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