您的位置:首页 > 理论基础 > 计算机网络

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

2015-10-11 22:34 447 查看






















缓存:

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.由于缓冲命中,封包就立刻发出去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: