天天看點

計算機網絡-5-10-TCP運輸連接配接管理

TCP的運輸連接配接管理

TCP是面向連接配接的通信,運輸連接配接是用來傳送TCP封包的,TCP運輸連接配接的建立和釋放是每一次面向連接配接的通信中必不可少的過程。是以,運輸連接配接有三個階段,即:建立連接配接,資料傳送,連接配接釋放,運輸連接配接的管理就是使運輸連接配接和釋放都能正常的進行。在TCP連接配接中主要解決以下問題:

  • 要使每一方都能确認對方的存在。
  • 要允許雙方協商一些參數(如最大視窗值,是否使用視窗擴大選項和時間戳選項以及服務品質等)。
  • 能夠對運輸實體資源進行合理的配置設定(如緩存大小,連接配接表中的項目等)。

TCP連接配接的建立采用客戶伺服器方式。主動發起連接配接建立的應用程序叫做客戶(client),而被動等待連接配接的應用程序叫做伺服器(server)。

TCP的連接配接建立

TCP建立連接配接的過程叫握手,握手需要客戶和伺服器之間交換三個TCP封包段。如下圖5-28。

計算機網絡-5-10-TCP運輸連接配接管理

假定主機A運作的是TCP客戶程式,而B運作的是TCP服務程式,最初兩端的連接配接處于CLOSE(關閉) 狀态,在本例中A主動打開連接配接,B被動打開連接配接。

TCP握手過程描述:

  1. 一開始,B的TCP伺服器程序先建立傳輸控制塊TCB(Transmission Control Block),準備接受客戶程序的連接配接請求,然後伺服器就處于LISTEN(監聽)狀态,等待客戶的連接配接請求,如果有,就做出響應。
  2. A的TCP客戶程序也是首先創立傳輸控制子產品TCB,然後在建立連接配接的時候,向伺服器B發送連接配接請求封包段,這時候首部中的同步位SYN=1,同時選擇一個初始序号seq=x。TCP規定:SYN封包段(SYN=1的封包段)不能攜帶資料,但是要消耗掉一個序列号,這時候,TCP用戶端程序進入SYN-SENT同步已發送狀态。
  3. B收到連接配接請求的封包段,如果同意建立連接配接,則向A發送确認,在确認封包段SYN位=1,ACK位為1,确認号是ack=x+1,同時也為自己選擇一個初始序号seq=y,注意,這個封包段也不能攜帶資料,但是同樣要消耗一個序列号。這時候TCP伺服器程序處于SYN-RCVD(同步收到)狀态。
  4. TCP客戶程序收到B的确認後,還要給B給出确認,确認封包段的ACK=1确認号ack=y+1,而自己的序号seq=x+1。TCP的标準規定,ACK封包段可以攜帶資料,但如果不攜帶資料則不消耗序号,這種情況下,下一個資料封包段的序号仍然是seq=x+1,這時候,TCP連接配接已經建立連接配接,用戶端A進入ESTABLISHED(已建立連接配接狀态),
  5. B收到A的确認封包後,也進入ESTABLISHED狀态。

上面給出的連接配接過程叫做三次封包握手,注意,在圖中,當B發送給A的封包段,也可以拆分成兩個封包段,可以先發送确認封包段(ACK=1,ack=x+1),然後再發送一個同步封包段(SYN=1,seq=y),這樣的過程就變成了四封包握手,但效果是一樣的。

為什麼A最後還要發送一次确認呢?這主要是為了防止已失效的連接配接請求封包突然又傳送到B,因而産生錯誤。

所謂“已失效的連接配接請求封包段”是這樣産生的。考慮一種正常情況,A 發出連接配接請求,但因連接配接請求封包丢失而未收到确認。于是 A 再重傳一次連接配接請求。後來收到了确認,建立了連接配接。資料傳輸完畢後,就釋放了連接配接。A 共發送了兩個連接配接請求封包段,其中第一個丢失,第二個到達了 B,沒有“已失效的連接配接請求封包段”。

現假定出現一種異常情況,即 A 發出的第一個連接配接請求封包段并沒有丢失,而是在某些網絡結點長時間滞留了,以緻延誤到連接配接釋放以後的某個時間才到達 B。本來這是一個早已失效的封包段。但 B 收到此失效的連接配接請求封包段後,就誤認為是A又發出一次新的連接配接請求。于是就向 A 發出确認封包段,同意建立連接配接。假定不采用封包握手,那麼隻要 B發出确認,新的連接配接就建立了。

由于現在 A 并沒有發出建立連接配接的請求,是以不會理睬 B 的确認,也不會向 B 發送資料。但 B 卻以為新的運輸連接配接已經建立了,并一直等待 A 發來資料。B 的許多資源就這樣白白浪費了。

采用三封包握手的辦法,可以防止上述現象的發生。例如在剛才的異常情況下,A 不會

