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

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

2015-10-14 15:33 681 查看
在数据结构名称中的rt,fib与fn前缀分别表示路由,转发信息库和功能。



其中的节点定义:

233 struct hlist_head {
234         struct hlist_node *first;
235 };
236
237 struct hlist_node {
238         struct hlist_node *next, **pprev;
239 };


IPV4路由代码使用的主要scope:

1.RT_SCOPE_NOWHERE。被认定为非法scope。

2.RT_SCOPE_HOST:为本地配置IP地址时自动创建的路由表项。

3.RT_SCOPE_LINK:为本地配置IP地址时,派生的目的地为本地网络地址和子网广播地址的路由表项的scope就是RT_SCOPE_LINK。

4.RT_SCOPE_UNIVERSE:该scope被用于所有的通往远程非直连目的地的路由表项。

路由scope总是应当大于或等于其下一跳的scope。





for_ifa宏开始一个循环,变量ifa表示选择的每一个地址。两个宏之间的代码不需要放在花括号内部,但是通常放在花括号内部,这是为了使循环内使用的诸如ifa等变量只在该花括号内使用。

204 #define for_ifa(in_dev) { struct in_ifaddr *ifa; \
205   for (ifa = (in_dev)->ifa_list; ifa; ifa = ifa->ifa_next)




纠正图中的一个错误:策略路由的初始化应该是用的fib_rules_init函数。



int fib_sync_down(u32 local, struct net_device *dev, int force)函数:

1.当设置local参数时,fib_sync_down删除所有以local为首选源地址的路由表项。

2.当设置dev参数时,fib_sync_down删除所有的吓一跳是通过dev到达的路由表项。

这两种情况下都不是直接删除路由表项,而是通过设置RTNH_F_DEAD标识将它们标记为dead(不可用)。只有当一条多路径路由的所有下一跳都被标记为dead时,该路由项才被标记为dead。









在某些条件下,函数fib_add_ifaddr不需要添加广播地址的路由。这依赖于子网掩码长度,它保存为局部变量prefixlen中:

1.当prefixlen为32时,在子网内只有一个有效地址,所有不需要导出的广播路由或网络路由。

2.当prefixlen为31时,只有一个二进制位参与地址的分配,所有在子网内只有两个地址。如果该位为0就是表示网络地址,为1则表示主机地址。这种情况下需要这两个地址的路由,而不需要导出的广播地址的路由。

3.当prefixlen小于31时,子网内包含的地址数大于或等于4,但本地地址,网络地址和广播地址只占其中三个,此时内核就添加到广播地址的路由和到网络地址的路由。





当设备被关闭时到IP地址的路由没有被删除,这是因为他的IP地址属于主机而不是属于接口。只要与该地址相关联的设备存在,那么该地址就一直存在。

路由协议运行在用户空间,但他们需要将自己的路由知识注入到内核中,以便将他们的路由合并到内核的路由表中。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: