Linux 网络编程基础:网络分类、分层模型与数据封装
课程:尚硅谷《嵌入式 Linux 应用层开发》第 6 章 Socket 编程
依据:2026-09-29 20:21 录音转写;课程 PDF 第 244---254 页。
本节边界:这是 Socket 编程的理论入口,暂未讲
socket()、bind()、listen()、connect()等代码接口。
1. 本节在网络编程路线中的位置
录音首先说明:计算机网络范围很大,本课程不会完整讲完所有网络技术,而是先建立后续 Socket 编程必需的框架。
#mermaid-svg-S4BGc3gQHvlT95FF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-S4BGc3gQHvlT95FF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-S4BGc3gQHvlT95FF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-S4BGc3gQHvlT95FF .error-icon{fill:#552222;}#mermaid-svg-S4BGc3gQHvlT95FF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-S4BGc3gQHvlT95FF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-S4BGc3gQHvlT95FF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-S4BGc3gQHvlT95FF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-S4BGc3gQHvlT95FF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-S4BGc3gQHvlT95FF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-S4BGc3gQHvlT95FF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-S4BGc3gQHvlT95FF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-S4BGc3gQHvlT95FF .marker.cross{stroke:#333333;}#mermaid-svg-S4BGc3gQHvlT95FF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-S4BGc3gQHvlT95FF p{margin:0;}#mermaid-svg-S4BGc3gQHvlT95FF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-S4BGc3gQHvlT95FF .cluster-label text{fill:#333;}#mermaid-svg-S4BGc3gQHvlT95FF .cluster-label span{color:#333;}#mermaid-svg-S4BGc3gQHvlT95FF .cluster-label span p{background-color:transparent;}#mermaid-svg-S4BGc3gQHvlT95FF .label text,#mermaid-svg-S4BGc3gQHvlT95FF span{fill:#333;color:#333;}#mermaid-svg-S4BGc3gQHvlT95FF .node rect,#mermaid-svg-S4BGc3gQHvlT95FF .node circle,#mermaid-svg-S4BGc3gQHvlT95FF .node ellipse,#mermaid-svg-S4BGc3gQHvlT95FF .node polygon,#mermaid-svg-S4BGc3gQHvlT95FF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-S4BGc3gQHvlT95FF .rough-node .label text,#mermaid-svg-S4BGc3gQHvlT95FF .node .label text,#mermaid-svg-S4BGc3gQHvlT95FF .image-shape .label,#mermaid-svg-S4BGc3gQHvlT95FF .icon-shape .label{text-anchor:middle;}#mermaid-svg-S4BGc3gQHvlT95FF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-S4BGc3gQHvlT95FF .rough-node .label,#mermaid-svg-S4BGc3gQHvlT95FF .node .label,#mermaid-svg-S4BGc3gQHvlT95FF .image-shape .label,#mermaid-svg-S4BGc3gQHvlT95FF .icon-shape .label{text-align:center;}#mermaid-svg-S4BGc3gQHvlT95FF .node.clickable{cursor:pointer;}#mermaid-svg-S4BGc3gQHvlT95FF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-S4BGc3gQHvlT95FF .arrowheadPath{fill:#333333;}#mermaid-svg-S4BGc3gQHvlT95FF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-S4BGc3gQHvlT95FF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-S4BGc3gQHvlT95FF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-S4BGc3gQHvlT95FF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-S4BGc3gQHvlT95FF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-S4BGc3gQHvlT95FF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-S4BGc3gQHvlT95FF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-S4BGc3gQHvlT95FF .cluster text{fill:#333;}#mermaid-svg-S4BGc3gQHvlT95FF .cluster span{color:#333;}#mermaid-svg-S4BGc3gQHvlT95FF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-S4BGc3gQHvlT95FF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-S4BGc3gQHvlT95FF rect.text{fill:none;stroke-width:0;}#mermaid-svg-S4BGc3gQHvlT95FF .icon-shape,#mermaid-svg-S4BGc3gQHvlT95FF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-S4BGc3gQHvlT95FF .icon-shape p,#mermaid-svg-S4BGc3gQHvlT95FF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-S4BGc3gQHvlT95FF .icon-shape .label rect,#mermaid-svg-S4BGc3gQHvlT95FF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-S4BGc3gQHvlT95FF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-S4BGc3gQHvlT95FF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-S4BGc3gQHvlT95FF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 网络分类
为什么要分层
OSI 七层模型
教学五层模型
TCP/IP 四层模型
PDU、SDU、PCI
封装与解封装
服务、接口、协议
后续 Socket API
本节最需要留下的主线是:
text
应用程序通过 Socket 接口使用传输层服务
→ TCP 或 UDP 通过 IP 发送数据
→ IP 数据包由链路层承载
→ 接收端逐层解封装并交给目标应用
2. 按地理范围划分网络
| 类型 | 英文 | 典型范围 | 常见示例 |
|---|---|---|---|
| 个人区域网 | PAN | 几米到十几米 | 蓝牙、近距离个人设备通信 |
| 局域网 | LAN | 家庭、办公室、楼宇或校园 | 以太网、Wi-Fi |
| 城域网 | MAN | 城市范围 | 城域光纤网络 |
| 广域网 | WAN | 跨城市、国家或洲际 | 运营商骨干网、跨区域企业网 |
范围分类描述的是覆盖尺度,不代表四类网络之间存在绝对、不可重叠的技术边界。
2.1 局域网和互联网不要混淆
电脑连接家里的交换机或无线路由器后,先进入一个局域网。能否访问公网,还取决于路由、网关、运营商连接、地址转换和访问策略。
text
电脑或开发板
→ 家庭或公司局域网
→ 默认网关
→ 运营商网络
→ Internet
连接 Wi-Fi 只表示接入了无线局域网,不自动保证已经连通互联网。
3. 按拓扑划分网络
| 拓扑 | 基本结构 | 主要特点 |
|---|---|---|
| 总线型 | 多个节点共享一条主干介质 | 布线简单,主干故障影响大 |
| 星型 | 所有终端连接中央交换设备 | 易管理,中央节点是关键点 |
| 环型 | 节点首尾相连形成环 | 数据沿环传递,故障影响取决于是否有冗余 |
| 网状 | 节点之间存在多条可选路径 | 冗余和可靠性高,成本与管理复杂度高 |
网状拓扑还分为全网状和部分网状。互联网整体更接近由大量网络和路由器组成的部分网状结构,并不是每台终端都直接连接所有其他终端。
4. 其他分类方法
4.1 按使用范围
| 类型 | 含义 |
|---|---|
| Internet | 全球互联的公网体系 |
| Intranet | 组织内部使用的网络和服务 |
| Extranet | 向合作伙伴等受控外部用户开放的部分内部资源 |
内网并不天然安全。身份认证、授权、补丁、加密和访问控制仍然需要落实。
4.2 按交换方式
| 类型 | 工作方式 | 典型场景 |
|---|---|---|
| 电路交换 | 通信前建立并独占一条逻辑通路 | 传统电话系统 |
| 分组交换 | 数据拆成分组,经网络逐跳转发 | Internet 的基本方式 |
| 报文交换 | 节点存储并转发完整报文 | 早期通信系统中的概念 |
4.3 按通信关系
- 广播:一个节点发送的信息能被广播域中的多个节点接收;
- 点对点:在两个端点之间建立直接或逻辑上的通信关系。
现代交换式以太网中的普通单播帧通常只被转发到目标端口,不能简单理解为"每个以太网帧都会让所有节点收到"。以太网仍支持广播帧和多播帧。
5. 为什么网络必须分层
网络通信同时涉及应用程序、操作系统、协议栈、网卡、交换机、路由器和物理介质。分层可以把复杂问题拆开:
- 每层处理一组相对明确的问题;
- 下层为相邻上层提供服务;
- 上层不需要理解下层全部实现细节;
- 同层的通信双方遵守同一协议;
- 某层实现可以替换,而不必重写所有上层。
例如应用程序通常只需要调用 Socket API,不需要自己生成以太网帧、计算 IP 路由或直接控制网卡发送比特。
6. 分层模型中的五个概念
6.1 层 Layer
把完整通信过程划分成多个功能层级。例如传输层负责应用之间的数据传递,网络层负责跨网络寻址与转发。
6.2 实体 Entity
实现某一层功能的软件或硬件组件。同一层中位于通信两端的实体称为对等实体。
6.3 协议 Protocol
对等实体之间遵守的规则,规定数据格式、字段含义、交互次序和错误处理方法。
text
主机 A 的 TCP 实体 ← 按 TCP 协议进行逻辑通信 → 主机 B 的 TCP 实体
6.4 接口 Interface
相邻层之间调用功能的边界和方法。在 Linux 应用层开发中,Socket API 是应用程序访问操作系统网络能力的重要接口。
6.5 服务 Service
下层能够为上层完成的功能。服务说明"能做什么",接口说明"怎样调用",协议规定通信双方"按照什么规则实现"。
7. OSI 七层模型
OSI 模型从下到上分为七层:
| 层级 | 主要职责 | 常见理解 |
|---|---|---|
| 7 应用层 | 为应用提供网络功能 | HTTP、FTP、SMTP 等 |
| 6 表示层 | 数据表示、编码、压缩、加密 | 把数据转换成双方可理解的格式 |
| 5 会话层 | 建立、维护和结束会话 | 管理通信过程 |
| 4 传输层 | 应用端点之间的数据传输 | TCP、UDP、端口号 |
| 3 网络层 | 跨网络寻址和路由 | IP、路由器 |
| 2 数据链路层 | 同一链路上的帧传输 | Ethernet、MAC 地址、FCS |
| 1 物理层 | 传输比特和电气或光学信号 | 网线、光纤、射频、PHY |
OSI 是理解职责边界的参考模型。实际互联网软件通常按 TCP/IP 协议栈讨论。
7.1 数据链路层并不保证端到端可靠
教材把数据链路层描述为"确保物理链路上的无误传输",适合作为入门简化,但不能理解成端到端数据一定送达。
以太网 FCS 能帮助检测链路帧错误,错误帧通常会被丢弃;是否重传、是否最终到达以及是否按序交付,还取决于更高层协议和具体链路技术。
8. 教学五层模型
五层模型把 OSI 的应用层、表示层和会话层合并为一个应用层:
text
应用层
传输层
网络层
数据链路层
物理层
它主要用于教学,既保留了链路层和物理层的区别,又比七层模型简洁。
9. TCP/IP 四层模型
本课程后续 Socket 编程主要使用 TCP/IP 四层视角:
| TCP/IP 层 | 主要协议或技术 | 负责的问题 |
|---|---|---|
| 应用层 | HTTP、FTP、SSH、SMTP、DNS 等 | 应用数据的含义和交互规则 |
| 传输层 | TCP、UDP | 把数据交给正确的应用端点 |
| 网际层 | IPv4、IPv6、ICMP | 跨网络寻址和路由 |
| 链路层 | Ethernet、Wi-Fi、PPP | 在当前物理网络上承载 IP 数据包 |
9.1 三种模型怎样对应
| OSI 七层 | 教学五层 | TCP/IP 四层 |
|---|---|---|
| 应用、表示、会话 | 应用层 | 应用层 |
| 传输层 | 传输层 | 传输层 |
| 网络层 | 网络层 | 网际层 |
| 数据链路层 | 数据链路层 | 链路层 |
| 物理层 | 物理层 | 链路层 |
模型用于帮助定位功能。实际协议并不总能完美、唯一地塞进某一层,分析时应关注协议真正提供的能力。
10. IP 地址、端口号和协议号分别负责什么
老师使用"IP 找到电脑,端口找到电脑中的程序"帮助入门。更准确的理解是:
- IP 地址标识网络接口,并参与路由选择;
- 协议号告诉 IP 层负载应交给 TCP、UDP、ICMP 等哪个上层协议;
- 端口号帮助 TCP 或 UDP 把数据交给主机中的具体 Socket;
- 操作系统再把 Socket 与相应进程关联。
#mermaid-svg-OvvSNvpno39kbbCg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OvvSNvpno39kbbCg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OvvSNvpno39kbbCg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OvvSNvpno39kbbCg .error-icon{fill:#552222;}#mermaid-svg-OvvSNvpno39kbbCg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OvvSNvpno39kbbCg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OvvSNvpno39kbbCg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OvvSNvpno39kbbCg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OvvSNvpno39kbbCg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OvvSNvpno39kbbCg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OvvSNvpno39kbbCg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OvvSNvpno39kbbCg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OvvSNvpno39kbbCg .marker.cross{stroke:#333333;}#mermaid-svg-OvvSNvpno39kbbCg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OvvSNvpno39kbbCg p{margin:0;}#mermaid-svg-OvvSNvpno39kbbCg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OvvSNvpno39kbbCg .cluster-label text{fill:#333;}#mermaid-svg-OvvSNvpno39kbbCg .cluster-label span{color:#333;}#mermaid-svg-OvvSNvpno39kbbCg .cluster-label span p{background-color:transparent;}#mermaid-svg-OvvSNvpno39kbbCg .label text,#mermaid-svg-OvvSNvpno39kbbCg span{fill:#333;color:#333;}#mermaid-svg-OvvSNvpno39kbbCg .node rect,#mermaid-svg-OvvSNvpno39kbbCg .node circle,#mermaid-svg-OvvSNvpno39kbbCg .node ellipse,#mermaid-svg-OvvSNvpno39kbbCg .node polygon,#mermaid-svg-OvvSNvpno39kbbCg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OvvSNvpno39kbbCg .rough-node .label text,#mermaid-svg-OvvSNvpno39kbbCg .node .label text,#mermaid-svg-OvvSNvpno39kbbCg .image-shape .label,#mermaid-svg-OvvSNvpno39kbbCg .icon-shape .label{text-anchor:middle;}#mermaid-svg-OvvSNvpno39kbbCg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OvvSNvpno39kbbCg .rough-node .label,#mermaid-svg-OvvSNvpno39kbbCg .node .label,#mermaid-svg-OvvSNvpno39kbbCg .image-shape .label,#mermaid-svg-OvvSNvpno39kbbCg .icon-shape .label{text-align:center;}#mermaid-svg-OvvSNvpno39kbbCg .node.clickable{cursor:pointer;}#mermaid-svg-OvvSNvpno39kbbCg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OvvSNvpno39kbbCg .arrowheadPath{fill:#333333;}#mermaid-svg-OvvSNvpno39kbbCg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OvvSNvpno39kbbCg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OvvSNvpno39kbbCg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OvvSNvpno39kbbCg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OvvSNvpno39kbbCg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OvvSNvpno39kbbCg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OvvSNvpno39kbbCg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OvvSNvpno39kbbCg .cluster text{fill:#333;}#mermaid-svg-OvvSNvpno39kbbCg .cluster span{color:#333;}#mermaid-svg-OvvSNvpno39kbbCg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OvvSNvpno39kbbCg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OvvSNvpno39kbbCg rect.text{fill:none;stroke-width:0;}#mermaid-svg-OvvSNvpno39kbbCg .icon-shape,#mermaid-svg-OvvSNvpno39kbbCg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OvvSNvpno39kbbCg .icon-shape p,#mermaid-svg-OvvSNvpno39kbbCg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OvvSNvpno39kbbCg .icon-shape .label rect,#mermaid-svg-OvvSNvpno39kbbCg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OvvSNvpno39kbbCg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OvvSNvpno39kbbCg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OvvSNvpno39kbbCg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} TCP
UDP
目的 IP 地址
到达目标主机的网络接口
IP 协议字段
目标 TCP 端口
目标 UDP 端口
目标 Socket / 应用
一条 TCP 连接通常由以下信息区分:
text
源 IP + 源端口 + 目的 IP + 目的端口 + 传输层协议
所以同一个服务器端口可以同时服务许多客户端连接。
11. TCP 与 UDP 的初步区别
| 特征 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接 | 无连接 |
| 数据形式 | 连续字节流 | 一个个数据报 |
| 可靠性 | 提供可靠、有序传递 | 不保证送达、顺序或不重复 |
| 消息边界 | 不保留应用写入边界 | 保留数据报边界 |
| 常见取舍 | 功能完整,协议开销和状态更多 | 简单、低开销,应用自行处理可靠性需求 |
TCP 的"可靠"表示协议会通过序号、确认、重传等机制提供可靠、有序的字节流服务,不表示网络永远不会断开,也不表示一次 send() 必然对应接收端一次完整 recv()。
录音在本节只做初步对比,第 254 页开始进入 TCP 特性,详细机制属于后续课程。
12. PDU、SDU 与 PCI
12.1 PDU
PDU(Protocol Data Unit,协议数据单元)是同层对等实体交换的数据单位。
不同层常使用不同名称:
| 层 | 常见 PDU 名称 |
|---|---|
| 应用层 | 消息或应用数据 |
| TCP 传输层 | TCP 报文段 Segment |
| UDP 传输层 | UDP 数据报 Datagram |
| IP 网际层 | IP 数据包或 IP 数据报 Packet / Datagram |
| 数据链路层 | 帧 Frame |
具体资料对 Packet、Datagram 等词的使用可能略有差异,判断时应先看它所处的协议层。
12.2 SDU
SDU(Service Data Unit,服务数据单元)是当前层从上层接收、需要继续承载的数据。对当前层来说,它是负载。
12.3 PCI
PCI(Protocol Control Information,协议控制信息)是当前层为了实现自身协议功能而添加的控制信息,例如:
- 源和目的地址;
- 源和目的端口;
- 协议类型;
- 序号、确认号和控制标志;
- 长度、校验信息。
基本关系:
text
PDU = PCI + SDU
PCI 常位于头部。某些协议还包含尾部,例如以太网帧尾部的 FCS。
13. 封装与解封装
假设浏览器向网站服务器发送 HTTP 请求。
13.1 发送端封装
#mermaid-svg-Y7E6EQc020er00aJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Y7E6EQc020er00aJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Y7E6EQc020er00aJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Y7E6EQc020er00aJ .error-icon{fill:#552222;}#mermaid-svg-Y7E6EQc020er00aJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Y7E6EQc020er00aJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Y7E6EQc020er00aJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Y7E6EQc020er00aJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Y7E6EQc020er00aJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Y7E6EQc020er00aJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Y7E6EQc020er00aJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Y7E6EQc020er00aJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Y7E6EQc020er00aJ .marker.cross{stroke:#333333;}#mermaid-svg-Y7E6EQc020er00aJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Y7E6EQc020er00aJ p{margin:0;}#mermaid-svg-Y7E6EQc020er00aJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Y7E6EQc020er00aJ .cluster-label text{fill:#333;}#mermaid-svg-Y7E6EQc020er00aJ .cluster-label span{color:#333;}#mermaid-svg-Y7E6EQc020er00aJ .cluster-label span p{background-color:transparent;}#mermaid-svg-Y7E6EQc020er00aJ .label text,#mermaid-svg-Y7E6EQc020er00aJ span{fill:#333;color:#333;}#mermaid-svg-Y7E6EQc020er00aJ .node rect,#mermaid-svg-Y7E6EQc020er00aJ .node circle,#mermaid-svg-Y7E6EQc020er00aJ .node ellipse,#mermaid-svg-Y7E6EQc020er00aJ .node polygon,#mermaid-svg-Y7E6EQc020er00aJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Y7E6EQc020er00aJ .rough-node .label text,#mermaid-svg-Y7E6EQc020er00aJ .node .label text,#mermaid-svg-Y7E6EQc020er00aJ .image-shape .label,#mermaid-svg-Y7E6EQc020er00aJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-Y7E6EQc020er00aJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Y7E6EQc020er00aJ .rough-node .label,#mermaid-svg-Y7E6EQc020er00aJ .node .label,#mermaid-svg-Y7E6EQc020er00aJ .image-shape .label,#mermaid-svg-Y7E6EQc020er00aJ .icon-shape .label{text-align:center;}#mermaid-svg-Y7E6EQc020er00aJ .node.clickable{cursor:pointer;}#mermaid-svg-Y7E6EQc020er00aJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Y7E6EQc020er00aJ .arrowheadPath{fill:#333333;}#mermaid-svg-Y7E6EQc020er00aJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Y7E6EQc020er00aJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Y7E6EQc020er00aJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Y7E6EQc020er00aJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Y7E6EQc020er00aJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Y7E6EQc020er00aJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Y7E6EQc020er00aJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Y7E6EQc020er00aJ .cluster text{fill:#333;}#mermaid-svg-Y7E6EQc020er00aJ .cluster span{color:#333;}#mermaid-svg-Y7E6EQc020er00aJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Y7E6EQc020er00aJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Y7E6EQc020er00aJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-Y7E6EQc020er00aJ .icon-shape,#mermaid-svg-Y7E6EQc020er00aJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Y7E6EQc020er00aJ .icon-shape p,#mermaid-svg-Y7E6EQc020er00aJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Y7E6EQc020er00aJ .icon-shape .label rect,#mermaid-svg-Y7E6EQc020er00aJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Y7E6EQc020er00aJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Y7E6EQc020er00aJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Y7E6EQc020er00aJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} HTTP 请求数据
加入 TCP 头部
TCP 报文段
加入 IP 头部
IP 数据包
加入以太网头部和尾部
以太网帧
网卡发送比特
可以把每层动作理解为:
text
上层 PDU
→ 作为本层 SDU
→ 本层添加 PCI
→ 形成新的本层 PDU
13.2 接收端解封装
接收端按相反方向处理:
text
网卡接收帧
→ 链路层检查并去除链路头尾
→ IP 层检查目的地址并去除 IP 头
→ TCP 根据端口和连接状态处理报文段
→ 应用从 Socket 读取字节
每层只解释自己负责的控制信息,然后把负载交给上层。
14. 服务、接口和协议的关系
这三个概念容易混淆,可以用一个问题分别对应:
| 概念 | 回答的问题 | 网络编程中的例子 |
|---|---|---|
| 服务 | 下层能为上层做什么 | TCP 提供可靠、有序的字节流传输 |
| 接口 | 上层怎样使用服务 | 应用调用 Socket API |
| 协议 | 通信双方怎样实现和互操作 | 两端 TCP 按统一报文格式和状态机通信 |
#mermaid-svg-wPKx5ZL5ZO6tEuTw{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wPKx5ZL5ZO6tEuTw .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .error-icon{fill:#552222;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .marker.cross{stroke:#333333;}#mermaid-svg-wPKx5ZL5ZO6tEuTw svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wPKx5ZL5ZO6tEuTw p{margin:0;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .cluster-label text{fill:#333;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .cluster-label span{color:#333;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .cluster-label span p{background-color:transparent;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .label text,#mermaid-svg-wPKx5ZL5ZO6tEuTw span{fill:#333;color:#333;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .node rect,#mermaid-svg-wPKx5ZL5ZO6tEuTw .node circle,#mermaid-svg-wPKx5ZL5ZO6tEuTw .node ellipse,#mermaid-svg-wPKx5ZL5ZO6tEuTw .node polygon,#mermaid-svg-wPKx5ZL5ZO6tEuTw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .rough-node .label text,#mermaid-svg-wPKx5ZL5ZO6tEuTw .node .label text,#mermaid-svg-wPKx5ZL5ZO6tEuTw .image-shape .label,#mermaid-svg-wPKx5ZL5ZO6tEuTw .icon-shape .label{text-anchor:middle;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .rough-node .label,#mermaid-svg-wPKx5ZL5ZO6tEuTw .node .label,#mermaid-svg-wPKx5ZL5ZO6tEuTw .image-shape .label,#mermaid-svg-wPKx5ZL5ZO6tEuTw .icon-shape .label{text-align:center;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .node.clickable{cursor:pointer;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .arrowheadPath{fill:#333333;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wPKx5ZL5ZO6tEuTw .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wPKx5ZL5ZO6tEuTw .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wPKx5ZL5ZO6tEuTw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .cluster text{fill:#333;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .cluster span{color:#333;}#mermaid-svg-wPKx5ZL5ZO6tEuTw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wPKx5ZL5ZO6tEuTw rect.text{fill:none;stroke-width:0;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .icon-shape,#mermaid-svg-wPKx5ZL5ZO6tEuTw .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .icon-shape p,#mermaid-svg-wPKx5ZL5ZO6tEuTw .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .icon-shape .label rect,#mermaid-svg-wPKx5ZL5ZO6tEuTw .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wPKx5ZL5ZO6tEuTw .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wPKx5ZL5ZO6tEuTw .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wPKx5ZL5ZO6tEuTw :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 调用接口
使用服务
遵守 TCP 协议
应用程序
Socket API
内核 TCP 实现
远端 TCP 实现
协议主要描述对等层之间的横向规则,服务和接口描述相邻层之间的纵向关系。
15. 与后续 Socket 编程的对应
学完本节后,后面的 API 才有明确位置:
| 后续概念 | 本节理论对应 |
|---|---|
socket() |
创建应用访问传输层服务的 Socket |
| IP 地址 | 指定本地或远端网络地址 |
| 端口号 | 指定主机中的服务端点 |
SOCK_STREAM |
通常选择 TCP 字节流服务 |
SOCK_DGRAM |
通常选择 UDP 数据报服务 |
send / recv |
应用通过接口提交和取得数据 |
| 网卡与驱动 | 在链路层和物理层完成实际收发 |
Socket 是操作系统提供给应用的编程接口。它本身不是 TCP、UDP 或 IP 协议,但可以让应用选择并使用这些协议提供的能力。
16. 可以立即做的观察练习
在 Linux 中运行:
bash
ip addr
ip route
ss -lntup
观察:
ip addr中接口和 IP 地址的对应关系;ip route中默认网关和路由条目;ss -lntup中 TCP、UDP、本地地址和端口号;- 同一个进程是否可能监听多个 Socket;
127.0.0.1与网卡实际地址有什么不同。
这一步不要求写代码,目的是把"接口、IP、传输协议、端口、进程"对应起来。
17. 录音与教材表述校正
- 转写中的"操作编程"应为"Socket 编程"或"套接字编程"。
- OSI 是网络体系结构参考模型,不宜称为"法律上的标准"。TCP/IP 是互联网实际采用的协议族和实现框架。
- IP 地址不应简单等同于网址。域名可以解析为 IP 地址,而 URL 还包含协议、主机、端口、路径等信息。
- IP 地址更准确地标识网络接口;端口帮助传输层把数据分用到 Socket,不是端口直接"找到进程"。
- 数据链路层能检测某些链路错误,但不能独自保证端到端可靠传输。
- TCP 提供可靠、有序的字节流,不保留应用消息边界;一次发送的数据可能被多次接收,也可能与其他发送合并读取。
- UDP 不是"保证传过来但可能丢"。UDP 只提供数据报发送能力,不保证交付、顺序和去重。
- 现代交换式以太网的普通单播不会让所有节点都接收每个帧;广播只适用于特定目的地址和广播域。
- 网状网络可分全网状和部分网状,互联网不是所有终端之间全部直连。
- 教材把应用层写作"应用、表示、会话的简单合并"便于入门;实际协议分层可能跨越理论模型边界。
- PDU、Packet、Datagram 等术语在不同资料中可能有宽泛用法,应结合所在层和协议判断。
18. 本节最低掌握标准
学完后应能回答:
- LAN 与 Internet 有什么区别?
- 为什么网络要分层?
- OSI 七层、教学五层和 TCP/IP 四层怎样对应?
- TCP/IP 四层各自解决什么问题?
- IP 地址、传输层协议和端口号分别起什么作用?
- TCP 与 UDP 的最基本区别是什么?
- PDU、SDU、PCI 之间是什么关系?
- 什么是封装和解封装?
- 服务、接口和协议分别回答什么问题?
- Socket API 在分层模型中的位置是什么?
最低实践要求:
- 能画出应用数据到以太网帧的封装顺序;
- 能解释"IP 找主机接口,端口找 Socket"的含义;
- 能读懂
IP:端口形式,例如192.168.1.10:8080; - 能使用
ip addr、ip route和ss查看本机网络状态。
19. PDF 页码与录音时间索引
| 主题 | PDF 页码 | 录音时间 |
|---|---|---|
| Socket 编程章节入口 | 244 | 00:05---00:55 |
| 按地理范围和拓扑分类 | 245---246 | 00:56---03:22 |
| 按用途、交换方式和通信方式分类 | 246---247 | 03:23---05:23 |
| 分层原因及相关概念 | 247---248 | 05:25---08:49 |
| OSI 七层模型 | 248---249 | 08:50---13:43 |
| 教学五层和 TCP/IP 四层模型 | 249---251 | 13:44---17:59 |
| PDU、SDU、PCI | 251---252 | 18:00---20:07 |
| 以太网通信的封装与解封装 | 252---253 | 20:08---21:31 |
| 服务、接口与协议 | 253---254 | 21:32---22:52 |
| TCP 特性入口 | 254 | 教材下一部分,录音尚未正式展开 |
进一步核对资料:
- IETF Internet Standard:RFC 9293,Transmission Control Protocol
- IETF Standard:RFC 768,User Datagram Protocol
20. 下一步学习
下一阶段应按下面顺序继续:
- IPv4 地址、子网掩码、默认网关和端口号;
- 主机字节序与网络字节序;
sockaddr_in地址结构;- TCP 的连接、可靠字节流和三次握手;
- TCP 服务端:
socket → bind → listen → accept → recv/send → close; - TCP 客户端:
socket → connect → send/recv → close; - UDP:
socket → sendto/recvfrom → close。
这节不需要背下所有网络名词。先确保自己能解释四层模型、IP 与端口、封装过程,后续写 Socket 程序时再把 API 放到对应层次中。