(轉(zhuǎn))TCP為什么需要3次握手與4次揮手

(轉(zhuǎn))TCP為什么需要3次握手與4次揮手

1. 為什么需要“三次握手”

在謝希仁著《計算機網(wǎng)絡(luò)》第四版中講“三次握手”的目的是“為了防止已失效的連接請求報文段突然又傳送到了服務(wù)端伞梯,因而產(chǎn)生錯誤”银亲。在另一部經(jīng)典的《計算機網(wǎng)絡(luò)》一書中講“三次握手”的目的是為了解決“網(wǎng)絡(luò)中存在延遲的重復(fù)分組”的問題赏僧。這兩種不用的表述其實闡明的是同一個問題庭敦。

謝希仁版《計算機網(wǎng)絡(luò)》中的例子是這樣的匿情,“已失效的連接請求報文段”的產(chǎn)生在這樣一種情況下:client發(fā)出的第一個連接請求報文段并沒有丟失,而是在某個網(wǎng)絡(luò)結(jié)點長時間的滯留了信殊,以致延誤到連接釋放以后的某個時間才到達server炬称。本來這是一個早已失效的報文段。但server收到此失效的連接請求報文段后涡拘,就誤認為是client再次發(fā)出的一個新的連接請求玲躯。于是就向client發(fā)出確認報文段,同意建立連接鳄乏。假設(shè)不采用“三次握手”跷车,那么只要server發(fā)出確認,新的連接就建立了橱野。由于現(xiàn)在client并沒有發(fā)出建立連接的請求朽缴,因此不會理睬server的確認,也不會向server發(fā)送數(shù)據(jù)水援。但server卻以為新的運輸連接已經(jīng)建立不铆,并一直等待client發(fā)來數(shù)據(jù)。這樣裹唆,server的很多資源就白白浪費掉了。采用”三次握手”的辦法可以防止上述現(xiàn)象發(fā)生只洒。例如剛才那種情況许帐,client不會向server的確認發(fā)出確認。server由于收不到確認毕谴,就知道client并沒有要求建立連接成畦。主要目的防止server端一直等待,浪費資源涝开。

2. 為什么需要“四次揮手”

那可能有人會有疑問循帐,在tcp連接握手時為何ACK是和SYN一起發(fā)送,這里ACK卻沒有和FIN一起發(fā)送呢舀武。原因是因為tcp是全雙工模式拄养,接收到FIN時意味將沒有數(shù)據(jù)再發(fā)來,但是還是可以繼續(xù)發(fā)送數(shù)據(jù)银舱。

3. 握手瘪匿,揮手過程中各狀態(tài)介紹

3次握手過程狀態(tài)(可參考下圖)

** LISTEN:**這個也是非常容易理解的一個狀態(tài),表示服務(wù)器端的某個SOCKET處于監(jiān)聽狀態(tài)寻馏,可以接受連接了棋弥。

** SYN_SENT:**當客戶端SOCKET執(zhí)行CONNECT連接時,它首先發(fā)送SYN報文诚欠,因此也隨即它會進入到了SYN_SENT狀態(tài)顽染,并等待服務(wù)端的發(fā)送三次握手中的第2個報文漾岳。SYN_SENT狀態(tài)表示客戶端已發(fā)送SYN報文。(發(fā)送端)

SYN_RCVD: 這個狀態(tài)與SYN_SENT遙想呼應(yīng)這個狀態(tài)表示接受到了SYN報文粉寞,在正常情況下尼荆,這個狀態(tài)是服務(wù)器端的SOCKET在建立TCP連接時的三次握手會話過程中的一個中間狀態(tài),很短暫仁锯,基本上用netstat你是很難看到這種狀態(tài)的耀找,除非你特意寫了一個客戶端測試程序,故意將三次TCP握手過程中最后一個 ACK報文不予發(fā)送业崖。因此這種狀態(tài)時野芒,當收到客戶端的ACK報文后,它會進入到ESTABLISHED狀態(tài)双炕。(服務(wù)器端)

ESTABLISHED:這個容易理解了狞悲,表示連接已經(jīng)建立了。

TCP三次握手示意圖

4次揮手過程狀態(tài)(可參考下圖)
FIN_WAIT_1: 這個狀態(tài)要好好解釋一下妇斤,其實FIN_WAIT_1和FIN_WAIT_2狀態(tài)的真正含義都是表示等待對方的FIN報文摇锋。而這兩種狀態(tài)的區(qū)別是:FIN_WAIT_1狀態(tài)實際上是當SOCKET在ESTABLISHED狀態(tài)時,它想主動關(guān)閉連接站超,向?qū)Ψ桨l(fā)送了FIN報文荸恕,此時該SOCKET即進入到FIN_WAIT_1狀態(tài)。而當對方回應(yīng)ACK報文后死相,則進入到FIN_WAIT_2狀態(tài)融求,當然在實際的正常情況下,無論對方何種情況下算撮,都應(yīng)該馬上回應(yīng)ACK報文生宛,所以FIN_WAIT_1狀態(tài)一般是比較難見到的,而FIN_WAIT_2狀態(tài)還有時常嘲构瘢可以用netstat看到陷舅。(主動方)

