TCP三次握手四次揮手

三次握手钞楼,建立連接

三次握手示意圖
  • 第一次握手:建立連接時(shí),客戶端A發(fā)送SYN包(SYN=j)到服務(wù)器B袄琳,并進(jìn)入SYN_SEND狀態(tài)询件,等待服務(wù)器B確認(rèn)。
  • 第二次握手:服務(wù)器B收到SYN包唆樊,確認(rèn)客戶A的SYN(ACK=j+1)宛琅,同時(shí)自己也發(fā)送一個(gè)SYN包(SYN=k),即SYN+ACK包逗旁,此時(shí)服務(wù)器B進(jìn)入SYN_RECV狀態(tài)嘿辟。
  • 第三次握手:客戶端A收到服務(wù)器B的SYN+ACK包,向服務(wù)器B發(fā)送確認(rèn)包ACK(ACK=k+1)片效,此包發(fā)送完畢红伦,客戶端A和服務(wù)器B進(jìn)入ESTABLISHED狀態(tài),完成三次握手淀衣。

完成三次握手昙读,客戶端與服務(wù)器開始傳送數(shù)據(jù)。(事實(shí)上膨桥,第三次握手的IP包中蛮浑,就已經(jīng)可以攜帶數(shù)據(jù))

四次揮手,拆除連接

四次揮手.png

由于TCP連接是全雙工的国撵,一個(gè)TCP連接存在雙向的讀寫通道陵吸。 因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN包來終止這個(gè)方向的連接介牙。收到一個(gè)FIN包只意味著這一方向上沒有數(shù)據(jù)流動(dòng),一個(gè)TCP連接在收到一個(gè)FIN包后仍可以在另一個(gè)方向上收發(fā)數(shù)據(jù)澳厢。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉环础,而另一方執(zhí)行被動(dòng)關(guān)閉囚似。

TCP連接的拆除需要發(fā)送四個(gè)包,因此稱為四次揮手(four-way handshake)线得∪幕剑客戶端或服務(wù)器均可主動(dòng)發(fā)起揮手動(dòng)作,在socket編程中贯钩,任何一方執(zhí)行close()操作即可產(chǎn)生揮手操作募狂。

  • 客戶端A發(fā)送一個(gè)FIN,用來關(guān)閉客戶A到服務(wù)器B的數(shù)據(jù)傳送角雷。 (服務(wù)器讀通道關(guān)閉)
  • 服務(wù)器B收到這個(gè)FIN祸穷,它發(fā)回一個(gè)ACK,確認(rèn)序號(hào)為收到的序號(hào)加1勺三。和SYN一樣雷滚,一個(gè)FIN將占用一個(gè)序號(hào)。 (客戶端寫通道關(guān)閉)
  • 服務(wù)器B關(guān)閉與客戶端A的連接吗坚,發(fā)送一個(gè)FIN給客戶端A祈远。 (服務(wù)器寫通道關(guān)閉)
  • 客戶端A發(fā)回ACK報(bào)文確認(rèn),并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1商源。 (客戶端讀通道關(guān)閉)

FIN包的主動(dòng)發(fā)起方關(guān)閉自己的寫通道车份,被動(dòng)方關(guān)閉自己的讀通道。

從建立連接到斷開連接TCP的狀態(tài)遷移

TCP狀態(tài)遷移
TCP狀態(tài)遷移

客戶端TCP狀態(tài)遷移:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED

服務(wù)器TCP狀態(tài)遷移:
CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

各個(gè)狀態(tài)意義如下:
LISTEN - 偵聽來自遠(yuǎn)方TCP端口的連接請求牡彻;
SYN-SENT -在發(fā)送連接請求后等待匹配的連接請求扫沼;
SYN-RECEIVED - 在收到和發(fā)送一個(gè)連接請求后等待對連接請求的確認(rèn);
ESTABLISHED- 代表一個(gè)打開的連接讨便,數(shù)據(jù)可以傳送給用戶充甚;
FIN-WAIT-1 - 等待遠(yuǎn)程TCP的連接中斷請求,或先前的連接中斷請求的確認(rèn)霸褒;
FIN-WAIT-2 - 從遠(yuǎn)程TCP等待連接中斷請求伴找;
CLOSE-WAIT - 等待從本地用戶發(fā)來的連接中斷請求;
CLOSING -等待遠(yuǎn)程TCP對連接中斷的確認(rèn)废菱;
LAST-ACK - 等待原來發(fā)向遠(yuǎn)程TCP的連接中斷請求的確認(rèn)技矮;
TIME-WAIT -等待足夠的時(shí)間以確保遠(yuǎn)程TCP接收到連接中斷請求的確認(rèn);
CLOSED - 沒有任何連接狀態(tài)殊轴;

