为什么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%可靠, 而上面的三次握手已经做好了通信的准备工作, 再增加握手, 并不能显著提高可靠性, 而且也没有必要。

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



        

你可能感兴趣的:(s2:,软件进阶,s2:,后台开发,S3:,笔试面试,s4:,计算机网络)