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

三次握手建立连接,四次挥手释放连接——TCP协议的核心机制

TCP协议的三次握手(Three-way Handshake)和四次挥手(Four-way Handshake)是建立和终止可靠网络连接的核心机制,它们确保了通信双方能够同步状态并安全地交换数据;

TCP连接的常用术语

术语全称含义说明
SYNSynchronous建立连接标志位。用于发起连接请求,携带初始序列号(ISN)。在三次握手中前两次出现。
ACKAcknowledgement确认标志位。表示已收到数据,携带确认号(Acknowledge number)。建立连接后所有报文必须设置ACK=1。
PSHPush推送标志位。要求接收方立即将数据提交给应用层(而非等待缓冲区满)。常见于HTTP请求/响应报文。
FINFinish终止连接标志位。表示发送方数据已发送完毕,请求关闭连接。在四次挥手中由双方各发送一次。
RSTReset复位标志位。强制中断异常连接(如端口未监听、处理超时),接收方会立即释放资源。
URGUrgent紧急标志位。表示报文包含紧急数据,需优先处理(配合紧急指针使用)。实际应用较少。
SeqSequence Number32位序列号。标识数据字节流的起始位置(首字节编号)。建立连接时随机生成,后续按数据长度递增。
AckAcknowledge Number32位确认号。期望收到的下一字节序列号(值为收到的Seq+数据长度)。若携带数据,则下次Seq=本次Ack。
Window SizeAdvertised Window16位窗口大小。接收方告知发送方可接收的数据量(流量控制)。动态调整防止缓冲区溢出。
ChecksumHeader Checksum16位校验和。验证TCP头部和数据完整性,防止传输错误。
Data OffsetHeader Length4位头部长度。标识TCP头部长度(单位:4字节),用于定位数据起始位置。
FlagsControl Bits9位控制位集合。包含SYN/ACK/PSH/FIN/RST/URG等标志位(各占1位)。
MSSMaximum Segment Size最大报文长度。在SYN报文中协商,表示本方可接收的最大TCP数据段(不含头部)。典型值1460字节(以太网)。
ISNInitial Sequence Number初始序列号。连接建立时随机生成的Seq起始值,防止历史报文混淆(旧连接报文ISN不同)。
TIME_WAITTime Wait State主动关闭方最终状态。等待2MSL(60-120秒)确保被动方收到ACK,同时让网络中旧报文失效。
MSLMaximum Segment Lifetime报文最大生存时间。IP报文在网络中的最长存在时间(通常30秒-2分钟),TIME_WAIT=2MSL。

关键补充说明:

  1. Seq与Ack的协作

    • 发送数据:Seq标识数据起始位置(如Seq=100,数据长度50 → 下一包Seq=150)

    • 确认数据:Ack=101表示已正确接收Seq=100的数据,期望接收Seq=101的数据

  2. 标志位组合示例

    场景

    典型标志位组合

    建立连接

    SYN=1, ACK=0

    确认连接

    SYN=1, ACK=1

    数据传输

    ACK=1, PSH=1(可选)

    关闭连接

    FIN=1, ACK=1

    强制中断

    RST=1, ACK=1

  3. 为什么需要随机ISN?
    防止历史连接干扰:若ISN固定,延迟的旧报文可能被误认为新连接数据,随机ISN大幅降低冲突概率(32位空间约42亿组合)

✅ TCP 三次握手过程详解

确保客户端(Client)和服务端(Server)双向通信能力正常,并同步初始序列号(ISN),防止历史连接混淆。

整个连接过程分为三个部分:1、连接建立 2、数据传输 3、连接关闭

📌 第一次握手:

  • 客户端(主机A) 向 服务器(主机B) 发送一个 TCP 报文段。
    • 标志位 SYN = 1,表示请求建立连接。
    • 随机生成一个初始序列号 seq = x
  • 此时客户端进入 SYN_SENT 状态,等待服务器确认。

🔹 报文内容:SYN=1, seq=x


