天天看點

TCP連接配接的建立和斷開

1.TCP連接配接的建立

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連接配接的釋放

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連接配接的建立和斷開

客戶程序變遷的過程(粗實線)

連接配接建立:設一個主機的客戶程序發起連接配接請求(主動打開),這時本地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狀态。

本文轉自ZH奶酪部落格園部落格,原文連結:http://www.cnblogs.com/CheeseZH/p/5169366.html,如需轉載請自行聯系原作者

繼續閱讀