TCP的超时和重传

来源:互联网 发布:h3c网络认证 编辑:程序博客网 时间:2024/05/25 21:36

TCP提供可靠的运输层。

其主要途径就是确认从另一端收到的数据。同时确认也需要传输,故而也存在丢掉的可能

TCP通过在发送时设置一个定时器来解决这种问题:如果定时器溢出还没有收到确认,重传该数据

对于每个连接,TCP管理4个不同的定时器。

1,重传定时器用于希望收到对端的确认。

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

3,keepalive定时器可检测到一个空闲连接的对端何时崩溃或重启。

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


1,重传定时器:

TCP超时和重传中最重要的部分就是对一个给定连接的往返时间(RTT)的测量。

但是RTT会因为路由器和网路流量的变化而变化,故TCP应该关注这些变化并适当性的改变其超时时间。

因为送出的数据报文段和ACK并不存在绝对的闭环一一对应关系,所以实际的超时重传时间RTO是基于均值和方差来计算一个评估值。


2,坚持(persist)定时器

鉴于TCP让接收端通过ACK报文来向发送端指定自己希望发送端发送的数据字节数(窗口大小)来进行流量控制,同时TCP只对数据报文确认并不确认ACK报文,故而一旦ACK丢失,可能导致两端互相等待

坚持定时器就是来解决这一问题的,发送方使用一个坚持定时器来周期性地向接收方查询,以便发现串口是否已经变化。

这些从发送方发出的报文段称为窗口探查(window probe)

糊涂窗口综合症SWS(silly window syndrome):接收方可以通告一个小得窗口(而不是一直等待有一个大得窗口时才通告),而发送方也可以发送少量的数据(而不是等待其他的数据以便发送一个大得报文段)。

鉴于TCP使用基于窗口的流量控制方案,会导致SWS,进而导致少量的数据通过连接进行交换,而不是满长度的报文段。

避免方式如下:

1,接收方不通告小窗口。

2,对于发送方,需要满足一下条件之一才发送数据:

a,可以发送一个满长度的报文段。

b,可以发送至少是接收方通告窗口大小一半的报文段。

c,可以发送任何数据并且不希望接受ACK或者该连接上不能使用Nagle算法。


3,保活定时器

顾名思义,这应该就是类似心跳一类的计时器,它并不是TCP规范中的一部分,因为它可能耗费不必要的带宽,浪费不必要的流量,如果出差,可能会对一个正常的连接有影响。

其主要应用在服务器端,也并不是说客户端不能使用。

如果设置了这个选项,那么对于一个连接,如果这个连接在两个小时内没有数据交互,服务器会向客户端发送一个探查报文。

1,客户端仍然正常工作,并从服务器可达,则服务器会将自己的keepalive timer复位,重新开始计时。

2,客户主机崩溃,关闭,正在重新启动尚未正常运行。这时就无法响应服务器的探查报文,75S之后超时,10个这样的报文之后,服务器认为客户端关闭并终止连接

3,客户端崩溃且已经完成重新启动,将会服务器的探查报文回复一个复位,服务器终止这个连接,因为正常来说这个客户进程在重启中死掉了。

4,客户主机正常运行,但是服务器不可达,如拔掉网线,这个第二种类似,服务器在10此报文试探之后关闭此链接。


0 0