談談TCP協議的三次握手和四次揮手

sun_xin發表於2018-10-25

TCP協議

Transmission Control Protocol傳輸控制協議,屬於傳輸層通訊協議,基於TCP的應用層協議有Htt,smtp,ftp等

TCP的特性

  • 面向連線: 傳輸資料之前會先建立連線,資料傳輸完畢之後釋放連線

  • 全雙工通訊:連線建立以後,通訊雙方能互相傳送資料

  • 安全可靠:通過TCP傳送的資料不丟失,無差錯,按序到達

  • TCP 使用校驗和,確認和重傳機制來保證可靠傳輸

  • 資料以位元組流的方式傳輸

  • 傳輸效率較低,因為需要建立連線和傳送確認包等

注意: TCP 並不能保證資料一定會被對方接收到,因為這是不可能的。TCP 能夠做到的是,如果有可能,就把資料遞送到接收方,否則就(通過放棄重傳並且中斷連線這一手段)通知使用者。因此準確說 TCP 也不是 100% 可靠的協議,它所能提供的是資料的可靠遞送或故障的可靠通知。

TCP建立連線的過程(三次握手)

三次握手指的是建立一個TCP連線需要客戶端和伺服器一共傳送3個包。三次握手的目的是連線伺服器指定埠,建立 TCP 連線,並同步連線雙方的序列號和確認號,交換 TCP 視窗大小資訊。在 socket 程式設計中,客戶端執行 connect() 時。將觸發三次握手。

image.png

通過抓包可以看到具體,紅框表示三次握手,黃框表示四次揮手。可以看到傳送的標記為和序列號和確認號。

image.png

首先,客戶端和服務端都是處於關閉的狀態,直到客戶端主動開啟連線,服務端會被動開啟連線,服務端現在處於listen狀態。

SYN,ACK,Seq到底是什麼東西

SYN,ACK 是TCP的標記位,TCP的標記位一共有6種。

  • SYN(synchronous建立聯機)

  • ACK(acknowledgement 確認)

  • PSH(push傳送)

  • FIN(finish結束)

  • RST(reset重置)

  • URG(urgent緊急)

  • Sequence number(順序號碼)

  • Acknowledge number(確認號碼)


1. 第一次握手(SYN=1,seq=x)

客戶端A傳送一個位碼 SYN = 1,然後會隨機產生一個序列號 seq = 1234567的資料包到伺服器,這個時候伺服器收到SYN=1知道了客戶端A要求建立連線。客戶端A此時處於SYN_SEND狀態

2. 第二次握手(SYN = 1, ACK = 1,seq = y, ack = x + 1)

伺服器收到請求連線資訊之後要確認聯機資訊,向主機A傳送ack number =(主機A的seq + 1 ),SYN = 1,ACK = 1,隨機產生一個序列號 seq = 7654321。 伺服器此時處於 SYN_RCVD狀態。

3. 第三次握手(ACK = 1 ,ack = y + 1)

主機A收到後檢查ack number是否正確,即第一次傳送的seq number+1,以及位碼ack是否為1,若正確,主機A會再傳送ack number=(伺服器seq+1),ack=1,然後主機A進入ESTABLISHED狀態。伺服器收到後確認seq值與ack=1則連線建立成功。伺服器也進入ESTABLISHED狀態。

Q1:為什麼TCP建立連線要進行三次握手

防止伺服器端因接收了早已失效的連線請求報文,從而一直等待客戶端請求,最終導致形成死鎖、浪費資源

TCP釋放連線的過程(四次揮手)

通訊結束之後,雙方都需要釋放連線,需要四次揮手

image.png

1. 第一次揮手(FIN = 1,seq = u)

客戶端想要關閉連線,會傳送一個標記位FIN = 1的包,表明已經沒有資料可以傳送了,但是仍可以接收資料。

此時客戶端處於FIN_WAIT_1狀態

2. 第二次揮手(ACK = 1 , ack = u+1)

服務端收到了客戶端的FIN包,然後傳送一個ACK = 1 的確認包,表明自己接收到了客戶端的關閉連線的請求,但是還沒準備好關閉。服務端傳送完畢之後,進入CLOSE_WAIT狀態。客戶端收到這個包的時候進入FIN_WAIT_2狀態。

3. 第三次揮手(FIN = 1,seq = w)

當服務端準備好關閉連線的時候,向客戶端傳送FIN=1,表明自己準備好關閉連線了。傳送完畢之後服務端進入LASK_ACK狀態,等待客戶端的最後一個確認ACK。

4. 第四次揮手(ACK = 1,ack = w+1)

客戶端接收到了服務端的的關閉請求之後,傳送最後一個ACK=1確認包,然後進入到TIME_WAIT狀態,等待可能出現的ACK包。伺服器收到最後一個ACK之後,確認關閉連線,進入CLOSE狀態。

客戶端在等待了某個固定時間之後,沒有收到服務端的ACK,就認為服務端已經正常關閉連線了,於是也將自己的連線關閉了,進入CLOSE狀態。

UDP協議

UDP 是一個簡單的傳輸層協議。

UDP的特性

  • 無連線。UDP的客戶端和伺服器不必存在長期連線的關係。UDP在傳送資料包之前也不用先與服務端建立連線

  • 不可靠。UDP 本身不提供確認,序列號,超時重傳等機制。UDP 資料包可能在網路中被複制,被重新排序。即 UDP 不保證資料包會到達其最終目的地,也不保證各個資料包的先後順序,也不保證每個資料包只到達一次。

  • 資料包是有長度限制的。

  • UDP支援廣播和多播。

  • 傳輸效率高

本篇文章主要介紹了TCP建立連線的三次握手和釋放連線的四次揮手。

參考:

計算機網路:這是一份全面 & 詳細 的TCP協議攻略

TCP三次握手中SYN,ACK,Seq三者的關係

相關文章