TCP-四次挥手
-
客户端
- 首先发送
FIN=1,seq=u的连接释放报文,进入FIN-WAIT-1状态
- 首先发送
-
服务端
- 收到请求后,发送
ACK=1,seq=v,ack=u+1的确认报文 - 同时进入
CLOSE-WAIT状态,不再接收来自客户端的数据 - 但服务端还是能继续返回数据的
- 收到请求后,发送
-
至此两次挥手完成,客户端收到这个报文后,进入
FIN-WAIT-2状态 -
服务端
- 等到没有数据要返回,就会发送
FIN=1,ACK=1,seq=w,ack=u+1的连接释放报文 - 同时进入
LAST-ACK状态
- 等到没有数据要返回,就会发送
-
客户端
- 收到报文后,会发送
ACK=1,seq=u+1,ack=w+1的确认报文 - 同时进入
TIME-AWAIT状态,这个状态会自动持续 2MSL 时间 - 这段时间内如果都没有来自服务端的请求,就会进入
CLOSED状态
- 收到报文后,会发送
-
至此四次挥手完成,服务端收到这个报文后,也会进入
CLOSED状态 -
【问题】为什么最后还要等待2MSL?
- 两句话:
- 让滞留的报文从网络中过期消失,避免新的连接混杂有旧的报文
- 就算最后的确认报文丢失,也能有时间重新接收到来自服务端的重传,从而重新给出确认报文,并重启2MSL,保证服务端能安全关闭
- 两句话:
-
【问题】为什么建立是3次,断开要4次?
- 两句话:
- 建立时,服务端把ACK和SYN统一到1次报文发送中
- 而断开时,服务端可能还有数据要传,所以先ACK,再传剩余数据,再SYN,这样分开发送后就会多1次
- 两句话: