為啥TCP握手只要3次但揮手卻要4次?
簡而言之就是,在執(zhí)行揮手前已經(jīng)有“歷史負(fù)擔(dān)”了,但在握手前是沒有的。
需要強(qiáng)調(diào)的一點(diǎn)是,TCP建立的是“全雙工通信”。也就是單個(gè)TCP連接,本質(zhì)上其實(shí)是由兩個(gè)相互獨(dú)立卻方向相反的數(shù)據(jù)通道組成。
圖片
基于此,在建立連接時(shí),其實(shí)是由兩組連接操作來完成,兩組操作一共4個(gè)報(bào)文,也就是“四次握手”。
圖片
但握手階段沒叫“四次握手”而是稱為“三次握手”則是因?yàn)榘l(fā)生了“報(bào)文合并”。而之所以能夠合并則是如開頭所說,雙方?jīng)]有“歷史負(fù)擔(dān)”都是從零開始,可以同時(shí)建立連接。
當(dāng)然,這里不是絕對的同時(shí),建立連接總要有一方先發(fā)送SYN連接請求報(bào)文,然后接受方再響應(yīng)。這時(shí)接受方就可以在響應(yīng)報(bào)文ACK中合并自己的SYN連接報(bào)文,然后“一箭雙雕”的發(fā)送。
圖片
于是,原本的“四次握手”就因?yàn)橹虚g兩個(gè)報(bào)文的合并變成“三次握手”了。
但是到了需要揮手?jǐn)嚅_TCP連接時(shí),全雙工的兩條數(shù)據(jù)通道都已經(jīng)有了數(shù)據(jù)流,這時(shí)很難做到當(dāng)其中一條數(shù)據(jù)流決定關(guān)閉時(shí),另外一條也恰好要關(guān)閉。這也就是開頭說的,大家各自都有“歷史負(fù)擔(dān)”了。
圖片
當(dāng)然,兩條數(shù)據(jù)流正好同時(shí)斷開的可能性也是有的,那就只需要“三次揮手”,但因?yàn)槭翘厥馇闆r不具備代表性,所以不能作數(shù)。
這就像兩個(gè)關(guān)系好的哥們,剛畢業(yè)時(shí)都是光棍,很容易約到一起去做事。但等雙方各自成家后就難了,就算雙方都有意愿,對方也不再一個(gè)電話就能到,而是“你先去,我等會到了給你電話”。