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

上层协议依赖TCP

上层协议依赖TCP

  • 上层协议依赖TCP(假设HTTP)
    • 步骤1:HTTP 层生成 “HTTP 请求报文
    • 步骤 2:HTTP 数据交给 TCP 层,TCP 封装为 “TCP 报文段(Segment)
    • 步骤 3:TCP 报文段交给 IP 层,封装为 “IP 数据包(Datagram)
    • 步骤 4:IP 数据包交给数据链路层,封装为 “数据帧(Frame)
    • 步骤 5:服务器端 “自下而上解封装”,还原 HTTP 数据
  • 例子
    • 一、关键参数:TCP最大报文段长度(MSS)
    • 二、计算过程:3200字节HTTP报文的拆分
    • 三、特殊情况:若MSS更小怎么办?
    • 四、总结

上层协议依赖TCP(假设HTTP)

HTTP 依赖 TCP 的本质是 “HTTP 数据通过 TCP 协议的载体(TCP 报文段)传输”,这一过程遵循 TCP/IP 协议栈的 “自上而下封装、自下而上解封装” 逻辑,具体分为 5 个步骤(以 “浏览器请求网页” 为例):

步骤1:HTTP 层生成 “HTTP 请求报文

客户端(浏览器)的应用层首先构建 HTTP 请求数据,即HTTP 请求报文,结构包括 3 部分:

  • 请求行:描述请求类型(如 GET/POST)、请求资源路径(如/index.html)、HTTP 版本(如 HTTP/1.1);
  • 请求头:键值对形式的元数据,如Host: www.baidu.com(目标服务器域名)、User-Agent: Chrome/120.0(客户端浏览器信息);
  • 请求体:可选,仅 POST 等请求携带(如表单数据、JSON 参数),GET 请求无请求体。
    示例 HTTP 请求报文(简化):
GET /index.html HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0
Accept: text/html,application/xhtml+xml

步骤 2:HTTP 数据交给 TCP 层,TCP 封装为 “TCP 报文段(Segment)

HTTP 层将完整的 “HTTP 请求报文” 作为 “应用层数据”,向下传递到传输层的 TCP 协议。TCP 层的核心工作是将 HTTP 数据分割、添加 TCP 头部,封装为 TCP 报文段,具体分为 2 步:

(1)分割 HTTP 数据(可选,仅大文件需要)
TCP 对单次传输的数据大小有上限(由 “最大报文段长度 MSS” 决定,通常为 1460 字节,由 MTU=1500 字节减去 TCP 头部 20 字节、IP 头部 20 字节计算得出)。若 HTTP 数据超过 MSS(如大 HTML 文件、图片),TCP 会将其分割为多个 “数据块”,每个数据块对应一个 TCP 报文段。

(2)添加 TCP 头部(核心控制信息)
TCP 为每个数据块添加TCP 头部(固定 20 字节,可选扩展字段),头部包含确保可靠传输的关键控制信息,这些信息是 TCP 实现 “三次握手、确认重传、有序传输” 的基础,核心字段如下:

此时,“TCP 头部 + HTTP 数据块” 就构成了TCP 报文段(Segment),这是 TCP 层的基本传输单元。

步骤 3:TCP 报文段交给 IP 层,封装为 “IP 数据包(Datagram)

TCP 层将 “TCP 报文段” 作为 “网络层数据”,向下传递到网络层的 IP 协议。IP 层的工作是添加 IP 头部,封装为 IP 数据包:

  • IP 头部(固定 20 字节)包含 “源 IP 地址”(客户端 IP,如 192.168.1.100)和 “目标 IP 地址”(服务器 IP,如 180.101.49.11),用于在互联网中路由数据包(找到目标服务器);
  • 最终形成 “IP 头部 + TCP 报文段” 的结构,即IP 数据包

步骤 4:IP 数据包交给数据链路层,封装为 “数据帧(Frame)

IP 层将 “IP 数据包” 向下传递到数据链路层(如以太网),数据链路层添加 “帧头部” 和 “帧尾部”:

  • 帧头部包含 “源 MAC 地址”(客户端网卡 MAC)和 “目标 MAC 地址”(网关或服务器网卡 MAC),用于在局域网内传输;
  • 最终形成 “帧头部 + IP 数据包 + 帧尾部” 的数据帧,通过物理层(网线、无线信号)发送到网络中。

步骤 5:服务器端 “自下而上解封装”,还原 HTTP 数据

数据帧到达服务器后,按 “数据链路层→网络层→传输层→应用层” 的顺序反向解封装:

  1. 数据链路层:剥离帧头部 / 尾部,提取 IP 数据包;
  2. 网络层:剥离 IP 头部,提取 TCP 报文段;
  3. 传输层(TCP):
    a)剥离 TCP 头部,验证序列号(按序重组分割的 HTTP 数据块);
    b)回复 ACK 确认 “已收到数据”;
    c)将完整的 HTTP 请求报文交给应用层(如 Nginx 服务器的 HTTP 进程);
  4. 应用层(HTTP):解析 HTTP 请求报文,处理请求(如读取/index.html文件),再按相同流程生成 HTTP 响应报文,通过 TCP 返回给客户端。

