【基礎知識】TCP三次握手四次揮手|

1.TCP三次握手與四次揮手

TCP報文格式

上圖中有幾個字段需要重點介紹下:
        (1)序號:Seq序號,佔32位,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記。
        (2)確認序號:Ack序號,佔32位,只有ACK標誌位爲1時,確認序號字段纔有效,Ack=Seq+1。
        (3)標誌位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:
                (A)URG:緊急指針(urgent pointer)有效。
                (B)ACK:確認序號有效。
                (C)PSH:接收方應該儘快將這個報文交給應用層。
                (D)RST:重置連接。
                (E)SYN:發起一個新連接。(表示這個報文使用來建立新連接用的)
                (F)FIN:釋放一個連接。

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

三次握手

TCP服務器進程先創建傳輸控制模塊TCB,準備接受客戶進程的連接請求,然後服務器進程就處於LISTEN(監聽)狀態,等待客戶的連接請求 

  1. 第一次握手:Client將標誌位SYN置爲1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。(TCP規定,SYN報文段(即SYN=1的報文段)不能攜帶數據,但要消耗掉一個序號。)
  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狀態

 簡化一下不看Seq和ack的話過程如下:

  1. 客戶端發送SYN給服務端
  2. 服務端返回SYN+ACK給客戶端
  3. 客戶端確認,返回ACK給服務端

完成三次握手,客戶端與服務器開始傳送數據。

爲什麼客戶端還要發送一次確認呢?

這主要是爲了防止已失效的連接請求報文段突然又傳送到了服務器,因而產生錯誤。

  假定A發出的某一個連接請求報文段在傳輸的過程中並沒有丟失,而是在某個網絡節點長時間滯留了,以致延誤到連接釋放以後的某個時間纔到達B。本來這是一個早已失效的報文段。但B收到此失效的連接請求報文段後,就誤以爲A又發了一次新的連接請求,於是向A發出確認報文段,同意建立連接。假如不採用三次握手,那麼只要B發出確認,新的連接就建立了。

  由於A並未發出建立連接的請求,因此不會理睬B的確認,也不會向B發送數據。但B卻以爲新的運輸連接已經建立了,並一直等待A發來數據,因此白白浪費了許多資源。

  採用TCP三次握手的方法可以防止上述現象發生。例如在剛纔的情況下,由於A不會向B的確認發出確認,B由於收不到確認,就知道A並沒有要求建立連接。

四次揮手

  1. 客戶端發送一個報文給服務端(沒有數據),用來關閉Client到Server的數據傳送,其中FIN設置爲1,Sequence Number置爲u,客戶端進入FIN_WAIT_1狀態
  2. 服務端收到來自客戶端的請求,發送一個ACK給客戶端,Acknowledge置爲u+1,同時發送Sequence Number爲v,服務端年進入CLOSE_WAIT狀態
  3. 服務端發送一個報文給客戶端,用來關閉Server到Client的數據傳送,其中FIN設置爲1,ACK置爲1,Sequence置爲w,Acknowledge置爲u+1,用來關閉服務端到客戶端的數據傳送,服務端進入LAST_ACK狀態
  4. 客戶端收到FIN後,進入TIME_WAIT狀態,接着發送一個ACK給服務端,Acknowledge置爲w+1,Sequence Number置爲u+1,最後客戶端和服務端都進入CLOSED狀態

簡化一下不看Seq和ack:

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

爲什麼建立連接是三次握手,而關閉連接卻是四次揮手呢?

這是因爲服務端在LISTEN狀態下,收到建立連接請求的SYN報文後,把ACK和SYN放在一個報文裏發送給客戶端。而關閉連接時,當收到對方的FIN報文時,僅僅表示對方不再發送數據了但是還能接收數據,我們也未必把全部數據都發給了對方,所以我們可以立即close,也可以發送一些數據給對方後,再發送FIN報文給對方表示同意關閉連接。因此我們的ACK和FIN一般會分開發送。

之前討論的是一方主動關閉,另一方被動關閉的情況,實際中還會出現同時發起主動關閉的情況,具體流程如下圖 

è¿éåå¾çæè¿°

 

2.

 

3.單工,半雙工,全雙工

單工

單工數據傳輸只支持數據在一個方向上傳輸(在同一時間只有一方能接受或發送信息,不能實現雙向通信)

舉例:電視,廣播。

半雙工

半雙工數據傳輸允許數據在兩個方向上傳輸,但是,在某一時刻,只允許數據在一個方向上傳輸(它實際上是一種切換方向的單工通信;在同一時間只可以有一方接受或發送信息,可以實現雙向通信。)

舉例:對講機。

全雙工

全雙工數據通信允許數據同時在兩個方向上傳輸。(因此,全雙工通信是兩個單工通信方式的結合,它要求發送設備和接收設備都有獨立的接收和發送能力;在同一時間可以同時接受和發送信息,實現雙向通信。)

舉例:電話通信。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章