TCP的TIME_WAIT和Close_Wait狀態(tài)

SYN_RECV

服務(wù)端收到建立連接的SYN之后&&沒有收到SYN的ACK包之前的時(shí)候處在SYN_RECV狀態(tài)衰倦。有兩個(gè)相關(guān)系統(tǒng)配置:

  • net.ipv4.tcp_synack_retries :INTEGER (默認(rèn)值是5)

對于遠(yuǎn)端的連接請求SYN,內(nèi)核會(huì)發(fā)送SYN + ACK數(shù)據(jù)報(bào)旁理,以確認(rèn)收到上一個(gè) SYN連接請求包樊零。這是所謂的三次握手( threeway handshake)機(jī)制的第二個(gè)步驟。這里決定內(nèi)核在放棄連接之前所送出的 SYN+ACK 數(shù)目。不應(yīng)該大于255驻襟,默認(rèn)值是5夺艰,對應(yīng)于180秒左右時(shí)間。通常我們不對這個(gè)值進(jìn)行修改沉衣,因?yàn)槲覀兿M鸗CP連接不要因?yàn)榕紶柕膩G包而無法建立郁副。

  • net.ipv4.tcp_syncookies

一般服務(wù)器都會(huì)設(shè)置net.ipv4.tcp_syncookies=1來防止SYN Flood攻擊滋尉。假設(shè)一個(gè)用戶向服務(wù)器發(fā)送了SYN報(bào)文后突然死機(jī)或掉線狡孔,那么服務(wù)器在發(fā)出SYN+ACK應(yīng)答報(bào)文后是無法收到客戶端的ACK報(bào)文的(第三次握手無法完成)悠反,這種情況下服務(wù)器端一般會(huì)重試(再次發(fā)送SYN+ACK給客戶端)并等待一段時(shí)間后丟棄這個(gè)未完成的連接屿笼,這段時(shí)間的長度我們稱為SYN Timeout牡拇,一般來說這個(gè)時(shí)間是分鐘的數(shù)量級(大約為30秒-2分鐘)冈敛。

這些處在SYNC_RECV的TCP連接稱為半連接潦嘶,并存儲(chǔ)在內(nèi)核的半連接隊(duì)列中贰锁,在內(nèi)核收到對端發(fā)送的ACK包時(shí)會(huì)查找半連接隊(duì)列巷屿,并將符合的requst_sock信息存儲(chǔ)到完成三次握手的連接的隊(duì)列中固以,然后刪除此半連接。大量SYNC_RECV的TCP半連接會(huì)導(dǎo)致半連接隊(duì)列溢出嘱巾,這樣后續(xù)的連接建立請求會(huì)被內(nèi)核直接丟棄憨琳,這就是SYN Flood攻擊。

能夠有效防范SYN Flood攻擊的手段之一旬昭,就是SYN Cookie篙螟。SYN Cookie原理由D. J. Bernstain和 Eric Schenk發(fā)明。SYN Cookie是對TCP服務(wù)器端的三次握手協(xié)議作一些修改问拘,專門用來防范SYN Flood攻擊的一種手段遍略。它的原理是,在TCP服務(wù)器收到TCP SYN包并返回TCP SYN+ACK包時(shí)骤坐,不分配一個(gè)專門的數(shù)據(jù)區(qū)绪杏,而是根據(jù)這個(gè)SYN包計(jì)算出一個(gè)cookie值。在收到TCP ACK包時(shí)纽绍,TCP服務(wù)器在根據(jù)那個(gè)cookie值檢查這個(gè)TCP ACK包的合法性蕾久。如果合法,再分配專門的數(shù)據(jù)區(qū)進(jìn)行處理未來的TCP連接拌夏。

