网络汇总

来源:互联网 发布:编程对cpu的要求高吗 编辑:程序博客网 时间:2024/05/29 14:28

1、I/O模型,select、poll、epoll:http://blog.csdn.net/pmt123456/article/details/56556557

2、三次握手、四次挥手、状态转换图:http://blog.csdn.net/pmt123456/article/details/56677578

3、socket编程范式http://blog.csdn.net/fly_yr/article/details/50387065

4、TCP和UDP的区别:

1)TCP提供面向连接的传输,通信前要先建立连接(三次握手机制);UDP提供无连接的传输,通信前不需要建立连接。

2)TCP提供可靠的传输(有序,无差错,不丢失,不重复);UDP提供不可靠的传输。

3)TCP面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组;UDP是面向数据报的传输,没有分组开销。

4)TCP提供拥塞控制和流量控制机制;UDP不提供拥塞控制和流量控制机制。

udp的优点


5、流量控制和拥塞控制

1)流量控制:让发送方的发送速率不要太快,要让接收方来得及接受

滑动窗口机制:

TCP 采用大小可变的滑动窗口进行流量控制。窗口大小的单位是字节。
在 TCP 报文段首部的窗口字段写入的数值就是当前给对方设置的发送窗口数值的上限。
发送窗口在连接建立时由双方商定。但在通信的过程中,接收端可根据自己的资源情况,随时动态地调整对方的发送窗口上限值(可增大或减小)。

  


TCP实体在端设备中为每个连接开设两个缓冲区,一个是接受缓冲区,用来接受对方发送来的数据;另一个是发送缓冲区,TCP实体从应用进程接受数据,存储在发送缓冲区。

发送数据一方可以在一定条件下连续发送若干个分组,而不必每次发送都要在前一个分组的确认信息收到后进行。通过设定的数据发送区间进行控制。


滑动窗口的大小和网络接收分组的速度有关,如果窗口大小为1,则滑动窗口协议就退化为简单的肯定确认协议,增加窗口大小,就可以减少甚至消除网络的空闲状态。分组发送速度应当与网络传输分则的能力相匹配。

TCP传输过程中的滑动窗口大小并不是固定不变的,在传输过程中会动态调整,接收方会不断的将自己的接收窗口大小通告发送方,发送方将接收方通告的窗口大小作为发送窗口大小。

发送方在两种情况下会停止发送数据:

a. 发送窗口中全是已发送未确认数据:网络传输延迟大

b. 接收方的接收窗口大小为0:接收方处理速度太慢

2)拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不至过载。

拥塞控制所要做的都有一个前提:网络能够承受现有的网络负荷。

拥塞控制是一个全局性的过程,涉及到所有的主机、路由器以及与降低网络传输性能有关的所有因素。

几种拥塞控制方法:慢启动、拥塞避免、快重传、快恢复

(1) 接收端窗口 rwnd     这是接收端根据其目前的接收缓存大小所许诺的最新的窗口值,是来自接收端的流量控制。接收端将此窗口值放在 TCP 报文的首部中的窗口字段,传送给发送端。
(2) 拥塞窗口 cwnd (congestion window)    是发送端根据自己估计的网络拥塞程度而设置的窗口值,是来自发送端的流量控制。


a、慢启动和拥塞避免:发送方维持一个拥塞窗口cwnd的状态变量,拥塞窗口的大小取决于网络的拥塞程度,并且在动态的变化,发送方让自己的发送窗口等于拥塞窗口。

发送方控制拥塞窗口的原则是:只要窗口没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去;但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。

a-1慢启动算法:当主机开始发送数据时,如果立即把大量数据字节注入网络,那么就可能引起网络拥塞,因为现在并不清楚网络的符合情况。因此,较好的方法时先探测下,即由小到大的逐渐增大发送窗口——由小到大逐渐增大拥塞窗口的数值。通常在刚刚发送报文段时,先把拥塞窗口cwnd设置为一个最大报文段MSS的数值,而在每收到一个对新的报文段的确认后,拥塞窗口至多增加一个MSS数值。用这样的方法逐步增大发送方的拥塞窗口cwnd,可以使分组注入网络的速率更加合理。


如图,在主机刚刚开始发送报文段时可先将拥塞窗口 cwnd 设置为一个最大报文段 MSS 的数值。
在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个 MSS 的数值。
用这样的方法逐步增大发送端的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理

