TCP连接为什么是三次握手?断开为什么是四次挥手?

1.三次握手

TCP连接换成四次握手行不行?为什么?换成两次握手行不行?为什么? 这是我面试时遇到的原题

首先来说一下三次握手,为什么需要三次握手呢?因为TCP提供的是可靠传输服务,因此它在传输之前必须要进行传输的可靠性测试和一些信息的同步,反观UDP就不用这些握手操作。三次握手正好使双方都能测试传输的可靠性,同时也能进行信息同步,三次握手过程如下:
在这里插入图片描述
那么三次握手到底是在握什么呢?抓包测试一下(抓包测试请看另一篇):
在这里插入图片描述

三次握手的作用

  • 第一次握手:client同步自己的发送序号seq和接收窗口win(还有其他可选信息),同时测试自己的发送能力是否正常
  • 第二次握手:server发送确认号ack,证明了client发送正常。同时同步自己的发送信息seq和win,还要测试自己的发送能力是否正常
  • 第三次握手:client发送确认号ack,证明了server发送正常

至此,发送信息同步完成,可靠性测试完成

两次握手是否可以

可以发现,前两次握手都需要发送同步信息,因此前两次肯定是必不可少的,唯一有可能的就是第三次,但是从上面的分析来看,如果少了第三次握手,那么client知道自己的发送能力正常,发送信息也同步完成,但是server不能确定自己的发送能力是否正常,也不知道自己的发送信息是否同步完成,因此第三次握手也是必不可少的。

PS:SYN泛洪攻击原理就是恶意终端故意不发送第三个握手包,操作系统在发送完第二次握手包后,会分配一些资源给这个半连接,同时将这个半连接放入半连接队列,半连接过多时会导致server半连接队列满,正常用户的请求得不到相应,同时过多的半连接占用过多的资源还会影响server性能。

四次握手是否可以

有的人可能会想,第三次握手万一丢失了呢?是不是需要第四次握手来对第三次进行确认?第三次握手确实可能会丢失,假如采用第四次来对第三次进行确认,那么第四次需要第五次来确人… …可以发现无论是四次五次或是更多次效果都是一样的,这样的协议既不可能实现也没有任何的效率可言。于是TCP采用了超时重传的策略来保证传输的可靠性,server在发送完第二次握手包之后,就会开启一个定时器,超时后如果没有收到第三次握手包,它就会重新发送SYN+ACK,重复以上步骤,如果失败三次后则说明连接失败,数据传输时采用同样的策略。

四次挥手

TCP四次挥手流程:
在这里插入图片描述
抓包测试:
在这里插入图片描述

为什么断开连接需要四次挥手

我们都知道,TCP连接是全双工通信的,而断开时双方都需要确定两个问题:自己是否还有数据要发送,对端是否还有数据要发送,而四次挥手正好在双方同步了这两个问题。

  • 第一次挥手:client告诉server自己的数据已全部发送,client可以回收发送缓冲区,server可以回收接收缓冲区
  • 第二次挥手:server告诉client自己收到了关闭信息
  • 第三次挥手:server告诉client自己的数据已全部发送,server可以回收发送缓冲区,client可以回收接收缓冲区
  • 第四次挥手:client告诉server自己收到了关闭信息

可以发现,四次挥手同样一次都不能少,如果少了其中任何一次,总有一方不能可靠的通知对方自己的数据已发送完毕,因此,连接不可能可靠的断开,TCP也就成了不可靠的协议。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页