TCP四种定时器

来源:互联网 发布:大数据采集软件 编辑:程序博客网 时间:2024/06/05 16:48

1.重传计数器
2.坚持计数器
3.保活计时器
4.2MSL计时器

  TCP是提供可靠的传输层,它使用的方法之一就是确认从另一端收到的数据。但是数据和确认都可能会丢失。TCP通过在发送时设置一个定时器来解决这个问题。如果当定时器溢出时还没收到确认,它就会重传该数据。关键在于超时和重传策略,即怎样决定超时的时间间隔和如何确定重传的频率。
  对于每个连接,TCP管理着四个不同的定时器:重传定时器,坚持定时器,保活定时器 以及 2MSL定时器。

1.重传定时器

  为了防止丢失数据报文段或确认报文段,当TCP发送报文段时,启动了特定报文段的计时器,若在计时器超时之前收到对报文段的确认,则撤销计时器。若收到特定报文段的确认之前计时器已经超时,则重传该报文,并把计时器复位。这里最重要的是超时的时间计算,有关该时间的计算清查阅具体的算法,这里不再进行记录。

2.坚持计时器

  坚持计时器主要是解决零窗口大小通知可能导致的死锁问题。刚开始接收端向发送端发送了一个零窗口报文段。在不久之后,如果接收端的缓存区有一定的空间可以接收数据,此时接收端就会向发送端发送一个非零窗口大小的报文段(即窗口更新),但是这个非零窗口大小的报文段在传输过程中丢失,导致发送端无法接收到该非零窗口大小的报文段。因此,发送端就会一直处于等待非零窗口大小的报文端通知,由于接收端已经发送了非零窗口大小的报文段,而且并不知道报文段在传输过程中丢失,则接收端会一直处于等待接收数据状态,如果没有任何措施的话,这个死锁的局面会一直延续下去。
  为了解决上面这个问题,TCP为每一个连接设有一个坚持定时器(也叫持续计数器)。当发送端收到零窗口的确认时,就启动坚持计时器,当坚持计时器截止期到时,发送端就发送一个特殊的报文段,叫探测报文段,这个报文段只有一个字节的数据。探测报文段有序号,但序号永远不需要确认,甚至在计算对其他部分数据的确认时这个序号也被忽略。探测报文段提醒接收端,确认已丢失,必须重传。
  坚持计时器的截止期设置为重传时间的值,若没有收到来自接收端的响应,则发送另一个探测报文段,并将坚持计时器的值加倍并复位,发送端继续发送探测报文段,将坚持计时器的值加倍和复位,直到这个值增大到阈值为止(通常为60秒)。在此之后,发送端每隔60s就发送一个报文段,直到窗口重新打开位置。
  坚持计时器的原理:当TCP服务器收到客户端的0滑动窗口报文时,启动一个定时器来计时,并在定时器溢出时向客户端查询窗口是否已经增大,如果得到非零窗口就重新发送数据,如果得到零窗口就再开一个新的定时器准备下一次查询。

3.保活定时器

  保活定时器是为了应对TCP连接双方出现长时间没有数据传输的情况。如果客户端与服务器建立了TCP连接之后,客户端由于某种原因导致主机故障,则服务器就不能收到来自客户端的数据,而服务器不可能一直处于等待状态,保活定时器就是用来解决这个问题的。服务器每收到一次客户端的数据,就重新设置保活定时器,通常为2小时,如果2小时没有收到客户端的数据,服务端就发送一个探测报文,以后每隔75秒发送一次,如果连续发送10次探测报文段后仍没有收到客户端的响应,服务器就认为客户端出现了故障,就可以终止这个连接。

4.2MSL定时器

  2MSL定时器主要是解决以下两种情况:

  1.TIME_WAIT确保有足够的时间让对端收到ACK,如何被动关闭的那方没有收到ACK,就会触发被动端重发FIN。因为最后一次确认应答ACK报文段很有可能丢失,因而使被动关闭方处于在LAST_ACK状态,此时被动关闭方会重发这个FIN+ACK报文段,在这等待的2MSL时间内主动关闭方重新收到这个被动关闭方重发的FIN+ACK报文段,因此,主动关闭方会重新发送确认应答信息,从而重新启动2MSL计时器,直到收到被动关闭方发来的确认ACK报文段,通信双方都进入CLOSED状态。如果主动关闭方在TIME_WAIT状态不等待一段时间就直接释放连接并进入CLOSED状态,那么主动关闭方无法收到来自被动关闭方重发的FIN+ACK报文段,也就不会再发送一次确认ACK报文段,因此被动关闭方就无法正常进入CLOSED状态。
  2.有足够的时间让这个连接不会跟后面的连接混在一起。防止已失效的请求连接出现在本连接中。在连接处于2MSL等待时,任何迟到的报文段都将被丢弃,因为处于2MSL等待的,由该插口(插口是IP端口对的意思,socket)定义的连接在这段时间内将不能被再用,这样就可以使下一个新的连接中不会出现这种旧的连接之前延迟的报文段。

0 0
原创粉丝点击