当前位置: 首页 > article >正文

TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)

TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)

      • 一、TCP三次握手(Three-way Handshake)
      • 二、TCP四次挥手(Four-way Wave)
      • 三、常见问题解答
      • 总结
      • 为什么三次握手不能减少到两次?
      • 为什么三次握手不能增加到四次?
      • 为什么四次挥手不能减少到三次?
      • 总结:

以下是关于TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)的详细整理:


一、TCP三次握手(Three-way Handshake)

目的:建立可靠的TCP连接,确保双方同步序列号并确认通信能力。
过程(分3步):
在这里插入图片描述

  1. 第一次握手(SYN请求)
    • 客户端发送TCP报文,设置标志位SYN=1,随机生成初始序列号Seq=X,表示请求连接。
    • 客户端进入SYN_SENT状态,等待服务器响应。
  2. 第二次握手(SYN+ACK响应)
    • 服务器收到请求后,发送TCP报文:
      • 标志位SYN=1, ACK=1,确认号Ack=X+1,自身生成初始序列号Seq=Y
    • 服务器进入SYN_RCVD状态,表示已准备好连接。
  3. 第三次握手(ACK确认)
    • 客户端收到服务器的响应后,发送TCP报文:
      • 标志位ACK=1,确认号Ack=Y+1,序列号Seq=X+1
    • 双方进入ESTABLISHED状态,连接正式建立,开始数据传输。

关键点

  • 通过序列号与确认号机制确保双方同步,防止旧连接数据干扰。
  • 第二次握手合并SYNACK,提高效率(服务器确认客户端的连接能力并同步自身序列号)。

二、TCP四次挥手(Four-way Wave)

目的:优雅关闭TCP连接,确保双方数据完全传输并释放资源。
过程(分4步):

在这里插入图片描述

  1. 第一次挥手(FIN请求关闭)
    • 客户端发送TCP报文,设置标志位FIN=1,序列号Seq=U,表示停止发送数据。
    • 客户端进入FIN_WAIT_1状态,等待服务器确认。
  2. 第二次挥手(ACK确认关闭请求)
    • 服务器收到FIN后,发送TCP报文:
      • 标志位ACK=1,确认号Ack=U+1,序列号Seq=V(当前发送数据的序列号)。
    • 服务器进入CLOSE_WAIT状态,通知应用层处理关闭请求,但仍可向客户端发送剩余数据。
  3. 第三次挥手(FIN请求反向关闭)
    • 服务器发送完剩余数据后,发送TCP报文:
      • 标志位FIN=1, ACK=1,确认号Ack=U+1,序列号Seq=W(可能为V+1)。
    • 服务器进入LAST_ACK状态,等待客户端最终确认。
  4. 第四次挥手(ACK确认反向关闭)
    • 客户端收到服务器的FIN后,发送TCP报文:
      • 标志位ACK=1,确认号Ack=W+1,序列号Seq=U+1
    • 客户端进入TIME_WAIT状态(持续2MSL时间),确认服务器收到后正式关闭。

关键点

  • 四次挥手而非三次:因TCP是全双工模式,双方需独立关闭数据流。
  • 2MSL(Maximum Segment Lifetime)等待
    • 确保最后一个ACK可靠到达服务器,防止连接异常中断。
    • 允许网络中未送达的数据包自然消亡,避免新旧连接混淆。

三、常见问题解答

  1. 为什么建立连接是三次握手,而关闭是四次挥手?
    • 三次握手:服务器收到客户端的SYN请求后,可同时发送SYN(同步序列号)和ACK(确认),因此合并为一次响应。
    • 四次挥手:服务器收到FIN后需先确认(ACK),但可能仍有数据待发送,需延迟发送FIN,导致分两步。
  2. TIME_WAIT状态的作用?
    • 防止延迟的重复FINACK干扰新连接(若立即关闭,可能误认为新连接数据是旧数据)。
    • 确保网络中的旧数据包彻底消失(2MSL通常是数据包的生存周期)。

总结

