eth0 : 10.168.0.2
docker0 : 172.17.0.1
Container1 : 172.17.0.2
Container2 : 172.17.0.3
Container1 PING  Container2 的过程

当在 Container1 内部执行 `ping 172.17.0.3` 命令时,首先触发以下操作:
应用层调用:PING程序通过系统调用向内核发送 ICMP 回显请求报文生成指令。
目标 IP解析:Container1 检查目标 IP(172.17.0.3)是否在本地网络。由于容器网络通常采用 /16 子网掩码(255.255.0.0),172.17.0.3 与本机 IP 172.17.0.2 处于同一子网(172.17.0.0/16)
因此判定为本地通信。

ARP 协议地址解析

(一)ARP 请求生成
Container1 内核查询本地 ARP 缓存表,未找到 172.17.0.3 对应的 MAC 地址。
生成 ARP 请求报文,包含:
源 MAC:Container1 的虚拟网卡 MAC 地址(如 `02:42:ac:11:00:02`)
目标 MAC:广播地址 `ff:ff:ff:ff:ff:ff`
源 IP:172.17.0.2
目标 IP:172.17.0.3
操作码:ARP 请求
(二)ARP 请求转发
Container1 的虚拟网卡(veth 接口)将 ARP 请求发送至 docker0 网桥。
docker0 网桥作为二层交换机,收到广播帧后执行泛洪操作,向所有连接的容器 veth 接口转发该帧(除源接口外)。
(三)ARP 响应处理
Container2 接收到 ARP 请求,检查目标 IP 与本机匹配,触发 ARP 响应:
源 MAC:Container2 的虚拟网卡 MAC 地址(如 `02:42:ac:11:00:03`)
目标 MAC:Container1 的 MAC 地址
源 IP:172.17.0.3
目标 IP:172.17.0.2
操作码:ARP 应答(2)
Container2 同时更新本地 ARP 缓存,记录 172.17.0.2 对应的 MAC 地址。
Container1 接收 ARP 响应后,更新本地 ARP 缓存表,建立 IP 与 MAC 的映射关系。

ICMP 报文封装与发送

(一)ICMP 报文构造
Container1 内核构造 ICMP 回显请求报文,包含:
类型字段:8(回显请求)
代码字段:0
校验和:对报文内容进行校验
标识符:用于匹配请求与响应(通常为 PING 进程 PID)
序列号:从 1 开始递增
数据区:随机填充数据(默认 56 字节)
(二)IP 层封装
ICMP 报文被封装为 IP 数据报:
源 IP:172.17.0.2
目标 IP:172.17.0.3
协议字段:1(ICMP)
TTL 值:64(Linux 系统默认值)
总长度:IP 头部(20 字节)+ ICMP 报文(8 + 56 = 64 字节)= 84 字节
(三)数据链路层封装
IP 数据报进一步封装为以太网帧:
源 MAC:Container1 的 MAC 地址
目标 MAC:通过 ARP 获取的 Container2 的 MAC 地址
类型字段:0x0800(IP 协议)
(四)帧发送过程
Container1 的虚拟网卡(veth 接口)将以太网帧发送至 docker0 网桥。
docker0 网桥根据目标 MAC 地址查询 MAC 地址表(FDB 表),找到对应的端口(连接 Container2 的 veth 接口)。
网桥通过该端口将以太网帧转发至 Container2 的虚拟网卡。

Container2 接收与响应处理

(一)帧接收与解封装
Container2 的虚拟网卡接收到以太网帧,检查目标 MAC 地址与本机匹配,将帧接收至内核。
剥离以太网头部,将 IP 数据报提交至 IP 层处理。
IP 层验证校验和,检查目标 IP 为本机,根据协议字段(1)将报文提交至 ICMP 协议处理。
(二)ICMP 响应生成
ICMP 模块识别回显请求报文,构造回显应答报文:
类型字段:0(回显应答)
代码字段:0
校验和:重新计算
标识符与序列号:与请求报文保持一致
数据区:原封不动返回请求报文的数据区
(三)响应报文发送
响应报文按原路径反向发送:
ARP 缓存已存在 172.17.0.2 的 MAC 地址,无需再次解析。
响应报文依次经过 ICMP 封装、IP 封装(源 IP 172.17.0.3,目标 IP 172.17.0.2)、以太网帧封装(源 MAC 为 Container2 的 MAC,目标 MAC 为 Container1 的 MAC)。
帧通过 docker0 网桥转发回 Container1。

Container1 接收与结果展示

  1. Container1 接收 ICMP 回显应答报文,验证标识符和序列号,确认与之前发送的请求匹配。
  2. 计算往返时间(RTT):通过记录发送请求和接收响应的时间戳差值获得。
  3. PING 程序将结果输出至终端,格式通常为:

   ```

   64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.123 ms

   ```

更多推荐