Skip to main content

2. Overview (概述)

2.1. Relation to Other Protocols (与其他协议的关系)

下图说明了互联网协议在协议层次结构中的位置:

                 +------+ +-----+ +-----+     +-----+  
|Telnet| | FTP | | TFTP| ... | ... | 应用层
+------+ +-----+ +-----+ +-----+
| | | |
+-----+ +-----+ +-----+
| TCP | | UDP | ... | ... | 传输层
+-----+ +-----+ +-----+
| | |
+--------------------------+----+
| Internet Protocol & ICMP | 网络层
+--------------------------+----+
|
+---------------------------+
| Local Network Protocol | 数据链路层
+---------------------------+

Protocol Relationships
(协议关系)

互联网协议一侧与更高级别的主机到主机协议接口,另一侧与本地网络协议接口。在此上下文中,"本地网络"可以是建筑物中的小型网络或像ARPANET这样的大型网络。

协议栈详解

应用层 (Application Layer):

Telnet  - 远程终端协议
FTP - 文件传输协议
TFTP - 简单文件传输协议
SMTP - 简单邮件传输协议
HTTP - 超文本传输协议
DNS - 域名系统

传输层 (Transport Layer):

TCP     - 传输控制协议 (面向连接,可靠)
UDP - 用户数据报协议 (无连接,不可靠)

网络层 (Network Layer):

IP      - 互联网协议 (数据报传递)
ICMP - 互联网控制消息协议 (错误报告)
IGMP - 互联网组管理协议 (组播)

数据链路层 (Data Link Layer):

Ethernet   - 以太网
PPP - 点对点协议
ARPANET - ARPANET协议
X.25 - X.25协议

2.2. Model of Operation (操作模型)

从一个应用程序向另一个应用程序传输数据报的操作模型由以下场景说明:

假设此传输将涉及一个中间网关。

完整传输场景

步骤1:发送应用程序

应用程序准备其数据,并调用其本地互联网模块以数据报形式发送该数据,
并将目的地址和其他参数作为调用的参数传递。

步骤2:发送主机的IP模块

互联网模块准备数据报头部并将数据附加到它。互联网模块确定此互联网
地址的本地网络地址,在这种情况下,它是网关的地址。

它将此数据报和本地网络地址发送到本地网络接口。

步骤3:发送主机的本地网络接口

本地网络接口创建本地网络头部,并将数据报附加到它,然后通过本地
网络发送结果。

步骤4:网关接收

数据报到达包装在本地网络头部中的网关主机,本地网络接口剥离此头部,
并将数据报转交给互联网模块。

互联网模块从互联网地址确定数据报将被转发到第二个网络中的另一个主机。
互联网模块确定目的主机的本地网络地址。它调用该网络的本地网络接口
以发送数据报。

步骤5:网关转发

此本地网络接口创建本地网络头部并将数据报附加到它,然后通过第二个
网络发送结果。

步骤6:目的主机接收

数据报到达包装在第二个网络的本地网络头部中的目的主机,本地网络接口
剥离此头部并将数据报转交给互联网模块。

互联网模块确定数据报是给此主机上的应用程序的。它将数据报中的数据
传递给应用程序,并将源地址和其他参数作为调用参数传递。

数据流示意图

发送主机                网关                  目的主机
| | |
| 1. 应用数据 | |
↓ | |
[IP模块] | |
| 2. 添加IP头部 | |
↓ | |
[网络接口] | |
| 3. 添加以太网头部 | |
| | |
|==数据报===========>| |
| ↓ |
| [网络接口] |
| | 4. 剥离以太网头部 |
| ↓ |
| [IP模块] |
| | 5. 路由决策 |
| | 6. 减少TTL |
| ↓ |
| [网络接口] |
| | 7. 添加新以太网头部 |
| | |
| |==数据报=============>|
| | ↓
| | [网络接口]
| | | 8. 剥离以太网头部
| | ↓
| | [IP模块]
| | | 9. 检查目的地址
| | ↓
| | [应用程序]
| | | 10. 接收数据

封装过程

应用层数据:
+---------------------------+
| Application |
| Data |
+---------------------------+

传输层 (TCP):
+----------+---------------------------+
| TCP头部 | Application Data |
+----------+---------------------------+

网络层 (IP):
+----------+----------+---------------------------+
| IP头部 | TCP头部 | Application Data |
+----------+----------+---------------------------+

数据链路层 (Ethernet):
+----------+----------+----------+---------------------------+----------+
|Ethernet | IP头部 | TCP头部 | Application Data | Ethernet |
| Header | | | | Trailer |
+----------+----------+----------+---------------------------+----------+

2.3. Function Description (功能描述)

互联网协议的功能是在互连的网络系统中传递互联网数据报。没有直接的端到端可靠性、流量控制或排序机制。

核心功能

1. 寻址 (Addressing)