例子

要计算HTTP请求报文(3200字节)需要拆分为多少个TCP报文段(Segment),需结合TCP最大报文段长度(MSS) 来计算,核心逻辑是:TCP会将应用层数据(此处为HTTP报文)拆分为多个不超过MSS的数据块,每个数据块对应一个TCP报文段

一、关键参数:TCP最大报文段长度(MSS)

MSS(Maximum Segment Size)是TCP连接建立时双方协商的“每个TCP报文段中数据载荷的最大长度”(不含TCP首部),其值由底层网络的MTU(最大传输单元)决定:

  • 以太网环境下,MTU通常为1500字节(网络层IP首部+传输层TCP首部+数据载荷的总长度不能超过MTU);
  • 假设IP首部固定为20字节(IPv4最小首部),TCP首部固定为20字节(最小首部,无选项字段),则:
    MSS = MTU - IP首部长度 - TCP首部长度 = 1500 - 20 - 20 = 1460字节

这是最常见的场景,以下计算均以MSS=1460字节为例(实际环境中MSS可能因网络类型或配置不同而变化,如PPPoE网络MTU为1492字节,MSS为1452字节)。

二、计算过程:3200字节HTTP报文的拆分

HTTP请求报文作为TCP的“数据载荷”,需被拆分为多个不超过MSS的块,具体步骤:

  1. 确定单个TCP报文段可承载的最大HTTP数据
    即MSS=1460字节(每个TCP报文段最多能装1460字节的HTTP数据)。

  2. 计算需要的TCP报文段数量

    • 总HTTP数据:3200字节
    • 第一个报文段:1460字节(剩余3200-1460=1740字节)
    • 第二个报文段:1460字节(剩余1740-1460=280字节)
    • 第三个报文段:280字节(剩余0字节)

    因此,共需要3个TCP报文段

三、特殊情况:若MSS更小怎么办?

若网络环境中MSS更小(如某些网络限制MSS=1000字节),则计算方式为:

  • 3200 ÷ 1000 = 3.2 → 向上取整为4个报文段(前3个各1000字节,第4个200字节)。

四、总结

TCP拆分HTTP报文的核心是按MSS大小分割数据,公式为:
报文段数量 = 向上取整(HTTP总字节数 ÷ MSS)

在以太网默认环境(MSS=1460字节)下,3200字节的HTTP请求报文需要拆分为3个TCP报文段。实际应用中,MSS由双方协商决定,拆分数量会随MSS变化,但计算逻辑一致。

http://www.xdnf.cn/news/1398097.html

相关文章:

  • 【系列10】端侧AI:构建与部署高效的本地化AI模型 第9章:移动端部署实战 - iOS
  • pdf转ofd之移花接木
  • 面试 八股文 经典题目 - Mysql部分(一)
  • jsqlparser(六):TablesNamesFinder 深度解析与 SQL 格式化实现
  • Java中使用正则表达式的正确打开方式
  • 在Kotlin中安全的管理资源
  • ⸢ 叁 ⸥ ⤳ 默认安全:概述与建设思路
  • Vue2之axios在脚手架中的使用以及前后端交互
  • MongoDB 聚合管道(Aggregation)高级用法:数据统计与分析
  • destoon8.0根据模块生成html地图
  • Go 语言面试指南:常见问题及答案解析
  • Excel工作技巧
  • 【自然语言处理与大模型】多机多卡分布式微调训练的有哪些方式
  • 【Python】并发编程(一)
  • 网络工程师软考选择题精讲与解题技巧
  • Ubuntu系统下交叉编译Android的X264库
  • 【Qt开发】按钮类控件(一)-> QPushButton
  • 互联网大厂面试:大模型应用开发岗位核心技术点解析
  • LeetCode54螺旋矩阵算法详解
  • MySQL數據庫開發教學(四) 後端與數據庫的交互
  • 【Docker】Docker初识
  • 医院排班|医护人员排班系统|基于springboot医护人员排班系统设计与实现(源码+数据库+文档)
  • flink中 Lookup Join和Interval Join和Regular Join使用场景与对比
  • HTML 核心元素实战:超链接、iframe 框架与 form 表单全面解析
  • Java类加载与JVM详解:从基础到双亲委托机制
  • 基于 Kubernetes 的 Ollama DeepSeek-R1 模型部署
  • Oracle 数据库性能调优:从瓶颈诊断到精准优化之道
  • Zynq开发实践(FPGA之输入、输出整合)
  • K8s卷机制:数据持久化与共享
  • 【机器学习基础】机器学习中的容量、欠拟合与过拟合:理论基础与实践指南