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 |
| 1 | DF(Don't Fragment) | 为 1 时不允许分片 |
| 2 | MF(More Fragments) | 为 1 表示后面还有分片,最后一个分片为 0 |
片偏移(13 位):分片在原数据包中的位置,以 8 字节为单位。第一个分片偏移为 0。
TTL(Time To Live)(8 位):数据包的生存时间,每经过一个路由器减 1,为 0 时丢弃。防止数据包在网络中无限循环。默认值通常是 64 或 128。
协议(8 位):标识上层协议,常见值:
| 值 | 协议 |
|---|---|
| 1 | ICMP |
| 2 | IGMP |
| 6 | TCP |
| 17 | UDP |
| 41 | IPv6 封装 |
| 89 | OSPF |
首部校验和(16 位):用于检测首部错误。每经过一个路由器,TTL 改变,需要重新计算。
源 IP 地址(32 位):发送方的 IP 地址。
目的 IP 地址(32 位):接收方的 IP 地址。
选项(可变):可选字段,用于测试和调试。包含安全、路由记录、时间戳等选项。
IPv4 地址
地址格式
IPv4 地址长 32 位,通常表示为点分十进制格式:
二进制:11000000 10101000 00000001 00000001
十进制:192.168.1.1
每 8 位转换为一个十进制数,范围 0-255,用点号分隔。
地址分类
传统 IPv4 地址分为五类:
| 类别 | 首字节范围 | 网络号位数 | 主机号位数 | 网络数 | 每网络主机数 |
|---|---|---|---|---|---|
| A | 1-126 | 8 | 24 | 126 | 16,777,214 |
| B | 128-191 | 16 | 16 | 16,384 | 65,534 |
| C | 192-223 | 24 | 8 | 2,097,152 | 254 |
| D | 224-239 | - | - | 组播地址 | - |
| E | 240-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/8 | A 类私有地址 |
| 172.16.0.0/12 | B 类私有地址 |
| 169.254.0.0/16 | 链路本地地址(DHCP 失败时使用) |
| 192.168.0.0/16 | C 类私有地址 |
私有地址:不能在公网路由,用于内部网络。通过 NAT(网络地址转换)访问公网。
IP 分片
当 IP 数据报长度超过链路的 MTU(Maximum Transmission Unit)时,需要进行分片。
分片过程
- 发送方检查数据报长度是否超过 MTU
- 如果超过且 DF 标志为 0,进行分片
- 每个分片有相同的标识字段
- 设置 MF 标志(最后一个分片除外)
- 设置片偏移字段
示例:
假设 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
重组过程
分片在目的主机重组:
- 根据标识字段将分片分组
- 根据片偏移字段排列分片
- 当收到 MF=0 的分片且所有分片都到齐时,重组完成
- 如果超时未收齐,丢弃所有分片
分片的问题
性能开销:分片和重组消耗 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 数据报时:
- 提取目的 IP 地址
- 依次与路由表中的子网掩码进行 AND 运算
- 检查结果是否匹配目的网络
- 选择匹配度最高(掩码最长)的路由
- 如果是直连网络,直接发送
- 如果有网关,发送给网关
- 如果没有匹配路由,发送给默认路由
最长前缀匹配
当有多条路由匹配时,选择子网掩码最长(前缀最长)的路由:
路由表:
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 工作过程:
- Discover:客户端广播寻找 DHCP 服务器
- Offer:DHCP 服务器提供 IP 地址
- Request:客户端请求使用该地址
- 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 协议是网络层的核心:
- 功能:寻址、路由、分片重组
- IPv4 首部:20-60 字节,包含地址、TTL、协议等字段
- IPv4 地址:32 位,点分十进制表示,使用 CIDR 灵活划分
- IP 分片:超过 MTU 时分片,目的主机重组
- IP 路由:根据路由表选择转发路径,最长前缀匹配
- IPv6:128 位地址,解决 IPv4 地址枯竭问题
理解 IP 协议是网络编程和运维的基础。
练习
- 解释 IPv4 首部各字段的作用
- 说明子网划分的原理和 CIDR 表示法
- 描述 IP 分片和重组的过程
- 比较 IPv4 和 IPv6 的主要区别