目录
- 1. TCP三次握手
- 1.1 什么是三次握手
- 1.2三次握手详解
- 2. 四次分手
- 2.1 什么是四次分手
- 2.2 四次分手详解
1. TCP三次握手
1.1 什么是三次握手
TCP建立连接时要传输三个数据包,俗称三次握手(Three-way Handshaking)。可以形象的比喻为下面的对话:
A:“你好,套接字B,我这里有数据要传送给你,请求建立连接。”
B:“好的,我这边已准备就绪。”
A:“谢谢你受理我的请求。
1.2三次握手详解


1 当客户端调用 connect() 函数后,TCP协议会组建一个数据包,并设置 SYN 标志位,同时生成一个随机数字 , 填充Seq ,发送同步数据包后,connect 会进入阻塞状态。
2 服务器端收到数据包,服务器端也会组建一个数据包,并设置 SYN 和 ACK 标志位,seq 随机数填充,ack 为上一个包的seq+1,发送数据包,accept 进入阻塞状态。
3 客户端收到数据包后,客户端会继续组建数据包,并设置 ACK 标志位,ack收的到seq+1,客户端将数据包发出,进入ESTABLISED状态,表示连接已经成功建立。
4 服务器端收到数据包,检测到已经设置了 ACK 标志位,服务器进入ESTABLISED状态。
2. 四次分手
2.1 什么是四次分手
断开连接同样重要,它让计算机释放不再使用的资源误,还会导致套接字不能关闭,持续占用资源
断开连接需要四次握手:
A:“任务处理完毕,我希望断开连接。”
B:“哦,是吗?请稍等,我准备一下。”
B:“我准备好了,可以断开连接了。”
A:“好的,谢谢合作。”
2.2 四次分手详解


1.客户端调用 close() 函数后,向服务器发送 FIN 数据包,进入FIN_WAIT_1状态。FIN 是 Finish 的缩写,表示完成任务需要断开连接。
2.服务器收到数据包后,检测到设置了 FIN 标志位,知道要断开连接,于是向客户端发送“确认包”,进入CLOSE_WAIT状态。
注意:服务器收到请求后并不是立即断开连接,而是先向客户端发送“确认包”,告诉它我知道了,我需要准备一下才能断开连接。
3.客户端收到“确认包”后进入FIN_WAIT_2状态,等待服务器准备完毕后再次发送数据包。
4.等待片刻后,服务器准备完毕,可以断开连接,于是再主动向客户端发送 FIN 包,告诉它我准备好了,断开连接吧。然后进入LAST_ACK状态。
5.客户端收到服务器的 FIN 包后,再向服务器发送 ACK 包,告诉它你断开连接吧。然后进入TIME_WAIT状态。
6.服务器收到客户端的 ACK 包后,就断开连接,关闭套接字,进入CLOSED状态
参考资料
作者:yongfutian
















