为什么TCP建立连接需要三次握手,断开却需要四次挥手

参考:https://baijiahao.baidu.com/s?id=1654225744653405133&wfr=spider&for=pc

1. 三次握手

d8f9d72a6059252d20d93b0a6645fb3e59b5b9d2.jpg
  1. Client发送Flag为SYN,seq为x。表示需要建立连接,server接受到请求
  2. Server发送Flag为SYN以及ACK,seq为y。ack=x+1(表示回复的是1) 表示 确认1的请求,且同意建立连接
  3. Client发送Flag为ACK,seq=x+1,ack=y+1(表示回复的是2)表示 收到2的同意建立连接的消息

mark: seq是两端各自增长,请勿搞混。ack会依照回复的哪个seq进行增长。

此时建立连接
具体的Flag,请参考TCP报文格式。


64380cd7912397ddb480a4110c5c4ab2d1a28709.jpg

其中:

其中比较重要的字段有:
(1)序号(sequence number):Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认号(acknowledgement number):Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
(3)标志位(Flags):共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:
URG:紧急指针(urgent pointer)有效。
ACK:确认序号有效。
PSH:接收方应该尽快将这个报文交给应用层。
RST:重置连接。
SYN:发起一个新连接。
FIN:释放一个连接。

需要注意的是:
不要将确认序号Ack与标志位中的ACK搞混了。
确认方Ack=发起方Seq+1,两端配对。


2. 四次挥手

48540923dd54564e5260495ce0006487d0584fb6.jpg
  1. Client发送Flag为FIN,以及seq为u,告诉Server 请求断开链接w
  2. Server回应Flag为ACK,seq=v,告诉Client 我收到了你的断开请求
  3. Server在做好断开准备后,继续向Client发送信息,Flag为FIN,seq为w,ack=u+1 表示我已经准备好断开了
  4. Client收到后,回复Server消息Flag为ACK,seq=u+1,ack=w+1 表示我已经知晓你要断开了

为什么三次握手,确需要四次挥手?

我们从结果看,问题出来第二次握手,Flag同时为SYN和ACK,一次性确认第一次握手,以及同意建立链接两个事情。
而挥手缺把这里给拆成了两个消息。

因为建立链接的时候,Server是无需做任何准备,可以直接开始建立链接。
而断开链接时候,因为TCP是全双工的,收到断开请求,又可能还在向Client发送数据等,所以Server需要进行处理,以及释放资源等,并不能立刻进行断开。

你可能感兴趣的:(为什么TCP建立连接需要三次握手,断开却需要四次挥手)