TCP的7个定时器

这两天看了下TCP/IP详解的第二卷,买了很久把第一卷和第三卷大概都看了下,但是第二卷一直没有怎么看过。实际上在第一卷里就经常提到这个定时器的概念,在第二卷里25章是专门介绍定时器的。7种定时器分别是
1.连接建立定时器。在发送每个SYN的时候会启动,如果在75s内没有收到对方的ACK,那么连接终止。
2.保活定时器。在新建socket的时候如果指定了SO_KEEPALIVE才会生效。链接超过设置的时候就会连续发几次探测包,如果对几次尝试都没有收到回复就减低对方已经崩溃。
这个两个定时器的实现:

3.重传定时器。在发送数据的时候,如果指定时间内没有收到对放的回复就会启动重传。如果一次重传后对方还是没有回应,那么这个重转时限每次都会进行调整,越来越长。
4.persist定时器。在连接的对端通告窗口为0 的时候会启动一个定时器,在指定的时间内不像对方发送数据。当定时器超时后才会向对方发送1字节的数据。
5.延迟ACK定时器。当收到对方的确认请求后,这个请求虽然是必须要确认的,但是不是太急,那么就启动定时器200ms,如果在这个定时器超时之前又收到对方的数据,那么就把最新的ACK发回去就行了。这个主要是持续传输数据的时候使用,比如A向B先发出了N-N+1000报文段,这个时候A就期望收到ACK是N+1001,如果A接着继续发了N+1001-N+2001,那么只需要把ACK的序号设置为N+2002就能对前面的2个报文一起做确认了。
6.FIN_WAIT2定时器。A与B是ESTABLISHED的时候,如果A主动发起关闭,调用了close,那么就A会主动对B发送FIN,这个时候A就进入了FIN_WAIT1状态,而B在收到FIN后回复ACK时就变成了CLOSE_WAIT,在A发出FIN和收到ACK的这段时间内A处于FIN_WAIT1,A收到ACK后状态变化为FIN_WAIT2。但是如果B始终不给A发FIN包,岂不是A就一直得在FIN_WAIT2状态?所以有了FIN_WAIT2定时器,linux下默认是60s,其实就是内核参数tcp_fin_timeout 设置的那个参数。当定时器超时后就会把FIN_WAIT2会自动转换到TIME_WIAT状态。
7.TIME_WAIT定时器。这个就是2MSL的时间了,链接主动关闭后等待回收的一段时间,2MSL称为平静时间,就是为了防止如果这个socket被马上重新使用了,之前的那个链接有迟到(后者重传过来的包)到了的话会被新socket直接接收到。linux对这个的定义是写死在头文件的。定义在net/tcp.h #define TCP_TIMEWAIT_LEN (60*HZ) 约为60s

可能每个系统具体的实现和书上的不一样,不过从概念上还是好理解的。

此条目发表在OS分类目录。将固定链接加入收藏夹。

发表回复