每经过一个传输轮次(往返时间RTT),拥塞窗口wcnd就加倍。不过传输轮次更加强调:把拥塞窗口所允许发送的报文段都连续发出去,并收到了对已经发送的最后一个字节的确认。

注:慢启动的慢并不是指cwnd的增长速度慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目的是探测一下网络的拥塞状况),然后再逐渐增大cwnd。

当cwnd<ssthresh时,使用上述慢启动算法;

当cwnd>ssthresh时,停止使用慢启动算法,而改用拥塞避免算法;

当cwnd=ssthresh时,即可使用慢启动算法,也可以使用拥塞避免算法。

a-2拥塞避免算法:让拥塞窗口cwnd缓慢的增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd+1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢的增长,比慢开始算法的拥塞擦混口增长速率慢得多。

无论是慢启动开始阶段还是拥塞避免阶段,只要发送方判断网络出现拥塞(没有收到确认),就要把慢启动门限ssthresh设置为出现拥塞时发送方窗口值得一半(但不能小于2)。然后把拥塞窗口cwnd的值重新设为1,执行慢启动算法。这样做的目的就是要迅速减少主机发送到网络中的分组数。

 

发送端的发送窗口不能超过拥塞窗口 cwnd 和接收端窗口 rwnd 中的最小值。我们假定接收端窗口足够大,因此现在发送窗口的数值等于拥塞窗口的数值。

(1)在执行慢开始算法时,拥塞窗口 cwnd 的初始值为 1,发送第一个报文段 M0。  

(2)发送端收到 ACK1 (确认 M0,期望收到 M1)后,将 cwnd 从 1 增大到 2,于是发送端可以接着发送 M1 和 M2 两个报文段。 

(3)接收端发回 ACK2 和 ACK3。发送端每收到一个对新报文段的确认 ACK,就把发送端的拥塞窗口加 1。现在发送端的 cwnd 从 2 增大到 4,并可发送 M4 ~ M6共 4个报文段。 发送端每收到一个对新报文段的确认 ACK,就把发送端的拥塞窗口加 1,因此拥塞窗口 cwnd 随着传输次数按指数规律增长。 当拥塞窗口 cwnd 增长到慢开始门限值 ssthresh 时(即当 cwnd = 16 时),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。 

注:“拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。“拥塞避免”是说在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。


b-2 快速重传和快速恢复


    如果发送方设置了超时计时器时限已到但还没有收到确认,那么很可能是网络出现了拥塞,致使报文段在网络中的某处被丢弃。这时,TCP马上把拥塞窗口cwnd减少到1,并执行慢启动算法,同时把慢启动门限值ssthresh减半。这是不使用快速重传的情况。
    快速重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有达到对而不要等到自己发送数据时才进行捎带确认。



(1) 当发送端收到连续三个重复的 ACK 时,就重新设置慢开始门限 ssthresh。
(2) 与慢开始不同之处是拥塞窗口 cwnd 不是设置为 1,而是设置为 ssthresh + 3 *MSS。 (这样做的理由是:既然发送方收到三个重复的确认,就表明有三个分组已经离开了网络。这三个分组不再消耗网络 的资源而是停留在接收方的缓存中。可见现在网络中并不是堆积了分组而是减少了三个分组。因此可以适当把拥塞窗口扩大了些。)
(3) 若收到的重复的 ACK 为 n 个(n > 3),则将 cwnd 设置为 ssthresh + n * MSS。
(4) 若发送窗口值还容许发送报文段,就按拥塞避免算法继续发送报文段。

(5) 若收到了确认新的报文段的 ACK,就将 cwnd 缩小到 ssthresh。



6、socket在什么情况下变为可读/可写

可读:

  1)socket的接收缓冲区中的数据字节大于等于该socket的接收缓冲区低水位标记的当前大小。

对这样的socket的读操作将不阻塞并返回一个大于0的值(即返回准备好读入的数据),可以用SO_RDVLOWAT选项来设置socket的低水位标记,对于TCP和UDP socket而言,缺省值为1

2)该连接的读这一半关闭,

即接收到对方发来的FIN,对于这样的socket的读操作将不阻塞并返回0

3)socket是一个用于监听的socket,并且已经完成的连接数为非0,

是因为socket已经收到了对方的connect请求,执行了三次握手的第一步:对方发生SYN请求过来,使监听socket处于可读状态;正常情况下,这样的socket accept操作不会阻塞。

4)有一个socket有由异常错误条件待处理

