跳到主要内容

IP 协议

IP(Internet Protocol,网际协议)是 TCP/IP 协议族的核心协议,负责在网络层实现主机间的数据传输。它为互联网上的每个设备分配唯一地址,并负责数据包的路由和转发。

IP 协议概述

IP 协议工作在网络层,主要功能包括:

寻址:为每个网络接口分配唯一的 IP 地址,用于标识网络中的设备。

路由:根据路由表选择数据包从源到目的的最佳路径。

分片与重组:当数据包超过链路 MTU 时进行分片,在目的地重组。

尽力而为传输:不保证数据包一定到达,不保证顺序,可能丢失或重复。

IP 协议的特点

无连接:每个 IP 数据包独立处理,不维护连接状态。

不可靠:不保证数据包正确到达,错误处理交给上层协议。

透明性:IP 不关心数据内容,只是将数据从源传送到目的。

独立于底层网络:IP 可以在各种物理网络上运行,如以太网、WiFi、光纤等。

IPv4 数据报格式

IPv4 数据报由首部和数据两部分组成,首部至少 20 字节:

 0               16                              31
+--------+--------+------------------------------+
| 版本 | 首部长度| 服务类型 | 总长度 |
+--------+--------+------------------------------+
| 标识 | 标志 | 片偏移 |
+-----------------+------------------------------+
| TTL | 协议 | 首部校验和 |
+-----------------+------------------------------+
| 源 IP 地址 |
+-----------------------------------------------+
| 目的 IP 地址 |
+-----------------------------------------------+
| 选项(可选) |
+-----------------------------------------------+
| 数据 |
+-----------------------------------------------+

字段详解

版本(4 位):IP 协议版本,IPv4 为 4,IPv6 为 6。

首部长度(4 位):IP 首部的长度,以 4 字节为单位。最小值 5(20 字节),最大值 15(60 字节)。

服务类型(8 位):用于区分服务,指定数据包的优先级和延迟、吞吐量、可靠性要求。现在常用于区分服务代码点(DSCP)和显式拥塞通知(ECN)。

总长度(16 位):整个 IP 数据报的长度,包括首部和数据,单位是字节。最大值 65535 字节。

标识(16 位):用于标识数据包,分片时所有片段使用相同的标识值,便于重组。

标志(3 位):

