TCP建立连接为什么是三次握手,而不是一次, 两次,或更多次

每次看到TCP三次握手的解释,都太过于千篇一侓。 并不知其所以然,今天自己稍微总结下。希望可以帮助更多的朋友。
我们先不用理会。三次握手中的所发的什么SYN ACK SEQ之类的东西。
单从逻辑上来分析为什么需要三次握手。在这里我们用三国的故事来说明。
首先三国时期曹操最强, 刘备与孙权需要联手才能抗击打败曹操。假设有这样一 个场景,刘备需要联手孙权攻打曹操, 刘备写信给孙权告知他的意图。这里刘备写信给孙权就好比一次握手。为什么一次握手不行,因为刘备写信给孙权,刘备并不知道孙权的意思,是同意,还是不同意。或者孙权压根就没有收到信。 所以孙权还得给刘备写回信,告知刘备,他知道了,同意联手。这就是第二次握手。刘备收到了孙权的回信后,就知道孙权同意了。貌似好像就达成协议了。 是的,正常情况下,确实两次握手。就可以了。但是, 凡事都有个但是,孙权就会担心了,他并不知道刘备是否收到了他的回信。 如果刘备没有收到他的回信, 刘备可能就不会进攻曹操了, 孙权自己如果进攻曹操, 那不是一个人去送死吗?。 所以说,刘备还得给孙权回信(第三次握手),说他已经收到了孙权的回信。孙权收到回信后,就放心了。因为孙权知道刘备是收到了自己的回信了。协议达成。(连接建立成功,ESTABLISHED). 因此可以看出。也就不需要第三第四或更多次握手了。
当然了, 如果稍微一想就知道,孙权虽然收到了刘备的回信。孙权是放心了。但刘备又会担心孙权是否收到了自己的回信。推理下去,孙权收到刘备回信后,还得给刘备写回信。以此循环往复。 这个问题就无解了。哈哈,理论上确实是这样。所以说TCP建立连接也不是绝对可靠的。但三次握手,与大于三次握手,的效果其实是一样的。三次握手开销最小。相对更可靠。
想象一下真实的网络环境,Client 要与Server建立连接,一次握手我们很容易就考虑到不行。比如网络拥堵Server压根就没有收到消息,那么来看两次握手, Client 发送请求到Server (第一次握手),Server 收到Client 请求后, 回复消息给Client(第二次握手)。Client 收到Server的回复消息后,理论上。是可以建立ESTABLISHED了, 但是真实网络环境,并不可靠的。比如网络拥堵的时候,Client可能压根就没有收到Server回复的消息。这样一来,Server以为与Client
成功建立了连接,但实际上Server与Client之间并没有连接通道。Server还得维护一个连接资源。Client此时早已不知去向了, 就造成了极大服务器资源浪费。所以说两次握手还是不够的。 Client收到Server回信后,还得给Server回复一个消息。(第三次握手)。Server收到Client回复后,Server就知道Client还在。相对来说就更可靠了。
还有一个更好的例子来证明。两次握手是不行。譬如发起请求遇到类似这样的情况:客户端发出去的第一个连接请求由于某些原因在网络节点中滞留了导致延迟,直到连接释放的某个时间点才到达服务端,这是一个早已失效的报文,但是此时服务端仍然认为这是客户端的建立连接请求第一次握手,于是服务端回应了客户端,第二次握手。如果只有两次握手,那么到这里,连接就建立了,但是此时客户端并没有任何数据要发送,而服务端还在傻傻的等候佳音,造成很大的资源浪费。所以需要第三次握手,只有客户端再次回应一下,就可以避免这种情况。
END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值