ARP 位址解析協議實現學習

2021-06-25 20:24:32 字數 3410 閱讀 8463

在乙太網上傳輸ip資料報時,乙太網裝置並不能識別32位ip位址,而是以48位乙太網位址傳輸乙太網資料報的。因此,ip資料報在乙太網上傳輸前需要封裝為乙太網幀,而乙太網幀的目的位址正是通過ip資料報的目的ip位址查詢得到的。因此ip位址和乙太網位址之間存在著對映,通過檢視arp表就可以得到這兩位址間的對應關係。位址解析協議(address resolution protocol-arp)就是用來確定這些對應關係的協議。

arp協議的處理涉及以下檔案:

include/linux/if_arp.h 定義arp報文等結構、巨集和函式原型

net/ipv4/arp.c arp協議實現

參見tcp/ip協議學習筆記(4)arp&rarp

定義arp報文頭的結構

struct arphdr

;

由於不同網路介質的mac位址長度是不同的,因此arp報文的結構不能包括操作碼後面的內容。這裡只是列舉了乙太網上的arp定義。

arp協議並不僅僅被ipv4使用,在核心的網路模組**中使用縮寫sip和tip來代表傳送方ip位址和目的ip位址

arp報文像ip資料報一樣,也是作為資料封裝在乙太網幀中傳送的。arp報文由arp_rcv()接收處理,arp模組初始化時需要在協議棧中註冊arp報文的型別

/*

* called once on startup.

*/static struct packet_type arp_packet_type __read_mostly = ;

arp模組的初始化是由arp_init()完成的,該函式由ipv4協議棧初始化函式inet_init()呼叫,首先初始化arp協議的鄰居表,然後在協議棧中註冊arp協議,最後建立proc物件,註冊事件通知

void __init arp_init(void)

arp的鄰居項函式指標表

在arp中,根據不同的介質,提供了多種鄰居項函式指標表的例項,例如通用的arp_generic_ops,支援快取硬體首部arp_hh_ops,不支援arp的arp_direct_ops以及支援業餘無線電裝置等的arp_broken_ops。除了兩個輸出函式指標output和connected_output,這些鄰居項函式指標表例項區別不大

static const struct neigh_ops arp_generic_ops = ;

static const struct neigh_ops arp_hh_ops = ;

static const struct neigh_ops arp_direct_ops = ;

const struct neigh_ops arp_broken_ops = ;

arp表

arp的鄰居表為arp_tbl,其中與協議特性相關的字段有:位址族為af_inet;鄰居項的大小為neighbour結構+4(ipv4位址的長度);雜湊演算法為arp_hash();arp初始化函式arp_constructor();延時處理**arp報文的例程為parp_redo(),以及調整arp表特性的引數。

struct neigh_table arp_tbl = ,

.gc_interval = 30 * hz,

.gc_thresh1 = 128,

.gc_thresh2 = 512,

.gc_thresh3 = 1024,

};

arp_constructor()是arp的鄰居初始化函式,用來建立新的neighbour結構例項,在鄰居表建立函式neigh_create()中被呼叫。

static int arp_constructor(struct neighbour *neigh)

neigh->type = inet_addr_type(dev_net(dev), addr);

parms = in_dev->arp_parms;

__neigh_parms_put(neigh->parms);

neigh->parms = neigh_parms_clone(parms);

rcu_read_unlock();

if (!dev->header_ops) else

#endif

if (neigh->type == rtn_multicast) else if (dev->flags&(iff_noarp|iff_loopback)) else if (neigh->type == rtn_broadcast || dev->flags&iff_pointopoint)

if (dev->header_ops->cache)

neigh->ops = &arp_hh_ops;

else

neigh->ops = &arp_generic_ops;

if (neigh->nud_state&nud_valid)

neigh->output = neigh->ops->connected_output;

else

neigh->output = neigh->ops->output;

} return 0;

}

arp_send()先建立乙個arp報文,如果建立成功就將其傳送出。該函式的引數與arp_create()相同

/*

* create and send an arp packet.

*/void arp_send(int type, int ptype, __be32 dest_ip,

struct net_device *dev, __be32 src_ip,

const unsigned char *dest_hw, const unsigned char *src_hw,

const unsigned char *target_hw)

arp_xmit(skb);

}

arp_rcv()用來從二層接收並處理乙個arp報文

/*

* receive an arp request from the device layer.

*/static int arp_rcv(struct sk_buff *skb, struct net_device *dev,

struct packet_type *pt, struct net_device *orig_dev)

在路由模組中,每當新增一條輸出路由或是單播**路由時,會嘗試將該路由與該路由目的位址相對應的鄰居項繫結。arp_bind_neighbour()實現了路由表項與鄰居繫結的功能,在繫結過程中,如果對應的鄰居項不存在,則會建立乙個鄰居項然後將路由項與之繫結。繫結之後,再輸出報文時就能通過路由快取找到輸出函式。

ARP協議 位址解析協議

網路層使用的是ip位址,但實際網路的鏈路上傳送資料幀時,最終還是必須使用該網路的硬體位址。arp快取記憶體 ip位址到硬體位址的對映表 那麼一台主機 a 是如何獲知本區域網內其他主機或路由的硬體位址的?主機a廣播arp請求分組 我的ip是 硬體位址是 請告知我ip位址為 主機的硬體位址。本區域網內的...

位址解析協議 ARP

1.什麼是arp?英文原義 address resolution protocol 中文釋義 是乙個位於tcp ip協議棧中的低層協議,負責將某個ip位址解析成對應的mac位址。區域網中,網路中實際傳輸的是 幀 幀裡面是有目標主機的mac位址的。所謂 位址解析 就是主機在傳送幀前將目標ip位址轉換成...

位址解析協議(ARP)

位址解析協議 arp 作用是將邏輯位址對映為實體地址,即將ip位址和實體地址關聯起來。當主機或路由器想要知道網路上另一台主機或者路由器的實體地址的時候,它就會傳送arp查詢分組。這個分組包括傳送端的實體地址和ip位址,以及接收端的ip位址。因為傳送端不知道接收端的實體地址,所以查詢就在網路上廣播。a...