1. 程式人生 > >TCP連線詳解

TCP連線詳解

一. 連線過程示意圖

  

 二. 建立TCP連線

2.1 三次握手

  1. 第一次握手:建立連線。客戶端傳送連線請求報文段,將SYN置為1,Sequence Number為x;然後,客戶端進入SYN_SEND狀態,等待伺服器的確認;
  2. 第二次握手:伺服器收到SYN報文段。伺服器收到客戶端的SYN報文段,需要對這個SYN報文段進行確認,設定Acknowledgment Number為Sequence Number+1;同時,自己自己還要傳送SYN請求資訊,將SYN位置為1,Sequence Number為y;伺服器端將上述所有資訊放到一個報文段(即SYN+ACK報文段)中,一併傳送給客戶端,此時伺服器進入SYN_RECV狀態;
  3. 第三次握手:客戶端收到伺服器的SYN+ACK報文段。然後將Acknowledgment Number設定為y+1,向伺服器傳送ACK報文段,這個報文段傳送完畢以後,客戶端和伺服器端都進入ESTABLISHED狀態,完成TCP三次握手。

2.2 為什麼三次握手 

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

三. 斷開TCP連線

3.1 四次揮手

  1. 第一次揮手:主機1(可以使客戶端,也可以是伺服器端),設定Sequence Number和Acknowledgment Number,向主機2傳送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有資料要傳送給主機2了 
  2. 第二次揮手:主機2收到了主機1傳送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number為Sequence Number加1;主機1進入FIN_WAIT_2狀態;主機2告訴主機1,我“同意”你的關閉請求 
  3. 第三次揮手:主機2向主機1傳送FIN報文段,請求關閉連線,同時主機2進入LAST_ACK狀態;
  4. 第四次揮手:主機1收到主機2傳送的FIN報文段,向主機2傳送ACK報文段,確認關閉連線。然後主機1進入TIME_WAIT狀態;主機2收到主機1的ACK報文段以後,此時,主機1等待2MSL後依然沒有收到回覆,則證明Server端已正常關閉,那好,主機1也可以關閉連線了。