到底什么时候创建的ARP表项_arp_accept

一周前遇到一个问题,比较简单但值得推敲。到底什么时候创建arp邻居项呢?是在查路由的时候呢,还是在实际走路由的时候?
  我们知道,在2.6.32的内核里,在查路由操作的最后,会有一个arp bind neighbour的操作,这个时候就会创建arp表项,即便只是查一下路由,并没有数据包会发送,也会创建这个表项,比如调用一下UDP的connect操作。
  然而在3.5内核之后,路由查找子系统发生了比较大的重构,neighbour管理和路由表管理彻底分开了,因此在查找路由的时候,也就不再会bind neighbour了,只有在实际的数据包发送的时候,在ip_finish_output2才会实际去bind neighbour。虽然这个改动看似没有什么影响,但是却可能带来一些诡异的问题。
  一般而言,系统不会为收到的那些“免费ARP”创建表项,这种ARP进行的只是一些初始化操作,并不是以通信为目的的,因此在Linux系统中会设置arp_accept为0,它的含义表示,如果收到一个ARP回应,该ARP回应在本地找不到任何与其对应的ARP表项,那就不处理它。
  在使用arping的时候,2.6.32内核和3.5以后的内核在行为出现了差异。我们知道arping使用的是packet套接字发包的,也就是说数据包不走IP路由,直接由dev发送出去,这意味着在3.5以后的内核中,ARP表项在使用arping的时候是始终不会被创建的,那么2.6.32内核呢?这要看情况。
  如果在arping的数据包发送前,曾经有查找路由表的操作,那么ARP表项就会被创建(此时必须用ip neigh ls nud none才能看得到),如果arping命令加上了-s选项指定了源IP地址,就不会调用connect,不会查找路由表自然也就不会创建ARP表项了。
  因此,在arp_accpet参数为0的情况下,对于2.6.32内核使用arping的时候,如果指定了-s选项,那么当ARP Reply到达的时候,是不会创建ARP条目的,如果没有指定-s选项,那么当ARP Reply到达的时候,便会创建ARP条目(因为connect调用已经创建了ARP表项)。
  哪个更合理?到底是查找路由时创建ARP表项还是走路由时创建ARP表项,这是一个问题。

原文链接: https://blog.csdn.net/dog250/article/details/75735002

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    到底什么时候创建的ARP表项_arp_accept

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/407406

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月26日 上午10:33
下一篇 2023年4月26日 上午10:33

相关推荐