天天看點

TCP三向交握和四次揮手詳解

TCP(Transmission Control Protocol)網絡傳輸控制協定,是一種面向連接配接的、可靠的、基于位元組流的傳輸層通信協定,資料傳輸前建立連接配接的工作要經過三次握手,資料傳輸後斷開連接配接的工作要經過四次揮手。

TCP共有6個标志位,分别是:

SYN(synchronous),建立聯機。

ACK(acknowledgement),确認。

PSH(push),傳輸。

FIN(finish),結束。

RST(reset),重置。

URG(urgent),緊急。

第一次握手:用戶端要和服務端進行通信,首先要告知服務端一聲,遂發出一個SYN=1的連接配接請求信号,”服務端哥哥,我想給你說說話”。

第二次握手:當服務端接收到用戶端的連接配接請求,此時要給用戶端一個确認資訊,”我知道了(ACK),我這邊已經準備好了,你現在能連嗎(SYN)”。

第三次握手:當用戶端收到了服務端的确認連接配接資訊後,要禮貌的告知一下服務端,“好的,咱們開始聯通吧(ACK)”。

到此整個建立連接配接的過程已經結束,接下來就是雙方你一句我一句甚至同時交流傳遞資訊的過程了。

第一次揮手:雙方交流的差不多了,此時用戶端也已經結尾了,接下來要斷開通信連接配接,是以告訴服務端“我說完了(FIN)”,此時自身形成等待結束連接配接的狀态。

第二次揮手:服務端知道用戶端已經沒話說了,服務端此時還有兩句心裡話要給用戶端說,“我知道你說完了(ACK),我再給你說兩句,&*……%¥”。

第三次揮手:此時用戶端洗耳恭聽繼續處于等待結束的狀态,伺服器端也說完了,自身此時處于等待關閉連接配接的狀态,并對告訴用戶端,“我說完了,咱們斷了吧(FIN)”。

第四次揮手:用戶端收知道服務端也說完了,也要告訴服務端一聲(ACK),因為連接配接和斷開要雙方都按下關閉操作才能斷開,用戶端同時又為自己定義一個定時器,因為不知道剛才說的這句話能不能準确到達服務端(網絡不穩定或者其他因素引起的網絡原因),預設時間定為兩個通信的最大時間之和,超出這個時間就預設伺服器端已經接收到了自己的确認資訊,此時用戶端就關閉自身連接配接,伺服器端一旦接收到用戶端發來的确定通知就立刻關閉伺服器端的連接配接。

到此為止雙方整個通信過程就此終結。這裡要聲明一下:斷開連結不一定就是用戶端,誰都可以先發起斷開指令,另外用戶端和服務端是沒有固定标準的,誰先發起請求誰就是用戶端。

1.為什麼斷開連結的時候用戶端設定的定時器時間等待要2MSL(兩個通信封包的最大時間)? 

這個問題也很好了解,當用戶端最終告訴伺服器端斷開确認的時候,他不知道自己的發出的指令是否能準确的一次性被伺服器接收。假如伺服器沒有接收到(這已經耗費了一個封包的最大通信時間了),伺服器端将會重新發起一個結束通話的指令(FIN)到用戶端,用戶端又接收到了伺服器發來的結束通信指令将繼續給伺服器進行一個确認,有人會說那要是用戶端發出的确認資訊服務端沒收到,而服務端重發的斷開指令用戶端也沒收到怎麼辦,說實話我也無奈,遇到這種情況咱們幹脆認為網确實不行了。

2.為什麼建立連接配接要三次握手而斷開連接配接要四次揮手? 

說起這個,打一個比喻,目前祖國正在高速發展高鐵,建立連接配接的過程正如上海到北京打通一條高鐵線,TCP通信過程是一個全雙工模式,即在這條高鐵線上要有兩個軌道,即能從上海發車到北京又能從北京發車到上海,甚至兩邊可以同時發車。是以斷開連接配接前提就是要保證兩條軌道都沒有車,然後雙方才能各自發起斷開動作。

用戶端工作流程: 

注意:在TIME_WAIT狀态中,如果TCP client端最後一次發送的ACK丢失了,它将重新發送。TIME_WAIT狀态中所需要的時間是依賴于實作方法的。典型的值為30秒、1分鐘和2分鐘。等待之後連接配接正式關閉,并且所有的資源(包括端口号)都被釋放。

伺服器端工作流程: 

TCP三向交握和四次揮手詳解

本文轉自 遊騎兵vtx 51CTO部落格,原文連結:http://blog.51cto.com/qibingtuan/1968842

繼續閱讀