为什么tcp建立连接是三次握手而不是两次握手或者四次握手?(笔试面试常考)

        先说说tcp三次握手,  不细说了, 也就是syn,  ack/syn,  ack.

        为什么不能是两次呢?

        先假设是两次吧。我们知道, tcp的连接过程中有一个超时重传算法(karn算法是比较典型的), 如果client发出syn包后, 由于网络原因, 没有立即收到ack/syn包, 那么client会再次发起syn包, 这一点, 我们已经多次实验过。

        如果第二次syn包正常达到且与server端建立了tcp连接, server端维护了一个连接, 一次貌似OK, 但别忘了, 第一次那个syn包可能就在此时达到server端了, 于是server端又要维护一个连接, 而这个连接是无效的, 可以认为是死连接。 而一个进程打开的socket是有限度的, 维护这些死连接非常耗费资源。

        所以, 二次握手, 服务端有较大隐患, 容易因为资源耗尽而崩溃。

        而三次握手, 可以避免如上问题, 想想为什么。

        实际上, 三次握手中, client和server都有一个发syn和收ack的过程, 双方都是发后能收, 表明通信则准备工作OK.

         举个简单例子吧:

         A:  美女, 你好

         B:  你好, 我在线, 有什么要聊的?

         此时A知道B收到消息了, 但B并不知道A能收到消息啊。 所以, 两次握手不太靠谱。



          为什么不是四次握手呢? 大家应该知道通信中著名的蓝军红军约定, 这个例子说明, 通信不可能100%可靠, 而上面的三次握手已经做好了通信的准备工作, 再增加握手, 并不能显著提高可靠性, 而且也没有必要。

          大家也可以思考一下, 这是个有趣的问题。



        

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值