目录
学前必会
三次握手详解
和打电话一样
为什么必须要三次?
四次挥手详解
和挂电话一样
为什么要四次挥手?
第四次为何要等待 2*MSL?
相关面试题:
- 说一下三次握手、四次挥手的过程
- 三次握手四次挥手的目的是什么?
- 为什么要三次握手?两次不行吗?
- 为什么挥手要四次?
- 每次的状态是什么样的?
学前必会
三次握手四次挥手的作用
在TCP/IP模型中,我们都知道在传输层的TCP协议是面向连接的能保证可靠的数据传输,而学习三次握手、四次挥手其实就是学习TCP协议的连接断开过程!
三次握手四次挥手需要标志位
而学习三次握手四次挥手,我们需要用到的有标志位的几个内容
- ACK:acknowledgement 确认报文
- seq:sequence 顺序
- SYN:synchronous 建立联机
- FIN:finish 结束
三次握手详解
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
第一次:客户端发送一个带有SYN( sql=x )标志的数据包给服务端,客户端状态变为syn_sent状态。
第二次:服务端接收成功后,回传一个带有SYN(sql=y)/ACK(sql=x+1)标志的数据包传递确认信息。其中syn代表询问你能否收到我的信息,ack应答我收到了你的信息。
第三次:客户端再回传一个带有ACK标志的数据包,表示我知道了,握手结束。
和打电话一样
三次询问可以确定我们都能说话,且都能听到对方说话。
其实三次握手就是确定客户端和服务区能收能发的过程。
为什么必须要三次?
从打电话那个图我们也可以很好理解
三次握手就能确认双方收发功能都正常,缺一不可。
若缺少第三次握手,服务器是无法确定自己可以发送信息的,而四次又没有必要,所以三次刚好,即能完成任务又不浪费资源~
四次挥手详解
挥手其实就是断开连接的过程!
第一次挥手:客户端发送一个FIN(seq=x)的数据包给服务器,告诉对方我发完了,自己进入FIN-WAIT-1状态。
第二次挥手:服务区收到后,发送一个ACK(ack=x+1)的数据包给客户端,然后服务器变为CLOSE-WAIT状态,客户端收到后进入FIN-WAIT-2状态。
第三次挥手:服务器发送一个FIN(seq=y)的数据包给客户端,服务器变为LAST-ACK状态。
第四次挥手:客户端收到服务器的FIN后,返回给服务器一个ACK(seq=y+1)的数据包,客户端进入TIME-WAIT状态,服务器收到ACK后进入CLOSE状态。如果客户端等到2msl后依旧没有收到信息则默认服务器已正常关闭,然后自己也进入关闭状态。
和挂电话一样
为什么要四次挥手?
TCP 是全双工通信,可以双向传输数据。
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。
当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。
和三次握手一样,但是挥手多了一次就是因为 中间可能还有信息没有发完,所以第二次和第三次的ACK和FIN不能合并发送!没有发完的信息在这两次回收之前发完!
这就好像打电话时候的 "你等我把话说完" "巴拉巴拉巴拉~~" "好了,挂了吧"
第四次为何要等待 2*MSL?
第四次挥手时,客户端发送给服务器的 ACK 有可能丢失,如果服务端因为某些原因而没有收到 ACK 的话,服务端就会重发 FIN,如果客户端在 2*MSL 的时间内收到了 FIN,就会重新发送 ACK 并再次等待 2MSL,防止 Server 没有收到 ACK 而不断重发 FIN。