4、网络层核心:IP协议头部结构、路由选择原理、ICMP协议与ping

网络层是整个TCP/IP模型里最硬核的一层。说白了,它负责把数据包从源主机送到目标主机,中间可能跨过好几个路由器。我经常跟团队里的新人说,你搞懂了网络层,才算真正入门了计算机网络。

这一章我们聚焦三个核心:IP协议头部、路由选择原理、ICMP协议与ping。这三块是网络层的骨架,也是你排查网络故障时最常打交道的知识点。

4.1 IP协议头部结构

IP协议是网络层的核心协议。目前主流是IPv4,虽然IPv6在慢慢普及,但IPv4的头结构你必须要烂熟于心。我记得刚入行时,有一次抓包分析一个丢包问题,盯着Wireshark里的IP头看了半天,才发现是TTL字段设得太小——从那以后,我对IP头的每个字段都不敢马虎。

IPv4头部固定部分20字节,选项部分最多40字节。下面是标准结构:

偏移(字节) 字段 长度(位) 说明
0 版本 + 首部长度 4 + 4 版本号(IPv4=4),首部长度以4字节为单位
1 服务类型(ToS) 8 现在常用DSCP做QoS
2-3 总长度 16 整个IP包长度,最大65535字节
4-5 标识 16 用于分片重组
6 标志 + 片偏移 3 + 13 DF/MF标志,片偏移以8字节为单位
8 生存时间(TTL) 8 每经过一个路由器减1,为0时丢弃
9 协议 8 上层协议:1=ICMP,6=TCP,17=UDP
10-11 首部校验和 16 只校验头部,不校验数据
12-15 源IP地址 32 发送方IP
16-19 目的IP地址 32 接收方IP

重点记忆:TTL字段是排错利器。我曾经遇到一个跨机房访问超时的问题,traceroute后发现中间某跳TTL被设成了1,导致后续路由全部丢弃。你想想看,一个字段设错,整个链路就断了。

小技巧:用 tcpdump -i eth0 -x -n icmp 抓一个ping包,然后对照上面的表格逐字节解析。我建议你至少手动解析3个包,这样IP头结构就刻在脑子里了。

4.2 路由选择原理

路由选择,说白了就是路由器决定把数据包往哪扔。每个路由器维护一张路由表,表里记录着目标网络和下一跳地址。当数据包到达时,路由器查表,找到最长匹配的条目,然后转发。

路由选择分两大类:

  • 静态路由:管理员手动配置。适合小网络,稳定但维护成本高。
  • 动态路由:路由器之间通过协议自动交换路由信息。常见的有OSPF、BGP、RIP。

我参与过一个跨国数据中心的项目,核心骨干网跑的是BGP。当时有个同事配错了AS号,导致路由黑洞——数据包发出去就消失了。排查了整整两天,最后发现是BGP的next-hop不可达。嗯,动态路由虽然灵活,但坑也不少。

路由选择的核心逻辑可以用下面这张图概括:

路由选择核心流程 路由选择核心流程 数据包到达 提取目标IP 查路由表(最长匹配) 匹配成功 → 转发到下一跳 匹配失败 → 丢弃并发送ICMP 最长匹配原则:选择子网掩码最长的路由条目 例如 192.168.1.0/24 优先于 192.168.0.0/16

注意:路由表查的是目标网络,不是目标主机。我曾经见过有人把路由表配成了/32的主机路由,结果路由表爆炸,性能直线下降。除非特殊场景,否则别这么干。

4.3 ICMP协议与ping

ICMP(Internet Control Message Protocol)是IP协议的辅助协议。它不传输用户数据,而是传递控制信息和错误报告。你平时用的ping、traceroute,底层都是ICMP。

ICMP报文类型很多,常见的有:

类型 代码 含义 典型场景
0 0 Echo Reply ping响应
3 0-15 Destination Unreachable 目标不可达
8 0 Echo Request ping请求
11 0 Time Exceeded TTL超时(traceroute用)

ping命令的原理其实很简单:

  1. 发送方构造一个ICMP Echo Request报文(类型8)。
  2. 目标主机收到后,回复一个ICMP Echo Reply报文(类型0)。
  3. 发送方计算往返时间(RTT)。

但ping能告诉你的信息远不止通不通。我习惯用ping的以下参数做深度排查:

# 连续ping,看丢包率和延迟抖动
ping -c 100 -i 0.1 8.8.8.8

# 指定包大小,测试MTU问题
ping -M do -s 1472 8.8.8.8

# 记录路由(部分系统支持)
ping -R 8.8.8.8

实战经验:有一次客户反馈业务间歇性超时。我连续ping了1000个包,发现丢包率只有0.3%,但延迟从2ms突然跳到800ms。后来定位到是中间某台交换机的队列满了。你看,ping不仅能测通断,还能测质量。

避坑指南:我曾经遇到一个场景,ping外网IP通,但ping域名不通。排查了半天,发现是DNS解析出了问题。记住:ping通IP不代表网络没问题,ping通域名才代表DNS+网络都正常。

4.4 三者之间的关系

IP协议负责寻址和转发,ICMP负责报告错误和提供诊断,路由选择决定转发路径。这三者配合起来,才构成了完整的网络层。

举个例子:你ping一个不存在的IP,路由器会返回ICMP Destination Unreachable。你ping一个跨网段的IP,路由器会查路由表,找到下一跳,然后转发。如果TTL耗尽,路由器会返回ICMP Time Exceeded。

嗯,网络层就是这么一环扣一环。搞懂了这些,你再看网络问题,就不再是黑盒了。