1. Introduction (简介)
1.1. Motivation (动机)
互联网协议设计用于分组交换计算机通信网络的互联系统。这样的系统被称为"catenet" [1]。互联网协议提供了将称为数据报 (datagrams) 的数据块从源传输到目的地的功能, 其中源和目的地是由固定长度地址标识的主机。互联网协议还提供了长数据报的分片和重组功能, 在必要时用于通过"小包"网络传输。
核心设计目标
1. 互联
网络 A ←→ 网关 ←→ 网络 B ←→ 网关 ←→ 网络 C
↓ ↓ ↓
主机 1 主机 2 主机 3
IP 使不同类型的网络能够互联
2. 数据报传递
- 无连接服务
- 每个数据报独立路由
- 不保证传递、顺序或重复保护
3. 寻址
- 32 位固定长度地址
- 唯一标识互联网上的每台主机
- 层次结构 (网络 + 主机)
4. 分片与重组
大数据报 (1500 字节)
↓ 分片
分片 1 (500 字节) + 分片 2 (500 字节) + 分片 3 (500 字节)
↓ 通过小包网络传输
↓ 重组
大数据报 (1500 字节)
1.2. Scope (范围)
互联网协议的范围被明确限定为提供将一包位 (互联网数据报) 从源通过互联网络系统传递到目的地所必需的功能。没有任何机制来增强端到端数据可靠性、流量控制、排序或主机间协议中常见的其他服务。 互联网协议可以利用其支持网络的服务来提供各种类型和质量的服务。
IP 不提供的功能
| 功能 | IP 提供 | 由谁提供 |
|---|---|---|
| 可靠传递 | ❌ 否 | TCP |
| 流量控制 | ❌ 否 | TCP |
| 排序 | ❌ 否 | TCP |
| 错误恢复 | ❌ 否 | TCP |
| 连接管理 | ❌ 否 | TCP |
| 拥塞控制 | ❌ 否 | TCP |
IP 提供的功能
| 功能 | 描述 |
|---|---|
| ✅ 寻址 | 32 位 IP 地址 |
| ✅ 路由 | 数据报转发 |
| ✅ 分片/重组 | 适应不同 MTU |
| ✅ 生存时间 | TTL 防止循环 |
| ✅ 服务类型 | ToS 字段 |
| ✅ 头部校验和 | 检测头部错误 |
设计哲学
端到端原则:
- 保持 IP 层简单
- 复杂功能在端点实现
- 网络核心只做转发
优势:
✅ 网络可扩展性
✅ 支持多种上层协议
✅ 故障域隔离
1.3. Interfaces (接口)
本协议由互联网环境中的主机间协议调用。本协议调用本地网络协议将互联网数据报传送到下一个网关或目的主机。
上层接口
示例: TCP 调用 IP
TCP 模块将调用互联网模块, 将 TCP 段 (包括 TCP 头部和用户数据)
作为互联网数据报的数据部分。TCP 模块将在调用时将互联网头部中的
地址和其他参数作为参数提供给互联网模块。
接口流程:
应用层
↓ 数据
传输层 (TCP/UDP)
↓ TCP 段/UDP 数据报
网络层 (IP) ← 添加 IP 头部
↓ IP 数据报
数据链路层 (以太网等)
↓ 帧
物理层
下层接口
示例: IP 调用本地网络
例如在 ARPANET 的情况下, 互联网模块将调用本地网络模块,
该模块将在互联网数据报前添加 1822 前导 [2], 创建一个 ARPANET
消息以传输到 IMP (接口消息处理器)。ARPANET 地址将由本地网络
接口从互联网地址派生。
1822 协议示例:
+----------------+------------------+
| 1822 前导 | IP 数据报 |
| (ARPANET 专用) | (通用格式) |
+----------------+------------------+
接口参数
IP 发送接口:
send_ip_datagram(
source_address, // 源 IP 地址
dest_address, // 目的 IP 地址
protocol, // 上层协议 (TCP=6, UDP=17)
tos, // 服务类型
ttl, // 生存时间
data, // 数据
length, // 数据长度
options // IP 选项 (可选)
);
IP 接收接口:
receive_ip_datagram(
source_address, // 源 IP 地址
dest_address, // 目的 IP 地址
protocol, // 上层协议
data, // 数据
length // 数据长度
);
1.4. Operation (操作)
互联网协议实现两个基本功能: 寻址和分片。
寻址
互联网模块使用互联网头部中携带的地址将互联网数据报传输到其目的地。选择传输路径称为路由。
地址结构:
32 位 IP 地址 = 网络部分 + 主机部分
A 类: [0][7 位网络][24 位主机]
B 类: [10][14 位网络][16 位主机]
C 类: [110][21 位网络][8 位主机]
路由决策:
def route_datagram(dest_ip):
if dest_ip in local_network:
# 直接传递
send_to_host(dest_ip)
else:
# 转发到网关
gateway = lookup_routing_table(dest_ip)
send_to_gateway(gateway, datagram)
分片
互联网模块使用互联网头部中的字段在必要时对互联网数据报进行分片和重组, 以便通过"小包"网络传输。
分片过程:
原始数据报 (MTU=1500):
+--------+------------------------+
| IP 头部 | 1480 字节数据 |
+--------+------------------------+
通过 MTU=500 的网络后分片:
分片 1:
+--------+--------+
| IP 头部 | 480 字节 | MF=1, 偏移=0
+--------+--------+
分片 2:
+--------+--------+
| IP 头部 | 480 字节 | MF=1, 偏移=60
+--------+--------+
分片 3:
+--------+--------+
| IP 头部 | 520 字节 | MF=0, 偏移=120
+--------+--------+
分片字段:
- Identification (标识): 标识原始数据报
- Flags (标志):
- DF (Don't Fragment, 不分片): 不允许分片
- MF (More Fragments, 更多分片): 后面还有分片
- Fragment Offset (分片偏移): 分片在原始数据报中的位置 (以 8 字节为单位)
操作模型
操作模型是互联网模块驻留在参与互联网通信的每台主机以及互联网络的每个网关中。这些模块共享解释地址字段以及分片和重组互联网数据报的通用规则。此外, 这些模块 (尤其是在网关中) 具有做出路由决策和其他功能的程序。
互联网协议将每个互联网数据报视为与任何其他互联网数据报无关的独立实体。没有连接或逻辑电路 (虚拟或其他)。
发送方:
1. 从上层接收数据
2. 添加 IP 头部
3. 查找路由表
4. 必要时分片
5. 传递给本地网络
中间网关:
1. 接收 IP 数据报
2. 检查目的地址
3. 查找路由表
4. 递减 TTL
5. 必要时分片
6. 转发到下一跳
接收方:
1. 接收 IP 数据报
2. 检查目的地址 (是否发给我?)
3. 如果已分片则重组
4. 传递给上层协议
关键机制
互联网协议在提供服务时使用四个关键机制: 服务类型、生存时间、选项和头部校验和。
服务类型 (Type of Service)
- 用于指示所需的服务质量
- 抽象或通用的参数集
- 由网关用于选择传输参数
- 指导路由和网络选择决策
生存时间 (Time to Live)
- 数据报生存期的上限
- 由发送方设置, 在每一跳递减
- 当 TTL 达到零时销毁数据报
- 可以理解为自毁时间限制
选项 (Options)
- 某些情况下需要的控制功能
- 对于大多数常见通信不必要
- 包括时间戳、安全性和特殊路由的规定
头部校验和 (Header Checksum)
- 验证头部是否正确传输
- 数据可能包含错误 (IP 不检查)
- 如果校验和失败, 立即丢弃数据报
可靠性模型
互联网协议不提供可靠的通信设施。既没有端到端的确认, 也没有逐跳的确认。数据没有错误控制, 只有头部校验和。没有重传。没有流量控制。
检测到的错误可以通过互联网控制消息协议 (Internet Control Message Protocol, ICMP) [3] 报告, 该协议在互联网协议模块中实现。
关键概念摘要
数据报 (Datagram)
- 独立的数据包
- 包含完整的寻址信息
- 可以独立路由
无连接 (Connectionless)
- 无需建立连接
- 每个数据报独立处理
- 简单高效
尽力而为 (Best Effort)
- 不保证传递
- 不保证顺序
- 不保证不重复
- 可靠性由上层协议处理
设计哲学: IP 协议遵循"简单网络, 智能端点"的设计哲学, 将复杂性推向网络边缘, 保持核心网络简单且可扩展。这种设计使互联网能够支持各种各样的应用和服务。