【计算机网络】TCP状态转移
目录
TCP状态转移概述
三次握手阶段
四次挥手阶段
异常状态转移
关键参数与公式
TCP状态转移概述
TCP协议通过状态机管理连接生命周期,共有11种标准状态。状态转移由特定事件触发,如数据包收发、超时或应用层操作。
三次握手阶段
首先服务器处于listen状态,客户端程序主动打开:即执行connect,进行三次握手。客户端先发出SYN即为第一次握手,服务器收SYN即为第二次握手(对于服务器就是第一次握手,服务器发出SYN和ack就是第二次);服务器发出ack就是客户端的第三次确认(服务器收ack就是服务器端的第三次)。
SYN_RCVD,SYN_SENT都是握手的中间状态,握手完成后编程ESTABLISHED,变成已完成握手的状态。最后执行close,变成待机状态。因此连接状态会随着握手的状态发生变化。
- CLOSED:初始状态,表示无连接,是一个假想的即时阶段,实际上不存在这个状态。
- LISTEN:服务器端调用
listen()
后进入该状态,等待SYN请求。 - SYN-SENT:客户端发送SYN后进入此状态,等待服务器响应。
- SYN-RECEIVED:服务器收到SYN并回复SYN+ACK后进入该状态。
- ESTABLISHED:完成三次握手后双方进入此状态,可开始数据传输。
什么时候握手?代码执行connect时开始握手。
什么时候挥手?代码执行close时开始挥手。
四次挥手阶段
挥手时任何一方关闭就执行了close。无论哪一方谁执行close,谁就给对方发送一个FIN,(以A先给B发送close为例)通知B关闭,这是A第一次挥手;B会进行接收,这是B的第一次挥手;B收到之后给A发送ack,这是B的第二次挥手(这时的状态就不是初始状态,变成FIN-WAIT-1状态);然后A接收B发来的ack,这是A的第二次挥手(这时状态变为FIN-WAIT-2状态)。这时B变成CLOSE-WAIT状态,B执行关闭即执行close,B向A发送FIN通知关闭,这时就是B的第三次挥手,同时A接收FIN通知要关闭(为A的第三次);这时A发送ACK给B,即为A的第四次挥手;B接收ACK即为B的第四次挥手。
- FIN-WAIT-1:主动关闭方发送FIN后进入该状态,等待ACK或FIN。
- FIN-WAIT-2:收到对端ACK后进入此状态,等待对端FIN。
- CLOSE-WAIT:被动关闭方收到FIN后进入该状态,需等待应用层关闭。
- LAST-ACK:被动关闭方发送FIN后进入此状态,等待最终ACK。
- TIME-WAIT:主动关闭方收到FIN并发送ACK后进入,持续2MSL确保报文消失。
1、存在原因/意义?
- 可靠的终止TCP链接
因为TCP有应答确认超时重传,我们发出去一个报文,无法保证其一定到达对方,因此当发送时,对方收到后回复一个确认信息。但是这个ACK会丢,这时对方无法收到ACK,就认为对方发送的FIN没收到,因此可能会重新发送FIN。如果不存在TIME-WAIT,会直接消失,默认四次挥手完成。
- 保证迟来的TCP报文段有足够的时间被识别丢弃。
用于服务器结束的情况,此时就没有服务器了。但是此时网络中可能有延迟的报文。
2、如何防止服务器出现TIME-WAIT状态?
先关闭客户端,因为客户端出现TIME-WAIT端口被占用了,如果运行客户端的话,系统会随机分配一个暂时没人用的端口;但是服务器不能随机分配,服务器的端口是固定的,一旦端口被占用就运行不了了。
- CLOSED:TIME-WAIT超时后进入最终关闭状态。
异常状态转移
SYN_TIMEOUT:SYN-SENT状态未收到响应时直接返回CLOSED。
RESET:收到RST包立即终止连接,所有未完成状态直接跳转CLOSED。
同时关闭:双方同时发送FIN时进入CLOSING状态,最终通过TIME-WAIT过渡到CLOSED。
关键参数与公式
MSL(Maximum Segment Lifetime)默认为2分钟,TIME-WAIT持续时间计算: $$ TIME_WAIT = 2 \times MSL $$
状态转移超时重传机制采用指数退避算法: $$ Timeout = min(60, 2^{n-1} \times RTO) $$ 其中$n$为重传次数,RTO(Retransmission Timeout)基于动态RTT计算。