对于这样的socket的读操作将不会阻塞,并且返回一个错误(-1),errno则设置成明确的错误条件,这些待处理的错误也可通过指定socket选项SO_ERROR调用getsockopy来取得清除

可写:

 1)socket的发送缓冲区中的字节数大于等于该socket的发送缓冲区低水位标记的当前大小。

对于这样的socket的写操作将不阻塞并返回一个大于0的值(返回准备好写入的数据)。可以用SO_SNDLOWAT socket选项来设置该socket的低水位标记。对于TCP和UDP socket而言,其缺省值为2048

2)该链接的写这一半关闭。

对这样的socket的写操作将产生SIGPIPE信号,该信号的缺省行为是终止进程

3)有一个socket有一次错误条件待处理

对于这样的socket的写操作将不会阻塞并范围一个错误(-1),,errno则设置成明确的错误条件.这些待处理的错误也可以通过指定socket选项SO_ERROR调用getsockopt函数来取得并清除;


7、节点计算机可以通过丢包率感知网络拥塞(不确定)

ping -f

8、netstat https://linux.cn/article-2434-1.html

Recv-Q 接收队列,表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走,recv()

Send-Q 发送队列,对方没有收到的数据或者说没有Ack的,还是本地缓冲区

这两个值通常应该为0,如果不为0可能是有问题的。packets在两个队列里都不应该有堆积状态。可接受短暂的非0情况,短暂的Send-Q队列发送pakets非0是正常状态。
如果接收队列Recv-Q一直处于阻塞状态,可能是遭受了拒绝服务 denial-of-service 攻击。
如果发送队列Send-Q不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快。

通过netstat的这两个值就可以简单判断程序收不到包到底是包没到还是包没有被进程recv。socket选项SO_ERROR调用getsockopt函数来取得并清除;

9、OSI参考模型


物理层:激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性。该层为上层协议提供了一个传输数据的物理媒体

数据链路层:数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。

网络层:网络层负责对子网间的数据包进行路由选择。此外,网络层还可以实现拥塞控制、网际互连等功能。

传输层:第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。

会话层:在两个节点间建立、维护和释放面向用户的连接,并向会话进行管理和控制,保证会话数据的可靠传输

表示层:传输信息的语法和语义,对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解。表示层的数据转换包括数据的加密、压缩、格式转换等。

应用层:为操作系统或网络应用程序提供访问网络服务的接口。



10.http协议http://www.cnblogs.com/ranyonsue/p/5984001.html



URL访问方式:ftp —— 文件传送协议 FTP
                            http —— 超文本传送协议 HTTP
                            News —— USENET 新闻

<主机> 是存放资源的主机在因特网中的域名



HTTP 是面向事务的客户服务器协议。
HTTP 1.0 协议是无状态的(stateless)。
HTTP 协议本身也是无连接的,虽然它使用了面向连接的 TCP 向上提供的服务。
万维网浏览器就是一个 HTTP 客户,而在万维网服务器等待 HTTP 请求的进程常称为 HTTP daemon,有的文献将它缩写为 HTTPD。
HTTP daemon 在收到 HTTP 客户的请求后,把所需的文件返回给 HTTP 客户。   

12、connect出错的几种情况

       1、ETIMEDOUT,TCP客户没有收到SYN分节的响应。若调用connect时,4.4BSD内核发送一个SYN,若无响应等待6s后再发送一个,若仍无响应则等待24s后再发送一个,若总共等了75s后仍未收到响应则返回本错误

       2、ECONNRREFUSED,若对客户SYN的响应是RST,则表明服务器主机在我们指定的端口上没有进程在等待与之连接,客户已接收到RST马上返回ECONNRREFUSED错误

       3、若客户发出的SYN在中间的某个路由器上引发了一个“destination unreachable”(目的地不可达)的ICMP错误,则认为是一种软错误。客户主机内核保存该消息,并按第一种情况中所述的时间间隔继续发送SYN。若在某个规定的时间后仍未收到响应,则把保存的消息(ICMP错误)作为EHOSTUNREACH或ENETUNREACH错误返回给进程。

13、TCP怎么保证可靠性

1.面向连接

2.将数据截断为合理长度

