TCP/IP詳解學習筆記(13)-- TCP鏈接的創建與終止

1.TCP鏈接的創建
     
     設主機B運行一個服務器進程,它先發出一個被動打開命令,告訴它的TCP要準備接收客戶進程的連續請求,而後服務進程就處於聽的狀態。不斷檢測是否有客戶進程發起連續請求,若有,做出響應。設客戶進程運行在主機A中,他先向本身的TCP發出主動打開的命令,代表要向某個IP地址的某個端口創建運輸鏈接,過程以下:
     1)主機A的TCP向主機B的TCP發出鏈接請求報文段,其首部中的同步比特SYN應置1,同時選擇一個序號x,代表在後面傳送數據時的第一個數據字節的序號是x。
     2)主機B的TCP收到鏈接請求報文段後,如贊成,則發揮確認。在確認報文段中應將SYN置爲1,確認號應爲x+1,同時也爲本身選擇一個序號y
     3)主機A的TCP收到此報文段後,還要向B給出確認,其確認號爲y+1
     4)主機A的TCP通知上層應用進程,鏈接已經創建,當主機B的TCP收到主機A的確認後,也通知上層應用進程,鏈接創建。
 
2.TCP鏈接的釋放
     
     在數據傳輸完畢以後,通訊雙方均可以發出釋放鏈接的請求。釋放鏈接的過程爲如上圖所示:
     1)數據傳輸結束後,主機A的應用進程先向其TCP發出釋放鏈接請求,不在發送數據。TCP通知對方要釋放從A到B的鏈接,將發往主機B的TCP報文段首部的終止比特FIN置爲1,序號u等於已傳送數據的最後一個字節的序號加1。
     2)主機B的TCP收到釋放鏈接通知後發出確認,其序號爲u+1,同時通知應用進程,這樣A到B的鏈接就釋放了,鏈接處於半關閉狀態。主機B不在接受主機A發來的數據;但主機B還向A發送數據,主機A若正確接收數據仍須要發送確認。
     3)在主機B向主機A的數據發送結束後,其應用進程就通知TCP釋放鏈接。主機B發出的鏈接釋放報文段必須將終止比特置爲1,並使其序號w等於前面已經傳送過的數據的最後一個字節的序號加 1,還必須重複上次已發送過的ACK=u+1。
     4)主機A對主機B的鏈接釋放報文段發出確認,將ACK置爲1,ACK=w+1, seq=u+1。這樣才把從B到A的反方向鏈接釋放掉,主機A的TCP再向其應用進程報告,整個鏈接已經所有釋放。
 
3.注意的問題
  • 三次握手創建鏈接時,發送方再次發送確認的必要性
    • 主要是爲了防止已失效的鏈接請求報文段忽然又傳到了B,於是產生錯誤。假定出現一種異常狀況,即A發出的第一個鏈接請求報文段並無丟失,而是在某些網絡結點長時間滯留了,一直延遲到鏈接釋放之後的某個時間纔到達B,原本這是一個早已失效的報文段。但B收到此失效的鏈接請求報文段後,就誤認爲是A又發出一次新的鏈接請求,因而就向A發出確認報文段,贊成創建鏈接。假定不採用三次握手,那麼只要B發出確認,新的鏈接就創建了,這樣一直等待A發來數據,B的許多資源就這樣白白浪費了。
  • 四次揮手釋放鏈接時,等待2MSL的意義
    • 第一,爲了保證A發送的最有一個ACK報文段可以到達B。這個ACK報文段有可能丟失,於是使處在LAST-ACK狀態的B收不到對已發送的FIN和ACK報文段的確認。B會超時重傳這個FIN和ACK報文段,而A就能在2MSL時間內收到這個重傳的ACK+FIN報文段。接着A重傳一次確認。
    • 第二,就是防止上面提到的已失效的鏈接請求報文段出如今本鏈接中,A在發送完最有一個ACK報文段後,再通過2MSL,就可使本鏈接持續的時間內所產生的全部報文段都從網絡中消失。
4.TCP的有限狀態機
     鏈接的創建和釋放所要求的步驟能夠用一個有限狀態機來表達,該狀態機有11種狀態。每一種狀態中都存在一些合法的事件,當合法事件發生的時候,可能須要採起某個動做。當其餘事件發生的時候,則報告一個錯誤。

狀 態服務器

描 述網絡

CLOSEDspa

關閉狀態,沒有鏈接活動或正在進行blog

LISTEN進程

監聽狀態,服務器正在等待鏈接進入事件

SYN RCVD資源

收到一個鏈接請求,還沒有確認同步

SYN SENTtable

已經發出鏈接請求,等待確認請求

ESTABLISHED

鏈接創建,正常數據傳輸狀態

FIN WAIT 1

(主動關閉)已經發送關閉請求,等待確認

FIN WAIT 2

(主動關閉)收到對方關閉確認,等待對方關閉請求

TIMED WAIT

完成雙向關閉,等待全部分組死掉

CLOSING

雙方同時嘗試關閉,等待對方確認

CLOSE WAIT

(被動關閉)收到對方關閉請求,已經確認

LAST ACK

(被動關閉)等待最後一個關閉確認,並等待全部分組死掉

TCP創建與釋放的變遷如圖所示:

 

 

  • 客戶進程變遷的過程(粗實線)
    • 鏈接創建:設一個主機的客戶進程發起鏈接請求(主動打開),這時本地TCP實體就建立傳輸控制快(TCB),發送一個SYN爲1的報文,進入SYN_SENT狀態。當收到來自進程的SYN和ACK時,TCP就發送出三次握手中的最後一個ACK,進而進入鏈接已經創建的狀態ESTABLISHED。
    • 鏈接釋放:設運行客戶進程主機本地TCP實體發送一個FIN置爲1的報文,等待着確認ACK的到達,此時狀態變爲FIN_WAIT_1。當運行客戶進程主機收到確認ACK時,則一個方向的鏈接已經關閉。狀態變成FIN_WAIT_2。當運行客戶進程的主機收到運行服務器進程的主機發送的FIN置爲1的報文後,應響應確認ACK時,這是另外一個鏈接關閉。但此時TCP還要等待一段時間後才刪除原來創建的鏈接記錄。返回到初始的CLOSED狀態,這是爲了保證原來鏈接上的全部分組都從網絡中消失了。
  • 服務器進程變遷的過程(粗虛線)
    • 鏈接創建:服務器進程發出被動打開,進入監聽狀態LISTEN。當收到SYN置爲1的鏈接請求報文後,發送確認ACK,而且報文中的SYN也置爲1,而後進入SYN_RCVD狀態。在收到三次握手最後一個確認ACK時,就轉爲ESTABLISHED狀態。
    • 鏈接釋放:當客戶進程的數據已經傳送完畢。就發出FIN置爲1的報文給服務器進程,進入CLOSE_WAIT狀態。服務器進程發送FIN報文段給客戶進程,狀態變爲LAST_ACK狀態。當收到客戶進程的ACK時,服務器進程就釋放鏈接。刪除鏈接記錄。回到原來的CLOSED狀態。
相關文章
相關標籤/搜索