IP之ARP

在IP通信中,当主机需要获取目的主机的MAC地址时,会通过ARP协议广播请求。ARP请求包含硬件地址类型、协议地址类型、操作码等信息,并在Ethernet中,ARP请求的类型标识为0x0806。在Linux实现中,ARP的主要代码位于src/net/ipv4/arp.c,关键数据结构是arp_tbl,负责缓存。arp_send()和arp_rcv()分别处理ARP包的发送与接收,通过arp_create()和arp_xmit()生成并发送ARP包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4.3 Control-plane protocol

4.3.1 ARP

当一个host需要得到目的host的mac时,它会广播一个arp request。目的host(或gateway)会应答一个arp reply(单播)。


hardware addresstype 和protocoladdress type表明哪个协议用在链路层或网络层。如果是Ethernet则hardware address type为1,如果是IP,则protocol address type为0x0800。

H.Addr Len:硬件地址长度,如果是Ethernet则hardware address type为6

P.Addr Len:协议地址长度,如果是IP,则protocol address type为4

operation code:arp的操作:request (1), reply (2), RARP request (3),and RARP reply (4)

紧接着的是发送者的mac和ip地址,最后两个field是接收者的mac和ip地址。

 

Remark:Ethernet的type id是0x0806为arp。就是ethernet header后接arp header。Arp请求的广播地址为0xFFFFFFFFFFFF.

 

Implementation for linux

 

Arp的大部分代码在src/net/ipv4/arp.c。

Arp最重要的数据结构是struct neigh_table  arp_tbl,包括一个hash_buckets成员,而hash_buckets指向arp cache。

arp_send() 和arp_rcv()分别处理arp的发送和接收。下图是arp_send() 和 arp_rcv()的调用框图。


arp_send() 调用arp_create() 来生成一个 ARP packet 然后调用arp_xmit() ,最后调用  dev_queue_xmit() 来发送arp packet。

当一个arppacket被接收时arp_process()被调用,在arp_process()中,_niegh_lookp()被调用来搜索hash_buckets hash table,hash key是source IP address。

arp_process()来处理一个请求并发送应答,无论该请求来自于本机器本身,还是来自于其他的机器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值