需要强调的一点是,TCP建立的是“全双工通信”。也就是单个TCP连接,本质上其实是由两个相互独立却方向相反的数据通道组成。
图片
基于此,在建立连接时,其实是由两组连接操作来完成,两组操作一共4个报文,也就是“四次握手”。
图片
但握手阶段没叫“四次握手”而是称为“三次握手”则是因为发生了“报文合并”。而之所以能够合并则是如开头所说,双方没有“历史负担”都是从零开始,可以同时建立连接。
当然,这里不是绝对的同时,建立连接总要有一方先发送SYN连接请求报文,然后接受方再响应。这时接受方就可以在响应报文ACK中合并自己的SYN连接报文,然后“一箭双雕”的发送。
图片
于是,原本的“四次握手”就因为中间两个报文的合并变成“三次握手”了。
但是到了需要挥手断开TCP连接时,全双工的两条数据通道都已经有了数据流,这时很难做到当其中一条数据流决定关闭时,另外一条也恰好要关闭。这也就是开头说的,大家各自都有“历史负担”了。
图片
当然,两条数据流正好同时断开的可能性也是有的,那就只需要“三次挥手”,但因为是特殊情况不具备代表性,所以不能作数。
这就像两个关系好的哥们,刚毕业时都是光棍,很容易约到一起去做事。但等双方各自成家后就难了,就算双方都有意愿,对方也不再一个电话就能到,而是“你先去,我等会到了给你电话”。