📌 第二次握手:

  • 服务器(主机B) 收到请求后,回应一个 TCP 报文段。
    • 设置标志位 SYN = 1 和 ACK = 1,表示同意建立连接并确认收到客户端的 SYN。
    • 确认号 ack = x + 1,即对客户端的 seq=x 进行确认。
    • 随机生成自己的初始序列号 seq = y

🔹 报文内容:SYN=1, ACK=1, ack=x+1, seq=y


📌 第三次握手:

  • 客户端(主机A) 接收到服务器的响应后,进行验证:
    • 检查确认号 ack 是否为 x + 1
    • 检查 ACK 标志是否为 1。
  • 若验证通过,则发送最后一个确认报文:
    • 标志位 ACK = 1
    • 确认号 ack = y + 1,即对服务器的 seq=y 进行确认。

🔹 报文内容:ACK=1, ack=y+1


✅ 握手完成:

  • 服务器收到第三次握手的确认报文后,双方连接正式建立,可以开始传输数据。
  • 客户端和服务器都进入 ESTABLISHED(已建立连接) 状态。

为什么是三次?

  • 两次握手的风险: 若失效的SYN报文延迟到达服务端,服务端会误认为新连接已建立(浪费资源)。

  • 三次握手解决: 客户端在第三步能判断是否是历史连接(通过ACK的合理性),决定是否终止。


✅ TCP 四次挥手过程详解

TCP 是全双工通信,因此连接的关闭需要双方都确认不再发送数据。四次挥手是为了确保数据完整传输后,安全地关闭连接。

📌 参与角色:

  • 主机A(客户端 或 主动关闭方)
  • 主机B(服务器 或 被动关闭方)

📌 第一次挥手:

  • 主机A 发送一个 FIN 报文段,表示自己不再发送数据,但仍可以接收数据。
    • 标志位 FIN = 1
    • 序列号 seq = u(前面已传输数据的最后一个字节序号 + 1)

🔹 报文内容:FIN=1, seq=u

  • 此时主机 A 进入 FIN-WAIT-1 状态。

📌 第二次挥手:

  • 主机B 收到 FIN 后,发送一个 ACK 报文段进行确认。
    • 标志位 ACK = 1
    • 确认号 ack = u + 1(对主机 A 的 FIN 进行确认)

🔹 报文内容:ACK=1, ack=u+1

  • 主机 B 进入 CLOSE-WAIT 状态;主机 A 收到后进入 FIN-WAIT-2 状态。

📌 第三次挥手:

  • 主机B 处理完自己的数据后,发送 FIN 报文段给主机 A,表示它也要关闭连接。
    • 标志位 FIN = 1
    • 序列号 seq = v(根据前面的数据序号继续)

🔹 报文内容:FIN=1, seq=v

  • 主机 B 进入 LAST-ACK 状态;主机 A 收到后进入 CLOSE-WAIT 并发送最后的 ACK。

📌 第四次挥手:

  • 主机A 收到主机 B 的 FIN 后,回复一个 ACK 报文段进行确认。
    • 标志位 ACK = 1
    • 确认号 ack = v + 1

🔹 报文内容:ACK=1, ack=v+1

  • 主机 A 进入 TIME-WAIT 状态,并等待 2MSL(Maximum Segment Lifetime)时间后正式关闭连接;
  • 主机 B 收到 ACK 后进入 CLOSED 状态。

✅ 挥手完成:

  • 双方连接完全关闭,资源释放。
  • TIME-WAIT 状态的存在是为了确保最后一个 ACK 能被对方收到,防止“网络中残留报文”干扰新连接。

🧠 小贴士:

  • 关闭双向通道: 收到对方的FIN只表示对方不再发送数据,己方可能仍需发送剩余数据。

  • 步骤拆分: 被动方的ACK(第二步)和FIN(第三步)无法合并(因应用层关闭时间不确定)。

问题解释
为什么是四次?因为 TCP 是全双工通信,每一端都需要单独关闭发送方向
为什么要有 TIME-WAIT?确保最后一个 ACK 被对方收到;避免旧报文干扰新连接
如果第三次挥手丢失怎么办?主机 B 会重传 FIN,直到收到 ACK

关键问题解析

