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不可达。嗯,动态路由虽然灵活,但坑也不少。
路由选择的核心逻辑可以用下面这张图概括:
注意:路由表查的是目标网络,不是目标主机。我曾经见过有人把路由表配成了/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命令的原理其实很简单:
- 发送方构造一个ICMP Echo Request报文(类型8)。
- 目标主机收到后,回复一个ICMP Echo Reply报文(类型0)。
- 发送方计算往返时间(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。
嗯,网络层就是这么一环扣一环。搞懂了这些,你再看网络问题,就不再是黑盒了。