2.7.2 以太网 TCP协议(TCP报文交互后的状态机变化)
一、TCP状态机:
二、TCP状态机变化
1、TCP三次握手
- 客户端主动发起SYN置位TCP之后,状态变为
SYN_SENT
(请求发送状态) - 服务器默认处于
LISTEN
(监听状态)。收到SYN报文之后,状态变为SYN_RCVD
(请求回复状态 syn_received)。回复SYN、ACK置位TCP。 - 客户端收到服务器回复的SYN、ACK置位TCP,状态变为
ESTABLISHED
(建立连接状态)。回复服务器ACK置位TCP,表示客户端连接建立成功。- 当服务器收到客户端的ACK置位TCP后,也将成为
ESTABLISHED
状态
- 当服务器收到客户端的ACK置位TCP后,也将成为
2、TCP四次挥手
- 客户端主动发送FIN、ACK置位的TCP之后,状态变为
FIN_WAIT_1
(结束等待状态1) - 服务器收到FIN、ACK置位TCP,状态变为
CLOSE_WAIT
(关闭等待状态)。通知上层程序关闭相关TCP程序,同时回复ACK置位报文,表示收到断开连接信息。- 收到服务器回复的ACK置位TCP,状态变为
FIN_WAIT_2
(结束等待状态2,等待对方回复FIN、ACK报文)
- 收到服务器回复的ACK置位TCP,状态变为
- 服务器结束上层TCP程序之后,回复客户端FIN、ACK置位TCP,请求断开连接。状态变为
LAST_ACK
(最后确认状态) - 客户端收到服务器FIN、ACK置位TCP后,状态变为
TIME_WAIT
(也称2MSL等待状态)。回复服务器ACK置位TCP,表示确认断开连接。- 服务器收到客户端ACK置位TCP之后,状态变为
CLOSED
,连接断开。
- 服务器收到客户端ACK置位TCP之后,状态变为
3、什么是2MSL?
- RFC 793 [Postel 1981c] 指出MSL为2分钟。然而,实现中的常用值是30秒,1分钟,或2分钟。
- TCP执行主动关闭的一端,收到FIN、ACK置位TCP并发出最后一个ACK确认时所处状态。
- 该连接必须在 TIME_WAIT状态停留的时间为 2倍的M S L。这样可防止最后的ACK在传输过程中丢失导致对端无法正常断开TCP:
- 假设ACK丢失,对端因为没能及时接收到ack而超时进行重新发送FIN、ACK报文。
- 如果不进行等待2MSL的时间,回复ACK之后就已经断开了连接。即使对端回复FIN、ACK也不会回复。
- 如果进行等待2MSL的时间,此时连接仍然存在,收到FIN、ACK之后将再次回复ACK报文进行确认。
- 假设ACK丢失,对端因为没能及时接收到ack而超时进行重新发送FIN、ACK报文。