最开始都是 CLOSED 状态,
服务器创建 socket 开始监听进入 LISTEN 状态
三次握手:
- 客户端-> 服务器发送 SYN(客户端进入 SYN_SENT)、
- 服务器-> 客户端发送 SYN+ACK(服务器进入 SYN_RECV)、
- 客户端-> 服务器 ACK(两方进入 ESTABLISHED)
四次挥手:
- 客户端-> 服务器发送 FIN(客户端进入 FIN_WAIT1)、
- 服务器-> 客户端发送 ACK(服务器进入 CLOSE_WAIT,客户端收到进 FIN_WAIT2)、
- 服务器-> 客户端发送 FIN(服务器进入 LAST_ACK)、
- 客户端-> 服务器发送 ACK(客户端进入 TIME_WAIT,服务器收到进入 CLOSED),经过 2MSL(Maximum Segment Lifetime)客户端进 CLOSED
为什么等待 2MSL:主要目的是怕最后一个 ACK 包对方没收到,那么对方在超时后将重发第三次握手的 FIN 包,主动关闭端接到重发的 FIN 包后可以再发一个 ACK 应答包。
CLOSING 状态:实际情况中很少见。CLOSING 状态表示一方发送 FIN 后,并没有收到对方的 ACK,反而却也收到了对方的 FIN。出现情况:当双方几乎在同时 close()同一个 SOCKET 的话,就会出现双方同时发送 FIN 的情况,这是就会出现 CLOSING 状态,表示双方都正在关闭 SOCKET 连接。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于