# 8.1无远弗届的网络

## 阅读入口

* [网络分层模型](/knowledge/cs/networks/network-layers/)
* [IPv4地址与子网](/knowledge/cs/networks/ipv4/)
* [TCP与UDP的传输形式](/knowledge/cs/networks/tcp-udp/)

## 五层模型

| 层     | 主要职责                    | 数据单位  | 典型设备或协议               |
| :---- | :---------------------- | :---- | :-------------------- |
| 物理层   | 在物理媒介上传输原始比特流           | 比特    | 中继器、集线器               |
| 数据链路层 | 在相邻节点之间传输帧              | 帧     | 交换机、网卡；以太网、Wi-Fi      |
| 网络层   | 把数据从源主机送到目标主机，负责路由与逻辑寻址 | 数据包   | 路由器；IP                |
| 传输层   | 在进程之间提供端到端通信            | 段或数据报 | TCP、UDP               |
| 应用层   | 为应用程序提供网络服务             | 报文    | HTTP、DNS、SMTP、FTP、SSH |

### 物理层

物理层是网络的最底层，负责在物理媒介上传输原始的比特流。

* **功能**：定义物理设备的电气、机械、功能和过程特性，例如用电压高低表示1和0，以及接口的形状。
* **传输介质**：有线介质包括双绞线（网线）、光纤和同轴电缆，其中光纤利用光的全反射传输，速度快、损耗低；无线介质包括无线电波（Wi-Fi）、微波和红外线。
* **设备**：中继器、集线器。
* **单位**：比特。

### 数据链路层

数据链路层负责在相邻的两个节点之间传输数据，把比特流组装成帧。它不关心跨越多少个网络，只处理一段链路上的传递。

* **物理寻址**：用MAC地址标识网络设备，MAC地址用于链路层寻址，例如`00:1A:2B:3C:4D:5E`。
* **差错检测**：检测传输过程中是否发生比特翻转，例如用CRC循环冗余校验。
* **介质访问控制**：决定谁可以在什么时候发送数据，例如以太网的CSMA/CD机制。
* **协议**：以太网、Wi-Fi（802.11）。
* **设备**：交换机、网卡。
* **单位**：帧。

### 网络层

网络层负责把数据从源主机传输到目标主机，途中可能跨越多个不同的网络，核心任务是路由和逻辑寻址。

* **单位**：数据包。
* **设备**：路由器。

IPv4的[地址](/knowledge/cs/networks/ipv4/)、[数据包](/knowledge/cs/networks/ipv4-packet/)和[路由](/knowledge/cs/networks/ip-routing/)分别有独立说明。

### 传输层

传输层负责端到端的通信，也就是进程与进程之间的通信。端口号属于这一层，用来区分同一台主机上的不同应用程序。

* **单位**：段或数据报。

TCP与UDP的机制和取舍见[TCP与UDP的传输形式](/knowledge/cs/networks/tcp-udp/)。

### 应用层

应用层直接为用户的应用程序提供网络服务，定义运行在不同端系统上的应用进程如何相互传递报文。

* **常见协议**：HTTP/HTTPS用于万维网访问；DNS是域名系统，把域名转换为IP地址；SMTP、POP3、IMAP用于电子邮件的传输与接收；FTP用于文件传输；SSH用于安全远程登录。
* **通信模式**：C/S模式由客户端请求、服务器响应，例如Web；P2P模式是对等连接，每个节点既是客户端也是服务器，例如BitTorrent。

> [!NOTE]
> 分层是逻辑划分，不是物理位置。同一台主机上会同时实现五层；路由器通常只处理到网络层，交换机通常只处理到数据链路层。

