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種狀態。每一種狀態中都存在一些合法的事件,當合法事件發生的時候,可能需要采取某個動作。當其他事件發生的時候,則報告一個錯誤。

狀 態

描 述

CLOSED

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

LISTEN

監聽狀態,服務器正在等待連接進入

SYN RCVD

收到一個連接請求,尚未確認

SYN SENT

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

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狀態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM