文章目录
TCP 四次挥手过程是怎样的?
四次挥手流程
- 第一次挥手:
- 客户端打算关闭连接,此时会发送一个
TCP
首部 FIN 标志位被置为 1 的报文,也即FIN
报文,之后客户端进入FIN_WAIT_1
状态。- 第二次挥手:
- 服务端收到该报文后,就向客户端发送
ACK
应答报文,接着服务端进入CLOSE_WAIT
状态。- 客户端收到服务端的
ACK
应答报文后,之后进入FIN_WAIT_2
状态。- 第三次挥手:
- 等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。
- 第四次挥手:
- 客户端收到服务端的
FIN
报文后,回一个 ACK 应答报文,之后进入TIME_WAIT
状态- 服务端收到了
ACK
应答报文后,就进入了CLOSE
状态,至此服务端已经完成连接的关闭。- 客户端在经过
2MSL
一段时间后,自动进入CLOSE
状态,至此客户端也完成连接的关闭。
注意是:主动关闭连接的,才有 TIME_WAIT 状态。
为什么挥手需要四次?
- 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
- 服务端收到客户端的 FIN 报文时,先回一个 ACK 应答报文,
而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。
在特定情况下,四次挥手是可以变成三次挥手的
第一次挥手丢失了,会发生什么?
- 当客户端(主动关闭方)调用 close 函数后,就会向服务端发送 FIN 报文,试图与服务端断开连接,此时客户端的连接进入到 FIN_WAIT_1 状态。
- 如果能及时收到服务端(被动关闭方)的 ACK,则会很快变为 FIN_WAIT2状态。
第一次挥手丢失?
如果第一次挥手丢失了,那么客户端迟迟收不到被动方的 ACK 的话,也就会触发超时重传机制,重传 FIN 报文,重发次数由 tcp_orphan_retries 参数控制。
- 当客户端重传 FIN 报文的次数超过 tcp_orphan_retries 后,就不再发送 FIN 报文,则会在等待一段时间(时间为上一次超时时间的 2 倍),如果还是没能收到第二次挥手,那么直接进入到 close 状态。
第二次挥手丢失了,会发生什么?
- 当服务端收到客户端的第一次挥手后,就会先回一个 ACK 确认报文,此时服务端的连接进入到 CLOSE_WAIT 状态。