【For Interview】TCP连接为什么是三次握手?

179 阅读3分钟

面试被问的多了,就很烦,但是还是没有好好总结,看了网上的文章,总结的详细很好。
然而我本身比较懒,也只是想知道,并不想深入了解什么tcp报文什么消息之类的。 就用通俗的语言讲一下为啥要三次握手,而不是二次,而不是四次

为什么不能是两次

我们要证明两次太少
已知条件是: TCP是可靠的连接

  • 第一个原因 我们用反证法:
    假设TCP是两次握手,
    从客户端来讲,发送给服务器一个请求,收到一个回应,客户端可以推测出,服务器有接收发送的能力。为什么呢?
    就好比你问一个陌生美女要微信号,她回应了一句!说明她能接收到你的请求,也能回应你,你知道哦,这位美女能接收能发送
    但是对于服务器来讲,它只知道客户端会发送数据(因为收到了第一次的请求了),但是它回应以后(第二次),没声音了?!它只能知道客户端会发送,但是不知道会不会接收!所以服务器只知道客户端的接收能力,但是不知道客户端的发送能力!
    还是美女例子,美女说了一句!然后你作为客户端不吱声了!美女心想,这人怕不是聋子吧?本来对你怒气冲冲,突然变成了怜悯~ 从包里扒拉出来1块钱硬币丢给了你…… 这波不亏…… 啊 ……呸!
    综上所述,两次握手创建的连接不可靠,所以证得TCP是不可靠连接,这就跟已知条件冲突,所以TCP不能是两次握手。
  • 第二个原因 看图吧,这个是在B站某个老师讲课的截图,可以看原视频 假设是两次握手
  1. 第一阶段 第一次握手由于某种原因网络阻塞了,服务器没有收到

  2. 第二阶段 客户端发现某个时间内没有收到响应,以为数据包丢失了,就会触发超时重发机制,再次发送一个请求。然后这一次很顺利,迅速建立了连接

  3. 第三阶段 第一次第一个握手的网络好了,然后服务器建立了连接,但是客户端在超时重发阶段就当作这个请求丢了,是不予回应的。
    这就造成了服务器在监听传过来的消息,浪费服务器资源;客户端也不‘认识’这个连接,所以他们还是没能建立通信。这样也就不可靠了,说TCP是可靠的,两次肯定不可靠啊!

为什么不是四次

我们要证明四次太多余 上面两次推断其实可以知道:
其一,双方获取对方的接收发送能力三次就够了,这个第四次多余;
其二,打个比方
客户端: 服务器我们建立连接吧! (一次)
服务器: 可以,我们建立连接把! (二次)
客户端: 收到,我们建立连接把! (三次)
服务器: 收到,我们建立连接吧! (四次)
第四次那个收到,我们建立连接吧! 明明已经在第二次就答应了,再答应一次真的是多余了!

综上,回答这类问题的时候,先回答为什么二次不行,有两个原因,其实第二个原因是面试官想考你的;再回答为什么四次不行!