三次握手

为什么要进行三次握手?

  1. 客户端需要知道自己发送的消息服务端能够收到
  2. 客户端自己本身也能够接收服务端发送的消息
  3. 服务端也需要知道自己发送的消息客户端能够收到
  4. 服务端本身也能够接收客户端发送的消息。

三次握手的作用?

1.确认客户端和服务器双方的接收能力和发送能力;
2.指定自己的初始化序列号为后面的可靠性传输做准备;
3.连接服务器指定的端口,建立TCP连接,并同步连接双方的序列号和确认号;

为何两次握手不可以?

弄清这个问题,我们需要先弄明白三次握手的目的是什么,能不能只用两次握手来达到同样的目的。
第一次握手:客户端发送网络包,服务端收到了。 这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。 这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
第三次握手:客户端发包,服务端收到了。 这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。 因此,需要三次握手才能确认双方的接收与发送能力是否正常。


在说三次握手之前,先来了解TCP头格式的几个东西

序号:就是SEQ,SEQ是一个32位的数,第一次使用时会由计算机自动生成,往后的使用会不断累加一
确认号:ack,ack是序号加一
SYN:一位,只有两种表达方式,0/1,为1表示:需要请求建立连接
ACK:应答信号,注意和小写的ack不一样,ACK只有一位,为1表示:收到了
FIN:请求断开连接,只有一位,可以理解为finish(完成)的缩写,为1表示:请求断开连接
了解了TCP请求头格式之后,下面看三次挥手

第一次握手

客户端需要向服务端发起建立连接的请求
此时SYN=1,就好像:我需要和你建立连接了
SEQ=x,x是序号,第一次使用是随机生成的,往后客户端的SEQ都会在此基础上加1,每发送一次信息就都会加一,是个累加的值
注意:此时客户端只是发送了请求,它并不知道服务端是否能收到

第二次握手

服务端收到了客户端的请求,那么他就需要告诉客户端,我可以和你建立连接了
此时SYN=1,表示:我可以和你建立连接
ack是确认序号,要在客户端的序号上加一
SEQ自动生成,之后服务端的SEQ都会在此基础上加一,每发送一次信息就都会加一,是个累加的值
ACK是应答信号,ACK=1表示:我收到了你的请求
注意:此时服务端已经收到了客户端的信息,但是他不能确认自己所发送的信息是否能够被服务端接收,因此还需要第三次握手来解决这个问题

第三次握手

客户端收到了服务端的请求,此时客户端知道了一件事:我发送的消息服务端能够接收了,同时我也能够收到服务端的消息
但是此时还不能建立连接,因为,服务端并不确认自己的消息客户端能否收到
所以:客户端需要再发送一次消息确认
ACK=1表示:我收到了你的消息
SEQ=x+1,在之前的SEQ加一
ack=y+1,应答信号,在服务端发送的SEQ上加一
当服务端收到了客户端的确认消息之后,就相当于知道了:我可以收到客户端的消息,自己发送的消息客户端也能够接收

至此,三次握手的过程已经完成。
如果在第三次握手阶段,服务端没有收到客户端发送的确认消息,是不会建立连接的,这就保证了连接的安全可靠性。

四次挥手

握手是用来建立连接的,那么挥手就是用来断开连接的,也称为释放连接,因为连接断开后就将占用空间释放了
注意:释放连接可以是由服务端发送断开连接请求,也可以是由客户端发送断开请求,两者是一样的过程
下面以客户端发送断开请求为例
释放连接需满足的四个条件:

客户端需知道服务端可以断开连接
服务端也需知道客户端可以断开连接
服务端确认本身可以断开连接
客户端确认本身可以断开连接

四次挥手过程图如下

第一次挥手

客户端发送断开请求
FIN=1:表示我需要断开请求
SEQ=x:从建立连接开始,累加到此刻的值,这里使用x表示
注意:此时,客户端确认了本身可以断开连接,但是不能够确认服务端是否可以断开连接,满足条件4

第二次挥手

服务端接收到客户端的断开请求,便发送确认消息
ACK=1,表示:我收到了你的消息
ack=x+1,确认序号,为接收客户端的序号加一
注意:此时,服务端已经能够知道客户端可以断开连接了,但是他还不能确认本身能够断开连接,导致的原因:有正在接收的消息服务端还未接收完成,满足条件4、2

第三次挥手

服务端发送可以断开连接的请求
FIN=1,表示:我可以和你断开连接了
SEQ=y,序号,从建立连接开始,累加到此刻的序号值
注意:此时,服务端确认客户端能够可以断开连接,也确认了本身可以断开连接;客户端确认了本身可以断开连接,但是无法确认服务端能够断开连接,满足条件4、2、3,因此需要再次发送确认信号,就有了第四次挥手

第四次挥手

客户端发送确认消息
ACK=1:表示:我收到了你的消息,你可以断开连接了
ack=y+1,为接收到服务端发送的序号加一
注意:此刻,尽管客户端已经满足了断开连接的条件,但客户端不会立即断开连接,而是会等待一段时间再断开连接,目的是为了保证服务端能够接收到确认消息。当服务端收到了确认消息之后,已经满足了断开的四个条件,他会立即断开连接,而客户端等待了一段时间之后也会断开连接。如果服务端没有收到确认消息,他会再一次发起断开连接请求,客户端收到请求之后,会再次发送确认消息,同时刷新等待时间,如果在等待时间内并没有收到断开请求,客户端就断开连接。

至此,四次挥手结束。

posted on 2022-12-07 16:01  京鸿一瞥  阅读(97)  评论(0编辑  收藏  举报