向B的确認發出确認。B 由于收不到确認,就知道A并沒有要求建立連接配接。

TCP連接配接釋放

TCP連接配接釋放比較複雜,我們仍然結合雙方狀态的改變來闡明連接配接釋放的過程。

資料傳輸結束後,通信的雙方都可釋放連接配接。現在 A 和 B 都處于 ESTABLISHED 狀态(圖5-29)。A 的應用程序先向其TCP發出連接配接釋放封包段,并停止再發送資料,主動關閉TCP 連接配接。A 把連接配接釋放封包段首部的終止控制位 FIN 置 1,其序号 seq = u,它等于前面已傳送過的資料的最後一個位元組的序号加 1。這時 A 進入 FIN-WAIT-1(終止等待 1)狀态,等待 B 的确認。請注意,TCP 規定,FIN 封包段即使不攜帶資料,它也消耗掉一個序号。

  • 計算機網絡-5-10-TCP運輸連接配接管理
    B伺服器收到連接配接釋放的封包段後立即發出确認,确認号為ack=u+1,而這個封包段自己的序号為v,等于B前面已傳過的資料的最後一個位元組+1,然後伺服器就進入CLOSE-WAIT(關閉等待)狀态,TCP伺服器程序這時候通知高層應用程序,因而從用戶端A到伺服器端B這個連接配接就釋放了,這時候的TCP連接配接窗台處于半關閉狀态(HALF-CLOSE),A已經沒有資料發送給B了,但是B要使發資料,A仍然要接受,也就說,從B到A的方向的連接配接仍未關閉,這個狀态可能還要持續一段時間。 A收到來自B的确認後,就進入FIN-WAIT2(終止等待2)狀态,等待B發出的連接配接釋放封包段。若B已經沒有必要向A發送資料了,其應用程序就通知TCP釋放連接配接。這時候B發出的連接配接釋放封包段必須使FIN=1。現假設B的序号為w,B還重複上次已經發送過的确認号ack=u+1,這時候B就進入LAST-ACK(最後确認狀态),等待A的确認。A在收到B的連接配接釋放的時候,必須對此發出确認,在确認封包段中把ACK=1,确認号ack=w+1,自己的序号為seq=u+1,然後進入到TIME-WAIT(時間等待狀态),注意,現在的TCP并沒有斷開連接配接,而是必須經過時間等待計時器設定的2MSL(max segment lifetime),A才能進入CLOSED狀态,時間MSL叫做最長封包段壽命,RFC标準建議為2min。為什麼要設立時間等待狀态必須為2MSL呢?
    1. 為了保證用戶端發送額最後一個ACK封包段能夠到達B,這個ACK封包段有可能會丢失,因而使用LAST-ACK狀态的B收不到對已發送FIN+ACK封包的确認,B會逾時重傳這個FIN+ACK封包段,而A就能在2MSL時間内收到這個重傳的FIN+ACK封包段,接着A重傳一次确認,重新啟動AMSL計時器。最後知道A和B都進入CLOSED狀态。
    2. 防止上面提到的已失效的連接配接請求封包段出現在本連接配接中,A在發完最後一個ACK封包段的時候,再經過2MSL時間,就可以是本連接配接持續的時間内産生的所有封包段都從網絡中協消失。這樣就可以使下一個新的連接配接中不會出現這種舊的連接配接請求文。
    除了時間等待計時器之外,還應該設有保活計時器(keep-live timer),有這樣的一個場景:用戶端已經主動與伺服器建立了TCP連接配接,但是後來用戶端的主機突然出現了故障,顯然,伺服器以後就不能在也接收到用戶端的資料了,是以,伺服器就沒有必要浪費資源繼續與出現故障的用戶端繼續保持相連。這就需要使用保活計時器,伺服器每收到一次用戶端請求的資料,就重新重置保活計數器,時間的設定通常是兩小時,若兩小時内沒有收到用戶端的資料,伺服器就發送一個探測封包段,以後每隔75s發送一個,若一連發送10個探測封包段後仍然沒有相應,伺服器就認為該用戶端出現了故障,就關閉這個連接配接。

TCP的有限狀态機)

為了更清晰地看出 TCP 連接配接的各種狀态之間的關系,圖 5-30 給出了 TCP 的有限狀态機。圖中每一個方框即 TCP 可能具有的狀态。每個方框中的大寫英文字元串是 TCP 标準所使用的 TCP 連接配接狀态名。狀态之間的箭頭表示可能發生的狀态變遷。箭頭旁邊的字,表明引起這種變遷的原因,或表明發生狀态變遷後又出現什麼動作。請注意圖中有三種不同的箭頭。粗實線箭頭表示對客戶程序的正常變遷。粗虛線箭頭表示對伺服器程序的正常變遷。另一種細線箭頭表示異常變遷。

計算機網絡-5-10-TCP運輸連接配接管理