发布网友 发布时间:2024-09-26 02:09
共1个回答
热心网友 时间:2024-11-17 18:58
首先简单介绍一下tcp协议:
基于连接的:数据传输之前需要建立可用的连接
全双工的:可以双向传输
字节流:不限制数据大小,打包成报文段,保证有序接收,重复报文自动丢弃
流量缓冲:解决双方处理能力的不匹配
可靠的传输服务:保证可达,丢包时通过重发机制实现可靠性
拥塞控制:防止网络出现恶性拥塞
因为是基于可用连接的,所以建立连接的过程需要三次握手; 因为是全双工的,所以断开连接需要四次挥手;
ok。接下来详细介绍,三次握手的过程,四次挥手的过程,已经为什么是三次挥手,四次挥手。
一,TCP 的三次握手机制开始客户端和服务器都处于 CLOSED 状态,然后服务端开始监听某个端口,进入 LISTEN 状态
第一次握手 (SYN=1, seq=x),发送完毕后,客户端进入 SYN_SEND 状态
第二次握手 (SYN=1, ACK=1, seq=y, ACKnum=x+1), 发送完毕后,服务器端进入 SYN_RCV 状态。
第三次握手 (ACK=1,ACKnum=y+1),发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时
二,TCP 握手为什么是三次,不能是两次?不能是四次?TCP 握手为什么是三次呢?为了方便理解,我们以谈恋爱为个例子:两个人能走到一起,最重要的事情就是相爱,就是我爱你,并且我知道,你也爱我,接下来我们以此来模拟三次握手的过程:
为什么握手不能是两次呢?
如果只有两次握手,女孩子可能就不知道,她的那句我也爱你,男孩子是否收到,恋爱关系就不能愉快展开。
为什么握手不能是四次呢?
因为握手不能是四次呢?因为三次已经够了,三次已经能让双方都知道:你爱我,我也爱你。而四次就多余了。
三, TCP 四次挥手过程?第一次挥手 (FIN=1,seq=u),发送完毕后,客户端进入 FIN_WAIT_1 状态
第二次挥手 (ACK=1,ack=u+1,seq =v),发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态
第三次挥手 (FIN=1,ACK1,seq=w,ack=u+1),发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个 ACK。
第四次挥手 (ACK=1,seq=u+1,ack=w+1),客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT 状态,等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。
四,. TCP 四次挥手过程中,客户端为什么需要等待 2MSL, 才进入 CLOSED 状态2MSL,2 Maximum Segment Lifetime,即两个最大段生命周期
1 个 MSL 保证四次挥手中主动关闭方最后的 ACK 报文能最终到达对端
1 个 MSL 保证对端没有收到 ACK 那么进行重传的 FIN 报文能够到达
五, 为什么需要四次挥手?举个例子吧
小明和小红打电话聊天,通话差不多要结束时,小红说 “我没啥要说的了”,小明回答 “我知道了”。但是小明可能还会有要说的话,小红不能要求小明跟着自己的节奏结束通话,于是小明可能又叽叽歪歪说了一通,最后小明说 “我说完了”,小红回答 “知道了”,这样通话才算结束。
ok,到这里就全明白了,以上就是通俗易懂的tcp连接的三次握手,断开连接的4次挥手。
版权声明:非商业转载
原文链接:?juejin.cn/post/6988794419910541348
作者:捡田螺的小男孩
来源:掘金,著作权归原文作者所有
原文:https://juejin.cn/post/7099449272399036423