TCP可靠传输(三次握手、四次挥手)

1. 三次握手(建立连接)

三次握手用于可靠地建立TCP连接,确保双方具备双向通信能力。过程如下:

  1. 第一次握手(SYN)

    • 客户端 → 服务器:发送SYN=1报文,携带随机生成的初始序列号(ISN,如Seq=x)

    • 目的:告知服务器客户端希望建立连接,并协商初始序列号。

    • 客户端状态SYN_SENT

  2. 第二次握手(SYN-ACK)

    • 服务器 → 客户端:回复SYN=1, ACK=1报文,确认客户端的序列号(Ack=x+1),并携带服务器的初始序列号(Seq=y)

    • 目的:确认客户端的SYN,并声明服务器的初始序列号。

    • 服务器状态SYN_RECEIVED

  3. 第三次握手(ACK)

    • 客户端 → 服务器:发送ACK=1报文,确认服务器的序列号(Ack=y+1)。

    • 目的:告知服务器已收到SYN-ACK,连接正式建立。

    • 双方状态:进入ESTABLISHED,开始数据传输。


为何需要三次握手?
  • 防止历史连接干扰:若客户端发送的旧SYN因网络延迟到达,服务器会误认为新连接请求。通过三次握手,客户端可检测到重复SYN并拒绝(通过RST包)。

  • 同步初始序列号:双方交换ISN,确保后续数据按序传输。

  • 验证双向通信能力:三次交互确认双方的收发功能正常。


2. 四次挥手(终止连接)

四次挥手用于安全关闭TCP连接,确保双方数据发送完毕。过程如下:

  1. 第一次挥手(FIN)

    • 主动关闭方(如客户端) → 被动关闭方:发送FIN=1报文(如Seq=u)。

    • 目的:声明主动方不再发送数据,但仍可接收数据。

    • 主动方状态FIN_WAIT_1

  2. 第二次挥手(ACK)

    • 被动关闭方 → 主动方:回复ACK=1报文(Ack=u+1)。

    • 目的:确认收到FIN,但被动方可能仍有数据待发送。

    • 被动方状态CLOSE_WAIT(等待应用层处理剩余数据)。

    • 主动方状态FIN_WAIT_2(等待被动方的FIN)。

  3. 第三次挥手(FIN)

    • 被动关闭方 → 主动方:发送FIN=1报文(如Seq=v)。

    • 目的:被动方数据发送完毕,请求关闭连接。

    • 被动方状态LAST_ACK(等待最终ACK)。

  4. 第四次挥手(ACK)

    • 主动方 → 被动方:回复ACK=1报文(Ack=v+1)。

    • 目的:确认被动方的FIN,双方连接关闭。

    • 主动方状态TIME_WAIT(等待2MSL时间后进入CLOSED)。

    • 被动方状态:收到ACK后立即进入CLOSED


为何需要四次挥手?
  • 全双工通信:TCP连接允许双向独立传输数据,需分别关闭每个方向。

  • 确保数据完整性:被动方可能仍需发送剩余数据,需延迟发送FIN。

  • TIME_WAIT状态的意义

    • 防止最后一个ACK丢失(被动方重传FIN时可再次回复ACK)。

    • 等待网络中残留的旧报文消亡(通过2MSL时间,通常1-4分钟)。


3. 特殊场景
  • 三次挥手:若被动方在第二次挥手时同时发送FIN和ACK(如无剩余数据),则四次挥手变为三次。

  • 同时关闭:双方同时发起FIN,直接进入CLOSING状态,交换ACK后关闭。


4. 总结
  • 三次握手:确保双方初始序列号同步,验证双向通信能力。

  • 四次挥手:保证数据完整传输,独立关闭双向连接。

  • 设计核心:通过确认机制(ACK)和状态机管理,实现可靠连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值