TCP狀態(tài)機

前言

本文將會首先介紹TCP的各個狀態(tài)预厌,然后描述TCP三次握手和四次揮手時的狀態(tài)變化畴蹭,最后重點介紹TIME_WAIT狀態(tài)鼎天。

TCP連接狀態(tài)

一個TCP連接在它的生命周期內(nèi)會有不同的狀態(tài)晦鞋。

下圖說明了TCP連接可能會有的狀態(tài),以及基于事件的狀態(tài)轉(zhuǎn)換艘虎。事件中有的是應(yīng)用程序的操作豫尽,有的是接收到了網(wǎng)絡(luò)發(fā)過來的請求。

TCP狀態(tài)及其描述如下表顷帖。

狀態(tài) 描述
LISTEN 等待來自遠(yuǎn)程TCP應(yīng)用程序的請求
SYN_SENT 發(fā)送連接請求后等待來自遠(yuǎn)程端點的確認(rèn)美旧。TCP第一次握手后客戶端所處的狀態(tài)
SYN-RECEIVED 該端點已經(jīng)接收到連接請求并發(fā)送確認(rèn)。
該端點正在等待最終確認(rèn)贬墩。TCP第二次握手后服務(wù)端所處的狀態(tài)
ESTABLISHED 代表連接已經(jīng)建立起來了榴嗅。這是連接數(shù)據(jù)傳輸階段的正常狀態(tài)
FIN_WAIT_1 等待來自遠(yuǎn)程TCP的終止連接請求或終止請求的確認(rèn)
FIN_WAIT_2 在此端點發(fā)送終止連接請求后,等待來自遠(yuǎn)程TCP的連接終止請求
CLOSE_WAIT 該端點已經(jīng)收到來自遠(yuǎn)程端點的關(guān)閉請求陶舞,此TCP正在等待本地應(yīng)用程序的連接終止請求
CLOSING 等待來自遠(yuǎn)程TCP的連接終止請求確認(rèn)
LAST_ACK 等待先前發(fā)送到遠(yuǎn)程TCP的連接終止請求的確認(rèn)
TIME_WAIT 等待足夠的時間來確保遠(yuǎn)程TCP接收到其連接終止請求的確認(rèn)

TCP三次握手

當(dāng)一個TCP連接建立時嗽测,發(fā)生了以下事情:

  1. 服務(wù)端必須準(zhǔn)備接收傳入的連接。這通常通過調(diào)用socket肿孵,bindlisten來完成唠粥,稱為被動打開。
  2. 客戶端通過調(diào)用connect方法來發(fā)起一個主動的打開停做∥罾ⅲ客戶端TCP會發(fā)送一個“同步”(SYN)段,它告訴服務(wù)器客戶端在連接上發(fā)送的數(shù)據(jù)的初始序列號蛉腌。通常情況下官份,SYN沒有發(fā)送數(shù)據(jù),它只包含一個IP頭烙丛,TCP頭和可能的TCP選項舅巷。
  3. 服務(wù)器必須確認(rèn)(ACK)客戶端的SYN,并且服務(wù)器還必須發(fā)送自己的SYN河咽,其中包含服務(wù)器將在連接上發(fā)送的數(shù)據(jù)的初始序列號钠右。
  4. 客戶端必須確認(rèn)服務(wù)器的SYN。

下圖顯示了TCP三次握手的過程忘蟹,以及客戶端和服務(wù)端狀態(tài)的變化飒房。

TCP四次揮手

一個TCP連接需要四步斷開:

  1. 一個應(yīng)用程序首先執(zhí)行close,發(fā)送FIN段寒瓦,這個操作被稱為主動關(guān)閉情屹,這意味著這一端完成數(shù)據(jù)的發(fā)送。
  2. 執(zhí)行FIN的另一端執(zhí)行被動關(guān)閉杂腰,該端發(fā)送ACK,確認(rèn)該FIN椅文。
  3. 被動關(guān)閉的一端執(zhí)行close喂很,向主動關(guān)閉的一方發(fā)送FIN惜颇。
  4. 主動關(guān)閉的一方確認(rèn)收到的FIN。

下圖顯示了一次典型的TCP四次揮手的過程少辣,以及主動關(guān)閉方和被動關(guān)閉方的狀態(tài)變化凌摄。在圖中是客戶端主動斷開了連接,這里只是舉個例子漓帅,服務(wù)端一樣可以主動斷開連接锨亏。

TIME_WAIT狀態(tài)

TIME_WAIT狀態(tài)應(yīng)該是最讓人疑惑的一個狀態(tài)了。在上圖中可以看到忙干,執(zhí)行主動斷開的節(jié)點最后會進(jìn)入這個狀態(tài)器予,該節(jié)點會在此狀態(tài)保存2倍的MSL(最大段生存期)。

TCP的每個實現(xiàn)都必須為MSL選擇一個值捐迫。RFC 1122推薦的值為兩分鐘乾翔,伯克利派的實現(xiàn)使用30秒。這也就是說TIME_WAIT狀態(tài)會維持1到4分鐘施戴。MSL是任何IP數(shù)據(jù)報可以在網(wǎng)絡(luò)中生存的最長時間反浓。這個時間是有限制的,因為每個數(shù)據(jù)報都包含一個8位的跳數(shù)限制赞哗,最大值是255.雖然這是一個跳數(shù)限制而不是一個真正的時間限制雷则,但是根據(jù)這個限制來假設(shè)數(shù)據(jù)報的最長生命周期依然是有意義的。

