IP 包接力与路由表
IP 包的构成
IP 包 = 头部(header)+ 数据(Data)
- 数据部分:真正要传送的信息
- 头部:为实现传输而附加的信息(与以太网帧的头部功能类似)
关注重点在头部的两个地址字段:
- 源地址(source address)
- 目的地址(destination address)
二者都是 IP 地址,是逐跳转发决策的唯一依据。
IP 包接力(routing)机制
每个主机和路由器中都存有一张路由表(routing table),它根据目的 IP 地址决定待发送的 IP 包该走哪条路。
一个完整的接力例子
主机 145.17 要发 IP 包到 146.21,查自己的路由表:
| Destination | Gateway | Genmask | Iface |
|---|---|---|---|
| 199.165.145.0 | 0.0.0.0 | 255.255.255.0 | eth0 |
| 0.0.0.0 | 199.165.145.17 | 0.0.0.0 | eth0 |
- 第一行:目的地属于
199.165.145.0这个网络 → 直接在 eth0 上本地送达(Gateway 0.0.0.0表示”本地送信”,无需经路由器) - 第二行:所有不符合第一行的目的地 → 发往网关
199.165.145.17(即路由器的 eth0 网卡)
146.21 不匹配第一行,故走第二行发给路由器。主机把 IP 包放进帧的 payload,帧头部写上 199.165.145.17 对应的 MAC 地址,于是可在局域网中传送。
路由器收到后(实际是收到以太帧,再从 payload 读出 IP 包),提取目的 IP,查自己的路由表:
| Destination | Gateway | Genmask | Iface |
|---|---|---|---|
| 199.165.145.0 | 0.0.0.0 | 255.255.255.0 | eth0 |
| 199.165.146.0 | 0.0.0.0 | 255.255.255.0 | eth1 |
| 0.0.0.0 | 199.165.146.8 | 0.0.0.0 | eth1 |
前两行说明这是直连网络,可直接从对应网卡送出;第三行是默认路由。目的地址匹配第二行,于是放入新帧、写上 146.21 的 MAC,直接送达目标主机。
核心不变式
接力过程中 IP 包内容始终保持不变
整个过程中,IP 包被主机和路由器反复封装入帧、再拆开,借助连接层在各 NIC 之间传送。
IP 包本身的内容(含源/目的 IP)保持完整、不发生任何变化。
变的只是外层帧的头部(每跳重新封装)。这正是”网络层提供端到端抽象”的体现——上层无需操心底层发生了什么。
三个支撑该过程的前提
IP 接力能跑通,隐含依赖三件事,各自再对应一个协议:
| 前提 | 由谁保证 | 对应笔记 |
|---|---|---|
| 主机/路由器知道局域网内 IP ↔ MAC 的对应关系 | ARP | ARP协议-IP到MAC的解析 |
| 每个主机和路由器都有合理的路由表 | 手工配置或路由协议 | — |
| 路由表能随拓扑变化自动更新 | RIP / BGP | RIP与BGP-路由表的自动生成 |
相关命令
route -n # Linux 下查看 routing table
ip route # 现代推荐写法参考链接
- IPv4地址分类与子网掩码 — 路由表匹配所依赖的地址结构
- ARP协议-IP到MAC的解析 — 封装帧所需的 MAC 地址从哪来
- RIP与BGP-路由表的自动生成 — 路由表如何自动生成
- Linux-IP转发与路由 — Linux 上的具体配置实践