环境
前端知识
前言
在知乎上看到的,非常的形象,就记录下
为什么3次握手
建立连接
理想情况下:
Client:"我要开始了"
Server:"好的"
然后Client
开始发送信息.
第二种情况:
Client:"我要开始了" 但是`Server`没有收到
Client:发现半天Server都没有反馈, 又发了一遍:"我要开始了"
Server:"好的"
如果Client
发送的请求没有被Server
收到, 那么长时间没有收到Server
的回复后, 重新发送请求既可。
第三种情况:
Client:"我要开始了" 这个请求堵在路上了,Server没有收到
Client:"我要开始了"【重新发送的】
Server:"好的"
Client:开始发送信息
但是:在发送信息的过程中, Server
收到了之前堵在路上的请求. Server
只能重新建立连接. 这并不是我们希望的。
为了避免Client
本该失效的请求被Server
接收, 必须要多一次握手, 即三次握手。
Client:"我要开始了"
Server:"好的"
Client:"那我真的开始了"
结束连接
和建立连接一样的考虑, 需要3次握手.如下:
Client:"我要结束啦"
Server:"好的"
Client:"那我真的结束了"
但是结束和建立的一个区别在于, Client
想建立的时候, Server
能够随时准备建立.而Client
想结束的时候, Server
得先确保手中的数据发送完才能够结束。
所以中间的一次握手要拆分为两步.如下:
Client:"我要结束啦"
Server:"好的, 等我把数据发完"
Server:"我发完啦"
Client:"那我真的结束啦"
然后Client
结束连接
Server
收到后也结束连接.
再考虑一种情况, 假如Server
没有收到Client
发送的"那我真的结束啦"呢?超时重传吗?Client
都已经关闭连接了.
所以解决办法是:
Client
在发完"那我真的结束啦"后, 等待一段时间, 如果这段时间内没有收到Server
的重传, 证明Server
已经确实收到了. 所以Client
可以放心的结束了。
所以最终流程如下:
client:"我要结束啦"
server:"好的, 等我把数据发完"
server:"我发完啦"
client:"那我真结束啦"
Client
怕Server
没有收到, 就等了一会儿, 如果这段时间内没有收到Server
的重传, 就放心的关闭连接啦.
而Server
这边接到"那我真的结束啦"后, 就直接关闭连接了。
总结
真的非常形象
参考地址:
https://www.zhihu.com/question/67772889/answer/495905873