IP 包接力与路由表

IP 包的构成

IP 包 = 头部(header)+ 数据(Data)

  • 数据部分:真正要传送的信息
  • 头部:为实现传输而附加的信息(与以太网帧的头部功能类似)

关注重点在头部的两个地址字段:

  • 源地址(source address)
  • 目的地址(destination address)

二者都是 IP 地址,是逐跳转发决策的唯一依据

IP 包接力(routing)机制

每个主机和路由器中都存有一张路由表(routing table),它根据目的 IP 地址决定待发送的 IP 包该走哪条路。

一个完整的接力例子

主机 145.17 要发 IP 包到 146.21,查自己的路由表:

DestinationGatewayGenmaskIface
199.165.145.00.0.0.0255.255.255.0eth0
0.0.0.0199.165.145.170.0.0.0eth0
  • 第一行:目的地属于 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,查自己的路由表:

DestinationGatewayGenmaskIface
199.165.145.00.0.0.0255.255.255.0eth0
199.165.146.00.0.0.0255.255.255.0eth1
0.0.0.0199.165.146.80.0.0.0eth1

前两行说明这是直连网络,可直接从对应网卡送出;第三行是默认路由。目的地址匹配第二行,于是放入新帧、写上 146.21 的 MAC,直接送达目标主机。

核心不变式

接力过程中 IP 包内容始终保持不变

整个过程中,IP 包被主机和路由器反复封装入帧、再拆开,借助连接层在各 NIC 之间传送。

IP 包本身的内容(含源/目的 IP)保持完整、不发生任何变化。

变的只是外层帧的头部(每跳重新封装)。这正是”网络层提供端到端抽象”的体现——上层无需操心底层发生了什么。

三个支撑该过程的前提

IP 接力能跑通,隐含依赖三件事,各自再对应一个协议:

前提由谁保证对应笔记
主机/路由器知道局域网内 IP ↔ MAC 的对应关系ARPARP协议-IP到MAC的解析
每个主机和路由器都有合理的路由表手工配置或路由协议
路由表能随拓扑变化自动更新RIP / BGPRIP与BGP-路由表的自动生成

相关命令

route -n            # Linux 下查看 routing table
ip route            # 现代推荐写法

参考链接