这几天面试校招生,需要考量一下他们的计算机网络基础,就问了这个老生常谈的问题,说一下TCP三次握手和四次挥手,为什么挥手比握手要多一次?
其实这个问题几乎所有人都能回答,甚至有的回答的很"标准",完全把课本上的答案背了下来说了一遍,甚至还知道SYN,ACK标志位,但是这些东西对我来说没有什么意义,因为这些标志位换成别的代号照样能完成三次握手和四次挥手。其实我想要知道的就是你怎么理解这个过程,三次握手的目的是什么?解决了什么问题,为什么不采取其他方案?比如二次握手或者四次握手?这才是关键所在。
其实三次握手的过程就是一个让客户端和服务端双方都确认自己发送数据及接收数据能力正常的过程,这样才能实现全双工通信。
我们可以来模拟一下"握手"的过程,实际上“握手”这个词不太好理解,因为握手的场景是两个人站在一起面对面的,双方都能够“坦诚相见”,不太好联想到双方站这么近还需要想办法建立连接的原因。实际上客户端和服务器相差可能十万八千里,它们甚至都不确定对方是否还有电,是否还活着。
那我们就假设世界末日了,世界上只剩下两个人小A(客户端)和小B(服务端),他们人手一个无线电发送/接收器,他们都不确定自己的机器是否是坏的,有可能发送不了数据,也有可能接收不了数据,这个时候小A和小B想要保持联系怎么办?答案就是3次握手。
1:小A给小B发送了一条消息:"小B你在吗?over"。-----------假设小B收到了消息,那么小B能够确认小A的机器能够发送数据,自己的机器能够接收数据。而小A还在焦急等待中。。啥也不知道
------------------------- 第一次握手结束
2:小B给小A发送了一条消息:"小A我能收到你消息,太好了"。-------------假设小A收到了小B的回复, 那么小A能够确认自己的机器既能发出去又能接收,小A高兴的不得了。而小B不确定自己的消息小A是否收到,因此不确定自己发送功能是否正常,只知道自己接收消息正常。
------------------------- 第二次握手结束
3:小A又给小B发送一条消息:"小B我也能收到你的消息,咱俩的机器都没有问题,接下来我们可以持续保持通信了"。-------------------假设小B收到小A的消息,那么他们双方都确认了他们的机器完全正常。
------------------------- 第三次握手结束
为什么假设都是对方能收到消息呢?因为如果收不到消息,就没有接下来的握手了,也别想建立任何连接的,因此不是每一次试图建立TCP连接都是三次握手,而是每一次成功建立TCP连接的都是三次握手。
假如说只有2次握手,第二次握手结束,小B其实是不确认自己发送的消息小A是否能收到的,有可能小B消息发送是坏的,有可能小A的消息接收是坏的,总之导致最后小A压根没收到小B回复,如果这时小B就贸然认为建立了连接,那么有可能他要等很久都收不到小A发的任何消息了,因为小A并没有收到回复。4次握手就不用说了,根据上面的场景模拟,完全没必要画蛇添足。
3次握手看上去是不是也就那样?没有什么高级的,其实就是一个相互确认的游戏而已。
那么讲讲四次挥手,为什么会多一次?
假设小A和小B连续网聊了一个月,他们终于厌倦了对方,不想继续保持联系,但是他们都还有最后的一些话要说(有最后的消息要发送),于是他们同时编辑并发送着最后想要说的话,接下来开始4次挥手:
1:小A想要说的都发送完了,于是给小B发了一条消息:“小B,我想说的都发完了,你看一下你都收到了没有,我做好准备跟你说再见了”-----------------假设小B收到小A的消息,小B知道小A的的消息都发完了,准备好再见了。
------------------------- 第一次挥手结束
2:小B回应小A了一条消息:“好了,我知道你发完了,而且我都收到了,但是我还有些信息没发完,你再等我会吧”----------------------------假设小A收到了小B的消息,此时小A确认自己发送出去的数据小B都收到了,但是要继续等待小A的最后几条消息。
------------------------- 第二次挥手结束
3:过了一会小B最后几条消息也发完了,给小A又发一条消息:“我现在也发完了,你看看有没有收到?收到的话我们就结束吧”-------------------------------假设小A收到了小B的消息,此时小A确认小B的消息也发完了,可以说再见了。
------------------------- 第三次挥手结束
4:小A给小B发送一条消息:“你发的消息我也都收到了,那就这样吧,再见啦~!”------------------------------------假设小B收到了小A的消息,此时小B确认了自己发送的消息小A都收到了,也和自己说再见了,小B就掐断了机器天线。
------------------------- 第四次挥手结束
所以整体来看,四次挥手相比三次握手,就是多了一次小B数据发送完毕的确认过程,也就是第三次握手,假设小B没有话想对小A说,只有小A给小B发消息,那么小A发送完毕后,小B就无需等待,可以直接发送我都收到啦,那就再见吧的消息。小A和小B就可以直接结束了,这时只需要二次挥手就可以完美结束关系,可是TCP是全双工通信啊,双方都要收发数据,这就直接变成4次挥手了,主要还是双方话都太多~
希望这篇文章能帮到那个对TCP握手挥手完全迷茫的你