有谁知道是什么决定了路由器进行的 arp 尝试次数?我的两个设备的行为不同,如果我尝试跟踪路由到属于路由器接口的子网上不存在的主机,Linux 机器将尝试 arp 3 次,然后返回主机无法访问的 icmp 消息。Junos 将不断尝试 arp 但不返回任何内容。是否有一个 sysctl 值可以决定这一点或任何东西。
答案1
在 Linux 上,您感兴趣的是:
% sysctl net.ipv4.neigh.eth0.mcast_solicit
net.ipv4.neigh.eth0.mcast_solicit = 3
如果尝试后仍无法解析 ARP,Linux 内核将向原始发送进程返回 ICMP 主机不可达信息mcast_solicit
。
在 BSD(包括 Junos)中,您可以这样设置:
% sysctl net.link.ether.inet.maxtries
net.link.ether.inet.maxtries: 4
这设置了重试次数,因此0
如果您只想要一个 ARP,请将其设置为。与 Linux 不同,BSD 不会回退 ICMP 不可达;这取决于其他因素(TCP SYN_SENT 超时或其他)。
如果你在 Linux 上对不存在的本地地址执行跟踪路由,你应该看到 3 个 ARP,然后跟踪路由以 退出!H !H !H
。(你得到所有三个!H
s 是因为net.ipv4.neigh.eth0.unres_qlen
默认设置为 3,所以 ARP 在尝试解析时将在其队列中保留最多 3 个数据包。如果你设置net.ipv4.neigh.eth0.unres_qlen
为2
,对不存在的本地地址的跟踪路由将给你!H !H *
如果您在 Junos(BSD)上对不存在的本地地址执行跟踪路由,您应该会看到 5 个 ARP,*
然后跟踪路由会再次尝试,您会看到另外 5 个 ARP,再一个*
等等,跟踪路由会继续,直到它在 3 次探测 30 跳后最终放弃,每次探测 ARPing 5 次(我猜总共有 450 个 ARP)。