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