1 连接建立定时器

这个定时器的作用就是在建立连接发送第一个 SYN 包的时候起作用,在发送 SYN 包后开启这个定时器,如果定的时间到了,那么就会重传 SYN 数据包。这里指定的初始时间间隔为 1s,后面每次达到定时器设定的时间那么便以指数级退避。如果抵达重传的次数,那么便放弃重试。在 Java 中便会报出 java.net.ConnectException: Connection timed out 的异常。

2 重传定时器

重传定时器在发送数据包后开启,初始的定时器时间是动态计算的,具体取决于 RTT 和重传的次数,同时,重传时间间隔是指数级退避。

3 延迟 ACK 定时器

在 TCP 收到数据包并不是立刻回复 ACK,这时候开启一个定时器,等待一段时间,看看是否有别的数据需要回复,如果期间有数据需要回复,那么则在需要回复的数据中捎带 ACK,如果时间到了也没有数据要发送,则直接发送 ACK。在 Centos7 上,这个定时器设定的时间是 40ms。

4 Persist 定时器

我们都知道 TCP 利用华东窗口来实现流量控制,当接收端接受窗口为 0 时,发送端此时不能再发送数据,发送端此时开启 Persist 定时器,超时后发送一个特殊的报文给接收端看对方窗口是否已经回复,这个特殊的报文只有一个字节。

5 保活定时器(keepalive timer)

如果通信一段时间以后没有再传输过数据,无法知道对方是挂掉了还是重启了。于是 TCP 提出了一个做法就是连接的空闲时间如果超过 2 小时,会发送一个探测报文,如果对方有回复则表示连接还活着,如果经过几次探测对方都没有回复则表示连接已经失效,客户端会丢弃这个连接。

6 FIN_WAIT_2 定时器

四次挥手过程中,主动关闭的一方收到 ACK 以后从 FIN_WAIT_1 进入 FIN_WAIT_2 状态等待对端的 FIN 包的到来,FIN_WAIT_2 定时器的作用是防止对方一直不发送 FIN 包,而自己一直在这儿傻等。这个值在 Centos7 上为 60s。

7 TIME_WAIT 定时器

TIME_WAIT 定时器也称为 2MSL 定时器,主动关闭连接的一方在 TIME_WAIT 持续等待 2 个 MSL 时间。确保之前的数据包在网络中全部失效。同时确保最后的 ACK 丢失了也能重传。

参考文章

  1. 深入理解 TCP 协议:从原理到实战