握手为什么要三次,两次不行?四次不行?

100 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

TCP三次握手其实就是建立起一个TCP连接,客户端与服务端交互需要三个数据包,握手的主要作用就是确认客户端和服务端双方的接收和发送的能力是否正常。

三次握手

第一次握手:客户端发送syn(synchronization同步)报文(序号),并进入syn_send状态,等待服务端的确认

第二次握手:服务端收到了syn报文,给客户端发送ack(acknowledgment确认)确认报文,同时也要给客户端发送一个syn报文,所以第二次握手,服务端向客户端发送syn加ack报文(序号+确认号(对方序列号+1)),服务器进入syn_rcvd状态
为什么要有确认号,因为客户端收到确认号后减1,再跟自己的序列号比较,就知道是不是自己的报文了。 此时服务器不需要记住自己的序号和客户端的序号,因为如果有黑客不断的发送syn报文而不进行下一步,那么服务器就会不断的消耗自己的资源,服务器会直接原地崩溃(Ddos攻击),因此服务器不保存对方和自己的序号,而是根据服务器的IP地址和端口号等信息进行算法的运算得出自己的序列号

第三次握手:客户端收到服务器的syn加ack报文,向服务器发送ack报文(对方的序列号+1)。客户端进入established状态,服务器收到客户端的ack包后,也进入establish状态。

为什么两次握手不行?

握手的目的是确认双方的接收和发送能力
第一次握手:客户端发、服务端收。服务端得出结论:客户端发送能力、服务端接收能力正常
第二次握手:服务端发、客户端收。客户端得出结论:服务端的接收和发送能力、客户端的接收和发送能力正常。
如果只有这两次握手,服务端并不知道客户端的接收能力是否正常,只有拥有第三次握手,服务端才能确认客户端的接收能力是正常的。

四次挥手

第一次挥手:客户端发送fin报文(finish)+ack报文
第二次挥手:服务端发送ack报文(此时可能有未处理完的信息)
第三次挥手:服务端发送fin报文+ack报文(处理完信息后发送)
第四次挥手:客户端发送ack报文

sequenceDiagram
客户端-)服务端: 我要回家吃饭啦
服务端-)客户端: 等下,饭快好了
服务端-)客户端: 饭好了。快回来
客户端-)服务端: 马上回来