[来源：网络分层模型](/knowledge/cs/networks/network-layers/#layers)

表里把五层的职责、数据单位和典型设备排在一起，正是本节要求整理的那三列。往后读到某一层的协议时，先回到这张表确认自己站在哪一层。

## IPv4地址

IPv4地址长度为32位，即4字节。书写时采用点分十进制，把4个字节分别写成十进制数，再用点隔开，例如`192.168.1.1`。

一个IPv4地址分为两部分：

* **网络号**：标识主机所在的网络。
* **主机号**：标识该网络内的特定设备。

子网掩码用于区分这两部分：掩码中为1的位对应网络号，为0的位对应主机号。例如掩码`255.255.255.0`表示前24位是网络号、后8位是主机号。

[来源：IPv4地址与子网](/knowledge/cs/networks/ipv4/#address)

### 分类编址

分类编址是历史上的方案；现代路由通常使用无类别的前缀长度，不能只靠地址类别推断当前掩码。

| 类别 | 地址范围                            | 网络号位数      | 主机号位数 | 用途    |
| :- | :------------------------------ | :--------- | :---- | :---- |
| A类 | `0.0.0.0` – `127.255.255.255`   | 8（首位为0）    | 24    | 超大型网络 |
| B类 | `128.0.0.0` – `191.255.255.255` | 16（前两位10）  | 16    | 中型网络  |
| C类 | `192.0.0.0` – `223.255.255.255` | 24（前三位110） | 8     | 小型网络  |
| D类 | `224.0.0.0` – `239.255.255.255` | —          | —     | 多播    |
| E类 | `240.0.0.0` – `255.255.255.255` | —          | —     | 保留实验  |

### 特殊地址

| 地址                                            | 含义                        |
| :-------------------------------------------- | :------------------------ |
| `10.0.0.0/8`、`172.16.0.0/12`、`192.168.0.0/16` | 私有地址，不在公共互联网中作为可路由的源或目标地址 |
| `127.0.0.1`                                   | 回环地址，通常指localhost，用于本机测试  |
| 主机号全为1，例如`192.168.1.255`                      | 广播地址，用于向本网络内所有主机发送数据      |
| 主机号全为0，例如`192.168.1.0`                        | 网络地址，用于标识整个网络             |

> [!NOTE]
> 私有地址可在独立的内部网络中复用；网络互连时若地址范围重叠，仍需处理寻址与路由冲突。

> [!NOTE]
> 下面将主机位全零和全一作为网络地址与广播地址的说明适用于常见子网；特殊前缀和点对点链路可能采用不同规则，不能机械套用可用主机数公式。

[来源：IPv4地址与子网](/knowledge/cs/networks/ipv4/#address-classes)

## IPv4数据包与路由

IPv4头部通常为20字节，包含路由和处理所需的关键信息。

| 字段      | 作用                                    |
| :------ | :------------------------------------ |
| 版本      | 值为4，表示IPv4                            |
| 生存时间TTL | 防止数据包在网络环路中无限循环；每经过一个路由器减1，减到0时数据包被丢弃 |
| 协议      | 指示数据部分使用哪个传输层协议，常见值6表示TCP、17表示UDP     |
| 源IP地址   | 发送方的32位地址                             |
| 目的IP地址  | 接收方的32位地址                             |

> [!WARNING]
> 现代IPv4转发中，路由器转发时将TTL至少减一；TTL耗尽时丢弃分组。

[来源：IPv4数据包](/knowledge/cs/networks/ipv4-packet/#definition)

路由器根据目的IP地址查询路由表，选择匹配的路由和相应的出口或下一跳。多个前缀同时匹配时通常选择最长匹配前缀；每一跳独立作出转发决定。主机可直接发送到同一链路上的目标，也可通过网关发送到其他网络。

[来源：IP路由](/knowledge/cs/networks/ip-routing/#definition)

## IPv6地址

IPv6地址长 $128$ 位，通常写成八组十六进制数，每组表示 $16$ 位，组间用冒号分隔。例如

```text
2001:0db8:0000:0000:0000:0000:0000:0001
```

每组开头的零可以省略；连续的全零组可以用一次 `::` 代替。常用的规范写法压缩最长的一段连续全零组；等长时选靠前的一段，并不压缩单个全零组。上例可写成`2001:db8::1`。`::` 在一个地址中只能出现一次，否则无法确定它代表多少组。

[来源：IPv6地址](/knowledge/cs/networks/ipv6-address/#definition)

常见子网题先按前缀划分网络位与主机位；特殊前缀要按具体链路规则判断，不能机械套用普通子网的广播地址或主机数公式。

## 传输层与端口

传输层为应用进程提供端到端通信。端口号用于区分同一主机上的通信端点；协议、地址、端口及连接状态共同参与实际分用。TCP与UDP的端口空间分别处理，因此相同的数字端口不必指向同一个端点。

例如网页服务常监听TCP端口 $80$，客户端通常使用临时源端口连接服务；端口 $80$ 不是所有浏览器进程自身固定使用的端口。

[来源：传输层与端口](/knowledge/cs/networks/transport-layer/#definition)

## TCP与UDP

TCP是面向连接的传输层协议，向应用提供有序字节流。它通过序列号、确认、重传与校验等机制应对丢失、重复和乱序；连接遇到持续故障时仍可能失败，不能理解为任何网络条件下都保证成功交付。

TCP没有应用消息边界：一次发送的数据可以被多次读取，多次发送的数据也可能被一次读取。应用需要时须自行设计分帧方式。

[来源：TCP](/knowledge/cs/networks/tcp/#definition)

UDP是无连接的数据报传输协议。一个数据报具有源端口、目的端口、长度、校验和字段与数据；首部固定为 $8$ 字节。UDP保留数据报边界，但自身不提供自动重传、按序交付或拥塞控制。

数据报可能丢失、重复或乱序。应用可以在UDP之上自行实现可靠性、加密或拥塞控制；不能只根据传输协议断定应用是否能容忍丢包，也不能断言UDP一定比TCP快。

[来源：UDP](/knowledge/cs/networks/udp/#definition)

[TCP](/knowledge/cs/networks/tcp/)提供面向连接的有序字节流；[UDP](/knowledge/cs/networks/udp/)提供无连接的数据报。两者都使用端口，区别在于传输形式和协议提供的服务。

| 特性   | TCP              | UDP          |
| :--- | :--------------- | :----------- |
| 数据形式 | 字节流，不保留应用发送边界    | 数据报，保留消息边界   |
| 交付   | 尝试可靠、按序交付；连接可能失败 | 不保证到达、顺序或不重复 |
| 连接   | 通常先建立连接          | 不需要建立传输层连接   |
| 首部   | 最小20字节           | 固定8字节        |

应用可在UDP之上实现可靠性或拥塞控制。性能取决于网络、实现和应用需求，不能简单断言一种协议总是更快。

[来源：TCP与UDP的传输形式](/knowledge/cs/networks/tcp-udp/#definition)

## 信道复用

为了提高通信线路的利用率，需要在同一条传输介质上同时传输多路信号，这就是信道复用。四种常见方式按“把什么切开分给各路信号”来区分。

| 方式      | 划分依据 | 说明                                                                   |
| :------ | :--- | :------------------------------------------------------------------- |
| 频分复用FDM | 频率   | 把频谱分成若干互不重叠的频带，每路信号占用一个频带。收音机不同电台使用不同频率、互不干扰，就是这种思路。                 |
| 时分复用TDM | 时间   | 把时间划分为一段段等长的时隙，每路信号轮流占用时隙传输。类似大家轮流发言，每人讲一分钟。                         |
| 波分复用WDM | 波长   | 本质是光的频分复用，在光纤中传输不同波长（颜色）的光信号，极大提高了光纤的传输容量。                           |
| 码分复用CDM | 编码   | 主要用于无线通信（如3G、4G）。每个用户分配一个唯一的码序列（码片），各用户使用同样的频率同时发送数据，通过解码分离出特定用户的信号。 |

> [!TIP]
> 记四种复用的区别时，先问“多路信号靠什么互不干扰”：频率、时间、波长还是编码。FDM与WDM都在频率维度上划分，WDM只是把这一思路用在光纤的光波上。

[来源：信道复用](/knowledge/cs/networks/channel-multiplexing/#definition)

## 网络交换

数据在网络核心中传输主要有两种交换方式。它们的差别不在传输介质，而在是否为通信双方预留资源。

### 电路交换

电路交换先在通信双方之间建立电路，并在沿途链路上预留相应的传输资源；这些资源可以是共享物理链路中的时隙或频带。

* **独占资源**：通话期间，链路带宽（频率或时隙）被固定分配给用户，其他用户无法使用。
* **三个阶段**：建立连接 → 数据传输 → 释放连接。
* **优缺点**：资源预留后通常避免竞争性排队；但静默期仍占用资源，实际时延还取决于传播和设备处理等因素。
* **典型案例**：传统公共电话交换网（PSTN）。

### 分组交换

分组交换把数据划分为较小的分组进行传输。

* **机制**：存储转发。路由器收到一个分组，先接收分组，再根据转发信息将其送往下一条链路。
* **统计复用**：用户按需占用链路，多路数据动态共享带宽。
* **无连接**：通常不需要预先分配固定资源。
* **优缺点**：线路利用率高，适应突发流量；但存在排队延迟，可能发生丢包。
* **典型案例**：互联网。

两种方式的对比：

| 比较项   | 电路交换           | 分组交换          |
| :---- | :------------- | :------------ |
| 资源分配  | 通信期间独占固定带宽     | 按需共享，统计复用     |
| 建立过程  | 必须先建立连接        | 通常无需预先分配资源    |
| 延迟    | 预留资源后通常避免竞争性排队 | 可能有排队延迟，随负载变化 |
| 线路利用率 | 低，静默期也占用资源     | 高，适合突发流量      |
| 抗毁性   | 通路中断则通信中断      | 可绕行，但可能丢包     |
| 典型场景  | 电话             | 互联网           |

> [!WARNING]
> 电路交换的“建立连接”与TCP的连接建立不是同一件事。电路交换预留的是沿途的电路资源和带宽，TCP只在两端维护连接状态，中间路由器并不为它保留资源。

[来源：电路交换与分组交换](/knowledge/cs/networks/network-switching/#definition)

## 学习安排

教材自底向上展开：先讲物理层怎样传比特，再逐层加上相邻节点寻址、跨网络路由、进程间通信和应用协议。按这个顺序读，每进入一层都能回答“上一层还缺什么”。

建议先把五层各自的负责范围、数据单位和典型设备列成三列，再进入网络层与传输层这两个重点。读 [网络分层模型](/knowledge/cs/networks/network-layers/) 时先建立整体框架，同时把信道复用和两种交换方式归到“网络核心怎样共享链路”这条线上。读[IPv4地址与子网](/knowledge/cs/networks/ipv4/) 时重点练地址计算：由地址和掩码写出网络地址、广播地址和可用主机范围，再对照头部字段理解TTL与协议字段。读[TCP与UDP的传输形式](/knowledge/cs/networks/tcp-udp/) 时把头部字段、三次握手和可靠性机制连起来看，不要只背字段名。

## 课程约定

* 采用TCP/IP五层模型：物理层、数据链路层、网络层、传输层、应用层。
* 数据单位沿用教材说法：比特、帧、数据包（分组）、段或数据报。
* 私有地址按A、B、C三段记：`10.0.0.0/8`、`172.16.0.0/12`、`192.168.0.0/16`。
* TCP的可靠性按“确认、重传、窗口”三层记；拥塞控制重点理解目的。
* 应用层协议只要求认出用途，并区分C/S与P2P两种通信模式。

## 易错点

* 网络层负责主机到主机，传输层才负责进程到进程；端口号属于传输层，不属于网络层。
* MAC地址只在相邻节点之间使用，IP地址负责跨网络寻址；两者不在同一层，也不能互相替代。
* 分组交换的存储转发会带来排队延迟和丢包，这是换取统计复用和线路利用率的代价，不是实现缺陷。
* 电路交换的三阶段是建立通路、传输数据、释放通路；它预留的是沿途带宽，和TCP在两端维护的连接状态不是一回事。
* TTL每经过一个路由器减1，按跳数递减而不是按时间递减。
* 不要因为UDP头部开销小就认为它总是更快；应用可以按自身需要在UDP上实现可靠传输、拥塞控制或其他机制。

## 复习要点

回忆每一层时按“负责范围、数据单位、典型设备”三列自问，比按协议名背更容易定位遗漏。

TCP提供有序字节流并通过确认和重传应对丢失；UDP保留数据报边界，应用也可以自行实现可靠性；IPv4的地址题先确定掩码位数，再分别把主机号置0和置1。
