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

TCP建立连接:三次握手(每次握手发的字段及字段值的解释)

一、先明确 TCP 头部的关键字段(和三次握手强相关)

字段名作用(三次握手中的意义)补充说明
SYN标记 “同步序列编号”,用于发起连接协商1 表示请求建立连接,0 表示正常数据
ACK标记 “确认号有效”,用于确认收到对方的数据1 表示确认,0 表示不确认
seq发送方的 “初始序列号”(ISN,Initial Sequence Number)随机生成(防止旧连接干扰)
ack接收方的 “确认序列号”,期望对方下一个序列号一般为 “收到的 seq + 1”

二、三次握手每一步的字段解析(结合流程)

1. 第一步:客户 A→服务器 B,发 SYN 报文
  • 字段内容SYN=1,ACK=0(默认,因为还没收到数据,不需要确认),seq=x,ack=任意(无意义,因为没收到数据)
  • 为啥发这些?
    • SYN=1:告诉 B “我(A)要发起连接,请求同步序列号”(相当于说 “我要和你建立连接,咱们商量一下数据怎么编号”)。
    • seq=x:A 生成的 初始序列号(ISN),是一个随机数(比如系统随机选的 32 位整数,防止旧连接的残留报文干扰新连接)。
    • ACK=0:因为 A 还没收到 B 的任何数据,所以不需要确认,ACK 置 0(只有收到数据后,ACK 才会置 1 并带确认号)。
2. 第二步:服务器 B→客户 A,发 SYN+ACK 报文
  • 字段内容SYN=1,ACK=1,ack=x+1,seq=y
  • 为啥发这些?
    • SYN=1:B 回应 A 的连接请求,告诉 A “我(B)也同意同步序列号,建立连接”。
    • ACK=1:告诉 A “我(B)确认收到你的 SYN 报文了”(通过 ack=x+1 体现)。
    • ack=x+1:B 期望 A 下一个发送的序列号是 x+1(因为 B 收到了 A 的 seq=x,所以确认号是 x+1,表示 “我收到了 seq=x 的报文,你下次发 seq=x+1 吧”)。
    • seq=y:B 自己生成的 初始序列号(ISN),也是随机数(和 A 的 x 无关,各自独立选)。
3. 第三步:客户 A→服务器 B,发 ACK 报文
  • 字段内容ACK=1,ack=y+1,seq=x+1(如果有应用层数据,还会带数据,但字段核心是这些)
  • 为啥发这些?
    • ACK=1:告诉 B “我(A)确认收到你的 SYN+ACK 报文了”。
    • ack=y+1:A 期望 B 下一个发送的序列号是 y+1(因为 A 收到了 B 的 seq=y,所以确认号是 y+1)。
    • seq=x+1:A 的下一个序列号,延续第一步的 seq=x(因为 TCP 是 面向字节流 的,每个字节都要有序号,即使没有数据,序列号也要推进。第一步的 SYN 报文占了 seq=x,所以这里用 seq=x+1,表示 “我接下来要发的数据从 x+1 开始”)。

三、字段值的 “为什么是这些”(核心逻辑)

  1. 初始序列号(seq)的随机性

    • 假设 seq 是固定值(比如每次都从 0 开始),如果网络中残留着旧连接的 SYN 报文(比如延迟的旧请求),新连接可能会被旧报文干扰(比如旧 SYN 的 seq=0 被误认为是新连接的请求)。
    • 用随机的 ISN,能极大降低 “旧连接残留报文干扰新连接” 的概率,保证连接的唯一性。
  2. 确认号(ack)的规则:ack = 收到的 seq + 1

    • TCP 是 可靠传输,需要确认 “对方发送的报文已收到”。
    • ack = 收到的 seq + 1 表示 “我已经收到了 seq 及之前的所有字节,你下次从 seq+1 开始发”,确保数据不丢失、不重复。
  3. SYN 与 ACK 标记的作用

    • SYN 是 “我要协商序列号,建立连接”,ACK 是 “我确认收到你的报文”。
    • 第二步必须同时带 SYN(回应 A 的连接请求,协商自己的序列号)和 ACK(确认收到 A 的 SYN 报文),所以是 SYN+ACK

四、总结:三次握手的字段设计,本质是 “可靠协商”

  • seq 和 ack:解决 “数据怎么编号、怎么确认收到” 的问题,保证连接建立过程中,双方的 “序号协商” 和 “收到确认” 是可靠的。
  • SYN 标记:明确 “我要发起 / 回应连接协商”,让双方知道 “现在是建立连接阶段”。
  • ACK 标记:明确 “我确认收到你的协商请求”,避免一方 “喊话” 后,另一方没回应导致的 “单向连接”。

简单说,三次握手的字段就是 TCP 用来 “精准协商” 的 “语言”:

  • 用 SYN 说 “我要连接,这是我的序号”;
  • 用 ACK 说 “我收到了,这是你的确认号,这是我的序号”;
  • 三次交互,让双方都确认 “我能发、你能收;你能发、我能收”,最终达成 “双向可靠连接”~
http://www.dtcms.com/a/581050.html

相关文章:

  • 【SpringBoot】34 核心功能 - 指标监控- Spring Boot Actuator 指标监控开启与禁用与 Endpoint 定制
  • 【软考】信息系统项目管理师-资源管理论文范文
  • 标准nodejs项目工程
  • 定制网站开发公司种子网站模板
  • Maven前奏
  • C++面试高级篇——内存管理(一)
  • kanass零基础学习,如何进行工时管理,有效度量项目资源
  • 恋爱ppt模板免费下载网站官方网站建立
  • Spark-3.5.7文档1 - 快速开始
  • Java_Map接口实现类Properties
  • 【底层机制】Android对Linux线程调度的移动设备优化深度解析
  • 2025制品管理工具选型,Jfrog or Hadess一文全面测评
  • 3.2、Python-元组
  • PyTorch之父发离职长文,告别Meta
  • 微信小程序与网站连接厦门 网站优化
  • 网站小图标怎么做的多就能自己做网站
  • 江阴规划建设局网站跨境电商开店要多少钱
  • 系统分析师大题介绍
  • 包装产线数字化转型实战:从数据采集到智能决策的效能提升之路
  • Flutter for HarmonyOS开发指南(四):国际化与本地化深度实践
  • Java:RocketMQ消息发送报错:MQClientException: No route info of this topic: topic_xxx
  • 青少年机器人技术等级考试理论综合试卷(一级)2019年3月
  • 产品经理画原型工具 axure
  • 云端硬盘详解:认识 Persistent Disk(持久磁盘)
  • 西安给大学做网站公司郑州网站seo服务
  • Java 8 Optional 类实战:从根源杜绝空指针异常的优雅方案
  • 面向强化学习的状态空间建模:RSSM的介绍和PyTorch实现(4)
  • openGauss安装部署详细教程
  • 用Visual Studio Code最新版开发C#应用程序
  • 修改llama index的prompte template(提示词模板)的解决方案