三次握手通过“请求-响应-确认”机制建立可靠连接,而四次挥手通过双向独立关闭确保数据完整性。理解这些机制是网络编程和故障排查的基础,尤其在处理连接延迟、丢包等问题时至关重要。

  • SYN 请求连接
  • ACK 已正确接收数据
  • FIN 是一种停止请求信号
  • Seq 是 序列号(Sequence Number)的缩写
  • Seq=X 中X是一个变量,
  • Ack 是 确认号 他也有自己的变量

TCP/IP协议中的三次握手和四次挥手是确保可靠连接建立与关闭的核心机制,其步骤数量经过精心设计,不能随意增减。以下是具体原因:

为什么三次握手不能减少到两次?

  1. 双向确认需求:
    ○ 第一次握手(客户端发SYN):服务器确认客户端的发送能力。
    ○ 第二次握手(服务器发SYN+ACK):客户端确认服务器的接收和发送能力。
    ○ 第三次握手(客户端发ACK):服务器确认客户端的接收能力。
    ○ 若减少为两次(如省略第三次握手):
    ■ 服务器无法确认客户端的接收能力,可能导致连接建立后,客户端无法接收服务器的数据,造成通信失败。
  2. 序列号同步:
    ○ 三次握手通过交换Seq和Ack号,确保双方初始序列号同步,避免后续数据传输混乱。
    ○ 两次握手无法完成双向同步,可能导致数据丢失或重复。

为什么三次握手不能增加到四次?

  1. 效率与资源消耗:
    ○ 三次握手已满足可靠性和同步需求,额外步骤会增加延迟和资源消耗(如TCP报文的传输和处理)。
  2. 无实际增益:
    ○ 第三次握手的ACK已确认双方状态,再次确认不会提升可靠性,反而可能引入更多潜在问题(如超时重传机制复杂性增加)。

为什么四次挥手不能减少到三次?

  1. 全双工特性:
    ○ TCP连接支持双向数据传输(如客户端和服务器可同时发送数据)。
    ○ 关闭需独立处理两个方向的数据流:
    ■ 第一次挥手:客户端停止发送数据(FIN)。
    ■ 第三次挥手:服务器停止发送数据(FIN)。
    ○ 若合并为三次(如服务器收到FIN后立即发FIN+ACK):
    ■ 服务器可能仍有数据未发送完,导致数据丢失。
    ■ 客户端无法区分FIN和ACK的合并响应,可能误判连接状态。
  2. 确保数据完整性:
    ○ 第二次挥手(ACK)确认客户端的关闭请求,允许服务器继续发送剩余数据。
    ○ 第三次挥手(FIN)通知客户端服务器已无数据发送,触发客户端进入TIME_WAIT状态等待确认。
    ○ 若减少步骤,可能无法保证所有数据已被传输和确认。

总结:

● 三次握手:通过三次交互确保双向通信能力和序列号同步,减少或增加步骤都会破坏可靠性或效率。
● 四次挥手:因TCP全双工特性,必须分别关闭两个方向的数据流,合并步骤可能导致数据丢失或未完成关闭。
这种设计平衡了可靠性、效率和复杂性,是TCP/IP协议核心机制的关键组成部分。


http://www.kler.cn/a/588336.html

相关文章:

  • 面试系列|蚂蚁金服技术面【1】
  • C++那些事儿:访问控制与友元函数的奇妙冒险
  • C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷一)
  • Vue开发者工具(VueDevtools)下载与安装
  • 区跨链知识和概念
  • C++|空指针nullptr
  • Ubuntu24.10编译Android12源码并运行于模拟器中
  • How To Change Windows VPS Password
  • LeetCodeHot100_0x07
  • [蓝桥杯 2023 省 A] 买瓜 --暴力DFS+剪枝优化
  • 深入分析 Shell 中 IFS、数组赋值与输出行为
  • 相对论-空间和时间(1)
  • ngx_event_conf_t
  • 淘宝API vs 爬虫:合规获取实时商品数据的成本与效率对比
  • [论文阅读]Demystifying Prompts in Language Models via Perplexity Estimation
  • 前端性能优化指标及优化方案
  • Leetcode-1278.Palindrome Partitioning IV [C++][Java]
  • 重返OI:1999
  • 计算机网络:IP数据分片与偏移试题
  • 【网络安全 | 漏洞挖掘】价值14981$的Google点击劫持漏洞