首页 > 代码库 > TCP协议中的计时器
TCP协议中的计时器
说明: 本文仅供学习交流,转载请标明出处,欢迎转载!
本文是以下文献相关内容的总结
[1] 《TCP/IP详解 卷1:协议》
[2] 《TCP/IP协议族 第4版》
[3] 《计算机网络 第5版》
TCP协议通常包括4种计时器:重传计时器、持续计时器、保活计时器和时间等待计时器。
重传计时器:Retransmission Timer,该计时器用于整个连接期间,用于处理RTO(重传超时)。当一个报文从发送队列发出去后,就启动该计时器。若在RTO之内收到了该报文的ACK,则停止该重传计时器;若t>=RTO都还没有收到报文的ACK,则重传该报文,并重置该重传计时器。
注意:若ACK报文捎带其他信息,则不会为该报文设置重传计时器。
持续计时器:Persistent Timer,用于处理零窗口值的通过。若接收端的TCP要命令发送端的TCP停止发送报文段时,就向发送TCP发送一个报文段,该报文的窗口大小字段为0,称为零值窗口。发送端的TCP收到该零值窗口值报文后,就会停止向接收端的TCP发送报文,直到接收端的TCP发送一个窗口大小非0的ACK报文。若接收端TCP向发送TCP发送ACK报文,以通知其发送窗口的大小(非0)后,接收端的TCP便等待发送端发送数据,若该ACK回去的路上丢失了,则发送端的TCP并没收到ACK报文,便不会向接收端发送报文,而接收却以为自己的ACK报文发成功了,便傻乎乎的瞎等待(别忘了,ACK报文是永远不会被设置重传计时器的),这样两个人便陷入了“死锁状态”。为了防止该死锁状态的出现,TCP为发送TCP设置了一个持续计时器,一旦发送TCP收到了“零值窗口报文”,该计时器便启动。启动后,在为超时期间,若收到了接收端的非0窗口的通知,则停止该计时器;若该持续计时器超时了,则发送TCP就发送一个特殊的探测报文段,该报文段仅包含1B的新数据,该报文不需要确认,探测报文的作用在于提醒对方(目的可以记录在数据部分),重传下上次发送发送的那个ACK报文(即那个非0值窗口的报文)。
注意:TCP规定,接收窗口的rwnd=0,也必须接收这三种报文段:零窗口探测报文段、确认报文段和携带紧急数据的报文段。
保活计时器:Keeplive Timer,防止两端的TCP在连接期间长时间处于空闲状态。可以为服务器设置一个保活计时器。每当服务器收到客户的信息,就把该计时器复位,表示该通话还活着,超时通常设置为2小时。当服务器超过了2H还没有收到客户的任何信息时,服务器就向客户发送过一个探测报文段。若连续发送了10个探测报文段(没个75s一个)还没有响应,就认为客户出了故障,并终止这个连接。
时间等待计时器:Time-Wait timer,(超时时间=2MSL,max segment lifetime),该计时器为客户端设置。该计时器是为还记得4次挥手中的第三次挥手吗?在第三次挥手中,客户端收到服务器发送的FIN报文后,客户端就启动Timer-Wait计时器,时间设置为2MSL,并发送最后一个ACK。两个作用:(1)保证在2MSL时间内,服务器端能够收到最后一个ACK;(2)能够保证之前某些在网络中滞留很久的发给服务器的报文不会在本次连接连接关闭后再去骚扰服务器。值得注意的是:最后两次挥手期间,启动了两种计时器,服务器向客户端发送FIN后启动重传计时器,客户端收到FIN后,向服务器发送ACK,同时启动Time-Wait计时器(时间长度为2MSL)。