TCP三次握手和四次挥手以及11种状态
![](https://img.haomeiwen.com/i6271376/0f423f0684ade8f1.png)
-
LISTEN:等待从任何远端TCP 和端口的连接请求。
-
SYN_SENT:发送完一个连接请求后等待一个匹配的连接请求。
-
SYN_RECEIVED:发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。
-
ESTABLISHED:表示一个打开的连接,接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。
-
FIN_WAIT_1:等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。
-
FIN_WAIT_2:等待远端TCP 的连接终止请求。
-
CLOSE_WAIT:等待本地用户的连接终止请求。
-
CLOSING:等待远端TCP 的连接终止请求确认。
-
LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)
-
TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。
-
TIME_WAIT 两个存在的理由:
1.可靠的实现tcp全双工连接的终止;
2.允许老的重复分节在网络中消逝。 -
CLOSED:不在连接状态(这是为方便描述假想的状态,实际不存在)
TCP协议规定2MSL等待的原因
在 TIME WAIT 等待的 2MSL 是报文在网络上生存的最长时间,超过阁值便将报文丢弃。
![](https://img.haomeiwen.com/i6271376/ce2b9485a9e40991.png)
第一 ,确认被动关闭方能够顺利进入 CLOSED 状态。如图 1-23 所示,假如最 后一个 ACK 由于网络原因导致无法到达 B 机器,处于 LAST ACK 的 B 机器通常 “自信”地以为对方没有收到自己的 FIN+ACK 报文,所以会重发。 A 机器收到第二 次的 FIN+ACK 报文,会重发一次 ACK,并且重新计时。如果 A 机器收到 B 机器的 FIN+ACK报文后,发送个ACK给B机器,就“自私”地立马进入CLOSED状态, 可能会导致 B 机器无法确保收到最后的 ACK 指令,也无法进入 CLOSED 状态。这是A 机器不负责任的表现。
第二,防止失效请求。这样做是为了防止己失效连接的请求数据包与正常连接的 请求数据包混淆而发生异常。