TCP與DUP知識點整理

一個暱稱而已T發表於2017-09-22

首先,需要知道的是,TCP、UDP協議對應於傳輸層


1、TCP連線的三次握手

三次握手

第一次握手(SYN=1, seq=x):
客戶端傳送一個 TCP 的 SYN 標誌位置1的報文段,指明客戶端打算連線的伺服器的埠,以及初始序號 X(由客戶端隨機選擇,即client_isn),儲存在包頭的序列號(Sequence Number)欄位裡。
傳送完畢後,客戶端進入 SYN_SEND 狀態。

第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):
伺服器發回確認報文段(ACK)應答。即 SYN 標誌位和 ACK 標誌位均為1。伺服器端選擇自己ISN序列號Y(server_isn),放到 Seq 域裡,同時將確認序號(Acknowledgement Number)設定為客戶的 ISN 加1,即X+1。 傳送完畢後,伺服器端進入 SYN_RCVD 狀態。

第三次握手(ACK=1,ACKnum=y+1)
客戶端再次傳送確認包(ACK),SYN 標誌位為0,ACK 標誌位為1,並且把伺服器發來 ACK 的序號欄位+1,放在確定欄位中傳送給對方,並且在資料段放寫ISN的+1。
傳送完畢後,客戶端進入 ESTABLISHED 狀態,當伺服器端接收到這個包時,也進入 ESTABLISHED 狀態,TCP 握手結束。

握手過程中傳送的報文段不包含應用層資料,三次握手完畢後,客戶端與伺服器才正式開始傳送資料。理想狀態下,TCP連線一旦建立,在通訊雙方中的任何一方主動關閉連線之前,TCP 連線都將被一直保持下去。

簡單的說就是Tcp的三次握手簡單來說:
第一次握手是客戶端向服務端傳送一個建立連線的請求,
第二次握手是服務端向客服端回覆建立連線的請求的確認,
第三次握手是客服端對服務端確認連線的確認。

2、TCP斷開連線的四次揮手

四次揮手
客戶端或伺服器均可主動發起揮手動作,在 socket 程式設計中,任何一方執行 close() 操作即可產生揮手操作。

第一次揮手(FIN=1,seq=x)
假設客戶端想要關閉連線,客戶端傳送一個 FIN 標誌位置為1的包,表示自己已經沒有資料可以傳送了,但是仍然可以接受資料。
傳送完畢後,客戶端進入 FIN_WAIT_1 狀態。

第二次揮手(ACK=1,ACKnum=x+1)
伺服器端確認客戶端的 FIN 包,傳送一個確認包,表明自己接受到了客戶端關閉連線的請求,但還沒有準備好關閉連線。
傳送完畢後,伺服器端進入 CLOSE_WAIT 狀態,客戶端接收到這個確認包之後,進入 FIN_WAIT_2 狀態,等待伺服器端關閉連線。

第三次揮手(FIN=1,seq=y)
伺服器端準備好關閉連線時,向客戶端傳送結束連線請求,FIN 置為1。
傳送完畢後,伺服器端進入 LAST_ACK 狀態,等待來自客戶端的最後一個ACK。

第四次揮手(ACK=1,ACKnum=y+1)
客戶端接收到來自伺服器端的關閉請求,傳送一個確認包,並進入 TIME_WAIT狀態,等待可能出現的要求重傳的 ACK 包。
伺服器端接收到這個確認包之後,關閉連線,進入 CLOSED 狀態。

簡單的說就是:
第一次握手,主機A告訴主機B,我沒有資料要傳送了,請求關閉。
第二次握手,主機B回覆主機A,你的請求我收到了,但是我還沒準備好,你等我訊息。
第三次握手,主機B向主機A請求關閉連線(注意,第二次握手是主機B 同意 主機A的關閉連線的請求)。
第四次握手,主機A向主機B傳送確認斷開連線請求,B收到後就關閉連線請求,A等待2MSL(兩個最大段生命週期,2 Maximum Segment Lifetime)後依然沒有收到回覆,則證明B已經正常斷開,A也關閉連線。

3、為什麼TCP是三次握手,四次揮手

(1)
因為 TCP 是雙向通訊協議,作為響應一方(Responder) 要想初始化傳送通道,必須也進行一輪 SYN + ACK。由於 SYN、ACK 在 TCP 分組頭部是兩個標識位,因此處於優化目的被合併了。所以達到雙方都能進行收發的狀態只需要 3 個分組。
拿兩臺主機舉例,在標準3-way handshake中,主機a傳送SYN去主機b,主機b接收到後傳送SYN-ACK資訊回主機a表示收到syn並確認,主機a收到後發ACK回主機b表示收到確認資訊。這樣兩臺主機都知道了對方準備好進行tcp通訊。
通俗的說就是:三次剛好夠雙方都確認已經建立起了連線。(三次握手不是TCP本身的要求, 而是為了滿足”在不可靠通道上可靠地傳輸資訊”這一需求所導致的)

(2)
原因是因為tcp是全雙工模式,接收到FIN時意味將沒有資料再發來,但是還是可以繼續傳送資料。
通俗的說:假如現在你是客戶端你想斷開跟Server的所有連線該怎麼做?第一步,你自己先停止向Server端傳送資料,並等待Server的回覆。但事情還沒有完,雖然你自身不往Server傳送資料了,但是因為你們之前已經建立好平等的連線了,所以此時他也有主動權向你傳送資料;故Server端還得終止主動向你傳送資料,並等待你的確認。其實,說白了就是保證雙方的一個合約的完整執行!


4、TCP和UDP的區別

TCP是面向連結的,雖然說網路的不安全不穩定特性決定了多少次握手都不能保證連線的可靠性,但TCP的三次握手在最低限度上(實際上也很大程度上保證了)保證了連線的可靠性;而UDP不是面向連線的,UDP傳送資料前並不與對方建立連線,對接收到的資料也不傳送確認訊號,傳送端不知道資料是否會正確接收,當然也不用重發,所以說UDP是無連線的、不可靠的一種資料傳輸協議。
簡單的說,TCP注重資料可靠性,而UDP資料傳輸快點,但安全性一般。


5、淺析TCP位元組流與UDP資料包的區別


參考文章:
https://hit-alibaba.github.io/interview/basic/network/TCP.html
https://hit-alibaba.github.io/interview/basic/network/UDP.html
TCP三次握手和四次揮手

另外附上一篇文章:
TCP/IP、Http、Socket的區別
講的通俗易懂。

相關文章