(012)TCP/IP協議-TCP建立與終止連接

一、引言

TCP是一個面向連接的協議。無論哪一方向另一方發送數據之前,都必須先在雙方之間建立一條連接。連接創建與終止的狀態變化圖如下:


圖1.tcp建立連接與終止連接狀態轉換圖

二、三次握手建立連接

圖2.tcp建立連接三次握手

過程如下:

  • 客戶端發送一個SYN數據包指明客戶端打算連接服務器的端口,初始化序號(ISN)為m。
  • 服務器發回包含服務器的ISN作為應答(值為n)。同時,將確認序號設置成客戶端ISN+1(m+1)來作為對客戶端SYN的確認。
  • 客戶端發送一個ACK數據包,ack=n+1,作為對服務器的SYN的確認。

1.為什么是三次握手,而不是兩次

網絡是不可靠的,數據包是可能丟失的。假設沒有第三次確認,客戶端向服務端發送了 SYN,請求建立連接。由于延遲,服務端沒有及時收到這個包。于是客戶端重新發送一個 SYN 包。回憶一下介紹 TCP 首部時提到的序列號,這兩個包的序列號顯然是相同的。假設服務端接收到了第二個 SYN 包,建立了通信,一段時間后通信結束,連接被關閉。這時候最初被發送的 SYN 包剛剛抵達服務端,服務端又會發送一次 ACK 確認。由于兩次握手就建立了連接,此時的服務端就會建立一個新的連接,然而客戶端覺得自己并沒有請求建立連接,所以就不會向服務端發送數據。從而導致服務端建立了一個空的連接,白白浪費資源。
??TCP是雙通道,需要雙向確定。只有兩次握手,客戶端知道了服務器收到了,服務器不知道客戶端收到了,聯想打電話。通訊系統中的占拜庭將軍問題。

2.最大報文段長度

最大報文段長度(MSS)表示TCP傳往另一端的最大塊數據的長度。當一個連接建立時,連接的雙方都要通告各自的MSS。在三次握手的時候SYN的TCP首部中的可選字段確定。以太網的默認長度為1460。

3.

三、四次握手關閉連接(正常狀態)

建立一個連接需要三次握手,而終止一個連接要經過4次握手。這由TCP的半關閉(half-close)造成的。一個TCP連接是全雙工(即數據在兩個方向上能同時傳遞),因此每個方向必須單獨地進行關閉。


圖3.四次握手關閉連接
  • 主動方想要關閉連接,發送FIN包給被動方,序號為m
  • 被動方接收到主動方發送的FIN包,知道了對方要關閉連接,發送ACK確認包,序號m+1。主動方連接關閉。
  • 等待片刻(處于半關閉狀態),在此期間(fin_wait2,close_wait)。被動方發送最后的數據,主動方接收最后的數據。
  • 被動方確認要關閉連接,發送FIN包。序號n。
  • 主動方等待片刻(接收網絡中,還未到達的數據包),發送ACK確認包。序號n+1。到此連接關閉。

1.TCP的半關閉狀態

TCP提供了連接的一端在結束它的發送后還能接收來自另一端數據的能力。如主動方處于fin_wait2狀態。

2.TIME_WAIT狀態

TIME_WAIT狀態也稱為2MSL等待狀態。每個具體TCP實現必須選擇一個報文段最大生存時間MSL( Maximum Segment Lifetime)。它是任何報文段被丟棄前在網絡內的最長時間。因為TCP報文段以IP數據報在網絡內傳輸,而IP數據報則有限制其生存時間的TTL字段。在實際應用中,對 I P數據報TTL的限制是基于跳數,而不是定時器。
??在處于2MSL等待狀態的socket(客戶端IP與端口,服務器IP與端口)不能再被使用。但在實際的使用中,允許一個新的連接請求到達仍處于time_wait狀態的連接,只要新的序號大于該連接的前一個連接的最后序號。

四、正常狀態抓包

下面是一次完整的tcp建立連接,發送數據,關閉連接過程


圖4.tcp一次完整請求

該過程為,3次握手建立連接,一次數據發送,4次握手關閉連接

五、異常情況

出現異常的時候,服務器通常通過復位報文來通告,復位報文為tcp數據包類型設置為rst。

1.連接超時或到達不存在的端口/服務器

當服務器端沒有開或網絡問題,會出現連接超時的情況。抓包如下:


圖5.連接超時

客戶端嘗試3三次來連接,有時候服務器端會發送rst數據包。

2.異常終止一個連接

在TCP通訊中。如果通訊雙方應為某種原因(如突然斷電等)關閉連接時候一方(如A)沒有發送fin數據包。另一端(如B)不知道對方已經關閉了連接。再次發送數據的時候,異常關閉的一方,可能會返回一個rst數據包。通知異常關閉。如果一方已經關閉或異常終止連接而另一方卻還不知道,我們將這樣的TCP連接稱為半打開(Half Open)的。

3.同時打開

兩個應用程序同時彼此執行主動打開的情況是可能的。每一方必須發送一個SYN,且這些SYN必須傳遞給對方。這需要每一方使用一個對方熟知的端口作為本地端口。同時打開的狀態遷移圖不同于正常狀態的三次握手,該情況下需要進行4次握手。如圖:


圖6.同時打開,4次握手建立連接

4.同時關閉

我們在以前討論過一方(通常但不總是客戶方)發送第一個FIN執行主動關閉。雙方都執行主動關閉也是可能的,TCP協議也允許這樣的同時關閉(simultaneous close)。在同時關閉的時候,雙方都進入time_wait狀態,如圖:


圖7.TCP同時關閉連接狀態轉換圖

六.TCP服務器設計

大多數的TCP服務器進程是并發的。當一個新的連接請求到達服務器時,服務器接受這個請求,并調用一個新進程來處理這個新的客戶請求。

1. 接入連接請求隊列

一個并發服務器調用一個新的進程來處理每個客戶請求,因此處于被動連接請求的服務器應該始終準備處理下一個呼入的連接請求。那正是使用并發服務器的根本原因。但仍有可能出現當服務器在創建一個新的進程時,或操作系統正忙于處理優先級更高的進程時,到達多個連接請求。當服務器正處于忙時,TCP是如何處理這些呼入的連接請求?TCP有這樣一個隊列來臨時存放這些連接-接入連接請求隊列。處理方式如下:

  • 正等待連接請求的一端有一個固定長度的連接隊列,該隊列中的連接已被TCP接受(即三次握手已經完成),但還沒有被應用層所接受。注意區分TCP接受一個連接是將其放入這個隊列,而應用層接受連接是將其從該隊列中移出。
  • 應用層將指明該隊列的最大長度,這個值通常稱為積壓值 (backlog)。
  • 當一個連接請求(SYN)到達時, TCP使用一個算法,根據當前連接隊列中的連接數來確定是否接收這個連接。積壓值說明的是TCP監聽的端口已被TCP接受而等待應用層接受的最大連接數。
  • 如果對于新的連接請求,該TCP監聽的端口的連接隊列中還有空間,TCP模塊將對SYN進行確認并完成連接的建立。此時,應用層不一定知道該新的連接,如果對方發送數據,這些數據將放入緩沖隊列中。
  • 如果對于新的連接請求,連接隊列中已沒有空間,TCP將不理會收到的SYN。也不發回任何報文段(即不發回 RST)。如果應用層不能及時接受已被TCP接受的連接,這些連接可能占滿整個連接隊列,客戶的主動打開最終將超時。

都看到這里了,要不要掃二維碼關注一下微信公眾號林灣村龍貓

微信公眾號rudy_tan_home

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容