Client 与 Server 连接前的三次握手过程:
- 第一次握手,A 向 B 发送信息,B 收到信息后可以确认自己的收信能力和 A 的发信能力没有问题。
- 第二次握手,B 向 A 发送信息,A 可以确认自己的发信能力和B的收信能力没有问题,但是 B 不知道自己的发信能力到底如何,所以就需要第三次通信。
- 第三次握手,A 向 B 发送信息,B 就可以确认自己的发信能力没有问题。
Client 与 Server 断开时的四次握手过程:
假设 A 为主动断开方,B 为被动断开方
- 第一次握手,A 向 B 发送消息,表明数据发送完成需要断开连接
- 第二次握手,B 向 A 发送消息,让 A 先等等,等 B 把数据传完
- 第三次握手,B 向 A 发送消息,数据已传完,可以断开了
- 第四次握手,A 向 B 发送消息,稍后*会断开连接(等待2MSL后变成 CLOSED 状态)
*注:虽然双方都同意关闭连接了,而且握手的4个报文也都发送完毕,按理可以直接回到 CLOSED 状态(好比从 SYN_SENT 状态到 ESTABLISH 状态那样),但是我们需要考虑到网络是不可靠的,你无法保证你(客户端)最后发送的 ACK 报文一定会被对方收到,就是说对方处于 LAST_ACK 状态下的 SOCKET 可能会因为超时未收到ACK 报文,而重发 FIN 报文,所以这个 TIME_WAIT 状态的作用就是用来重发可能丢失的ACK报文。