3.对于收到的请求,给出确认响应,超时重发(发送端有计时器,超时收不到确认,将重发这个报文段。

4.校验和出错,丢弃报文段,不给出响应

5.对失序数据进行重新排序

6丢弃重复的数据

7.流量控制,防止较快主机致使较慢主机的缓冲区溢出

14、计算机网络常考点

15、Event Loop

16、ARP是地址解析协议,简单语言解释一下工作原理。

     不管网络层使用的是什么协议,在实际网络的链路上传输数据帧时,最终还是必须使用硬件地址。OSI 模式把网络工作分为七层,彼此不直接打交道,只通过接口(layre interface). IP地址在第三层, MAC地址在第二层。协议在发生数据包时,首先要封装第三层 (IP地址)和第二层 (MAC地址)的报头, 但协议只知道目的节点的IP地址,不知道其物理地址,又不能跨第二、三层,所以得用ARP的服务。
答:
(1)首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。
(2)当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机IP地址,源主机MAC地址,目的主机的IP地址。

(3)当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址
(4)源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。


17、DNS(Domain Name System)域名系统

          将主机名和域名转换为IP地址

       应用层协议

       运行在UDP之上,使用端口号是53

 


每一个域名fuqu不但能够进行一些域名到IP地址的解析,而且还必须具有连向其他域名服务器的信息。

当自己不能进行域名到IP地址的转换时,就能够知道到什么地方去找别的域名服务器。

a、本地域名服务器  b、根域名服务器  c、授权域名服务器




从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。


eg

1、在浏览器中输入www.qq.com域名,浏览器首先会在自己的缓存中查找是否有该域名对应的IP地址(若曾经访问过该域名且没有清空缓存便存在)。


2、当浏览器缓存中无域名对应IP时操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。 


3、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。 


4、如果hosts与本地DNS解析 器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的 域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。 


5、如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。 


6、如果本地DNS服务器本地区域文 件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务 器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负 责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址 (qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到 www.qq.com主机。 


7、如果用的是转发模式,此DNS服 务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地 DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。 


17、ipconfig

18、TCP的4个不同的定时器

        (1)重传定时器:使用于希望收到另一端的确认

                  当TCP发送报文段时,就创建该特定报文段的重传计时器。可能发生两种情况:
                 若在计时器截止时间到(通常是60秒)之前收到了对此特定报文段的确认,则撤销此计时器。
                 若在收到了对此特定报文段的确认之前计时器截止期到,则重传此报文段,执行指数退避。

        (2)坚持定时器:使窗口大小信息保持不断流动,即时另一端关闭了其接收窗口

                 ACK的传输并不可靠。TCP不对ACK报文段进行确认,只确认那些包含有数据的ACK报文段。当接收窗口大小为0,并且接收方发送的窗口通告确认丢失了,那接收方等待接收数据,而发送方在等待允许它继续发送数据的窗口更新,这样就形成了死锁。对该情况的解决方案:发送方使用一个坚持定时器来周期性地向接收方发送窗口探测报文,以便发现窗口是否已增大。

        (3)保活定时器:可以检测到一个空闲连接的另一端何时崩溃或重启。

                 许多时候一个服务器希望知道客户主机是否崩溃并关机或崩溃又重新启动,保活定时器就提供这个功能。在连接两个端系统的网络出现临时故障的时候,保活选项会引起一个实际上很好的连接终止。如果一个给定的连接在两个小时之内没有任何动作,则服务器就向客服发送一个探查报文段,客户主机必须处于以下4个状态之一:

1)客户机依然正常运行,并从服务器可达。客户TCP响应正常,两小时内保活定时器复位。如果两小时内有数据交换,则在数据交换后的未来2小时再复位 
2)客户机已经奔溃,并且关闭或正在重新启动,客户TCP没有响应。服务器收不到探查的响应,然后每隔75秒发送探查报文,总共发送10个,如果服务器没有收到一个响应,认为客户端已经关闭并终止连接 
3)客户主机崩溃并已经重新启动,。这是服务器收到对其保活探查的响应,但是这个响应是一个复位(RESET),服务器终止连接 
4)客户主机正常运行,但是从服务不可达,等同情况2

        (4)2MSL定时器测量一个连接处于TIME_WAIT状态的时间


19、Nagle算法和延迟ACK

       有时候在一个连接上客户一般每次发送一个字节到服务器,这就产生了一些41字节长的分组(20字节的IP首部,20字节的TCP首部和1个字节的数据)。在局域网上,这些小分组通常不会引起麻烦,但在广域网上,这些小分组会增加拥塞的可能。


20、reactor模式

21、ICMP协议


ICMP报文被封装在IP包里,也就是说他是由IP协议承载的,从这一点伤来说,他跟TCP协议是一个层级的。

22、keepalive

0 0
原创粉丝点击