到底什麼時候建立的ARP表項

2021-08-04 03:57:51 字數 1019 閱讀 8644

一周前遇到乙個問題,比較簡單但值得推敲。到底什麼時候建立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表項,這是乙個問題。

iOS Copy到底什麼時候用?

a 在oc裡面有個值物件的概念,當你新定義乙個屬性是值物件時就應該用copy來修飾。那麼都什麼物件是值物件呢?值物件 指封裝了基本值 屬於c資料型別 且提供與該值相關的服務的物件。值物件以物件形式表示標量型別。foundation框架向您提供了以下類 這些類產生物件,用於字串 二進位制資料 日期與時...

到底什麼時候該使用MQ?

mq是幹嘛的 訊息匯流排 message queue 後文稱mq,是一種跨程序的通訊機制,用於上下游傳遞訊息。在網際網路架構中,mq是一種非常常見的上下游 邏輯解耦 物理解耦 的訊息通訊服務。使用了mq之後,訊息傳送上游只需要依賴mq,邏輯上和物理上都不用依賴其他服務。什麼時候不使用訊息匯流排 mq...

到底什麼時候該使用MQ?

一 緣起 一切脫離業務的架構設計與新技術引入都是耍流氓。引入乙個技術之前,首先應該解答的問題是,這個技術解決什麼問題。就像微服務分層架構之前,應該首先回答,為什麼要引入微服務,微服務究竟解決什麼問題 詳見 網際網路架構為什麼要做微服務?不少詢問,究竟什麼時候使用mq,mq究竟適合什麼場景,故有了此文...