除了网关,如何选择下一跳,如何去最快的将包传递过去呢?
那么首先说,路由器本身就是一台网络设备,其具有多张网卡,当一个入口的网络包传递到路由器的时候,会根据本地的转发信息库,来决定如何去转发,这个转发的信息库可以叫做路由表
一个路由表中包含着多条路由规则,每一条规则至少包含着三项信息
1.目的网络:去哪
2.出口设备:哪个口出去
3.下一跳的网关,下一跳的路由器地址
这个可以通过ip route命令配置
假如我们设置ip route add 10.176.48.0/20 via 10.173.32.1 dev etho0,意味着要去10.176.48.0/20的网络都从etho端口出去,下一跳是10.173.32.1
这种配置方式的核心思想是:根据目的IP路由来配置路由
如何配置策略路由:
在真实的网络环境中,除了根据目的ip地址来配置路由外,可以根据多个参数来配置,就是策略路由
可以配置多个路由表,根据源IP,入口设备,TOS来选择路由表,然后在路由表中查找路由
让来源不同的包走不同得路由
比如,我们设置
ip rule add from 192.168.1.0/24 table 10
ip rule add from 192.168.2.0/24 table 20
这就说明,从192.168.1.0/24来的,走table10中的路由表,从192.168.2.0/24来的,走table20的路由表
然后可以定义一条路由走多个路径,根据权重的不同
比如下面
ip route add default scope global nexthop via 100.100.100.1 weight 1 nexthtp via 200.200.200.1 weight 2
下一跳有两个路径,权重分别是1 和 2
有什么场景能够用到这种复杂的配置呢?
加入我们家中有两个网线,两个运行商的带宽不同,有两个租户,在内网分别是192.168.1.101/24和
192.168.1.102/24
网关是192.168.1.1/24
网关在路由器上
家中的网段是私有网段,出去的包需要转成NAT网段的IP地址
两个运营商要为这个网关配置一个公网的IP地址
整体的配置如上
我们需要配置一下整体的网络路由
ip route list table main
60.190.27.189/30 dev eth3 proto kernel scope link src 60.190.27.190
183.134.188.1/32 dev eth2 proto kernel scope link src 183.134.189.34.32
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.1
127.0.0.0/8 dev lo scope link
default via 183.134.188.1 dev eth2
路由器的整体规则就是如果去运营商2,就走eth3
如果去运营商1,就走eht2
如果去内网,就走eth1
如果所有的规则都匹配不上,默认会走运营商一(eth2),走快的网络
那么,假设只给组户A走带宽比较低的网络,该如何配置呢?
我们新加入一个表,叫chao
echo 200 chao >> /etc/iproute2/rt_tables
添加一个规则
0: from all lookup local
32765: from 10.0.0.10 lookp chao
32766: from all lookup main
32767: from all lookup default
ip route add default via 60.190.27.189 dev eth3 table chao
ip route flush cache
默认的路由走慢的,少的网络还能这样折腾,多的可以就不容易了
接下来就是动态路由算法
使用动态路由算法,我们可以根据路由协议算法生成动态路由表,随着网络运行变化而变化
我们可以想象一下,如果去西天取经,如何找最短路径问题,就是对应的动态路由算法
常见的图求最短路径的算法有两种,Bellman-Ford算法和Dijkstra算法
1.距离矢量路由算法
基于了Ballman-Ford算法,这种的实现的思路就是,每个路由器都保存一个路由表,包含了多行,每一行都对应的包含了两部分信息,一部分是到目的路由器的方向,一部分是距离
可以看出来,每个路由器都是知道全局的信息的,那么是如何感知的呢?
每个路由器都知道自己和邻居的距离,然后每个路由器都将自己能够到达的路由器的距离告诉给邻居,邻居告诉邻居,然后计算出了距离
但是有问题
1,好的消息传得快,坏的消息传的慢
如果有个路由器加入了这个网络,他的邻居很快就能知道,但是一旦路由器挂了,因为挂了是没有广播的,每个路由器一旦发现原来的道理到不了了,就尝试用其他的路径访问,直到试过了所有的路径,才能确定其已经挂了
2.
这样的时候,如果A和B建立了通道,B和C建立了,B距离A的距离是1,C距离B是1,A距离C是2
A挂掉了,B和A是邻居,发现连不上了,于是找C,而C和A的距离是2,那么就会把自己设置为3,然后C连A,于是又把自己设置为了4,依次类推,直到超过了一个阈值,才能判定是否真的挂了
3,每次发送的时候,都要发送整个全局的路由表,网络太大了,就很难受了,所以适合小型网络的搭建,现在一个数据中心的内部数目很大,就不适用了
2.链路状态路由算法
基于了Dijkstra算法
就是一个路由器启动的时候,首先发现了邻居,然后向邻居say hello,邻居回复后计算距离,然后将将自己和邻居的状态包广播租出去,发送到整个的网络的每个路由器里面,这样每个路由器都能收到他和邻居的关系的信息,因此,每个路由器都能在自己的本地构建起一个完整的图,然后针对这个图使用Dijkstra算法,找到最短路径
他们不需要在更新的时候发送整个路由表,而是只广播更新或者变化的网络拓扑,一旦一个路由器挂了,其邻居会广播这个消息,使得坏消息快速收敛
动态路由协议
1.基于链路状态路由算法的OSPF,开放式最短路径有限,基于链路状态的路由协议,常用于在数据中心内部,用于路由决策,因为被称为内部网关协议,简称IGP
内部网关协议的重点就是找到最短的协议,在一个组织内部,经常要求路径最短,当然如果发现了多个最短的路径,可以在这个路径之间进行负载均衡,被称为等价路由
这种协议可以分摊流量,在一条路不通的时候,走另外的一条路,在我们将数据中心的网络时候,往往在接入层还有负载均衡,可以和OSPF结合,实现高吞吐量的接入层设计
2.基于矢量路由算法的BGP协议
一般用于外网的通信,可以用于国家之间,称为外网路由协议
在一个国家内部,我们一般会选择近的路去走,但是国家之间,可以能有些政策上的差异
可能有的不让你过,所以需要我们去避开
对于网络包,每个数据中都设置自己的Policy,例如,哪些外部的IP,可以让内部知晓,哪些可以过,那些不能过,这就好比,虽然我离着目标近,但是外人是不能走我家的院子的
于是,每个内部数据网络都是一个自治的系统AS(Autonomous System),那么对于自治的系统,分成了几种类型
1.Stub AS,只有外部链接,不会传递其他的AS的包,大多拒绝帮忙传输
2.Multihomed AS:可能有多个链接到其他的AS,但是拒绝大多数的请求传输
3.Transit AS:有多个链接到外部的AS,可以帮助其他的AS传输包,比如主干网
每个AS都有自己的边界路由器,通过这个和外部建立关系
BGP分为两种,eBGP和iBGP,在多个AS之间,彼此的路由器使用eBGP来广播路由,在内部,我们使用iBGP,让内部路由器能够找到到达外网目的地最好的边界路由器
之前我们说了距离矢量路由协议的缺点,一个是收敛慢,在BGP中,除了下一跳hop,还包含了AS的路径,可以说,之前可能出现的彼此来回增长距离,直到阈值才停止的问题,可以利用路径来避免这个问题,因为C直到自己是通过B连接到的A,一旦B连不上A了,自己也连不上了
小结:
路由分为了静态路由和动态路由,静态路由可以配置较为复杂的策略路由,让不同的租户走不同的路
动态路由主流算法分为了 距离矢量算法和链路状态算法,基于两种算法产生的两种协议OSPF和BGP协议
课后思考:
1.路由器之间交换信息,是走路由吗?
2.路由器之间的信息交换是什么协议?报文格式呢?
BGP的信息交互,走的是TCP,OSPF走的是UDP
ospf发送的是ip包,而bgp使用的tcp协议,路由器之间建立了tcp连接,每60s发送一次keep alive消息
路由器之间的协议走的时候组播报文,组播报文走的是专门的组播路由协议
组播报文的地址是专用的地址,用于传输路由信息
AS是指的是一家公司的一个数据中心这样的一个概念,接入的是各个运营商的网络,运营商的网络也是数据中心的里面,运营商之间走的BGP协议
多线的BGP机房是怎么回事
很多主机商卖主机的时候,强调自己是BGP机房多线接入,虽然只有一个IP,但是和多个运营商访问延迟都低,如何做到的?
BGP主要用于互联网AS自治系统之间的互联,
使用此方案来实现多线路互联,IDC需要在CNNIC或者APNIC申请自己的IP地段或者AS号,然后通过BGP协议将网段IP广播到其他的网络运营商网络中
BGP协议互联后,网络运营商所有骨干路由设备会判断IDC机房,IP段最佳路由,来保证不同运营商的告诉接入