地址格式:

32位地址 = 网络标识 + 主机标识

示例:
192.168.1.100

11000000.10101000.00000001.01100100

网络: 192.168.1
主机: 100

地址类别:

Class A: 0xxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
网络: 7位 (128个)
主机: 24位 (16,777,216个)

Class B: 10xxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
网络: 14位 (16,384个)
主机: 16位 (65,536个)

Class C: 110xxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
网络: 21位 (2,097,152个)
主机: 8位 (256个)

2. 分段 (Fragmentation)

为什么需要分段?

不同网络的MTU (Maximum Transmission Unit) 不同:
- Ethernet: 1500字节
- Token Ring: 4464字节
- FDDI: 4352字节
- PPPoE: 1492字节

大数据报需要分段以通过小MTU网络

分段示例:

原始数据报 (1500字节):
ID=12345, Offset=0, MF=0
+--------+------------------------+
| IP头部 | 1480字节数据 |
+--------+------------------------+

通过MTU=576的网络后:

分段1 (576字节):
ID=12345, Offset=0, MF=1
+--------+--------+
| IP头部 | 556字节 |
+--------+--------+

分段2 (576字节):
ID=12345, Offset=69, MF=1
+--------+--------+
| IP头部 | 556字节 |
+--------+--------+

分段3 (408字节):
ID=12345, Offset=138, MF=0
+--------+--------+
| IP头部 | 368字节 |
+--------+--------+

3. 生存时间 (Time to Live, TTL)

TTL的作用:

防止数据报在网络中无限循环

每经过一个路由器,TTL减1
当TTL=0时,数据报被丢弃

TTL示例:

发送时: TTL=64

路由器1: TTL=63

路由器2: TTL=62

...

路由器64: TTL=0 → 丢弃并发送ICMP Time Exceeded

4. 服务类型 (Type of Service, ToS)

ToS字段:

 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
| Precedence |D|T|R|C|
+-+-+-+-+-+-+-+-+

Precedence: 优先级 (0-7)
D: Delay (延迟)
T: Throughput (吞吐量)
R: Reliability (可靠性)
C: Cost (成本)

服务类型示例:

最小延迟: 用于交互式流量 (Telnet, SSH)
最大吞吐量: 用于文件传输 (FTP)
最高可靠性: 用于关键数据
最低成本: 用于批量数据

5. 选项 (Options)

选项为某些情况下需要或有用但对于最常见的通信不必要的控制功能提供支持。选项包括时间戳、安全性和特殊路由的规定。

常见选项:

- Security: 安全级别
- Loose Source Routing: 松散源路由
- Strict Source Routing: 严格源路由
- Record Route: 记录路由
- Timestamp: 时间戳

6. 头部校验和 (Header Checksum)

头部校验和提供验证,确保处理互联网数据报时使用的信息已正确传输。**数据可能包含错误。**如果头部校验和失败,检测到错误的实体会立即丢弃互联网数据报。

校验和计算:

def calculate_checksum(header):
"""计算IP头部校验和"""
sum = 0
# 将头部视为16位字的序列
for i in range(0, len(header), 2):
word = (header[i] << 8) + header[i+1]
sum += word
# 处理进位
sum = (sum & 0xFFFF) + (sum >> 16)
# 取反码
checksum = ~sum & 0xFFFF
return checksum

不提供的功能

互联网协议不提供可靠的通信设施:

  • ❌ 没有端到端或逐跳确认
  • ❌ 没有数据错误控制,只有头部校验和
  • ❌ 没有重传
  • ❌ 没有流量控制

检测到的错误可能通过互联网控制消息协议 (ICMP) [3] 报告,该协议在互联网协议模块中实现。


2.4. Gateways (网关)

网关在互联网协议中起着核心作用,实现互连网络系统的互联网协议。

网关功能

1. 路由 (Routing)

网关维护路由表,决定数据报的下一跳:

目的网络 下一跳网关 接口
192.168.1.0 直接连接 eth0
10.0.0.0 192.168.1.1 eth0
0.0.0.0 192.168.1.254 eth0 (默认路由)

2. 分段 (Fragmentation)

如果出站网络的MTU小于数据报大小,网关必须分段数据报

3. TTL处理

网关必须减少数据报的TTL
如果TTL达到0,丢弃数据报并发送ICMP Time Exceeded消息

4. 头部校验和重新计算

由于TTL和可能的其他字段发生变化,网关必须重新计算头部校验和

网关 vs 路由器

在现代术语中,RFC 791中的"网关"通常称为"路由器":

RFC 791术语现代术语功能
GatewayRouter第3层转发设备
HostHost/End System端系统

关键要点: IP协议提供了一个简单但强大的数据报传递服务,作为互联网架构的基础。它的无连接、尽力而为的特性使得网络核心保持简单,同时允许端系统根据需要实现可靠性和其他高级功能。