《深入理解Linux网络技术内幕》阅读笔记(二十九)
2015-10-14 15:33
681 查看
在数据结构名称中的rt,fib与fn前缀分别表示路由,转发信息库和功能。
其中的节点定义:
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等变量只在该花括号内使用。
纠正图中的一个错误:策略路由的初始化应该是用的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地址属于主机而不是属于接口。只要与该地址相关联的设备存在,那么该地址就一直存在。
路由协议运行在用户空间,但他们需要将自己的路由知识注入到内核中,以便将他们的路由合并到内核的路由表中。
其中的节点定义:
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地址属于主机而不是属于接口。只要与该地址相关联的设备存在,那么该地址就一直存在。
路由协议运行在用户空间,但他们需要将自己的路由知识注入到内核中,以便将他们的路由合并到内核的路由表中。
相关文章推荐
- 在java网络编程中实现服务器和客户端一对一的聊天
- Android中间httpclient发送帧get求
- HttpClient异常总结
- 《UNIX网络编程》读书笔记1---简介和TCP/IP
- 一种基于浏览器内核修改的复杂网站layout/渲染bug的HTTP重放调试系统
- http://www.cnblogs.com/AloneSword/p/3821569.html
- 网络编码究极入门贴
- NSURLSession类分析
- IOS Android Tomcat SSL双向认证HTTPS访问
- 检测SDWebImage有没有缓存图片 IOS 获取网络图片大小
- WP开发 - HttpWebRequest的GetResponse或GetRequestStream的超时问题
- OSI模型之网络层概述
- Heritrix3.3.0源码阅读 crawler-beans.cxml中处理器链的配置
- 如何解决在Azure上部署Sqlserver网络访问不了
- C++ 用libcurl库进行http通讯网络编程
- SVN服务器迁移,SVN版本库迁移(网络copy)
- 流媒体协议引见(rtp/rtcp/rtsp/rtmp/mms/hls)
- AndroidHttpClient详解及调用示例
- IOS-11-关于AFNetworking访问网络超时的设置
- 20个你可能不知道的 Linux 网络工具