1. TIME_WAIT状态的作用(等待2MSL)

  • 确保被动方收到ACK 若ACK丢失,被动方会重发FIN,主动方能响应。

  • 消除历史报文干扰: 等待足够时间(2MSL,通常1-4分钟),确保网络中所有此连接的报文消失。

2. 半关闭状态(Half-Close)

  • 第二次挥手后,连接处于半关闭状态:被动方仍可发送数据(如传输剩余文件)。

3. 异常情况处理

  • 握手失败: 若SYN未收到响应,客户端会超时重试(指数退避)。

  • 挥手ACK丢失: 被动方重发FIN,主动方在TIME_WAIT期间可响应。

TCP报文格式

  1. 源端口号(Source Port,16位):发送方的端口号。
  2. 目的端口号(Destination Port,16位):接收方的端口号。
  3. 序列号(Sequence Number,32位):用于对发出的数据包进行编号,以保证数据传输的顺序和准确性。
  4. 确认号(Acknowledgment Number,32位):期望从对方接收到的下一个字节的序列号,实现可靠传输。
  5. 头部长度(Data Offset,4位):指示TCP头的长度,以32位字为单位。通常最小值是5,表示没有选项的情况。
  6. 保留字段(Reserved,6位):保留供将来使用的字段,目前必须设置为0。
  7. 标志位(Flags,6位)
    • CWR (Congestion Window Reduced): 拥塞窗口减少标志。
    • ECE (ECN-Echo): 显示网络拥塞或支持显式拥塞通知。
    • URG (Urgent Pointer field significant): 紧急指针字段有效。
    • ACK (Acknowledgment field significant): 确认号字段有效。
    • PSH (Push function): 推送功能。
    • RST (Reset the connection): 重置连接。
    • SYN (Synchronize sequence numbers): 同步序号用于发起连接。
    • FIN (No more data from sender): 发送方已无数据发送。
  8. 窗口大小(Window Size,16位):表示发送本报文段的一方的接收窗口还有多少空间,用于流量控制。
  9. 校验和(Checksum,16位):用于确保TCP报文段在传输过程中的完整性。
  10. 紧急指针(Urgent Pointer,16位):只有当URG标志被设置时才有效,它指出本报文段中紧急数据的位置。
  11. 选项(Options,长度可变):可选参数,如最大报文段长度(MSS)、窗口扩大因子等。
  12. 填充(Padding):使整个TCP头部的长度为32位的整数倍,一般用0填充。

 

相关文章:

  • Linux 下的 PM2 完整指南
  • linux基于内存实现jar文件搜索
  • 如何有效监控JVM环境,保障应用性能
  • Elasticsearch:使用 ES|QL 进行地理空间距离搜索
  • 动态规划3——背包类动态规划详解
  • elasticSearch是什么,如何使用,有什么用
  • 考研系列—408真题操作系统篇(2015-2019)
  • Windows环境变量原理(用户变量与系统变量)(用户环境变量、系统环境变量)
  • centos6.5 老旧系统编译glib-2.58.3.tar.bz2
  • vue-property-decorator实践(一)
  • 如何通过插件系统打造个性化效率工作流
  • AUTOSAR图解==>AUTOSAR_TR_InteroperabilityOfAutosarTools
  • PEP 8: E302 expected 2 blank lines, found 0
  • [vela os_5] 中断系统 | 任务调度 | 日志系统
  • node.js连接mysql写接口(一)
  • jupyter notebook的相关知识及可能遇到的问题
  • spring-ai MCP Server运行一段时间后断联2
  • Spring Boot3批式访问Dify聊天助手接口
  • 力扣-70.爬楼梯
  • 电梯钢带安全无盲区:电梯钢带断丝智慧监测方案让隐患“毫秒现形“
  • 西安网站建设 企业建站/凤凰网台湾资讯
  • 旅游投资公司网站建设/关键词查询爱站网
  • 网站建设和网站设计一样吗/武汉推广系统
  • 网站专题优化/培训网站制作
  • dreamweaver可以做网站/灰色词排名代做
  • 苏州网站推广建设/杭州百度seo