TCP狀態(選自Windows網路編程技術)

來源:互聯網
上載者:User

作為一名Wi n s o c k程式員,通常沒必要瞭解實際的T C P狀態。但瞭解T C P狀態,就能更好地理解Winsock API調用如何對基層協議中的改變產生影響。此外,許多程式員在關閉通訊端時,會碰到一個常見問題;圍繞通訊端關閉的T C P狀態是我們目前最感興趣的問題。

對每個通訊端來說,它的初始狀態都是C L O S E D。若客戶機初始化了一個串連,就會向伺服器發送一個S Y N包,同時將客戶機通訊端狀態置為S Y N _ S E N T。伺服器收到S Y N包後,會發出一個“ S Y N - A C K”包。作為客戶機,需要用一個A C K包對它做出反應。此時,客戶機的通訊端會變成E S TA B L I S H E D狀態。如果伺服器一直不發送“ S Y N - A C K”包,客戶機就會逾時,並返回C L O S E D狀態。
若一個伺服器的通訊端同一個本地介面和連接埠綁定起來,並在它上面進行監聽,那麼通訊端的狀態便是L I S T E N。客戶機試圖與之串連時,伺服器就會收到一個S Y N包,並用一個S Y N - A C K包做出響應。伺服器通訊端的狀態就變成S Y N _ R C V D。最後,客戶機發出一個A C K包,令伺服器通訊端的狀態變成E S TA B L I S H E D。
一旦應用處於E S TA B L I S H E D狀態,可通過兩種方法來關閉它。如果由應用程式來關閉,便叫作“主動通訊端關閉”;否則,通訊端的關閉便是被動的。圖7 - 2對兩種關閉方法進行瞭解釋。如主動關閉,應用程式便會發出一個F I N包。應用程式調用c l o s e s o c k e t或s h u t d o w n時(把S D _ S E N D當作第二個參數),會向對方發出一個F I N包,而且通訊端的狀態則變成F I N _ WA I T _ 1。正常情況下,通訊對方會回應一個A C K包,我們的通訊端的狀態隨之變成F I N _ WA I T _ 2。如對方也關閉了串連,便會發出一個F I N包,我們的機器則會響應一個A C K包,並將己方通訊端的狀態置為T I M E _ WA I T。

T I M E _ WA I T狀態也叫作2 M S L等待狀態。其中, M S L代表“分段最長存留時間”(Maximum Segment Lifetime),表示一個資料包在丟棄之前,可在網路上存在多長時間。每個I P包都含有一個“存留時間”(T T L)欄位,若它遞減為0,包便會被丟棄。一個包經過網路上的每個路由器時, T T L 值都會減1 ,然後繼續傳遞。一旦應用程式進入T I M E _ WA I T狀態,那麼就會一直持續M S L時間的兩倍之久。這樣一來, T C P就可以在最後一個A C K丟失的前提下,重新發送它,也就是說, F I N會被重新傳送出去。M S L時間兩倍之久的等待狀態結束之後,通訊端便進入C L O S E D狀態。
採取主動關閉措施時,有兩個路徑會進入T I M E _ WA I T狀態。在我們以前的討論中,只有一方發出一個F I N,並接收一個A C K響應。然而,另一方仍然可以自由地發送資料,直到它也被關閉為止。因此,需要兩個路徑發揮作用。在一個路徑中(即同步關閉),一台電腦和它的通訊對方會同時要求關閉;電腦向對方送出一個F I N資料包,並從它那裡接收一個F I N資料包。隨後,電腦會發出一個A C K資料包,對對方的F I N包做出響應,並將自己的通訊端置為C L O S I N G狀態。電腦從對方那裡接收到最後一個A C K包之後,它的通訊端狀態會變成T I M E _ WA I T。
主動關閉時,另一個路徑其實就是同步關閉的變體:通訊端從F I N _ WA I T _ 1狀態直接變成T I M E _ WA I T。若應用程式發出一個F I N資料包,但幾乎同時便從對方那裡接收到一個F I N - A C K包,這種情況就會發生。在這種情況下,對方會確認收到應用程式的F I N包,並送出自己的F I N包。對於這個包,應用程式會用一個A C K包做出響應。
T I M E _ WA I T狀態的主要作用是在T C P串連處於2 M S L等待狀態的時候,規定用於建立那個串連的一對通訊端不可被拒絕。這對通訊端由本地I P連接埠以及遠程I P連接埠組成。對某些T C P實施方案來說,它們不允許拒絕處於T I M E _ WA I T狀態下的通訊端對中的任何連接埠號碼。在微軟的方案中,不會存在這個問題。然而,若試圖通過一對已處於T I M E _ WA I T狀態的通訊端建立串連,就會失敗,並返回W S A E A D D R I N U S E錯誤。要解決這一問題(除了等待使用那個本地連接埠來脫離T I M E _ WA I T狀態的通訊端對),一個辦法是使用通訊端選項S O _ R E F U S E A D D R,我們將在第9章對這個選項進行詳細討論。

被動關閉情況下,應用程式會從對方那裡接收一個F I N包,並用一個A C K包做出響應。此時,應用程式的通訊端會變成C L O S E _ WA I T狀態。由於對方已關閉自己的通訊端,所以不能再發送資料了。但應用程式卻不同,它能一直發送資料,直到對方的通訊端已關閉為止。要想關閉對方的串連,應用程式需要發出自己的F I N,令應用程式的通訊端狀態變成L A S T _ A C K。應用程式從對方收到一個A C K包後,它的通訊端就會逆轉成C L O S E D狀態。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.