上层协议依赖TCP

上层协议依赖TCP

上层协议依赖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 请求报文(简化):
bash 复制代码
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变化,但计算逻辑一致。

相关推荐
K_i1341 小时前
云原生网络基础:IP、端口与网关实战
网络·ip·接口隔离原则
m0_651593911 小时前
Netty网络架构与Reactor模式深度解析
网络·架构
大面积秃头2 小时前
Http基础协议和解析
网络·网络协议·http
我也要当昏君3 小时前
6.3 文件传输协议 (答案见原书 P277)
网络
Greedy Alg4 小时前
Socket编程学习记录
网络·websocket·学习
刘逸潇20055 小时前
FastAPI(二)——请求与响应
网络·python·fastapi
软件技术员5 小时前
使用ACME自动签发SSL 证书
服务器·网络协议·ssl
我也要当昏君5 小时前
6.4 电子邮件 (答案见原书 P284)
网络协议
Mongnewer5 小时前
通过虚拟串口和网络UDP进行数据收发的Delphi7, Lazarus, VB6和VisualFreeBasic实践
网络
我也要当昏君6 小时前
6.5 万维网(答案见原书P294)
网络