TCP三握四挥

今天做京东前端笔试题的时候看到了相关的问题,然后在网上看了一下一些博客的解释。https://blog.csdn.net/qq_38950316/article/details/81087809

说下我的理解。

为什么一定需要三次握手呢?就是因为我们无法保证第二次握手的时候,Customer端能收到来自Server端的确认消息。举个例子,你和一些人打篮球,你运着球,这个时候你发现一个队友站的位置非常好就想传球给他,然后你叫了他一声就马上把球扔过去了,结果你队友根本没听见,然后你就把队友给砸晕了。。。这个例子的目的是想表达二次握手这种思路太理想,根本没有考虑实际的情况。所以二次挥手会有死锁的可能性。

三次握手就避免了上述情况的发生,第二次握手的意思其实是S向C表示已经准备好,但是C是否准备好S并不知道(S不应该默认C准备好),第三次握手的目的就是C告诉S这边已经准备好。当S收到C的确认消息之后,表示CS都准备好了,所以连接就正式建立,开始发收数据。

为什么是四次挥手?举个例子,假设你是好学生,正在写作业,然后你作业还没写完的时候,你妈告诉你等会写完作业要跟她去探亲戚,所以你自然是先回应她一声你知道了,然后等你把作业写完的时候,你才再告诉她你写完作业可以去了。多出来一次挥手就是因为S端不会在接收到断开连接之后就马上停止发送数据,它需要把来自C端的请求处理完才能停。

挥手同样也是需要两边准备好的过程。接上边的例子,你作业写完了,然后你通知你妈,但是你妈不一定听见了,那这个时候很自然的,你猜她肯定没听见,这个时候肯定要再叫她一次(未必你说完了之后就穿着鞋子管都不管就走了?),直到她答应你才代表她听见了(我也不相信你妈听见之后也一言不发低着头穿鞋无视你的存在)。所以说最后两次挥手就是这么来的,很符合现实环境。

上面的例子顺带解释了wait 2个msl的存在理由,wait其实解决的是你妈回答了你,你却没听见的问题——你如果没听见你妈回复你,自然就会认为是她没听见,然后再叫她(妈!!!),然后你妈就又回答你(干什么啊?我知道了呀!)。直到你听见之后,这个循环就停了。这个例子的思路和wait并不完全一致,因为现实中妈妈不会专门去wait,但是大体思路已经能说清wait的存在理由。

发表评论

电子邮件地址不会被公开。 必填项已用*标注