浅析TCP的四种内部计时器

来源:互联网 发布:创维网络电视价格 编辑:程序博客网 时间:2024/06/06 02:48

TCP有四种内部计时器

1.时间等待计时器

2.保活计时器

3.重传计时器

4.持久计时器

一、时间等待计时器

     时间等待计时器常用于链接终止时,当TCP关闭一个链接时,它并不认为这个链接马上就真正地终止了,在时间等待期间,链接还处于一种中间过渡状态。时间等待计时器的值通常设置为一个报文段寿命期待值的2倍。

     设置时间计时器的目的:

1.如果最后一个ACK报文丢失了,那么服务器(它为最后的FIN设置了计时器)以为它的FIN丢失了,因而重传,如果客户端在2MSL时间之前就关闭了链接,进入closed状态,那么,它就永远无法接收到这个重传的FIN报文,所以,服务器也会无法接收到丢失的ACK报文。服务器就不能关闭这个链接,2MSL可以使客户端等待足够长的时间,这样就使得如果ACK丢失了,客户端也可以等到下一个FIN的到来。如果在2MSL时间内,一个新的FIN到达了,客户端就冲发一个ACK,并且重新启动2MSL计时器。


2.从一个链接发来的报文可能会在下一个链接出现。如果客户和服务器关闭了链接,短暂时间后又使用相同的套接字打开一个链接,这样的新链接叫久链接的化身。这样前一个链接的报文就有可能会到达新的链接,同时被解释成新的报文。为了避免这个问题,TCP规定这个化身必须经过2MSL时间以后才出现。

扩展:2MSL

MSL(Maximum Segment Lifetime)即报文最大生存时间

TCP的时间等待状态也成为2MSL等待状态。当TCP一方发起关闭链接请求后,就会使用“四次挥手”的方式断开链接。当发出最后一个ACK字段也就是三次挥手之后,发送了第四次的ACK就进入时间等待状态。

该状态为什么设计在主动方关闭?

     由主动关闭方发送最后一次ACK字段,只要有一方保持时间等待状态,就能起到避免链接在2MSL时间内重新建立。不需要双方都有。

二、保活计时器

     保活计时器使用在某些实现中,用来防止两个TCP之间的链接中出现长时间的空闲。如果客户端与服务器端建立了TCP链接后,很长时间内客户端都没发送数据给服务器端,那么,很有可能是客户端出现了故障,但此时,服务器端就会一直处于等待的状态,在这种情况下,链接就会一直处于打开的状态。我们用设置保活计时器的方法解决这种情况。

如何实现?(工作原理)

     每当服务器端收到客户端的数据时,都将保活计时器重新设置(通常设置为2个小时),过了两个小时后,如果服务器端没有收到客户端的数据,就会发探测报文段给客户端,每隔75秒发一个,连续发10个探测报文后,仍没有收到对方的来信,则服务器端认为客户端出现故障,并会终止链接。

三、重传计时器

     重传计时器是为了控制丢失的报文段或丢弃的报文段。一般在TCP发送报文段的时候会创建对此次报文段的重传定时器。

为了防止报文丢失,当TCP发送一个报文时,就会启动重传计时器。

1.在计时器超时之前就收到了特定报文的确认,则撤销这个计时器。

2.在计时器超时之前没有收到特定报文的确认,则重传这份数据报,并重置计时器。

重传时间一般为2RTT(Round Trip Time),2倍的往返时间。

四、持久计时器

     为了对付零窗口大小通知,TCP还有一种计时器叫做持久计时器。

     产生:假定接收TCP宣布了窗口为0,发送TCP就停止发送报文段,直到确认TCP确认并且宣布了一个非0的窗口大小。但这个确认有可能会丢失。因为在TCP中,对确认是不需要再发送确认的。若确认丢失了,接收TCP并不知道,而是会认为它已经完成了任务。并等待着发送TCP会发送更多的报文。但发送TCP没有收到确认,就等待对方发来确认来通知窗口大小。这样,双方都在等待等待对方。就会形成一种死锁的局面。

     要打开这种死锁,TCP为每一个链接使用一个持久计时器。当发送TCP收到一个窗口大小为0的通知时,就启动持久计时器。当持久计时器期限到时,就发送一个特殊的报文段叫做探测报文段。这个报文段只有一个字节的数据。它有一个序号,但是这个序号永远不需要确认,甚至在计算对其他部分数据的确认时,也忽略该序号。探测报文只是用来提醒对方,确认报文已经丢失,需要重传。

   使用:持久计时器的值设置为重传时间的值,但是,若没有收到从接收端来的响应,则需要发送另一个探测报文,并将持久计时器的值加倍和复位。发送端继续发送探测报文段,将持久计时器的值加倍和复位,直到这个值达到最大限度(通常为60秒),在这以后,发送端每隔60秒发送一个探测报文段。直到窗口重新打开。






0 0