FIN_WAIT_2:上面已經(jīng)詳細解釋了這種狀態(tài),實際上FIN_WAIT_2狀態(tài)下的SOCKET审洞,表示半連接莱睁,也即有一方要求close連接,但另外還告訴對方芒澜,我暫時還有點數(shù)據(jù)需要傳送給你(ACK信息)缩赛,稍后再關(guān)閉連接。(主動方)

TIME_WAIT:表示收到了對方的FIN報文撰糠,并發(fā)送出了ACK報文**酥馍,就等2MSL后即可回到CLOSED可用狀態(tài)了。如果FIN_WAIT_1狀態(tài)下阅酪,收到了對方同時帶FIN標志和ACK標志的報文時旨袒,可以直接進入到TIME_WAIT狀態(tài)汁针,而無須經(jīng)過FIN_WAIT_2狀態(tài)。(主動方)

CLOSING(比較少見): 這種狀態(tài)比較特殊砚尽,實際情況中應(yīng)該是很少見施无,屬于一種比較罕見的例外狀態(tài)。正常情況下必孤,當你發(fā)送FIN報文后猾骡,按理來說是應(yīng)該先收到(或同時收到)對方的 ACK報文,再收到對方的FIN報文敷搪。但是CLOSING狀態(tài)表示你發(fā)送FIN報文后兴想,并沒有收到對方的ACK報文,反而卻也收到了對方的FIN報文赡勘。什么情況下會出現(xiàn)此種情況呢嫂便?其實細想一下,也不難得出結(jié)論:那就是如果雙方幾乎在同時close一個SOCKET的話闸与,那么就出現(xiàn)了雙方同時發(fā)送FIN報文的情況毙替,也即會出現(xiàn)CLOSING狀態(tài),表示雙方都正在關(guān)閉SOCKET連接践樱。

CLOSE_WAIT:這種狀態(tài)的含義其實是表示在等待關(guān)閉厂画。怎么理解呢?當對方close一個SOCKET后發(fā)送FIN報文給自己拷邢,你系統(tǒng)毫無疑問地會回應(yīng)一個ACK報文給對方木羹,此時則進入到CLOSE_WAIT狀態(tài)。接下來呢解孙,實際上你真正需要考慮的事情是察看你是否還有數(shù)據(jù)發(fā)送給對方,如果沒有的話抛人,那么你也就可以 close這個SOCKET弛姜,發(fā)送FIN報文給對方,也即關(guān)閉連接妖枚。所以你在CLOSE_WAIT狀態(tài)下廷臼,需要完成的事情是等待你去關(guān)閉連接。(被動方)

LAST_ACK:這個狀態(tài)還是比較容易好理解的绝页,它是被動關(guān)閉一方在發(fā)送FIN報文后荠商,最后等待對方的ACK報文。當收到ACK報文后续誉,也即可以進入到CLOSED可用狀態(tài)了莱没。(被動方)

CLOSED:表示連接中斷。

TCP四次揮手示意圖

5. TCP的具體狀態(tài)圖可參考:

TCP狀態(tài)遷移圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酷鸦,一起剝皮案震驚了整個濱河市饰躲,隨后出現(xiàn)的幾起案子牙咏,更是在濱河造成了極大的恐慌,老刑警劉巖嘹裂,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妄壶,死亡現(xiàn)場離奇詭異,居然都是意外死亡寄狼,警方通過查閱死者的電腦和手機丁寄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泊愧,“玉大人伊磺,你說我怎么就攤上這事∑绰眩” “怎么了奢浑?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長腋腮。 經(jīng)常有香客問我雀彼,道長,這世上最難降的妖魔是什么即寡? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任徊哑,我火速辦了婚禮,結(jié)果婚禮上聪富,老公的妹妹穿的比我還像新娘莺丑。我一直安慰自己,他們只是感情好墩蔓,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布梢莽。 她就那樣靜靜地躺著,像睡著了一般奸披。 火紅的嫁衣襯著肌膚如雪昏名。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天阵面,我揣著相機與錄音轻局,去河邊找鬼。 笑死样刷,一個胖子當著我的面吹牛仑扑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播置鼻,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼镇饮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了箕母?” 一聲冷哼從身側(cè)響起盒让,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤梅肤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后邑茄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姨蝴,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年肺缕,在試婚紗的時候發(fā)現(xiàn)自己被綠了左医。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡同木,死狀恐怖浮梢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情彤路,我是刑警寧澤秕硝,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站洲尊,受9級特大地震影響远豺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坞嘀,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一躯护、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丽涩,春花似錦棺滞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矮男,卻和暖如春移必,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昂灵。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舞萄,地道東北人眨补。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像倒脓,于是被迫代替她去往敵國和親撑螺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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