目录
1.TCP 四次挥手详情
2. 为什么会有 TIME-WAIT 状态
3. 为什么需要四次握手才能断开连接
4. 服务器出现大量 CLOSE_WAIT 的原因
五, TCP 四次挥手
1.TCP 四次挥手详情
(1)一开始双方都属于已连接状态
(2)客户端发送一个报文段: FIN=1,seq=u.FIN 表示连接关闭请求, seq 是之前最后一个发送的数据的标号 + 1. 客户端进入关闭等待状态 1(FIN-WAIT-1)
(3)服务端接收到关闭连接请求之后, 通知程序需要关闭连接, 然后返回一个报文段: ACK=1,seq=v,ack=u+1. 这里标志位 ACK=1 表示确认号 (ack) 有效 seq 表示当前数据包顺序号, ack 表示顺序号为 u 的数据包已经确认接受, 请求数据号为 u+1 数据. 状态变为关闭等待状态(CLOSE-WAIT)
(4)客户端接收到数据之后进入关闭等待状态 2(FIN-WAIT2)
(5)服务器端发送报文段: FIN=1,ACK=1,seq=w,ack=u+1, 用来关闭服务端到客户的数据传送, 服务端进入一个 LAST-ACK 状态
(6)Client 收到 FIN 之后, Client 进入时间等待状态 (2MSL 之后关闭连接) 接着发送一个报文段: ACK=1,seq=u+1,ack=w+1,Server 进入 CLOSED 状态, 完成四次挥手
2. 为什么会有 TIME-WAIT 状态
(1)确保有足够的时间让对方收到 ACK 包
(2)避免新旧连接混淆
3. 为什么需要四次握手才能断开连接
TCP 连接是全双工的, 服务端可以发送数据到客户端, 客户端也可以发送数据到服务端, 发送方和接收方都需要两次挥手才能关闭
4. 服务器出现大量 CLOSE_WAIT 的原因
出现原因:(1)客户端一直请求关闭连接, 服务端发送的数据对方接受不到 (2) 我方忙于读和写没有及时关闭
解决方法:(1)程序有 bug, 检查代码 (2) 检查配置
计算机网络(五),TCP 四次挥手
来源: http://www.bubuko.com/infodetail-2946652.html