CLOSE_WAIT

發(fā)起TCP連接關(guān)閉的一方稱為client僧著,被動(dòng)關(guān)閉的一方稱為server。被動(dòng)關(guān)閉的server收到FIN后障簿,但未發(fā)出ACK的TCP狀態(tài)是CLOSE_WAIT盹愚。出現(xiàn)這種狀況一般都是由于server端代碼的問題,如果你的服務(wù)器上出現(xiàn)大量CLOSE_WAIT站故,應(yīng)該要考慮檢查代碼皆怕。

TIME_WAIT

根據(jù)TCP協(xié)議定義的3次握手?jǐn)嚅_連接規(guī)定,發(fā)起socket主動(dòng)關(guān)閉的一方 socket將進(jìn)入TIME_WAIT狀態(tài)。TIME_WAIT狀態(tài)將持續(xù)2個(gè)MSL(Max Segment Lifetime),在Windows下默認(rèn)為4分鐘端逼,即240秒朗兵。TIME_WAIT狀態(tài)下的socket不能被回收使用. 具體現(xiàn)象是對于一個(gè)處理大量短連接的服務(wù)器污淋,如果是由服務(wù)器主動(dòng)關(guān)閉客戶端的連接顶滩,將導(dǎo)致服務(wù)器端存在大量的處于TIME_WAIT狀態(tài)的socket, 甚至比處于Established狀態(tài)下的socket多的多,嚴(yán)重影響服務(wù)器的處理能力寸爆,甚至耗盡可用的socket礁鲁,停止服務(wù)。

為什么需要TIME_WAIT赁豆?TIME_WAIT是TCP協(xié)議用以保證被重新分配的socket不會(huì)受到之前殘留的延遲重發(fā)報(bào)文影響的機(jī)制,是必要的邏輯保證仅醇。

和TIME_WAIT狀態(tài)有關(guān)的系統(tǒng)參數(shù)有一般有3個(gè):

  • net.ipv4.tcp_fin_timeout,默認(rèn)60s魔种,減小fin_timeout析二,減少TIME_WAIT連接數(shù)量。
  • net.ipv4.tcp_tw_reuse = 1表示開啟重用节预。允許將TIME-WAIT sockets重新用于新的TCP連接叶摄,默認(rèn)為0,表示關(guān)閉安拟;
  • net.ipv4.tcp_tw_recycle = 1表示開啟TCP連接中TIME-WAIT sockets的快速回收蛤吓,默認(rèn)為0,表示關(guān)閉糠赦。

從上面可以看到会傲,主動(dòng)發(fā)起關(guān)閉連接的操作的一方將達(dá)到TIME_WAIT狀態(tài),而且這個(gè)狀態(tài)要保持Maximum Segment Lifetime的兩倍時(shí)間拙泽。為什么要這樣做而不是直接進(jìn)入CLOSED狀態(tài)淌山?

原因有二:
一、保證TCP協(xié)議的全雙工連接能夠可靠關(guān)閉
二顾瞻、保證這次連接的重復(fù)數(shù)據(jù)段從網(wǎng)絡(luò)中消失

先說第一點(diǎn)泼疑,如果Client直接CLOSED了,那么由于IP協(xié)議的不可靠性或者是其它網(wǎng)絡(luò)原因朋其,導(dǎo)致Server沒有收到Client最后回復(fù)的ACK王浴。那么Server就會(huì)在超時(shí)之后繼續(xù)發(fā)送FIN,此時(shí)由于Client已經(jīng)CLOSED了梅猿,就找不到與重發(fā)的FIN對應(yīng)的連接氓辣,最后Server就會(huì)收到RST而不是ACK,Server就會(huì)以為是連接錯(cuò)誤把問題報(bào)告給高層袱蚓。這樣的情況雖然不會(huì)造成數(shù)據(jù)丟失钞啸,但是卻導(dǎo)致TCP協(xié)議不符合可靠連接的要求。所以,Client不是直接進(jìn)入CLOSED体斩,而是要保持TIME_WAIT梭稚,當(dāng)再次收到FIN的時(shí)候,能夠保證對方收到ACK絮吵,最后正確的關(guān)閉連接弧烤。

