IP 协议
2025/12/21大约 13 分钟
IP 协议
核心概念
IP(Internet Protocol) 是网络层协议,负责逻辑寻址和数据包的路由转发。它定义了如何给计算机分配唯一的地址(IP 地址),以及如何将数据包从源地址路由到目的地址。现有两个版本:IPv4(32 位地址) 和 IPv6(128 位地址)。
IP 协议的核心特点:
- 无连接:不需要建立连接,直接发送数据包
- 不可靠:不保证数据包传输成功(由上层协议 TCP 保证)
- 最尽力交付:尽力将数据包送达,但不保证顺序和完整
- 路由转发:根据目的 IP 地址和路由表进行转发
IP 地址和分类
IPv4 地址:
32 位二进制数,分为 4 个 8 位的十进制数
格式:a.b.c.d(如 192.168.1.1)
范围:0.0.0.0 ~ 255.255.255.255
按用途分类:
1. 单播地址(Unicast)
- 标准 IP 地址,用于一对一通信
- 如:192.168.1.1, 10.0.0.1
2. 广播地址(Broadcast)
- 主机号全为 1
- 如:192.168.1.255(发送给该网络的所有主机)
- 192.168.1.0/24 的广播地址是 192.168.1.255
3. 多播地址(Multicast)
- 224.0.0.0 ~ 239.255.255.255
- 一对多通信(发送给特定的一组主机)
4. 特殊地址
- 0.0.0.0:表示任意 IP(路由时用)
- 127.0.0.1:回环地址(localhost)
- 255.255.255.255:本地广播(当前网络的所有主机)
- 169.254.0.0/16:链路本地地址(APIPA)子网掩码和网络划分:
IP 地址和子网掩码进行 AND 运算,得到网络地址
子网掩码决定了 IP 地址中哪些位是网络部分,哪些是主机部分
示例:192.168.1.100/24
↓
IP: 192.168.1.100
掩码: 255.255.255.0
网络地址:192.168.1.0
广播地址:192.168.1.255
可用主机:192.168.1.1 ~ 192.168.1.254(共 254 个)
CIDR 记法:
- /24 表示前 24 位是网络部分,后 8 位是主机部分
- /24 = 255.255.255.0
- /16 = 255.255.0.0
- /8 = 255.0.0.0私有 IP 地址范围(RFC 1918):
| 范围 | 掩码 | 主机数 |
|---|---|---|
| 10.0.0.0 ~ 10.255.255.255 | /8 | 16,777,216 |
| 172.16.0.0 ~ 172.31.255.255 | /12 | 1,048,576 |
| 192.168.0.0 ~ 192.168.255.255 | /16 | 65,536 |
IPv4 数据包结构
IP 包头(20-60 字节):
0 4 8 12 16 20 24 28 32
+---------+---------+---------+---------+---------+---------+---------+---------+
| Version | Header | Type of Service (ToS) | Total Length (bytes) |
| (4bit) | Length | (8 bits) | (16 bits) |
+---------+---------+---------+---------+---------+---------+---------+---------+
| Identification (16 bits) | Flags | Fragment Offset (13 bits) |
+---------+---------+---------+---------+---------+---------+---------+---------+
| Time To Live (TTL) | Protocol (8 bits) | Header Checksum |
| (8 bits) | | (16 bits) |
+---------+---------+---------+---------+---------+---------+---------+---------+
| Source IP Address (32 bits) |
+---------+---------+---------+---------+---------+---------+---------+---------+
| Destination IP Address (32 bits) |
+---------+---------+---------+---------+---------+---------+---------+---------+
| Options (可选,0-40 字节) |
+---------+---------+---------+---------+---------+---------+---------+---------+
| Data Payload |
+---------+---------+---------+---------+---------+---------+---------+---------+
关键字段说明:
1. Version (4 bits):IP 版本
- 4:IPv4,6:IPv6
2. Header Length (4 bits):包头长度(以 4 字节为单位)
- 默认 20 字节(IHL = 5)
- 最大 60 字节(IHL = 15)
3. Type of Service (8 bits):服务类型
- 用于 QoS(Quality of Service)
- 可以标记优先级
4. Total Length (16 bits):整个数据包长度(包头 + 数据)
- 最大 65,535 字节
5. Identification (16 bits):数据包 ID
- 同一来源的数据包序号
- 用于分片重组
6. Flags (3 bits):控制标志
- DF (Don't Fragment):禁止分片
- MF (More Fragments):还有更多分片
- Reserved:保留位
7. Fragment Offset (13 bits):分片偏移
- 指示该分片在原始数据包中的位置
- 以 8 字节为单位
8. TTL (8 bits):生存时间
- 每经过一个路由器 -1
- TTL = 0 时丢弃该包
- 默认 64 或 255
9. Protocol (8 bits):上层协议
- 6:TCP,17:UDP,1:ICMP
10. Header Checksum (16 bits):包头校验和
- 只验证包头,不验证数据
11. Source/Destination IP:源和目的地址查看 IP 包结构:
# 使用 tcpdump 抓取 IP 包
tcpdump -i eth0 -n 'host 192.168.1.1' -X
# 输出显示包的 16 进制内容,可以手工解析包头IP 路由和转发
路由表:
# 查看本机的路由表
route -n
ip route show
# 输出示例:
# Kernel IP routing table
# Destination Gateway Genmask Flags Metric Ref Use Iface
# 0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0
# 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
# 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
# 字段含义:
# Destination:目的网络
# Gateway:网关(0.0.0.0 表示直连,无需网关)
# Genmask:子网掩码
# Flags:
# U = Up(路由可用)
# G = Gateway(需要网关)
# H = Host(主机路由)
# D = Dynamic(动态路由)
# Metric:度量值(跳数或成本,越小越优先)
# Iface:输出接口IP 路由过程:
接收到一个数据包
↓
1. 检查目的 IP 是否为本机
- 是 → 交给上层协议(TCP/UDP)处理
- 否 → 继续
2. 查看是否启用了 IP 转发
- 已启用 → 继续,否 → 丢弃包
sysctl net.ipv4.ip_forward # 查看是否为 1
3. 在路由表中查找最匹配的路由项
- 遵循最长前缀匹配(Longest Prefix Match)
- 如果多条都匹配,选择最具体的(掩码最长)
4. 根据路由项的下一跳地址和输出接口
- 若下一跳是网关,发送给网关
- 若下一跳是直连网络,直接发送给目的主机
5. 使用 ARP 获取下一跳的 MAC 地址
6. 通过输出接口转发数据包
↓
更新 TTL 和包头校验和
↓
转发给下一跳常见路由配置:
# 查看详细路由信息
ip route show
netstat -r
# 添加静态路由
route add -net 192.168.2.0/24 gw 192.168.1.1
ip route add 192.168.2.0/24 via 192.168.1.1
# 删除路由
route del -net 192.168.2.0/24
ip route del 192.168.2.0/24
# 添加默认网关
route add default gw 192.168.1.1
ip route add default via 192.168.1.1
# 查看到某个主机的路由路径
traceroute 8.8.8.8IP 分片和重组
分片原因:
不同的网络接口有不同的 MTU(Maximum Transmission Unit)
- 以太网 MTU 通常为 1500 字节
- 如果 IP 包大于 MTU,需要分片
IP 包总大小:1500 字节 + 20 字节包头 = 1520 字节
数据大小:1500 - 20 = 1480 字节
如果应用层要发送 3000 字节数据:
- 需要分成两片:1480 + 1020
分片过程:
原始包(ID=1234, Len=3020)
↓
分片 1(ID=1234, Offset=0, MF=1, Len=1500)→ 含 1480 字节数据
↓
分片 2(ID=1234, Offset=1480, MF=0, Len=1040)→ 含 1020 字节数据分片的问题:
# 查看 MTU
ifconfig eth0
ip link show eth0
# 分片的弊端:
# 1. 如果任意一个分片丢失,整个包都要重传
# 2. 增加处理器负担
# 3. 降低网络效率
# 解决方案:
# 1. 增加 MTU 值(如果网络支持)
# 2. 应用层使用更小的数据包
# 3. 启用路径 MTU 发现(Path MTU Discovery)
# 测试 MTU 大小
ping -M do -s 1472 8.8.8.8 # 禁止分片,尝试 1472 字节数据IPv4 vs IPv6
| 特性 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32 位 | 128 位 |
| 地址数 | 4.3 亿 | 340 万亿亿个 |
| 地址格式 | 点分十进制(a.b.c.d) | 十六进制冒号分隔(xxxx:xxxx::xxxx) |
| 包头大小 | 20-60 字节 | 40 字节(固定) |
| 分片 | 路由器和主机 | 仅主机 |
| 包头校验 | 包头校验和 | 无包头校验(交给上层) |
| QoS | ToS 字段 | 流标签字段 |
| 自动配置 | DHCP | StateLess 自动配置 |
IPv6 地址表示:
完整形式:
2001:0db8:85a3:0000:0000:8a2e:0370:7334
简写规则:
- 每个 16 位的组可以去掉前导零
2001:db8:85a3:0:0:8a2e:370:7334
- 连续的全 0 组可以用 :: 代替(只能用一次)
2001:db8:85a3::8a2e:370:7334
特殊地址:
- ::1:回环地址(IPv6 版的 127.0.0.1)
- :::未指定地址
- fe80::/10:链路本地地址(路由器无法转发)
- ff00::/8:多播地址IP 协议常见问题诊断
问题 1:无法连接到某个网络
# 诊断步骤:
# 1. 检查本机 IP 配置
ifconfig eth0
ip addr show eth0
# 2. 检查网关
route -n | grep default
ip route show default
# 3. 检查能否 ping 通网关
ping 192.168.1.1
# 4. 检查路由表
route -n
ip route show
# 5. 追踪路由路径
traceroute target_ip
# 可能原因:
# - IP 地址配置错误
# - 网关配置错误
# - 路由表缺少路由项
# - 防火墙阻止
# - 网络不可达问题 2:丢包率高
# 诊断:
ping -c 100 target_ip # 发送 100 个包,查看丢包情况
# 可能原因:
# - 链路质量差(物理层问题)
# - 网络拥塞
# - MTU 不匹配导致分片多
# 解决:
# - 调整网络设置
# - 更换网络线路
# - 增加 MTU 值问题 3:IP 地址冲突
# 诊断:
arp -a # 查看 ARP 表
ip neigh show # 查看邻接表
# 症状:
# - 网络不稳定,间歇性无法连接
# - 同一个 IP 有多个 MAC 地址
# 解决:
# - 重启 DHCP 客户端
# - 手动配置 IP 地址快速参考命令
# 查看 IP 地址
ifconfig / ip addr show
# 查看路由表
route -n / ip route show
# 查看到某个主机的路由
traceroute 8.8.8.8 / mtr 8.8.8.8
# 测试网络连接
ping host
nping -c 1 --tcp -p 80 host
# 抓取 IP 包
tcpdump -i eth0 -n host 192.168.1.1
# 查看 IP 统计
netstat -s
ss -s
# 启用/禁用 IP 转发
sysctl -w net.ipv4.ip_forward=1相关高频面试题
Q1: 什么是子网掩码?如何计算一个网络有多少台主机?
答案:
# 子网掩码:用于划分 IP 地址中的网络部分和主机部分
# 格式:4 个 8 位十进制数(如 255.255.255.0)
# 作用:
# IP 地址 AND 子网掩码 = 网络地址
# 192.168.1.100 AND 255.255.255.0 = 192.168.1.0
# CIDR 记法:
# /24 表示前 24 位是网络,后 8 位是主机
# 可用主机数 = 2^(主机位数) - 2
# 减 2:减去网络地址和广播地址
# 计算示例:
# 192.168.1.0/24
# 网络位:24,主机位:32-24=8
# 可用主机数:2^8 - 2 = 254
# 192.168.0.0/16
# 网络位:16,主机位:32-16=16
# 可用主机数:2^16 - 2 = 65,534
# 常见子网掩码对应的主机数:
# /32:1 个 IP(单个主机)
# /31:2 个 IP(点对点链接)
# /30:4 个 IP(通常 2 个可用)
# /29:8 个 IP(通常 6 个可用)
# /28:16 个 IP(通常 14 个可用)
# /24:256 个 IP(通常 254 个可用)
# /16:65,536 个 IP(通常 65,534 个可用)Q2: TTL(生存时间)有什么作用?如何防止数据包无限循环?
答案:
# TTL(Time To Live):IP 包头中的一个 8 位字段
# 单位:跳数(hops),每经过一个路由器 -1
# 作用:
# 1. 防止数据包在网络中无限循环
# 如果存在路由环路,数据包会在环路中反复转发
# TTL 可以确保最多转发 255 次就被丢弃
# 2. 限制数据包的转发范围
# 例如,TTL=1 的包只能在本网段转发
# 典型的 TTL 值:
# - Windows:TTL = 128
# - Linux/Unix:TTL = 64
# - macOS:TTL = 64
# 工作原理:
# 发送端:设置 TTL = 64
# ↓ 路由器 1:TTL = 64 - 1 = 63
# ↓ 路由器 2:TTL = 63 - 1 = 62
# ↓ ...
# ↓ 路由器 64:TTL = 1 - 1 = 0(丢弃,发送 ICMP Time Exceeded)
# 实际应用:
traceroute 8.8.8.8
# traceroute 就是通过逐步增加 TTL 来找出到达目的地的路径Q3: IP 分片对网络性能有什么影响?如何避免分片?
答案:
# IP 分片的弊端:
# 1. 数据包损失率增加
# 整个原始包由多个分片组成
# 只要有一个分片丢失,整个包都要重传
# 2. 处理开销增加
# 路由器需要分片和重新打包
# 目的主机需要重组分片
# 3. 网络效率降低
# 每个分片都需要单独的 IP 包头(20 字节)
# 额外的包头占用带宽
# 4. 增加延迟
# 分片、转发、重组都需要时间
# 避免分片的方法:
# 1. 增加 MTU(如果可能)
# 查看 MTU:ip link show eth0
# 修改 MTU:ip link set dev eth0 mtu 9000
# 巨帧(Jumbo Frames)MTU=9000 可减少分片
# 2. 应用层使用更小的数据块
# 如 TCP 会根据 MSS(Maximum Segment Size)分割数据
# MSS = MTU - 20(IP 包头)- 20(TCP 包头)
# 3. 启用 Path MTU Discovery
# 自动发现最优 MTU,避免分片
# sysctl -w net.ipv4.ip_no_pmtu_disc=0
# 4. 禁止分片(DF 标志)
# ping -M do -s 1472 target # 禁止分片发送 ping
# 如果包太大,会收到 ICMP 报错而非分片Q4: 如何用 traceroute 命令追踪到目标主机的路由路径?
答案:
# traceroute 的工作原理:
# 1. 发送 TTL=1 的 UDP 包(或 ICMP 包)
# 2. 第一个路由器返回 ICMP Time Exceeded
# 3. 逐步增加 TTL 到 2、3、4...
# 4. 最终收到目的主机的 ICMP Port Unreachable(或 ICMP Echo Reply)
# 5. 这样就得到了完整的路径
# 基本用法:
traceroute 8.8.8.8
# 输出示例:
# traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
# 1 192.168.1.1 (192.168.1.1) 2.345 ms 2.456 ms 2.567 ms
# 2 10.0.0.1 (10.0.0.1) 5.234 ms 5.345 ms 5.456 ms
# 3 * * * (无回应,可能被防火墙阻止)
# 4 72.14.207.1 (72.14.207.1) 25.123 ms 25.234 ms 25.345 ms
# 字段含义:
# - 第一列:跳数
# - 第二列:路由器地址或 * (无回应)
# - 后三列:三次 ping 的 RTT(往返时间)
# 常用选项:
traceroute -m 30 8.8.8.8 # 最多跳转 30 次
traceroute -w 5 8.8.8.8 # 等待超时 5 秒
traceroute -n 8.8.8.8 # 不做 DNS 反向查询
traceroute -I 8.8.8.8 # 使用 ICMP Echo(而不是 UDP)
traceroute -T 8.8.8.8 # 使用 TCP
mtr 8.8.8.8 # 持续监测路由,更强大Q5: 什么是 ARP 协议?IP 地址转换到 MAC 地址的过程是什么?
答案:
# ARP(Address Resolution Protocol):地址解析协议
# 作用:将 IP 地址转换为 MAC 地址(物理地址)
# 为什么需要 ARP?
# - 同一网络段内通信
# - 需要知道目标主机的 MAC 地址才能发送帧
# - IP 地址是逻辑地址,MAC 地址是物理地址
# - ARP 完成了 IP → MAC 的映射
# ARP 工作原理(同网段):
# 假设 192.168.1.100 要与 192.168.1.200 通信
# 1. 检查 ARP 缓存
# arp -a 或 ip neigh show
# 如果已有映射,直接使用
# 2. 发送 ARP Request(广播)
# "谁有 IP 地址 192.168.1.200?请告诉我你的 MAC 地址"
# 源 MAC:192.168.1.100 的 MAC
# 目的 MAC:FF:FF:FF:FF:FF:FF(广播)
# 3. 192.168.1.200 收到广播,发送 ARP Reply
# "我的 MAC 地址是 00:11:22:33:44:55"
# 回复给 192.168.1.100
# 4. 192.168.1.100 缓存映射
# 192.168.1.200 → 00:11:22:33:44:55
# 5. 后续通信直接使用缓存的 MAC 地址
# 跨网段通信的 ARP:
# A (192.168.1.100) 要与 B (192.168.2.100) 通信
# 1. A 计算:192.168.2.100 不在同网段
# 2. A 发送包给默认网关(192.168.1.1)
# 3. A 先做 ARP 查询网关的 MAC
# 4. A 设置目的 IP = 192.168.2.100,目的 MAC = 网关的 MAC
# 5. 网关转发到 192.168.2.100 的网关
# 6. 最终网关做 ARP 查询 192.168.2.100 的 MAC
# 常见 ARP 命令:
arp -a # 查看 ARP 缓存
ip neigh show # 查看邻接表(新)
arp -d 192.168.1.100 # 删除 ARP 缓存条目Q6: 什么是路由转发?如何配置静态路由?
答案:
# 路由转发:
# 路由器根据数据包的目的 IP 地址,查询路由表,决定下一跳
# 启用 IP 转发:
sysctl -w net.ipv4.ip_forward=1 # 启用(临时)
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf # 永久配置
sysctl -p # 应用配置
# 检查是否启用:
cat /proc/sys/net/ipv4/ip_forward # 输出 1 表示已启用
# 路由转发的完整过程:
# 1. 收到数据包,检查目的 IP 是否为本机
# 是 → 交给应用程序处理
# 否 → 继续转发
# 2. 查看 IP 转发是否启用
# 未启用 → 丢弃包,返回 ICMP Destination Unreachable
# 已启用 → 继续
# 3. 在路由表中查找最匹配的路由
# 遵循最长前缀匹配(LPM)
# 若多条匹配,选择掩码最长的
# 4. 根据路由项的下一跳和出接口转发
# 更新 TTL(-1),重计算包头校验和
# 5. 通过 ARP 获取下一跳的 MAC 地址
# 如果是直连网络,直接发送给目的地址
# 如果是网关,发送给网关
# 配置静态路由:
# 查看路由表
route -n
ip route show
# 添加静态路由(临时)
route add -net 192.168.2.0/24 gw 192.168.1.1
# 或
ip route add 192.168.2.0/24 via 192.168.1.1
# 删除路由
route del -net 192.168.2.0/24
ip route del 192.168.2.0/24
# 永久配置(Debian/Ubuntu)
vim /etc/network/interfaces
# 添加:
# up route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.1
# 或在 /etc/network/interfaces 中:
# post-up ip route add 192.168.2.0/24 via 192.168.1.1
# 永久配置(Red Hat/CentOS)
vim /etc/sysconfig/network-scripts/route-eth0
# 内容:192.168.2.0/24 via 192.168.1.1IP 协议诊断速查表
| 问题 | 诊断命令 | 可能原因 |
|---|---|---|
| 无法 ping 通 | ping -c 4 host | IP 错误、网关错误、防火墙 |
| 没有网络 | route -n, ifconfig | IP 未配置、网关配置错 |
| 丢包率高 | ping -c 100 host | 链路质量差、网络拥塞 |
| 延迟高 | ping host, mtr host | 路由路径长、网络拥塞 |
| IP 冲突 | arp -a, ip neigh show | DHCP 分配冲突、手动冲突 |
| 路由异常 | traceroute host | 路由配置错、网络分区 |