一看就懂的TCP握手和揮手

今晚打老虎嗎發表於2019-04-08

TCP三次握手

TCP是一個面向連線的的協議,所以無論哪一方傳送資料之前都必須要建立連線。三次握手是TCP/IP網路中用於在本地主機/客戶端和伺服器之間建立連線的方法。這是一種三步方法,要求客戶機和伺服器在實際資料通訊開始之前交換SYN和ACK(確認)資料包。 要建立連線,將發生三次握手:

1.SYN:主動開啟由客戶機向伺服器傳送syn來執行。客戶機將段的序列號(SEQ)設定為隨機值A。
2.SYN-ACK:作為響應,伺服器用SYN-ACK進行響應。確認號被設定為比接收到的序列號多一個,即A+1,伺服器為資料包選擇的序列號是另一個隨機數B。
3.最後,客戶機將一個ACK傳送回伺服器。序列號設定為接收到的確認值,即A+1,確認號設定為接收到的序列號(即B+1)的一個以上。

此時,客戶機和伺服器都已收到連線確認。步驟1、2建立一個方向的連線引數(序列號),並確認。步驟2、3為另一個方向建立連線引數(序列號),並確認。通過這些,建立了全雙工通訊。

TCP 3-way and 4-way handshake

TCP四次揮手

TCP的關閉是四次,也就是說需要雙方都傳送FIN告知對方我要關閉了,並回復FIN-ACK。所以在一方關閉的時候另一方還可以傳送資料,我們把這種現象稱為TCP半關閉。當然主動方發起方也可以選擇不接受。TCP四次揮手:

1.FIN:主動開啟方通知向被動方傳送FIN,告知被動方我已經完成資料傳送要關閉連線了。自己進入FIN_WAIT1
2.ACK:伺服器收到對方FIN並回復ACK告知我已收到(這裡不像建立連線一樣,把ACK和自己的FIN一起傳送是因為自己有可能還沒完成資料的傳輸)自己可以繼續進行未完成的資料傳輸並把狀態設定成CLOSE_WAIT,對方收到ACK把自己的狀態變成FIN_WAIT2並繼續等待被動方的FIN
3.FIN:服務端資料傳輸完成後向主動開啟方傳送傳送FIN,等待對方的ACK,被動關閉的一方進入LAST_ACK狀態
4.ACK:主動方收到被動方傳送的FIN,回覆ACK

此時,主動方進入到TIME_WAIT狀態然後等待2MSL(Maximum segment lifetime 它是任何報文段被丟棄前在網路內的最長時間)後進入到CLOSED關閉,被動方收到ACK後進入到CLOSED。因為網路環境是複雜多變的,有可能自己的最後一個ACK丟失導致對方重傳FIN。所以主動發起方要等待2MSL來預防對方重傳
最後附上一副TCP狀態機,可以參考TCP/IP illustrated Vol. 1 第18章(強烈推薦英文版,如果英文不好可以買本中文的參考著看)

TCP state machine

相關文章