前言: TCP的三次握手四次挥手通过现实生活的场景的方式,更能让大家理解,此文章仅代表鄙人的总结和理解,如有错漏,欢迎指正...
一、一次完整的TCP事务过程
1. 第一次握手:建立连接,客户端发送连接请求报文
2. 第二次握手:服务器收到客户端请求信息,发送报文给客户端
3. 第三次握手:客户端接收到报文,再发送信息给服务器成功状态
4. 第一次分手:主机1告诉主机2请求关闭连接
5. 第二次分手:主机2同意关闭连接,发送应答报文(此时主机2可能还有数据要传,主机2不能立刻关闭。)
6. 第三次分手:主机2的数据传完后,发送自己的关闭报文给主机1
7. 第四次分手:主机1收到主机2的关闭报文,发送最后应答给主机2。主机2得到最后应答就立即关闭了。最后主机1也关闭了
(服务器结束TCP连接的时间要比客户端早一些)
二、TCP三个状态位:
ACK:用于对收到的数据进行确认,所确认的数据由确认序列号表示。
SYN:用作建立连接时的同步信号
FIN:表示后面没有数据需要发送,通常意昧着所建立的连接需要关闭了。
三:为什么不能两次握手?

TCP是一个双向通信协议,通信双方都有能力发送信息,并接收响应。
如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认。
四、三次握手场景:

五、为什么三次握手?
1.A发起ACK(应答)请求连接报文给B
2.B收到ACK报文然后返回ACK(应答)+SYN(同步)报文给A (这一步发送了2个东西,就是这一步省了一步)
3.A收到后,再将ACK发送给B,告诉B我已经知道你那边接收到了
这个过程是双向的。TCP就是双向的,所以三次握手足以。
六、四次挥手场景:
A:B 啊,我不想玩了。
B:哦,你不想玩了啊,我知道了。
这个时候,还只是 A 不想玩了,也即 A 不会再发送数据,但是 B 能不能在 ACK 的时候,直接关闭呢?当然不可以了,很有可能 A 是发完了最后的数据就准备不玩了,但是 B 还没做完自己的事情,还是可以发送数据的,所以称为半关闭的状态。 这个时候 A 可以选择不再接收数据了,也可以选择最后再接收一段数据,等待 B 也主动关闭。
B:A 啊,好吧,我也不玩了,拜拜。
A:好的,拜拜。
七、为什么四次挥手?
因为TCP是双向通信协议,所以当挥手的时候要4次,因为A说不想玩,只是A不发送数据,B还是可以发送数据给A的。所以要多一步应答。从此双方才能真正的关闭。
更多关于通信协议相关的知识,请查看狐狸与小兔的专栏博客之【java开发通信协议篇】...
结语:以往都是看别人的博客进行学习技术,其中不乏有精华博客也有吊儿郎当的CV大法文章,所以决定将自己所学所用所整理的知识分享给大家,主要还是想为了后浪们少走些弯路,多些正能量的博客,如有错漏,欢迎指正,仅希望大家能在我的博客中学到知识,解决到问题,那么就足够了。谢谢大家!(转载请注明原文出处)