TCP定时器

来源:互联网 发布:mac下安装mysql 编辑:程序博客网 时间:2024/05/21 22:31

TCP 是提供可靠的传输层,它使用的方法之一就是确认从另一端收到的数据。但是数据和确认都可能会丢失。TCP 通过在发送时设置一个定时器来解决这个问题。如果当定时器溢出时还没收到确认,它就会重传该数据。关键在于超时和重传策略,即怎样决定超时的时间间隔和如何确定重传的频率。
TCP定时器种类
对于每个TCP连接,TCP管理4个不同的定时器。
 (1) 重传定时器用于当希望收到另一端的确认。
 (2) 坚持定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口。  
 (3) 保活定时器可检测到一个空闲连接的另一端何时崩溃或重启。
 (4)2MSL定时器测量一个连接处于TIME_WAIT状态的时间。
TCP的重传定时器
为了防止丢失数据报文段或确认报文段,当 TCP 发送报文段时,启动了特定报文段的重传计时器,若在计时器超时之前收到对报文段的确认,则撤销计时器。若收到特定报文段的确认之前计时器已经超时,则重传该报文,并把计时器复位。这里最重要的是超时的时间计算,有关该时间的请查阅具体的算法,这里不再进行记录。
TCP的坚持定时器
原理:当 TCP 服务器收到了客户端的 0 滑动窗口报文时,启动一个定时器来计时,并在定时器溢出的时向客户端查询窗口是否已经增大,如果得到非零的窗口就重新开始发送数据,如果得到零窗口就再开一个新的定时器准备下一次查询。
①坚持定时器主要是解决零窗口大小通知可能导致的死锁问题。刚开始接收端向发送端发送了一个零窗口报文段。在不久之后,如果接收端的缓存区有一定的空间可以接收数据,此时接收端就会向发送端发送了一个非零窗口大小的报文段(即窗口更新),但是这个非零窗口大小的报文段在传输过程中丢失,导致发送端无法接收到该非零窗口大小的报文段。因此,发送端就会一直处于等待非零窗口大小的报文端通知,由于接收端已经发送了非零窗口大小的报文段,而且并不知道该报文段在传输过程中丢失,则接收端会一直处于等待接收数据状态,如果没有任何措施的话,这个死锁的局面会一直延续下去。
②为了解决上面这个问题,TCP 为每一个连接设有一个坚持定时器(也叫持续计数器)。当发送端收到零窗口的确认时,就启动坚持计时器,当坚持计时器截止期到时,发送端就发送一个特殊的报文段,叫探测报文段,这个报文段只有一个字节的数据。探测报文段有序号,但序号永远不需要确认,甚至在计算对其他部分数据的确认时这个序号也被忽略。探测报文段提醒接收端,确认已丢失,必须重传。
坚持计时器的截止期设置为重传时间的值,但若没有收到来自接收端的响应,则发送另一个探测报文段,并将坚持计时器的值加倍和并复位,发送端继续发送探测报文段,将坚持计时器的值加倍和复位,直到这个值增大到阈值为止(通常为 60 秒)。在此之后,发送端每隔 60s 就发送一个报文段,直到窗口重新打开为止。
TCP的保活定时器
   如果一个给定的连接在2小时内没有任何动作,那么服务器就向客户发送一个探查报文段。客户主机必须处于以下4个状态之一。
  (1) 客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方的正常工作的。服务器在2小时内将保活定时器复位。
  (2) 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务器将不能收到对探查的响应,并在75秒后超时。总共发送10个探查,间隔75秒。
  (3) 客户主机崩溃并已经重新启动。这是服务器将收到一个对其保活探查的响应,但这个响应是一个复位,使得服务器终止这个连接。
  (4) 客户主机正常运行,但是从服务器不可达。
TCP的2MSL定时器
2MSL 定时器主要是解决以下两种情况:
①TIME_ WAIT 确保有足够的时间让对端收到了ACK,如果被动关闭的那方没有收到 ACK,就会触发被动端重发 FIN。因为最后一次确认应答 ACK 报文段很有可能丢失,因而使被动关闭方处于在LIST_ ACK 状态的,此时被动关闭方会重发这个 FIN+ACK 报文段,在这等待的 2MSL 时间内主动关闭方重新收到这个被动关闭方重发的 FIN+ACK 报文段,因此,主动关闭方会重新发送确认应答信息,从而重新启动 2MSL 计时器,直到通信双方都进入 CLOSED 状态。如果主动关闭方在 TIME_WAIT 状态不等待一段时间就直接释放连接并进入 CLOSED 状态,那么主动关闭方无法收到来自被动关闭方重发的 FIN+ACK 报文段,也就不会再发送一次确认 ACK 报文段,因此被动关闭方就无法正常进入CLOSED 状态。
②有足够的时间让这个连接不会跟后面的连接混在一起。防止已失效的请求连接出现在本连接中。在连接处于 2MSL 等待时,任何迟到的报文段将被丢弃,因为处于 2MSL等待的、由该插口(插口是IP和端口对的意思,socket)定义的连接在这段时间内将不能被再用,这样就可以使下一个新的连接中不会出现这种旧的连接之前延迟的报文段。

原创粉丝点击