TCP的三次握手與四次揮手詳解

petterchx發表於2021-09-09

TCP的傳輸如圖:

圖片描述


TCP三次握手的過程如下:

建立TCP連線,就是指建立一個TCP連線時,需要客戶端和服務端總共傳送3個包以確認連線的建立。在socket程式設計中,這一過程由客戶端執行connect來觸發。

在TCP/IP協議中,TCP協議提供可靠的連線服務,採用三次握手建立一個連線.

第一次握手:Client將標誌位SYN置為1,隨機產生一個值seq=J,並將該資料包傳送給Server,Client進入SYN_SENT狀態,等待Server確認。

SYN:同步序列編號(Synchronize Sequence Numbers)

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

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

圖片描述

為什麼需要三次握手,是為了解決下列的一個問題:

client發出的第一個連線請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連線釋放以後的某個時間才到達server。本來這是一個早已失效的報文段。但server收到此失效的連線請求報文段後,就誤認為是client再次發出的一個新的連線請求。於是就向client發出確認報文段,同意建立連線。假設不採用三次握手,那麼只要server發出確認,新的連線就建立了。由於現在client並沒有發出建立連線的請求,因此不會理睬server的確認,也不會向server傳送資料。但server卻以為新的運輸連線已經建立,並一直等待client發來資料。這樣,server的很多資源就白白浪費掉了。採用三次握手的辦法可以防止上述現象發生

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

TCP四次揮手的過程如下:

圖片描述

 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狀態,完成四次揮手。

如果有大量的連線,每次在連線、關閉時都要三次握手,四次揮手,會很明顯會造成效能低下,因此,

HTTP有一種叫做keep connection的機制,它可以在傳輸資料後仍然保持連線,當客戶端再次獲取資料時,直接使用剛剛空閒下的連線而無需再次握手

圖片描述


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4606/viewspace-2818364/,如需轉載,請註明出處,否則將追究法律責任。

相關文章