Linux內(nèi)核鄰居子系統(tǒng)的學(xué)習(xí)-arp request報文的發(fā)送條件
鄰居子系統(tǒng)的作用就是將ip地址轉(zhuǎn)換成一個mac地址
在ipv4中就是通過arp協(xié)議來完成該操作
在iipv6中就是通過ndp協(xié)議來完成該操作
? ? ? ? 當(dāng)發(fā)送一個報文的時候,需要知道報文的目的地址和mac地址,現(xiàn)在我們已經(jīng)知道了目的地址,那么arp報文是什么時候發(fā)送出去的呢?
內(nèi)核4.19
ip_output_finish2
?1. 當(dāng)通過內(nèi)核協(xié)議棧發(fā)送報文的時候進(jìn)入ip_output_finish2,此處通過rt_nexthop找到目的地址,有網(wǎng)關(guān)則使用網(wǎng)關(guān)地址否則使用傳入的daddr
2. 調(diào)用__ipv4_neigh_lookup_noref以nexthop為key值在arp_tbl中找鄰居表項
3. 沒有找到則會調(diào)用__neigh_create創(chuàng)建一個鄰居表項,狀態(tài)為NUD_NOARP,之后返回一個neigh結(jié)構(gòu)體。
4. 找到則直接調(diào)用neigh_output即調(diào)用neigh_resolve_output(對于此處第一次發(fā)送該報文,函數(shù)調(diào)用在arp_constructor中設(shè)置),發(fā)送arp請求報文,狀態(tài)變?yōu)镹UD_INCOMPLETE,去請求nexthop的mac地址。之后就是arp協(xié)議的狀態(tài)機(jī)流程。
標(biāo)簽: