TCP连接建立三次握手和TCP连接释放四次挥手(正解篇)

一、参考文章

https://blog.csdn.net/lengxiao1993/article/details/82771768

多次在网络博客上学习到的错误解读是:

  1. 防止已失效的连接请求又传送到服务器端,因而产生错误。

 但这种解释不准确。

正确的解释是:

  • 为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤。
  • 如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认。

 

第一次握手:客户端向服务器端发送链接请求的报文段,syn(请求序列连接)=1,seq=x,等待服务器确认;

第二次握手:服务器收到syn包并确认,同时发送一个syn包应答,syn=1,seq=y,ack=x+1;

第三次握手:客户端收到服务器的连接应答包后,向服务器发送确认包ACK,发送完毕后,双方进入TCP成功连接状态,完成三次握手。

为什么需要三次,而不是两次?

为了实现可靠传输,发送方和接收方始终需要同步序号(SYN)。 三次握手的过程就是通信上方相互告知起始序号,并确认对方已经收到了序列号的起始值。如果只是两次握手,那么最多只有发起方的序列号能被确认,另一方选择的序列号得不到确认。

二、TCP连接释放四次挥手 

 

第一次挥手:客户端发出连接释放报文,并且停止发送数据;

第二次挥手:服务器收到连接释放报文,发出确认报文;

第三次挥手:客户端收到确认后,等待服务器发送连接释放报文(在这之前还需要接收服务器发送的最后数据),服务器将最后的数据发送完毕后,就向客户端发送连接释放报文;

第四次挥手:客户端收到服务器的连接释放报文后,必须发出确认,进入等待状态。注意此时的连接还没有释放,经过2MSL时间后,进入closed状态。服务器只要收到客户端发出的确认立即进入closed状态。

为什么TIME_WAIT状态要客户端经过2MSL才能返回到closed状态?

 因为必须假想网络是不可靠的,最后一个ACK有可能丢失,所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章