面試必問之 TCP/IP協議的三次握手 四次揮手

暴躁的熱心網友皮皮文發表於2018-05-10

面向連線的協議端對端的協議 TCP 報文的關鍵字:

SYN:建立新的連線請求 ACK:確認請求序號(必須是1,ack才有效) seq:傳送資料的位元組流的序號標記 fin:釋放一個連線,bu'f

全雙工:兩個方向都可以傳輸 單工:只有一個單方向可以傳輸 半雙工:傳輸方向不固定,但每次只能有一個方向傳輸狀態處於啟用狀態

需要注意的是: (A)不要將確認序號Ack與標誌位中的ACK搞混了。 (B)確認方Ack=發起方Req+1,兩端配對。

三次握手:

面試必問之 TCP/IP協議的三次握手 四次揮手

這一過程由客戶端執行connect來觸發,整個流程如上圖所示: TCP三次握手 (1)第一次握手:Client將標誌位SYN置為1,隨機產生一個值seq=J,並將該資料包傳送給Server,Client進入SYN_SENT狀態,等待Server確認。 (2)第二次握手:Server收到資料包後由標誌位SYN=1知道Client請求建立連線,Server將標誌位SYN和ACK都置為1,ack=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之間可以開始傳輸資料了。

四次揮手: 三次握手耳熟能詳,所謂四次揮手(Four-Way Wavehand)即終止TCP連線,就是指斷開一個TCP連線時,需要客戶端和服務端總共傳送4個包以確認連線的斷開。在socket程式設計中,這一過程由客戶端或服務端任一方執行close來觸發,整個流程如下圖所示:

面試必問之 TCP/IP協議的三次握手 四次揮手
這裡寫圖片描述 圖3 TCP四次揮手 由於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狀態,完成四次揮手。

相關文章