上层协议依赖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 数据
数据帧到达服务器后,按 “数据链路层→网络层→传输层→应用层” 的顺序反向解封装:
- 数据链路层:剥离帧头部 / 尾部,提取 IP 数据包;
- 网络层:剥离 IP 头部,提取 TCP 报文段;
- 传输层(TCP):
a)剥离 TCP 头部,验证序列号(按序重组分割的 HTTP 数据块);
b)回复 ACK 确认 “已收到数据”;
c)将完整的 HTTP 请求报文交给应用层(如 Nginx 服务器的 HTTP 进程); - 应用层(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的块,具体步骤:
-
确定单个TCP报文段可承载的最大HTTP数据
即MSS=1460字节(每个TCP报文段最多能装1460字节的HTTP数据)。 -
计算需要的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变化,但计算逻辑一致。