1. 程式人生 > >TCP的握手和揮手

TCP的握手和揮手

lose protoc 不可靠 prot 聯機 是否 http 重要 ado

  • 什麽是TCP
    TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接的、可靠的、基於字節流的傳輸層通信協議,由IETF的RFC 793定義。在簡化的計算機網絡OSI模型中,它完成第四層傳輸層所指定的功能,用戶數據報協議(UDP)是同一層內 [1] 另一個重要的傳輸協議。在因特網協議族(Internet protocol suite)中,TCP層是位於IP層之上,應用層之下的中間層。不同主機的應用層之間經常需要可靠的、像管道一樣的連接,但是IP層不提供這樣的流機制,而是提供不可靠的包交換。
    技術分享圖片
    先了解一下下面的名詞:
    SYN ( synchronous 建立聯機 )
  • ACK ( acknowledgement 確認 )

    PSH ( push 傳送 )

    FIN ( finish 結束 )

    RST ( reset 重置 )

    URG ( urgent 緊急 )

    Sequence number ( 順序號碼 )

    Acknowledge number ( 確認號碼 )

    2.TCP的三次握手
    技術分享圖片
    所謂三次握手(Three-Way Handshake)即建立 TCP 連接,是指建立一個 TCP 連接時,需要客戶端和服務端總共發送 3 個包以確認連接的建立。
    (1)第一次握手:Client 將標誌位 SYN 置為 1,隨機產生一個值 seq=J,並將該數據包發送給 Server,Client 進入 SYN_SENT 狀態,等待 Server 確認。

    (2)第二次握手:Server 收到數據包後由標誌位 SYN=1 知道 Client 請求建立連接,Server 將標誌位 SYN 和 ACK 都置為 1,ack ( number ) =J+1,隨機產生一個值 seq=K,並將該數據包發送給 Client 以確認連接請求,Server 進入 SYN_RCVD 狀態。

    (3)第三次握手:Client 收到確認後,檢查 ack 是否為 J+1,ACK 是否為 1,如果正確則將標誌位 ACK 置為 1,ack=K+1,並將該數據包發送給 Server,Server 檢查 ack 是否為 K+1,ACK 是否為 1,如果正確則連接建立成功,Client 和 Server 進入 ESTABLISHED 狀態,完成三次握手,隨後 Client 與 Server 之間可以開始傳輸數據了

    3.四次揮手
    技術分享圖片
    所謂四次揮手(Four-Way Wavehand)即終止 TCP 連接,就是指斷開一個 TCP 連接時,需要客戶端和服務端總共發送 4 個包以確認連接的斷開。
    由於 TCP 連接是全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個 FIN 來終止這一方向的連接,收到一個 FIN 只是意味著這一方向上沒有數據流動了,即不會再收到數據了,但是在這個 TCP 連接上仍然能夠發送數據,直到這一方向也發送了 FIN。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉,上圖描述的即是如此。

    (1)第一次揮手:Client 發送一個 FIN,用來關閉 Client 到 Server 的數據傳送,Client 進入 FIN_WAIT_1 狀態。

    (2)第二次揮手:Server 收到 FIN 後,發送一個 ACK 給 Client,確認序號為收到序號 +1(與 SYN 相同,一個 FIN 占用一個序號),Server 進入 CLOSE_WAIT 狀態。

    (3)第三次揮手:Server 發送一個 FIN,用來關閉 Server 到 Client 的數據傳送,Server 進入 LAST_ACK 狀態。

    (4)第四次揮手:Client 收到 FIN 後,Client 進入 TIME_WAIT 狀態,接著發送一個 ACK 給 Server,確認序號為收到序號 +1,Server 進入 CLOSED 狀態,完成四次揮手。
    需要註意的是:

    (A)不要將確認序號 Ack 與標誌位中的 ACK 搞混了。

    (B)確認方 Ack= 發起方 Req+1,兩端配對。

    TCP的握手和揮手