TCP协议的三次握手与四次挥手分别指什么?

TCP协议的三次握手与四次挥手分别指什么?

说说TCP的三次握手

客户端首先发送一个SYN(同步序列编号)消息给服务器,服务器收到后回复一个SYN-ACK(同步序列编号-确认)消息,最后客户端再发送一个ACK(确认)消息确认服务器已经收到SYN-ACK消息,从而完成三次握手,建立起一个可靠的TCP连接。

下方是一个示意图:

image-20250712164902035

为什么需要三次握手?

有两个原因:

  • 避免历史错误连接的建立,减少通信双方不必要的资源消耗
  • 帮助通信双方同步初始化序列号
1. 避免历史错误连接的建立

RFC793明确指出了使用三次握手的首要原因是:为了阻止历史的重复连接初始化导致的混乱。

为什么三次能解决这个问题?

因为网络情况比较复杂,发送方第一次发送请求后,可能由于网络原因被阻塞住了,此时发送方可能又会再次发送请求。
如果握手只有两次,那么接收方应对发送方的请求只能拒绝或者接受,但是它无法识别当前的请求是旧的请求还是新的请求。

2. 帮助通信双方同步初始化序列号

因为网络本身的不稳定性可能为导致:

  • 数据丢失
  • 数据重复传输
  • 数据乱序

而TCP是一个可靠传输协议,它需要保证数据不丢失且有序的传输。基于上述的问题,TCP引入了序列号,它使得:

  • 接收方可以根据序列号去重
  • 接收方可以根据序列号排序
  • 发送方针对为接收到ACK的序列号对应的数据包,可以重传

序列号是有序的,因此在通信的初始化阶段,双方就需要同步序列号,不然数据后面就都对不上了。

说说四次挥手

TCP的四次挥手是用于安全关闭一个已建立的连接的过程,它确保双方都能完成数据传输并安全地释放连接资源。
简述步骤:
1)第一次挥手(FIN→ACK):客户端主动关闭连接,发送FIN包,进入FIN_WAIT_1状态。服务器收到FIN后,表示不再接收数据,但仍可能继续发送数据。
2)第二次挥手(ACK):服务器发送ACK包,确认已收到FIN。此时服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。
3)第三次挥手(FIN→ACK):服务器完成所有数据传输后,发送FIN包,进入LAST_ACK状态。客户端收到FIN后,准备关闭连接。
4)第四次挥手(ACK):客户端发送最后一个ACK包,进入TIME_WAIT状态,等待可能迟到的FIN包。服务器收到ACK后,关闭连接,进入CLOSED状态。客户端在TIME_WAIT计时结束后(2MSL),正式关闭连接。

image-20250712165442287

为什么需要挥手四次?

主要是为了确保数据完整性。
TCP是一个全双工协议,也就是说双方都要关闭,每一方都向对方发送FIN和回应ACK。
客户端发起连接断开,代表客户端没数据要发送的,但是服务端可能还有数据没有返回给客户端。
就像我对你说我数据发完了,然后你回复好的你收到了。然后你对我说你数据发完了,然后我向你回复我收到了。这样才能保证数据不会丢失。
所以一个FIN+ACK代表一方结束数据的传输,因此需要两对FIN+ACK,加起来就是四次通信。

挥手一定需要四次吗?

不一定,有时可能是三次挥手

image-20250712165939458

不一定,有时可能是三次挥手

正常的四次挥手流程应该很熟悉了,但是思考一下,如果Client发送FIN给server的时候server已经没数据发送给Client了,**那么Server就可以将ACK和它的FIN一起发给Client,**这样一来不就变成三次挥手了吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

耄耄爱哈气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值