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

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

2015-10-14 01:39 806 查看




假设需要执行以下两个策略:

1.从校园网1到校园网3的流量要通过路由器RT1,从校园网2到校园网3的流量要通过RT2。

2.从校园网1到因特网的流量要经过DG1(默认网关1),从校园网2到因特网的流量要通过DG2.



注:因为eth0和eth1各自只连了一个局域网,所以不需要指定下一跳地址,只需指定出口设备即可。

因为在每次路由查找时,都可能要检查多个条件,所以主机维护多张独立的路由表,根据特定的条件选择正确的路由表,可以更快查找出路由。



当使用策略路由时,为目的地查找路由可分为两个步骤:

1.根据配置策略选择要用的路由表,这个额外任务不可避免地增加了路由查找时间。

2.从选择的路由表中查找路由。

当然,内核执行这两步骤之前,总是先在路由缓存内查找。

内核可以基于以下参数作为在选择路由表时所用的策略:

1.源IP地址与/或目的IP地址。

2.入口设备。

3.TOS。与基于流量的源地址和目的地址参数相比,TOS参数有助于划分流量类型。

4.Fwmark。Linux防火墙威力的一个特性。







选择下一跳,可以用加权循环算法实现:内核定义循环预算为所有下一跳的总和,每个下一跳的预算初始值为它的权值。在每个循环,内核在0到总循环预算之间生成一个随机数。然后它遍历下一跳列表,直到找到某个下一跳的预算大于或等于该值。在一个下一跳被选择后,将循环预算和被选中下一跳的预算都递减。



给定一条多路径路由,对于与该路由项匹配的流量,在下一跳之间分配时可以基于流,基于连接或者封包:

1.基于流 Per flow:根据每个源IP地址和目的IP地址的唯一组合选择下一跳。

2.基于连接 Per connection:每当启动一个新连接时选择一个下一跳(标识元素包含了端口号)。

3.基于封包 Per packet:根据每个封包来选择下一跳。



在流量控制子系统可用的许多分类器中,有一种称为基于路由表的分类器,它能够给予realm来讲路由分配。Realm是可以在策略和路由上指定的数字标签(该标签会被流量控制子系统使用)。



如上图所示,假设该路由器收到一个来自主机10.0.1.100(Realm A)且目的地址为10.0.2.200(Realm B)的封包。其路由标签计算过程如下:

1.路由查找返回的是路由R2和策略P1.因为在路由R2上没有配置Realm,所有使用策略P1上的源Realm A。//也就是说此时R2的源Realm为Realm A.

2.因为没有初始化目的Realm,内核计算从10.0.2.200到10.0.1.100的反向路由。这一次路由查找返回的是路由R1和策略P2.在匹配的路由R1上还是没有配置Realm,所以内核依赖于策略Realm,即Realm B。但是因为这是在反向查找的时候发现的,所以反向路径上的源Realm B被用作转发路径上的目的Realm。

最终,路由标签被初始化为源Realm A和目的Realm B。当流量通过QoS层时,QoS层可以使用这两个realm来将封包正确地分类。

流程可参考下图:







一个IP主机永远不会对不属于本地配置子网的IP地址发送ARP请求。但是这种行为其实是有可能的,因为在路由缓存中包含有重定向路由的话,就可以绕过路由表。虽然主机A和主机B都连到同一个共享介质,并且因此能够在链路层相互通信,但是从IP层来看是不可能的。









注:上图源地址应该为10.0.1.150.

Linux的默认行为认为非对称路由是可疑的,因而将根据理由表丢弃那些源IP地址通过接收接口为不可到达的封包。上图a中,Linux检测出了这种企图,并将这种封包丢弃,而b中则没有。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: