1、直连路由:直接连接在路由器接口的网段,有路由器(配置完路由器网络接口的ip地址后)自动生成;
当接口的物理层和数据连接层正常时候,直连路由会自动出现在路由表中;当此接口down掉后,此条路由会自动在路由表中消失;
2、非直连路由:不是直接连接在路由器接口上的网段,此记录需要手动添加(静态路由)或者是使用动态路由。
分类:内部网关协议(IGP:链路状态----OSPF;距离矢量-----RIP;)、外部网关协议(BGP)
(1)发现邻居,了解其网络地址;(发送一个特殊的hello,返回一个应答)
(2)设置到每个邻居节点的度量值(延时、带宽、流量);
(3)构造链接状态包;(每个节点链接的邻居以及到其邻居的度量值); 类型下图C的;
(4)洪范链路状态包到所有的路由器,并接受其他路由器发过来的包。
节点每发生一个链路状态包,seq加1;并且路由器会记录下他所看到的所有源路由器、序列号对;
其他节点,接收到包后,根据记录进行比对;
如果是新的分组,则会从其他端口发送洪泛;如果是分组重复,则丢弃;如果接受的seq<记录的seq,则拒绝;
可能遇到的问题:
1、路由器突然崩溃,则seq会从0开始,发生数据包。其他节点接受的seq(0)<记录的seq,则会丢弃;
2、如果seq字段(32bit),在传输的时候发生错误(比如4变成了65540),则其他路由器,接到了这个节点发送的数据包seq是5到65540的时候,则会直接丢弃;
可用age进行解决:
每个分组都有age的值,其值每秒减1,age=0时,丢失该分组;
一般每隔一段时间(比如10s)一个分组就会到来。所以只有Down机的时候才可能导致超时;
①假设路由器A发送LSP给路由器B,B记录下收到的A的LSP的信息后A崩溃了,此时路由器B上记录下的A的LSP对应的age已经开始倒计时,当A再次启动通常age已经倒计时到零,A的LSP被B扔掉了所以当重启后的A发送的LSP再次来到B,B上已经没有A的记录,新到达的LSP被重新记录而不会被当做一个旧的分组扔掉;
②当某个LSP的序列号被损坏了,变成了另外一个序列号,由于序列号的连续性,损坏后的序列号并没有后续的序列号跟上,所以损坏后的序列号对应的那个LSP很快就会因为age倒计时到零而被丢弃,正确序列号的LSP将会被重新纪录;
进一步增加其健壮性:
当一个链路状态分组到达一个路由器后,路由器并不直接转发,而是先被放在保留区中等待一段时间。
如果这个数据被转发之前,另一个接收到了来自于同一源路由器的链路状态数据包也到来了。如果seq相同,则重复,丢弃;如果seq不等,则丢弃老的数据包。为了防止线路产生错误导致丢包和错包,所有的链路状态数据包都要被确认。
1、B的直接连接有AFC,假如B收到了源路由器是A的链接状态包,则像CF泛红发送,确认收到A的包。
2、第二行同样,收到F的数据包后,需要像AC发送,并确认收到F的数据包;
3、第三行E的数据包,分别通过EAB和EFB到达,则B接受到后,需要像C发送,并确认收到AF发来的数据包。
4、如果表中第4项被转发出去之前,C的链接状态包从F到达一个副本,则只A进行发送(F不在发送),同时,确认收到从F到来的数据包(100011);
(5)每个节点跟进接受到的链接状态包,组成拓扑图,求出它到此系统中其他所有节点的最小路径(Dijkstra算法);
基本思想:每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。
1、选定源点,有与源点直接的节点,用度量值表示此节点到源点的路径,不与源点直连的,∞代替;
2、选出那个与源点的度量值直接连接最小的节点(第2点);并以第2个点为中心点,重新计算源点到其他未选中各个节点的路径值(经过第2点)。如果比原先的值大,则不改变;比原先的值小,则改变;
3、以节点2为中心,选出剩余的未选出的节点中距离节点2最小的路径值的节点(节点3),再依次计算从源点出发,经过节点3直连后到达剩余各个节点的距离值,比较修改;.
4、最终得出最小路径值;
(1)、每个路由器都维护一张表,表中包含当前已知到网络中各个目标的最佳距离,所使用的链路(下一跳);
(2)、在邻居路由器之间相互交换路由信息(1表);
(3)、每个路由器根据收到的路由信息,更新自己(维护)的表,最终确定到各个目标的最佳链路;
注意:这里的路由器维护的一张表中,通常只有两个属性(目的网络,距离),也就是说没有下一跳,经过谁,所以会产生环路的情况;
存在问题:
原先:Y到Z是1,Y到X是4;Z到X是5(经过Y);当Y与X之间的链接费用变坏,增大到60的时候;Y发现他现在到X变成了60(大于了原先的4),而又通过交换路由表得知Z到X是5(Y不知道其实Z到X是通过自己的,它或者想着是Z直接链接的那个链接是5呢?),而Y到Z是1,这样Y想,既然这样,如果我经过Z到X才6,明显比60小。
存在问题:水平分割或者毒性逆转
水平分割原理:在路由信息传送过程中,不再把路由信息发送到接收到此路由信息的接口上。即如果路由器从接口X学习到了新的路由信息R(目的网络R),并进行更新;那么,从该接口(X)发出的新的路由信息,不包括该条路由信息R(目的网络R)。
毒性逆转原理:即如果节点A到节点C中间是经过了节点B(A---B--C);那么A会告诉经过的节点(B),到目的节点(c)的距离是∞;即:如果路由器从端口X学到路由信息(R)并更新路由表,则新的路由信息从也会端口X发出包含R的信息,只是将该条信息的度量值变成无穷大。
毒性逆转的局限性:
但是,当涉及3个或更多节点(而不仅仅是两个直接相连的邻居节点)的环路将不能被毒性逆转技术检测到,如下例:
当C和D之间的连接断开时,依次发生如下事件: A收到来自C的坏消息,然后将选择从B到达D A向C发送更新报文 C向B发送更新报文 这种问题出现的原因是,A和B无法同时收到来自C的更新报文然后更新自己的距离向量。比如这里,B与A相比得到的更新报文时间要晚,这就给A造成了“错觉”,在A看来,虽然从C到不了D,但是选B也可以。然后它又把这个错误的好消息告诉了C,让C也以为自己又和D团聚了。最后,终于想到忽略了B,又发送了报文给B。这样,A、B、C都以为自己和D联系上了。但实际上D和它们已经隔离了。。。
设想,如果不分层管理,假设全球有6亿个不同的路由信息,全部都存储在路由表中,需要多大的内存,路由表在查询时候需要多长时间?如果不分层,收敛速度要多慢,能保证路由表快速刷新一致吗?如果不分层,网络中将会充斥着大量的链路状态信息在传送、大量的DV在交换,用户的信息怎么传送?
将若干个路由器聚合成一个区域,也就是一个自制系统;