《深入理解Linux网络技术内幕》阅读笔记(二十四)

来源:互联网 发布:鹰眼图js 编辑:程序博客网 时间:2024/05/29 18:28

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
缓存:
1.邻居映射。由于任何数据都有可能被多次使用,那么缓存L3到L2的映射结果就是有意义的。不缓存错误结果(失败的地址解析),但是会将映射失败的neighbour结构设置为NUD_FAILED态,以便垃圾回收定时器能将其清除。
2.L2帧头。邻居基础结构会缓存L2帧头,这样可以缩短L3封包到L2帧的封装时间。否则,基础结构将要挨个初始化的L2帧头的每个字段。
当向一个目的地址发送第一个封包后,驱动程序就将其L2帧头保存在名为hh_cache的专用结构中。如果下一次若有封包发往同一个邻居,发送者就不需要挨个填充其L2帧头的每个字段,只需要从缓存中拷贝一个帧头就可以。
这里写图片描述
这里写图片描述
该表的查询函数:

416 struct neighbour *neigh_lookup(struct neigh_table *tbl, const void *pkey,417                                struct net_device *dev)418 {419         struct neighbour *n;420         int key_len = tbl->key_len;421         u32 hash_val;422         struct neigh_hash_table *nht;423 424         NEIGH_CACHE_STAT_INC(tbl, lookups);425 426         rcu_read_lock_bh();427         nht = rcu_dereference_bh(tbl->nht);428         hash_val = tbl->hash(pkey, dev, nht->hash_rnd) >> (32 - nht->hash_shift);429 430         for (n = rcu_dereference_bh(nht->hash_buckets[hash_val]);431              n != NULL;432              n = rcu_dereference_bh(n->next)) {433                 if (dev == n->dev && !memcmp(n->primary_key, pkey, key_len)) {434                         if (!atomic_inc_not_zero(&n->refcnt))435                                 n = NULL;436                         NEIGH_CACHE_STAT_INC(tbl, hits);437                         break;438                 }439         }440 441         rcu_read_unlock_bh();442         return n;443 }

垃圾回收:
1.同步清理。当邻居基础结构需要分配一个新的neighbour基础结构,并且这种结构专用的内存池已经用完时,内核就立即执行同步清理。
2,异步清理。异步清理是周期性的,目的是为了删除某段时间内没有用过的neighbour结构。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
当在一个设备上完全启动代理时,那么状态信息就很简单:该设备只需要关联一个标识这个标志表明是否启动了代理。另一方面,按目的地址代理需要保存被代理的地址。这些L3地址保存在hash表neigh_table->phash_buckets.
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
上图中三种情况分析:
a.空缓存。处理步骤如下:
1.L3提交要传送封包的请求。该封包要发往L3地址是192.168.1.1的目的地。
2.查询缓冲,但缓冲未命中。
3.临时将封包插入到(arp_queue)队列中。
4.发出solicitation请求。
5.收到solicitation应答。
6.缓存中增加相应的邻居项。
7.队列中的等待的封包被发送出去。
b.地址解析待定。处理步骤如下:
1.L3提交要传送封包的请求,该请求要发往L3地址是192.168.1.1的目的地址。
2.查询缓存。
3.地址不在缓冲中,但是内核已经开始解析地址的工作,因此封包被临时插入队列中,等待相关的应答。只有另一个封包正在a中的第五步等待时,才会出现这种情况。
c.完成地址解析。处理步骤如下:
1.L3提交要传送封包的请求,该请求要发往L3地址是192.168.1.1的目的地址。
2.查询缓存。
3.由于缓冲命中,封包就立刻发出去。

0 0
原创粉丝点击