先说说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%可靠, 而上面的三次握手已经做好了通信的准备工作, 再增加握手, 并不能显著提高可靠性, 而且也没有必要。
大家也可以思考一下, 这是个有趣的问题。