拓扑及配置

分析流程
- PC1去ping 外网的server,发送数据包的L2地址(MAC地址)及L3地址(IP地址) 应该如何变化?
组包结果
- PC发送封包

- PC接收封包

抓包验证
- PC1 发送ping包

- SERVER端接收包

- SERVER reply 包

- PC接收reply包

上面我们分发送和接收简单介绍了L2和L3的封包逻辑,是按照什么依据呢?
- IP地址是端到端的
源IP :电脑发出时是 192.168.10.2,经过路由器NAT后变成公网IP 10.0.0.1
目的IP:始终不变(发送包情况) - MAC地址是逐跳的
每经过一个路由器,源、目的MAC地址完全重写,拆开外层MAC → 查路由表 → 包装新MAC → 转发
流程梳理
- ping触发后,如果是域名,则触发DNS --> IP地址
- 主机判定ip地址是否属于本机,若不属于,查询路由表确定下一跳IP
- 查询ARP缓存,确定吓一跳MAC
- 填入目的MAC,
- 接口转发
我们深入代码,主要关注负责获取邻居的MAC地址并通过邻居子系统发送数据包

在这里我们就不加入路由模块参与讨论了
- IP层到链路层转换的关键桥梁

- 确定用于查找邻居缓存的目标IP地址

rt_gw4为网关地址,192.168.10.1


- 查询内核的ARP哈希表

哈希值计算



在这里,我们不讨论创建邻居项的分路:

什么是邻居子系统?
邻居子系统是Linux内核网络协议栈中的一个核心组件,它负责管理同一局域网中相邻设备之间的地址映射关系。换句话说,它的主要工作就是:把IP地址(三层)转换成MAC地址(二层)