名称含义
0保留必须为 0
1DF(Don't Fragment)为 1 时不允许分片
2MF(More Fragments)为 1 表示后面还有分片,最后一个分片为 0

片偏移(13 位):分片在原数据包中的位置,以 8 字节为单位。第一个分片偏移为 0。

TTL(Time To Live)(8 位):数据包的生存时间,每经过一个路由器减 1,为 0 时丢弃。防止数据包在网络中无限循环。默认值通常是 64 或 128。

协议(8 位):标识上层协议,常见值:

协议
1ICMP
2IGMP
6TCP
17UDP
41IPv6 封装
89OSPF

首部校验和(16 位):用于检测首部错误。每经过一个路由器,TTL 改变,需要重新计算。

源 IP 地址(32 位):发送方的 IP 地址。

目的 IP 地址(32 位):接收方的 IP 地址。

选项(可变):可选字段,用于测试和调试。包含安全、路由记录、时间戳等选项。

IPv4 地址

地址格式

IPv4 地址长 32 位,通常表示为点分十进制格式:

二进制:11000000 10101000 00000001 00000001
十进制:192.168.1.1

每 8 位转换为一个十进制数,范围 0-255,用点号分隔。

地址分类

传统 IPv4 地址分为五类:

类别首字节范围网络号位数主机号位数网络数每网络主机数
A1-12682412616,777,214
B128-191161616,38465,534
C192-2232482,097,152254
D224-239--组播地址-
E240-255--保留-

注意:127.x.x.x 是回环地址,用于本机测试。

子网划分

传统分类地址浪费严重,现代网络使用 CIDR(无类别域间路由)进行灵活的子网划分。

子网掩码:用于区分网络号和主机号。网络号部分全 1,主机号部分全 0。

IP 地址:192.168.1.100
子网掩码:255.255.255.0
网络地址:192.168.1.0(IP 与 子网掩码)
主机地址:0.0.0.100(IP 与 子网掩码取反)

CIDR 表示法:使用斜线后跟网络号位数表示子网掩码。

192.168.1.0/24 表示网络号 24 位
相当于子网掩码 255.255.255.0

子网划分示例

将 192.168.1.0/24 划分为 4 个子网:

192.168.1.0/26    (00000000 - 00111111)  0-63
192.168.1.64/26 (01000000 - 01111111) 64-127
192.168.1.128/26 (10000000 - 10111111) 128-191
192.168.1.192/26 (11000000 - 11111111) 192-255

每个子网有 62 个可用主机地址(减去网络地址和广播地址)。

特殊 IP 地址

地址用途
0.0.0.0本机所有 IP 地址
127.0.0.1本地回环地址
255.255.255.255本地广播地址
10.0.0.0/8A 类私有地址
172.16.0.0/12B 类私有地址
169.254.0.0/16链路本地地址(DHCP 失败时使用)
192.168.0.0/16C 类私有地址

私有地址:不能在公网路由,用于内部网络。通过 NAT(网络地址转换)访问公网。

IP 分片

当 IP 数据报长度超过链路的 MTU(Maximum Transmission Unit)时,需要进行分片。

分片过程

  1. 发送方检查数据报长度是否超过 MTU
  2. 如果超过且 DF 标志为 0,进行分片
  3. 每个分片有相同的标识字段
  4. 设置 MF 标志(最后一个分片除外)
  5. 设置片偏移字段

示例

假设 MTU = 1500 字节,发送 4000 字节数据(不含 IP 首部):

原始数据报:总长度 = 4000 + 20 = 4020 字节

分片 1:
- 数据长度:1480 字节(必须是 8 的倍数)
- 总长度:1480 + 20 = 1500 字节
- 片偏移:0
- MF:1

分片 2:
- 数据长度:1480 字节
- 总长度:1500 字节
- 片偏移:1480 / 8 = 185
- MF:1

分片 3:
- 数据长度:1040 字节
- 总长度:1060 字节
- 片偏移:2960 / 8 = 370
- MF:0

重组过程

分片在目的主机重组:

  1. 根据标识字段将分片分组
  2. 根据片偏移字段排列分片
  3. 当收到 MF=0 的分片且所有分片都到齐时,重组完成
  4. 如果超时未收齐,丢弃所有分片

分片的问题

性能开销:分片和重组消耗 CPU 和内存资源。

丢包风险:任何一个分片丢失,整个数据报都要重传。

安全风险:分片可能被用于攻击,如 Ping of Death、Teardrop 攻击。

最佳实践:避免分片,使用 Path MTU Discovery 确定合适的 MTU。

IP 路由

IP 路由是决定数据包从源到目的的路径的过程。

路由表

每个主机和路由器都维护路由表,决定数据包的转发方向:

# Linux 查看路由表
route -n
# 或
ip route show

# 示例输出
Destination Gateway Genmask Flags Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG eth0
192.168.1.0 0.0.0.0 255.255.255.0 U eth0

路由表字段

  • 目的网络:目标 IP 地址或网络
  • 网关:下一跳地址
  • 子网掩码:用于匹配目的网络
  • 接口:发送数据包的网络接口
  • 度量值:路由优先级

路由选择过程

当主机发送 IP 数据报时:

  1. 提取目的 IP 地址
  2. 依次与路由表中的子网掩码进行 AND 运算
  3. 检查结果是否匹配目的网络
  4. 选择匹配度最高(掩码最长)的路由
  5. 如果是直连网络,直接发送
  6. 如果有网关,发送给网关
  7. 如果没有匹配路由,发送给默认路由

最长前缀匹配

当有多条路由匹配时,选择子网掩码最长(前缀最长)的路由:

路由表:
192.168.0.0/16 via 10.0.0.1
192.168.1.0/24 via 10.0.0.2

目的地址:192.168.1.100
两条路由都匹配,选择 /24 的路由(更具体)

默认路由

默认路由(0.0.0.0/0)匹配所有目的地址,当没有其他路由匹配时使用:

默认网关:192.168.1.1
所有不知道目的地的数据包都发送给默认网关

IPv6

IPv6 是 IP 协议的新版本,解决了 IPv4 地址枯竭的问题。

IPv6 特点

更大的地址空间:128 位地址,约 3.4×10^38 个地址。

简化的首部:固定 40 字节,处理效率更高。

内置安全:IPSec 是必选功能。

更好的 QoS 支持:流量类别和流标签字段。

无需 NAT:地址充足,不需要地址转换。

IPv6 地址格式

IPv6 地址长 128 位,表示为 8 组 4 位十六进制数:

完整格式:2001:0db8:85a3:0000:0000:8a2e:0370:7334
压缩格式:2001:db8:85a3::8a2e:370:7334(连续的 0 可以压缩为 ::)

特殊地址

地址用途
::未指定地址
::1本地回环地址
fe80::/10链路本地地址
fc00::/7唯一本地地址(类似 IPv4 私有地址)
ff00::/8组播地址

IPv6 首部格式

 0               16                              31
+--------+-------+-------------------------------+
| 版本 | 流量类| 流标签 |
+--------+-------+-------------------------------+
| 载荷长度 | 下一头部 | 跳数限制 |
+----------------+-----------+-------------------+
| 源地址 |
| (128 位) |
+-----------------------------------------------+
| 目的地址 |
| (128 位) |
+-----------------------------------------------+

字段说明

  • 版本(4 位):值为 6
  • 流量类(8 位):类似 IPv4 的服务类型
  • 流标签(20 位):标识属于同一流的数据包
  • 载荷长度(16 位):除首部外的数据长度
  • 下一头部(8 位):类似 IPv4 的协议字段
  • 跳数限制(8 位):类似 IPv4 的 TTL

IPv4 与 IPv6 共存

IPv4 和 IPv6 将长期共存,过渡技术包括:

双栈:同时运行 IPv4 和 IPv6 协议栈。

隧道:将 IPv6 数据包封装在 IPv4 数据包中传输。

NAT64:IPv6 主机访问 IPv4 服务器时进行地址转换。

IP 地址配置

静态配置

手动配置 IP 地址:

# Linux
ip addr add 192.168.1.100/24 dev eth0
ip route add default via 192.168.1.1

# 永久配置(Ubuntu)
# /etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
eth0:
addresses: [192.168.1.100/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]

动态配置(DHCP)

通过 DHCP 自动获取 IP 地址:

# Linux
dhclient eth0

# 或使用 NetworkManager
nmcli device connect eth0

DHCP 工作过程:

  1. Discover:客户端广播寻找 DHCP 服务器
  2. Offer:DHCP 服务器提供 IP 地址
  3. Request:客户端请求使用该地址
  4. Ack:服务器确认分配

IP 相关工具

ping

测试网络连通性:

ping 8.8.8.8
ping -c 4 www.example.com # 发送 4 个包
ping -s 1000 192.168.1.1 # 指定数据包大小

traceroute

追踪路由路径:

traceroute www.example.com
traceroute -I www.example.com # 使用 ICMP

ip

网络配置工具:

ip addr show          # 显示 IP 地址
ip route show # 显示路由表
ip link set eth0 up # 启用接口
ip addr add 192.168.1.100/24 dev eth0 # 添加 IP

ifconfig

传统网络配置工具:

ifconfig              # 显示网络接口信息
ifconfig eth0 up # 启用接口
ifconfig eth0 192.168.1.100 netmask 255.255.255.0

小结

IP 协议是网络层的核心:

  1. 功能:寻址、路由、分片重组
  2. IPv4 首部:20-60 字节,包含地址、TTL、协议等字段
  3. IPv4 地址:32 位,点分十进制表示,使用 CIDR 灵活划分
  4. IP 分片:超过 MTU 时分片,目的主机重组
  5. IP 路由:根据路由表选择转发路径,最长前缀匹配
  6. IPv6:128 位地址,解决 IPv4 地址枯竭问题

理解 IP 协议是网络编程和运维的基础。

练习

  1. 解释 IPv4 首部各字段的作用
  2. 说明子网划分的原理和 CIDR 表示法
  3. 描述 IP 分片和重组的过程
  4. 比较 IPv4 和 IPv6 的主要区别