TCP的三次握手和四次挥手

三次握手(建立连接)

在TCP中,客户端与服务端之所以能够建立可靠的连接,就是因为它们之间发生了三次握手。

第一次握手 客户端→服务端

一般情况下,一个连接往往都是由客户端主动发起,服务端则被动地等待。因此,要建立一个连接,首先由客户端向服务端发送一个数据包,这个数据包包含了一些关键的信息:

SYN=1 建立连接标志位
seq=n 计算机随机生成的序号

意思是:服务端,我(客户端)要和你建立连接(SYN=1)。

第二次握手 服务端→客户端

此时,服务端接收到这个数据包,也会发送一个数据包给客户端,作为回应,这个数据包中也包含了一些关键的信息:

SYN=1 建立连接标志位
seq=m 计算机随机生成的序号
ACK=1 确认标志位
ack=n+1 确认序号

意思是:客户端,我收到你的连接请求了(ACK=1),我也要和你建立连接(SYN=1),另外,我已经收到序号为n的数据包,下次你需要从序号为n+1的数据包开始发送(ack=n+1)。

第三次握手 客户端→服务端

客户端收到服务端发来的数据包,可以知道两件事情:我(客户端)可以向服务端发送数据,也可以接收到服务端发送过来的数据。

但是,服务端只能知道自己可以接收从客户端发送过来的数据,却不知道客户端能否接收到自己发送出去的数据。所以,客户端需要再给服务端发送一个数据包,告诉服务端,客户端已经收到服务端发送的数据了。这个数据包包含的关键信息有:

ACK=1 确认标志位
ack=m+1 确认序号
seq=n+1 报文序号

意思是:服务端,我已经收到你发来的序号为m的数据包了,下次你需要从序号为m+1的数据包开始发送(ACK=1,ack=m+1)。
在这里插入图片描述

经过三次握手,客户端与服务端之间的连接就成功建立起来了。

Q:为什么不四次握手?

A:可以,但没必要。经过两次握手,客户端就已经可以确认自己是可以向服务端收发数据的,但服务端只能确认自己可以收到客户端发来的数据。有了第三次握手,服务端就可以进一步确认,自己也可以向客户端发送数据,就可以放心地向客户端发送数据了。

四次挥手(断开连接)

建立连接时,客户端与服务端之间只需要进行三次握手,但是断开双方的连接时,却需要进行四次挥手。

第一次挥手 客户端→服务端

一般情况下,断开连接的请求也是由客户端主动发起的。客户端要断开一个连接,先向服务端发送一个数据包,这个数据包包含以下关键信息:

FIN=1 断开连接标志位
seq=x 报文序号,不是随机生成的,取决于客户端在建立连接后发送了多少数据包,是一个与n有关的累计值

意思是:服务端,我(客户端)要和你断开连接了(FIN=1)。

第二次挥手 服务端→客户端

服务端收到由客户端发送来的断开连接的请求,但是,这时候服务端可能还有数据没有发送完,还需要做一些收尾工作,不能立刻断开连接,所以,服务端会向客户端发送一个数据包,这个数据包包含以下关键信息:

ACK=1 确认标志位
ack=x+1 确认序号
seq=y 报文序号 不是随机生成的,取决于服务端在建立连接后发送了多少数据包,是一个与m有关的累计值

意思是:好了好了我知道了(ACK=1,ack=x+1),但是现在一时半会断不了,等我通知吧(?)

客户端收到这个数据包,知道服务端已经获悉自己想要断开连接了,就进入半关闭状态,可以关闭客户端→服务端这个方向上的连接,客户端也就没法向服务端发送消息了,但服务端依然可以向客户端发送消息,也就是继续它的收尾工作。

第三次挥手 服务端→客户端

服务端完成收尾工作后,就会发送一个数据包来通知客户端,这个数据包包含以下关键信息:

FIN=1 断开连接标志位
ACK=1 确认标志位
ack=x+1 确认序号
seq=z 不是随机生成的,取决于服务端在建立连接后发送了多少数据包,是一个与m有关的累计值

意思是:客户端,我这边完事了,可以断开连接了(FIN=1)。

第四次挥手 客户端→服务端

客户端收到客户端发来的数据包,就知道客户端已经处理完手头上的工作了,于是客户端也向服务端发送一个数据包,这个数据包包含以下关键数据:

ACK=1 确认标志位
ack=z+1 确认序号
seq=x+1 报文序号

意思是:服务端,我收到你断开连接的请求了(ACK=1,ack=z+1),你可以断开连接了。

服务端收到这个数据包,就可以放心地断开到客户端方向上的连接了。
在这里插入图片描述

Q:为什么要有四次挥手?

A:因为客户端想断开连接,但是不能确保服务端这边就能立刻停止数据的发送,所以客户端只能发起一个请求,让服务端知道它想断开连接。服务端也只能告诉客户端:已经接收到你的断开连接请求了,但是我这边可能还有一些数据需要发送,你先等我消息吧。然后客户端就等候,等到服务端处理好所有事情后,主动发来断开连接的请求,这时候客户端再向服务端发送确认消息,告诉服务端:我收到了你的断开连接请求。这样才能真正断开一个连接。

参考:
详解 TCP 连接的“ 三次握手 ”与“ 四次挥手 ”
tcp/ip协议三次握手、四次挥手

P.S:如有错误,欢迎指正~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值