谁来决定 ping 是否应该发送 ARP 请求?

网络工程 ipv4 通讯协议 转储
2021-08-01 01:26:49

在我的 Fedora linux 中,我的 eno1 的 ip 是192.168.1.105,我的网关的 ip 是192.168.1.1,以及网络掩码netmask 255.255.255.0

为了监视 ARP 请求,在一个终端中,我使用了sudo tcpdump -i eno1 -v "icmp or arp",在另一个终端中,我运行了ping 192.168.1.5(不存在)或ping 192.168.91.1

当我ping 192.168.1.5在我的局域网中不存在时,在tcpdump终端中,我收到了ARP请求:

 [abelard@localhost iputils]$ sudo tcpdump -i eno1 -v "icmp or arp"
 [sudo] password for abelard: 
 tcpdump: listening on eno1, link-type EN10MB (Ethernet), capture size 262144 bytes
 06:39:13.111379 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has     192.168.1.5 tell localhost.localdomain, length 28

当我ping 192.168.91.5在我的局域网中仍然不存在时,在tcpdump终端中,我没有收到ARP请求:

 [abelard@localhost iputils]$ sudo tcpdump -i eno1 -v "icmp or arp"
 tcpdump: listening on eno1, link-type EN10MB (Ethernet), capture size 262144 bytes
 06:50:02.417926 IP (tos 0x0, ttl 64, id 32986, offset 0, flags [DF], proto ICMP (1), length 84)
localhost.localdomain > 192.168.91.1: ICMP echo request, id 6682, seq 1, length 64
 06:50:03.417060 IP (tos 0x0, ttl 64, id 33783, offset 0, flags [DF], proto ICMP (1), length 84)
localhost.localdomain > 192.168.91.1: ICMP echo request, id 6682, seq 2, length 64

我想知道谁决定发送ARP请求或不发送ARP请求?一些googled结果说这是由linux内核完成的,如果是,我想知道linux内核在哪里?

2个回答

发生的事情是

  1. Ping 构建一个 ping 数据包并将其传递给内核。
  2. 内核在路由表中查找目的地。它根据路由表确定接口和“下一跳 IP 地址”。
  3. 如果接口是“类以太网”,内核会在接口的 ARP 表中查找下一跳 IP 地址。
  4. 如果 ARP 表中有条目,内核会将 MAC 地址附加到数据包并发送它。否则,它会将其放入队列并发出 ARP 请求。

你没有说你的子网掩码是什么,但我会假设它是 255.255.255.0

平 192.168.1.5

  1. Ping 生成发往 192.168.1.5 的数据包
  2. 内核在路由表中查找目的地。数据包匹配通过设置子网掩码创建的隐式路由。这告诉它目的地在 eth0 上“在链接上”。由于目标在链路上,因此下一跳 IP 地址与目标地址相同。
  3. 内核在 arp 表中查找 eth0 的下一跳。它找不到任何条目。
  4. 内核发出一个 arp 请求。

平 192.168.91.5

  1. Ping 生成发往 192.168.91.5 的数据包
  2. 内核在路由表中查找目的地。数据包匹配默认路由(又名默认网关)。下一跳 IP 地址为 192.168.1.1
  3. 内核在 arp 表中查找 192.168.1.1 并且很可能找到匹配项(您倾向于与默认网关进行很多对话)。
  4. ping 被发送。

抱歉,我不知道 linux 内核中代码的确切布局来告诉您实现此功能的代码在哪里。

主机需要的东西发送到局域网上的其他主机需要解决的第3层(如IP)地址的第2层(例如以太网)地址。这就是 ARP(地址解析协议)所做的。

主机将维护一个 ARP 表,它可以在其中查找第 3 层地址以解析为相应的第 2 层地址。如果第 3 层地址不在 ARP 表中,则主机广播 ARP 请求以获取必要信息。