1. IP 协议概述
网络层负责逻辑寻址和分组转发,核心协议是 IP(Internet Protocol),提供无连接、不可靠的点到点数据传输。
1.1 IPv4 报头结构
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options (if IHL > 5) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Version: 4 (IPv4) / 6 (IPv6)
IHL: 头部长度,单位 4 字节(最小 5 = 20 字节)
TTL: 生存时间,每经过一个路由器减 1,到 0 丢弃
Protocol: 上层协议(6=TCP, 17=UDP, 1=ICMP)
2. IP 编址
2.1 IPv4 地址分类
| 类别 | 首字节范围 | 默认掩码 | 网络位 | 主机位 | 用途 |
|---|---|---|---|---|---|
| A | 1-126 | 255.0.0.0 | 8 | 24 | 大型网络 |
| B | 128-191 | 255.255.0.0 | 16 | 16 | 中型网络 |
| C | 192-223 | 255.255.255.0 | 24 | 8 | 小型网络 |
| D | 224-239 | — | — | — | 组播 |
| E | 240-255 | — | — | — | 保留实验 |
私有地址(RFC 1918):
| 类别 | 范围 | 可用主机数 |
|---|---|---|
| A | 10.0.0.0/8 | 16,777,214 |
| B | 172.16.0.0/12 | 1,048,574 |
| C | 192.168.0.0/16 | 65,534 |
2.2 CIDR(无类别域间路由)
用斜线后的数字表示网络前缀长度,取代传统的 A/B/C 分类。
192.168.1.0/24 = 网络位 24,主机位 8,254 个可用主机
192.168.1.0/26 = 网络位 26,主机位 6,62 个可用主机
10.0.0.0/8 = 整个 A 类私有地址
2.3 子网划分计算
def subnet_info(network, prefix):
"""
计算子网信息
network: e.g., '192.168.1.0/24'
"""
import ipaddress
net = ipaddress.IPv4Network(network, strict=False)
print(f"网络地址: {net.network_address}")
print(f"广播地址: {net.broadcast_address}")
print(f"可用主机: {net.num_addresses - 2}")
print(f"主机范围: {net.network_address + 1} - {net.broadcast_address - 1}")
print(f"掩码: {net.netmask}")
subnet_info('192.168.1.0/26')
# 网络地址: 192.168.1.0
# 广播地址: 192.168.1.63
# 可用主机: 62
# 主机范围: 192.168.1.1 - 192.168.1.62
# 掩码: 255.255.255.192
2.4 子网划分实例
需求:将 192.168.1.0/24 划分为 4 个子网,每网至少 50 主机
分析:
50 主机 → 需要 6 位主机位(2⁶ - 2 = 62 ≥ 50)
剩余 2 位用于子网 → 4 个子网
子网掩码:/26(255.255.255.192)
子网 1: 192.168.1.0/26 (1-62)
子网 2: 192.168.1.64/26 (65-126)
子网 3: 192.168.1.128/26 (129-190)
子网 4: 192.168.1.192/26 (193-254)
3. 路由基础
3.1 路由表
$ ip route
# 或 route -n
default via 192.168.1.1 dev eth0 proto dhcp metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 metric 100
# 各项含义:
# destination: 目标网络
# gateway: 下一跳
# interface: 出接口
# proto: 来源(kernel=直连, dhcp=动态, static=静态)
3.2 最长前缀匹配
路由选择时,选择与目标地址匹配位数最多的路由条目。
目标: 10.1.2.3
路由表:
10.0.0.0/8 → 路由器 A (匹配 8 位)
10.1.0.0/16 → 路由器 B (匹配 16 位)✓
10.1.2.0/24 → 路由器 C (匹配 24 位)✓✓
选择: 10.1.2.0/24 → 路由器 C
4. 路由算法
4.1 距离向量算法(RIP)
每个路由器维护到所有目的地的距离(跳数),定期与邻居交换路由表。
Bellman-Ford 方程:
dₓ(y) = minᵥ { c(x,v) + dᵥ(y) }
x 到 y 的最短距离 = 所有邻居 v 中,x 到 v 的代价 + v 到 y 的距离的最小值
问题:
- 计数到无穷大(Count to Infinity)
- 15 跳限制(RIP 最大 15 跳)
- 收敛慢
4.2 链路状态算法(OSPF)
每个路由器泛洪 LSA(链路状态通告),构建全网的拓扑图,运行 Dijkstra 算法计算最短路径。
OSPF 工作过程:
1. 邻居发现(Hello 包)
2. 交换 LSA 数据库
3. 运行 Dijkstra 计算最短路径
4. 维护 LSDB,拓扑变化时重新计算
优点:
- 无计数到无穷大问题
- 收敛快(触发更新 + 增量更新)
- 支持区域划分(Area),减少 LSA 泛洪范围
4.3 边界网关协议(BGP)
路径向量协议,用于自治系统(AS)之间的路由。每个路由条目包含完整 AS 路径。
BGP 路径属性:
- AS_PATH: 经过的 AS 序列(防环)
- NEXT_HOP: 下一跳
- LOCAL_PREF: 本地优先级(IBGP 选路)
- MED: 多出口鉴别器(影响邻居 AS 的入站流量)
BGP 选路规则(简化为前几条):
1. 最高 LOCAL_PREF
2. 最短 AS_PATH
3. 最低 ORIGIN 类型
4. 最低 MED
5. eBGP 优先于 iBGP
6. 最近的 IGP 下一跳
4.4 算法对比
| 特性 | RIP(距离向量) | OSPF(链路状态) | BGP(路径向量) |
|---|---|---|---|
| 范围 | 内部网关(IGP) | 内部网关(IGP) | 外部网关(EGP) |
| 算法 | Bellman-Ford | Dijkstra | 路径向量 |
| 度量 | 跳数 | 带宽(Cost) | AS 路径策略 |
| 收敛 | 慢(30s 周期) | 快(触发更新) | 较慢(策略复杂) |
| 可扩展 | 差 | 好(区域化) | 好(分层设计) |
5. NAT(网络地址转换)
5.1 为什么需要 NAT
IPv4 地址枯竭,NAT 允许多个私有地址共享一个公网 IP。
5.2 NAT 类型
静态 NAT:一对一映射
公网 203.0.113.1 ↔ 私网 192.168.1.10
动态 NAT:从地址池中动态分配
地址池: 203.0.113.1 - 203.0.113.10
NAPT/PAT(端口地址转换):多对一
通过端口号区分不同内网主机
192.168.1.10:54321 ↔ 203.0.113.1:54321
192.168.1.11:54321 ↔ 203.0.113.1:54322
5.3 NAPT 端口映射
出站连接:
内网(192.168.1.10:54321) → NAT → 公网(203.0.113.1:60001) → 目标
NAT 会话表:
┌───────────────────────┬───────────────────────┐
│ 内网地址:端口 │ 公网地址:端口 │
├───────────────────────┼───────────────────────┤
│ 192.168.1.10:54321 │ 203.0.113.1:60001 │
│ 192.168.1.11:80 │ 203.0.113.1:60002 │
└───────────────────────┴───────────────────────┘
入站连接(端口映射):
公网访问 203.0.113.1:80 → NAT 映射到 192.168.1.10:80
6. ICMP 与 ARP
6.1 ICMP(Internet Control Message Protocol)
常用 ICMP 类型:
Type 0 / Code 0: Echo Reply(ping 回应)
Type 8 / Code 0: Echo Request(ping 请求)
Type 3: Destination Unreachable
Code 0: 网络不可达
Code 1: 主机不可达
Code 3: 端口不可达
Type 11: Time Exceeded(TTL 耗尽)
Type 5: Redirect(路由器重定向)
# ping 用到 ICMP Echo Request/Reply
ping 8.8.8.8
# traceroute 利用 TTL 递增或端口不可达
traceroute 8.8.8.8
# UDP 模式:发送到高端口,到目标时返回 ICMP Port Unreachable
# ICMP 模式:发送 Echo,中间返回 Time Exceeded
6.2 ARP(Address Resolution Protocol)
IP 地址 → MAC 地址的映射。
ARP 请求(广播):
"谁的 IP 是 192.168.1.1?请告诉我你的 MAC!"
ARP 响应(单播):
"我是 192.168.1.1,我的 MAC 是 aa:bb:cc:dd:ee:ff"
ARP 缓存:
arp -a
? (192.168.1.1) at aa:bb:cc:dd:ee:ff [ether] on eth0
7. IPv6
7.1 IPv6 特性
| 特性 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32 位 | 128 位 |
| 地址数量 | ~4.3×10⁹ | ~3.4×10³⁸ |
| 表示法 | 点分十进制 | 冒号分隔十六进制 |
| 头部长度 | 可变(20-60B) | 固定 40B |
| 校验和 | 头部有 | 无(上层负责) |
| NAT | 普遍使用 | 设计原则上不需要 |
| 安全性 | IPsec 可选 | IPsec 内置支持 |
7.2 IPv6 地址表示
完整:2001:0db8:85a3:0000:0000:8a2e:0370:7334
简化:
1. 前导 0 省略:2001:db8:85a3:0:0:8a2e:370:7334
2. 连续 0 块压缩为 ::(只能一次)
2001:db8:85a3::8a2e:370:7334
回环地址:::1
未指定地址:::
参考文章
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。