关于TCP三次握手和四次挥手的解释
https://www.cnblogs.com/zhuzhenwei918/p/7465467.html
https://blog.youkuaiyun.com/baixiaoshi/article/details/67712853
https://blog.youkuaiyun.com/xifeijian/article/details/12777187
我的一些个人理解:
为什么是“三次握手”?
建立连接时,A先向B发个建立连接的请求,然后等待B的回应(根据超时重发机制,若规定时间内没收到回复,就会再发一次建立连接的请求,达到重发规定次数还是没收到回复A就不再等待了),接着B收到后给A一个回应并且开始等待A的回应(与前边的A一样,也会有超时重发机制和次数限制,换句话说等待时间有限,等不到回应就放弃了),最后A收到B的回应再给B发一个回应,连接就建立了。
仿照两个人的交流就是这样的:
A:我有点事想和你说,你现在在吗? 上午九点 SYN
B:我现在在的,你在吗? 上午九点零一 ACK+SYN
A:我也在的,okay,开聊吧。 上午九点零二 ACK
如果不是“三次握手”会怎样?比如是两次握手的话。
A:我有点事想和你说,你现在在吗? 上午九点
九点零一时,A没收到回应,就再发一次请求:你现在在吗?
九点零二时,A还是没收到回应,又发一次请求:你现在在吗?
。。。
九点零五时,A依然没收到回应,于是不再等待,放弃请求,干其他事去了。
。。。
B:我现在在的。 下午四点
如果是两次握手,那么当B回复他在的时候他以为连接建立了,然而A上午九点发的请求,B下午四点才回应,A不会在那傻等7个小时的,不然太浪费时间了,A可能会由于迟迟收不到回应早就放弃去干其他事了。
接下来B就会傻等,这样太浪费B的时间了。
所以三次握手,可以节省双方时间,当B回复他现在在的时候,他会发个消息给A,等到四点零五仍然收不到A的回应就视为放弃,不再傻等了。
为什么断开连接要四次挥手?
实际上,建立连接也可以看作双方互相发了共4个消息,只不过B发的两个消息--“我收到你的请求了”和“你现在在吗?”合并成一个消息发了出去,所以一共就3个消息,对应3次握手,那么断开连接能不能这样简化呢?
来看一下断开连接的过程:
A:我事情已经说完了,打算挂电话了。 (A将不再说话,但是还会听B说话) FIN
B:知道了,你先别挂,我事情还没说完呢。 (这是告诉A,我收到你打算挂电话的消息了) ACK
B:。。。。。冬天到了,天气冷了,多穿衣服啊。。。。。。。。。。。(具体的数据)
B:恩,就这些事,说完了,我也没事了,打算挂电话了 (B的数据传送完了,打算挂电话) FIN
A:知道了,挂了啊。 (告诉B,我已经断开连接) ACK
然后B收到A的最后一个断开连接的确认,不再说话,也挂断了。
从上边来看,这没法简化,因为B需要发给A两个消息----“我收到你打算挂电话的消息了(ACK)”和“我也打算挂了(FIN)”,这俩消息之间B有可能得传数据给A。所以先发ACK,然后接着把最后的数据传过去,传完之后发个FIN,很明显,ACK和FIN之间隔着数据,不能合并。
更进一步看,建立连接的过程中,只有请求和确认,没有具体的事情要谈,所以相邻的请求和应答可以合并成一个消息发出去;而断开连接时,可能有一方事情还没说完(首先提出断开的肯定是事情已经说完了的),相邻的FIN和ACK之间还有数据要传送,所以二者不能合并。