三次握手和四次挥手图解_图解TCP三次握手和四次挥手
三次揮手
為什么建立連接需要三次握手?
三次握手的目的:為了防止已經失效的連接請求報文段突然又傳到服務端,因而產生錯誤,保證在信道上傳輸可靠的數據
第一次握手:客戶端發送syn包(syn=j)到服務器,并進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(建立)狀態,完成三次握手。握手過程中傳送的包里不包含數據,三次握手完畢后,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。
假設有這樣一次場景:客戶端(A) ? 服務端(B)
????????客戶端A發出去的第一個連接請求報文并沒有丟失,而是因為某些未知的原因在某個網絡節點上發生滯留,導致延遲到連接釋放以后的某個時間才到達服務端B,但是服務端B收到此失效的報文之后,會誤認為是客戶端A再次發出的一個新的連接請求,于是B就向A又發出確認報文,表示同意建立連接。
????????如果此時沒有三次握手,那么只要B端發出確認報文就會認為新的連接已經建立了,但是A端并沒有發出建立連接的請求,因此不會去向B端發送數據,B端沒有收到數據就會一直等待。這樣B端就會白白浪費掉很多資源
????????如果采用的是三次握手,就算是那一次失效的報文傳送過來了,服務端接受到了那條失效報文并且回復了確認報文,但是客戶端不會再次發出確認。由于服務器收不到確認,就知道客戶端并沒有請求連接。
從以上流程可以看到,3次握手,是可以讓通信雙方確認連接有效,以進行正常全雙工通信認知的最少“握手”次數。所以TCP選擇了3次握手~
四次揮手
為什么斷開連接需要四次揮手?
四次揮手的目的:因為TCP是一個全雙工協議,必須單獨拆除每一條信道。4次揮手的目的是終止數據傳輸,保證數據傳輸完成,并回收資源。
第一步,客戶端主動發起一個請求給服務端,里面包含FIN標識位=1,客戶端的seq序列號u,表示的是當前客戶端在該連接上的當前序列號。
第二步,服務端在收到這個含有FIN的請求消息之后,校驗無誤之后會立馬回復ACK消息給客戶端,消息內部包含ACK標志位為1,同時seq號碼是FIN的請求消息的seq號+1。此時的服務端同時會主動發個結束標識給服務端上面的應用層程序,應用層程序可以決定是立馬結束,還是等到該連接中的數據處理完了之后,在發送FIN消息給客戶端來關掉另外的一半連接。
第三步,服務端在處理完該連接上面的Pending住的數據之后,應用程序會close這個連接。服務端會主動發起FIN的消息給客戶端。消息內部帶有,FIN=1的結束符標識位,以及服務端的seq序列號。
第四步,客戶端在收到對應的FIN消息之后,會主動通知應用層程序,告知這個連接現在需要關閉了。然后,客戶端會回復ACK消息給服務端,以便斷開另外一個方向的通道,這個消息包含ACK=1的標識位和FIN的請求帶過來的seq+1。
假設有這樣一次場景:客戶端(A) ? 服務端(B)
????????客戶端和服務端通過3次握手建立連接,此時客戶端數據全部發送完成,需要斷開連接,客戶端就會向服務端發送斷開請求。
????????服務器收到對方的客戶端發送關閉報文時,僅僅表示客戶端不再發送數據了但是還能接收數據,而服務器也未必全部數據都發送給客服端了,所以服務器可以立即關閉,也可以繼續發送數據給客戶端,如果有數據未發送完畢,就需要通知客戶端,我還有數據未發送完,不要斷開連接。等全部數據傳輸完成服務端在發送斷開請求。客服端收到服務端斷開報文后,重新發送一個斷開確認報文,服務端收到斷開報文后便斷開連接。
這樣便保證了數據傳輸完成,資源回收~
錯誤之處,望指正~
總結
以上是生活随笔為你收集整理的三次握手和四次挥手图解_图解TCP三次握手和四次挥手的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 研究:格陵兰冰川的融化速度比 20 年前
- 下一篇: 爬虫的步骤解析内容xpath介绍_爬虫入