这里主要是针对linux下的路由一些基本概念.

1 路由是位于L3(ip层)。

2 路由表(routing table)也叫做Forwarding Information Base(FIB).

3 路由器之间通过路由协议(routing protocols)进行信息的交换.

4 一个路由表包含了一大堆的路由,一个路由就是存储了一些传输数据包到给定地址的必须信息。在linux里面一个路由主要包括了这三个参数,分别是目的网络地址,需要使用的设备以及下一跳网关(next hop gateway)。

5 路由器一般会被设置成下面三种情况。

a 不同的网段对应路由器不同的网络接口

b 路由器在同一个lan有2个网络接口,这两个网络接口被配置成不同的子网.

6 对称路由(symmetric route)和不对称路由(asymmetric route),其中对称路由指的是从HOST a到HOST b所走的路由和从HOST b到HOST a所走的路由是相同的,而不对称则刚好相反。

7 metric是一个可选的,能够配置到一个路由选项的参数。这里注意,这个metric和路由协议中的metric是完全不同的。具体是起什么作用,还没太搞懂。

8 scope,ip地址和路由都有一个域的概念,主要是告诉内核他们起作用的上下文。在linux中,路由的域表明了目的网络和本机的距离。而ip地址的域说明了这个ip地址的作用域。在linux中一共有3种作用域,分别是HOST,LINK(对于ip地址来说说明这个地址是只在lan中使用,而对于route来说目的的地址在lan中),Universe/global(广域网的地址,对于route来说要到达这个地址肯定会多于1跳).

要注意,域的默认值是Universe,也就是说你不显示指明,则默认都是Universe,下面就是我的电脑里面的路由和ip的一些信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  
[diaoliang@T-diaoliang project]$ ip route list

10.13.116.64/26 dev eth0 proto kernel scope link src 10.13.116.71 metric 1

//默认路由都是Universe,via表示下一跳的网关地址。

default via 10.13.116.126 dev eth0 proto static

[diaoliang@T-diaoliang project]$ ip address

1: lo: …………………

…………………..

inet 127.0.0.1/8 scope host lo

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: eth0: ………………………

………………………………………..

inet 10.13.116.71/26 brd 10.13.116.127 scope global eth0

inet6 fe80::225:64ff:fec1:d586/64 scope link

valid_lft forever preferred_lft forever

9 在一个网卡配多个网络地址,以前(使用ifconfig)需要设置虚拟设备(eth0:0, eth0:1).而现在则(IPROUTE)直接用ip address来添加地址就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  
[diaoliang@T-diaoliang ~]$ sudo ip address add 10.13.116.67/26 dev lo

ip address

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

inet 10.13.116.67/26 scope global lo

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

10 linux默认使用两个路由表,一个是针对本地的地址.一个是针对非本地的地址。

11 action,当从路由表得到得到对应的路由(下一跳和输入设备)之后,默认就是forward这个数据包根据返回的路由信息。但是linux提供了一个可选的action选项,这个选项可以在用ip 设置的时候指定。一共分为4种类型,分别是:

a Black hole,匹配这个类型,则数据包会被丢掉。

b Unreachable,匹配这个类型,则数据包被丢掉并且生成一个ICMP的unreachable的消息。

c Prohibit ,匹配这个类型,则数据包也会被丢掉,并且生成一个ICMP的filterd的消息。

d Throw, 这个类型被policy routing使用.

12 路由cache, 路由cache将会被remove, 而multipath cached routing已经被remove掉了。

http://git.kernel.org/?p=linux/kernel/git/davem/net-next-2.6.git;a=commitdiff;h=e06e7c615877026544ad7f8b309d1a3706410383

http://comments.gmane.org/gmane.linux.network/185987

13 路由查找,步骤是这样子的。

a 首先在cache查找,如果找到则route 这个包到下一跳。

b 然后在本地地址查找(本地地址的路由表).如果找到则route 这个包

c 然后在非本地的路由表里面查找。

d 如果都没找到,则丢掉这个数据包.

最简单的情况,对于一个目的地址,只会匹配一个路由。复杂的时候,一个目的地址会返回多个路由,这个时候,内核会首先选择LPM算法(Longest Prefix Match), 接下来解释一下LPM。

假设我们有一个目的地址是10.0.0.100,然后匹配了2个路由,分别是10.0.0.0/16和10.0.0.0/24,这个时候由于第二个是24位,所以将会选择第二个路由。

还有一种更复杂的情况,那就是匹配的路由的prefix长度是相同的,还是上面的例子,如果返回两个路由,都是10.0.0.0/24,只不过下一跳的地址不同。所以,内核在使用LPM的同时,还使用了TOS(Type of service)作为一个key。而当tos都相同的时候,内核将会选择更高优先级的路由,如果优先级也相同,内核将会按照顺序选择第一个路由。

14 multipath routing, 对于一个路由,提供多个下一跳,命令如下:

1
2
  
ip route add default scope globale nexthop via 100.100.100.1 weight 1 nexthop via 200.200.200.1 weight 2

可以看到加了两个下一跳,然后每一个都有一个权重(weight),而最终选择那个nexthop,主要是根据权重值.内核使用的算法并不是简单的大小比较,它使用了一个随机的算法来选择nexthop(类似round-robin).

15 插入路由信息到内核,使用3种方法。

a 静态的config(ip route/ route).

b 使用一些路由协议(BGP/EGP/OSPF) 来进行动态的config。

c 内核收到ICMP redirect 消息。

b方法中,会在用户空间运行一个daemon进程,这个进程主要是实现了很多路由协议,然后根据协议之间的交互信息,来修改内核中的路由表。比如有Routed,GateD,BIRD.