網(wǎng)絡(luò)中數(shù)據(jù)報丟失的原因通常是路由異常肪笋。一旦路由崩潰或者兩個路由之間的鏈路斷開巧婶,路由協(xié)議需要幾秒或幾分鐘才能穩(wěn)定,并找到一條備用路徑涂乌。在這段時間內(nèi)艺栈,可能發(fā)生路由回路。同時假設(shè)丟失是一個TCP數(shù)據(jù)報湾盒,則發(fā)生TCP超時湿右,并且重新發(fā)送分組,重傳的分組通過一些備用路徑達(dá)到最終目的地罚勾。但是一段時間后(該時間小于MSL)毅人,路由循環(huán)被更正,在循環(huán)中丟失的數(shù)據(jù)報被發(fā)送到最終目的地尖殃。這個原始的數(shù)據(jù)報被稱為丟失的副本或漫游副本丈莺。TCP協(xié)議必須處理這些數(shù)據(jù)報。

維持TIME_WAIT有兩個原因:

  1. 可靠地實現(xiàn)TCP的全雙工連接終止送丰。
  2. 允許舊的重復(fù)數(shù)據(jù)段在網(wǎng)絡(luò)中過期

在四次揮手中缔俄,假設(shè)最后的ACK丟失了,被動關(guān)閉方會重發(fā)FIN。主動關(guān)閉端必須維護(hù)狀態(tài)俐载,來允許被動關(guān)閉方重發(fā)最后的ACK蟹略;如果它沒有維護(hù)這個狀態(tài),將會對重發(fā)FIN返回RST遏佣,被動關(guān)閉方會認(rèn)為這是個錯誤挖炬。如果TCP正在執(zhí)行徹底終止數(shù)據(jù)流的兩個方向所需的所有工作(即全雙工關(guān)閉),則必須正確處理這四個段中任何一個的丟失状婶。所以執(zhí)行主動關(guān)閉的一方必須在結(jié)束時保持TIME_WAIT狀態(tài):因為它可能必須重傳最后的ACK意敛。

現(xiàn)在來聊維持TIME_WAIT狀態(tài)的第二個原因。假設(shè)在主機12.106.32.254的1500端口和206.168.112.219的21端口之間有一個TCP連接膛虫。此連接關(guān)閉后草姻,在相通的地址和端口建立了另外一個連接。由于IP地址和端口相同走敌,所以后一種連接被稱為先前連接的“化身”碴倾。TCP必須防止連接中的舊副本在稍后再次出現(xiàn),并被誤解為屬于同一連接的新“化身”掉丽。為此跌榔,TCP將不會啟動當(dāng)前處于TIME_WAIT狀態(tài)的連接的新“化身”。由于TIME_WAIT狀態(tài)的持續(xù)時間時兩倍的MSL捶障,因此TCP允許一個方向的數(shù)據(jù)在MSL秒內(nèi)丟失僧须,也允許回復(fù)在一個MSL秒內(nèi)丟失。通過強制執(zhí)行此規(guī)則项炼,可以保證當(dāng)一個TCP連接成功建立時担平,來自先前連接的所有舊的副本在網(wǎng)絡(luò)中已過期。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锭部,一起剝皮案震驚了整個濱河市暂论,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拌禾,老刑警劉巖取胎,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異湃窍,居然都是意外死亡闻蛀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門您市,熙熙樓的掌柜王于貴愁眉苦臉地迎上來觉痛,“玉大人,你說我怎么就攤上這事茵休⌒桨簦” “怎么了手蝎?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盗尸。 經(jīng)常有香客問我柑船,道長帽撑,這世上最難降的妖魔是什么泼各? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮亏拉,結(jié)果婚禮上扣蜻,老公的妹妹穿的比我還像新娘。我一直安慰自己及塘,他們只是感情好莽使,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笙僚,像睡著了一般芳肌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肋层,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天亿笤,我揣著相機與錄音,去河邊找鬼栋猖。 笑死净薛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蒲拉。 我是一名探鬼主播肃拜,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雌团!你這毒婦竟也來了燃领?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤锦援,失蹤者是張志新(化名)和其女友劉穎猛蔽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雨涛,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡枢舶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了替久。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凉泄。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚯根,靈堂內(nèi)的尸體忽然破棺而出后众,到底是詐尸還是另有隱情胀糜,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布蒂誉,位于F島的核電站教藻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏右锨。R本人自食惡果不足惜括堤,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绍移。 院中可真熱鬧悄窃,春花似錦、人聲如沸蹂窖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞬测。三九已至横媚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間月趟,已是汗流浹背灯蝴。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狮斗,地道東北人绽乔。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像碳褒,于是被迫代替她去往敵國和親折砸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 在網(wǎng)絡(luò)協(xié)議棧中沙峻,目前只有tcp提供了一種面向連接的可靠性數(shù)據(jù)傳輸睦授。而可靠性,無非就是保證摔寨,我發(fā)給你的去枷,你一定要收到...
    Alfie20閱讀 1,369評論 0 1
  • 參考文章:https://www.2cto.com/net/201209/157585.html tcp狀態(tài): L...
    anmei001閱讀 785評論 0 0
  • 1、TCP狀態(tài)linux查看tcp的狀態(tài)命令:1)是复、netstat -nat 查看TCP各個狀態(tài)的數(shù)量2)删顶、lso...
    北辰青閱讀 9,410評論 0 11
  • 目錄: TCP是什么TCP報文結(jié)構(gòu)TCP連接過程TCP狀態(tài)轉(zhuǎn)移TCP流量控制 —— 滑動窗口TCP擁塞控制TCP可...
    Katou_Megumi閱讀 1,337評論 0 4
  • 概念 RTT:round trip time,客戶端與服務(wù)端之間的往返時間通告窗口:advertised wind...
    紫色紅色黑色閱讀 484評論 0 0