聚合国内IT技术精华文章,分享IT技术精华,帮助IT从业人士成长

[原]到底什么时候创建的ARP表项

2017-07-23 10:40 浏览: 892223 次 我要评论(0 条) 字号:

一周前遇到一个问题,比较简单但值得推敲。到底什么时候创建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表项,这是一个问题。

作者:dog250 发表于2017/7/22 15:09:31 原文链接
阅读:52 评论:0 查看评论


网友评论已有0条评论, 我也要评论

发表评论

*

* (保密)

Ctrl+Enter 快捷回复