三次握手
简单来说就是相隔一段距离的两个人必须靠喊话来交流,那么两个人在正式交谈之前要先确认对方是否可以听到自己,那么这个确认过程就是TCP三次握手,目的是建立连接。
假设发送端是张三,接收端是李四
1.张三:李四,你能不能听到我说话?
2.李四:能!那你能听到我说话吗?
3.张三:能!
到这里张三和李四都确认了对方能听到自己说话
类比于三次握手:
1.发送端发送标有SYN的数据包给接收端
2.接收端发送标有ACK和SYN的数据包给发送端
3.发送端发送标有ACK的数据包给接收端
这其中的第二步其实是两步的合并,接收端确认自己能听到发送端并且接收端还要问发送端能不能听到自己
数据传输
TCP总是要反复确认对方能不能听到自己,所以张三喊了一句话(data),李四听见了要回复张三自己听到了(ACK)。
如果张三喊了话,半天没李四的回复,张三就认为自己的话被大风刮走了,所以张三重新喊话,即【重传】
既然重传,李四就有可能同一句话听见了两次,那么就是【去重】
【重传】和【去重】用户层都不用关心,这件事情由操作系统的网络内核模块帮我们处理
同时,张三连续喊了八句话,李四到最后一起回复他,我前面八句都收到了,这就是【批量ACK】
但是,有可能张三说了很多话,李四一时无法消化,所以两个人协商好了合适的发送和接收速率,即【TCP窗口大小】
四次挥手
TCP四次挥手即要断开连接,它与建立连接时差不多,但是不同的是四次挥手中把中间两步并没有合并成一条。
谁先发完数据包谁就先请求断开连接。并不是只有服务端才能或者只有客户端才能。
假设张三先发完数据包
张三:我没什么要传的了(Fin)
李四:知道了(ACK)
李四:那我关了(Fin)
张三:好的(ACK)
此时李四处于closed状态
但是张三处于time_wait状态,持续时间2个MSL(4分钟),MSL是最长报文生存时间,这四分钟足以使残留报文永远消失
定时等待后,张三没有接收到消息则关闭连接,处于closed状态。
参考:
https://blog.csdn.net/ZWE7616175/article/details/80432486
https://blog.csdn.net/qzcsu/article/details/72861891