邻居子系统与ARP

1.什么是邻居子系统?

同属一个子网的主机,及三层概念上的下一跳。

2.邻居子系统框架


2.1 neigh_tables结构

struct neigh_table *next:该链表中除了ARP的arp_tbl,还有IPV6T的nd_tbl。

int family 邻居协议所属的地址族,ARP是AF_INET。

int entry_size arp_tbl初始化为sizeof(neighbour+4)

char *id neighbour结构实例的缓冲池名称。arp为arp_cache。

int gc_interval 垃圾回收时钟

atomic_t entries 邻居项数目

struct neigh_statistics *stats 各类统计数据

struct neighbour **hash_buckets存储邻居项的散列表,可扩容。

2.2 neighbour结构

一个邻居并不代表一个主机,而是一个ip地址。




2.3 neigh_ops结构


solicit用于发送arp请求,neigh_alloc中注册了一个定时器。定时发送

那么问一个问题 neigh_ops中德output与neighbor中的output有什么区别?neighbor中的output会被设置为neigh_ops的output。例如链路可达时就设置为connected_output。

3 邻居项状态机

状态机是邻居子系统的核心。


4 相关函数 

4.1 邻居项的创建及初始化

neigh_alloc()

根据邻居项表目判断是否需要垃圾回收

缓冲池中分配邻居项

协议无关的初始化

neigh_create()

neigh_alloc()

三层协议地址和输出设备的赋值

协议相关的初始化。ARP中为constructor()

检查散列表容量,如果不足,扩容。添加到散列表。

4.2 邻居项的查找

便历桶,检验输出设备,比较三层地址。

4.3 发送

慢速发送:


快速发送:

目的路由缓存项缓存了链路层首部。调用neigh_hh_output()。

需要添加硬件首部。


5. ARP

5.1 ARP报文格式

           arp是一个三层协议,封装在MAC帧中,协议号0x0806

5.2初始化

         arp_init()在inet_init()中调用,初始化邻居表,注册协议,创建proc文件。

5.3邻居项指针表

5.4ARP报文的发送

        发送函数是arp_solicit()目的MAC地址缺省为ffffffff

5.5 ARP的处理

      图18-2截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值