再說第二點(diǎn),如果Client直接CLOSED蹬敲,然后又再向Server發(fā)起一個(gè)新連接暇昂,我們不能保證這個(gè)新連接與剛關(guān)閉的連接的端口號(hào)是不同的。也就是說有可能新連接和老連接的端口號(hào)是相同的伴嗡。一般來說不會(huì)發(fā)生什么問題急波,但是還是有特殊情況出現(xiàn):假設(shè)新連接和已經(jīng)關(guān)閉的老連接端口號(hào)是一樣的,如果前一次連接的某些數(shù)據(jù)仍然滯留在網(wǎng)絡(luò)中瘪校,這些延遲數(shù)據(jù)在建立新連接之后才到達(dá)Server澄暮,由于新連接和老連接的端口號(hào)是一樣的,又因?yàn)門CP協(xié)議判斷不同連接的依據(jù)是socket pair阱扬,于是泣懊,TCP協(xié)議就認(rèn)為那個(gè)延遲的數(shù)據(jù)是屬于新連接的,這樣就和真正的新連接的數(shù)據(jù)包發(fā)生混淆了价认。所以TCP連接還要在TIME_WAIT狀態(tài)等待2倍MSL嗅定,這樣可以保證本次連接的所有數(shù)據(jù)都從網(wǎng)絡(luò)中消失。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末用踩,一起剝皮案震驚了整個(gè)濱河市渠退,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脐彩,老刑警劉巖碎乃,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異惠奸,居然都是意外死亡梅誓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門佛南,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梗掰,“玉大人,你說我怎么就攤上這事嗅回〖八耄” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵绵载,是天一觀的道長埂陆。 經(jīng)常有香客問我苛白,道長,這世上最難降的妖魔是什么焚虱? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任购裙,我火速辦了婚禮,結(jié)果婚禮上鹃栽,老公的妹妹穿的比我還像新娘躏率。我一直安慰自己,他們只是感情好谍咆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布禾锤。 她就那樣靜靜地躺著,像睡著了一般摹察。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上倡鲸,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天供嚎,我揣著相機(jī)與錄音,去河邊找鬼峭状。 笑死克滴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的优床。 我是一名探鬼主播劝赔,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胆敞!你這毒婦竟也來了着帽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤移层,失蹤者是張志新(化名)和其女友劉穎仍翰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體观话,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡予借,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了频蛔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灵迫。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖晦溪,靈堂內(nèi)的尸體忽然破棺而出瀑粥,到底是詐尸還是另有隱情,我是刑警寧澤尼变,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布利凑,位于F島的核電站浆劲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哀澈。R本人自食惡果不足惜牌借,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望割按。 院中可真熱鬧膨报,春花似錦、人聲如沸适荣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弛矛。三九已至够吩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丈氓,已是汗流浹背周循。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留万俗,地道東北人湾笛。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像闰歪,于是被迫代替她去往敵國和親嚎研。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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

  • tcp三次握手四次揮手 TCP狀態(tài)圖 TCP狀態(tài)時(shí)序圖 tcp三次握手 流程圖: TCP握手狀態(tài)說明: TCP_S...
    肖金光xjg閱讀 654評論 0 4
  • 本文參考:http://blog.csdn.net/zxxyyxf/article/details/6609272...
    Levan_li閱讀 6,146評論 1 54
  • TCP的運(yùn)輸連接管理 TCP是面向連接的協(xié)議库倘。運(yùn)輸連接是用來傳送TCP報(bào)文的临扮。TCP運(yùn)輸連接的建立和釋放是每一次面...
    曲諧_閱讀 3,092評論 1 6
  • 最近在惡補(bǔ)計(jì)算機(jī)網(wǎng)絡(luò)方面的知識(shí),之前對于TCP的三次握手和四次分手也是模模糊糊于樟,對于其中的細(xì)節(jié)更是渾然不知公条,最近看...
    微醺歲月閱讀 9,512評論 4 129
  • 粉脂凝玉露 青絲撫丹唇 濃眉掃纖目 桃頰襯巧云 花房彈酥蜜 雛菊引白臀 嫩髀掛柔荑 曼妙多香芬: 軟下去顰顰似水,...
    居花閱讀 181評論 0 1