前言:
网络层的控制平面控制端到端之间数据是如何转发的,而且控制网络层组件和服务如何配置和管理。
目录
一、路由选择算法
路由器中的转发表的构造离不开路由选择算法。路由选择算法就是在网络的这个图中找到合适的那条路。
1.算法分类
- 全局:
- 所有的路由器拥有完整的拓扑和边的代价的信息
- “link state” 算法
- 分布式:
- 路由器只知道与它有物理连接关系的邻居路由器,和到相应邻居路由器的代价值
- 叠代地与邻居交换路由信息、计算路由信息
- “distance vector” 算法
- 静态:
- 路由随时间变化缓慢
不能适应网络拓扑和通信量的变化,路由表是事先计算好的- 动态:
- 路由变化很快
- 周期性更新
- 根据链路代价的变化而变化
能适应网络拓扑和通信量的变化
2.链路状态算法
链路状态算法(Link State , LS )是一种具有全局信息的算法。上帝视角看网络连线。底层计算路径使用的是Dijkstra算法,获得网络上其他路由位置和其他信息是利用广播的形式。
实践中每个节点向网络中所有的其他节点广播链路状态分组,每个链路状态分组包含它所链接的标识和开销,广播的结果就是所有节点都具有该网络体系下统一、完整的视图。基于这张图,利用Dijkstra算法算出最低开销路径。
LS路由的基本工作过程
- 发现相邻节点,获知对方网络地址
- 测量到相邻节点的代价(延迟,开销)
- 组装一个LS分组,描述它到相邻节点的代价情况
- 将分组通过扩散的方法发到所有其它路由器以上4步让每个路由器获得拓扑和边代价
- 通过Dijkstra算法找出最短路径(这才是路由算法)
- 每个节点独立算出来到其他节点(路由器=网络)的最短路径
- 迭代算法:第k步能够知道本节点到k个其他节点的最短路径
3.距离矢量算法
距离矢量算法(Distance-Vector,DV)是一种迭代、异步、分布式的算法。
- 分布式:每个节点都要从一个或者多个直接相连邻居接收其信息,执行计算,然后将其计算结果分发给邻居。
- 迭代:此过程要一直持续到邻居之间无更多信息要交换为止,也就是到达一定程度后,就到达收敛的状态
- 异步:不需要所有节点互相统一步伐的操作。
距离矢量路由选择的基本思想
- 各路由器维护一张路由表,结构如图(其它代价)
- 各路由器与相邻路由器交换路由表(待续)
- 根据获得的路由信息,更新路由表(待续)
- 代价及相邻节点间代价的获得
- 跳数(hops), 延迟(delay),队列长度
- 相邻节点间代价的获得:通过实测
- 路由信息的更新
- 根据实测得到本节点A到相邻站点的代价(如:延迟)
- 根据各相邻站点声称它们到目标站点B的代价
- 计算出本站点A经过各相邻站点到目标站点B的代价
- 找到一个最小的代价,和相应的下一个节点Z,到达节点B经过此节点Z,并且代价为A-Z-B的代价
在计算路径的时候,使用的是Bellman-Ford方程,这个方程本质上是动态规划算法,下面方程表示x节点到y的最低开销路径的开销。v可以理解为x和y的是中间节点,当v不存在时,两节点最近了。
dx (y) = min {c(x,v) + dv (y) }
实例过程:
算法存在的问题:
链路开销改变&链路故障--->无穷计算问题
无穷计算问题:DV算法的好消息传的快,坏消息传的慢
好消息的传播以每一个交换周期前进一个路由器的速度进行,这个就是畅通无阻,跑起来快,没有阻碍。
坏消息的传播速度非常慢,这是因为当链路开销发送改变或者链路障碍时,消息传递的比较没这么快,每个节点还那种之前的那一份转发表,很显然发送意外后,那份表没得用了。但是节点得到固定时间才能拿到新的表(信息差问题),此时它会进行无穷计算
举一个例子:
有一条链路A——B——C,假如A路由器断掉了,B无法到达A了,这时只有B知道,而C不知道,造成了一个信息差。B在告诉C之前,C还是以之前到达A的路径进行转发,而这时C的分组到达了B进行信息交换,但是B误以为C可以到A(B以为 B——C——A),所以B将跳数+1,然后B把这个分组发回给C,C任然认为B是C——B——A,然后发给B继续跳数+1........然后进入了一个死循环,直到更新转发表。
对于这种问题的解决,官方使用了:水平分裂+毒性逆转的方法解决
水平分裂:禁止把在一个接口上接收到的关于一个网络的路由信息再在同一接口上通告,以避免回路的发生(即使这样也存在问题,只能避免大部分问题)
- A,B到D的距离为2, C到D的距离为1
- 如果C-D路径失败
- C获知到D为INF,从A,B获知到D的距离为INF,因此C认为D不可达
- A从C获知D的距离为INF,但从B处获知它到D的距离为2,因此A到B的距离为3,从B走
- B也有类似的问题
- 经过无限次之后,A和B都知道到D的距离为INF
毒性逆转:增加跳数限制,可以理解为TTL(Time To Live),一定跳数后直接修改为不可到达,在RIP 协议中限制为16跳
使用水平分裂+毒性逆转,就是静止无限次数访问,在某种情况下,即使发送故障向着无限次数的趋势发展,也会因为毒性逆转设置的跳数而停止。
3.LS算法与DV算法比较
- 消息复杂度(DV胜出)
- LS: 有 n 节点, E 条链路,发送报文O(nE)个
- 局部的路由信息;全局传播
- DV: 只和邻居交换信息
- 全局的路由信息,局部传播
- 收敛时间(LS胜出)
- LS: O(n2) 算法
- 有可能震荡
- DV: 收敛较慢
- 可能存在路由环路
- count-to-infinity 问题
- 健壮性: 路由器故障会发生什么(LS胜出)
- LS:
- 节点会通告不正确的链路代价
- 每个节点只计算自己的路由表
- 错误信息影响较小,局部,路由较健壮
- DV:
- DV 节点可能通告对全网所有节点的不正确路径代价
- 距离矢量
- 每一个节点的路由表可能被其它节点使用
- 错误可以扩散到全网
2种路由选择算法都有其优缺点,而且在互联网上都有应用
二、自治系统内/外部路由
自治系统(Autonomous System,AS),每个AS由一个通常处在相同管理下的路由器组成。通常由在一个ISP中的路由器以及互联网他们的链路组成。一个AS由其全局唯一的AS号所标识。
AS之间的路由的规模问题
- 增加一个AS,对于AS之间的路由从总体上来说,只是增加了一个节点=子网(每个AS可以用一个点来表示)
- 对于其他AS来说只是增加了一个表项,就是这个新增的AS如何走的问题
- 扩展性强:规模增大,性能不会减得太多
各个AS可以运行不同的内部网关协议
可以使自己网络的细节不向外透露
1.自治系统内部
1)RIP
RIP协议是DV算法的一个实际应用,RIP协议运用于小型AS内部中
特点:
- 距离矢量:每条链路cost=1,# of hops (max = 15 hops) 跳数
- DV和邻居交换DV通告
- 定期(30秒)交换,而且在改变路由的时候发送通告报文
- 在对方的请求下可以发送通告报文
- 每个通告包括:最多25个目标子网
- 发现经过这个邻居的路由已失效
- 新的通告报文会传递给邻居
- 邻居因此发出新的通告 (如果路由变化的话)
- 链路失效快速地在整网中传输
- 使用毒性逆转(poison reverse)阻止ping-pong回路 (不可达的距离:跳数无限 = 16 段)
- RIP 以应用进程的方式实现:route-d (daemon)
- 通告报文通过UDP报文传送,周期性重复
- 网络层的协议使用了传输层的服务,以应用层实体的方式实现
RIP协议报文格式:
2)OSPF
OSPF协议及其关系密切的洗衣IS-IS都被泛用于因特网。OSPF是也是运用于AS中,但是范围比RIP的大。底层使用了泛洪链路状态信息和Dijkstra最低开销路径算法。
特点:
- 使用LS算法
- LS 分组在网络中(一个AS内部)分发
- 全局网络拓扑、代价在每一个节点中都保持
- 路由计算采用Dijkstra算法
- OSPF通告信息中携带:每一个邻居路由器一个表项
- 通告信息会传遍AS全部(通过泛洪)
- 在IP数据报上直接传送OSPF报文 (而不是通过UDP和TCP)
- IS-IS路由协议:几乎和OSPF一样
高级特性(RIP没有)
- 安全: 所有的OSPF报文都是经过认证的 (防止恶意的攻击)
- 允许有多个代价相同的路径存在 (在RIP协议中只有一个)
- 对于每一个链路,对于不同的TOS有多重代价矩阵
- 例如:卫星链路代价对于尽力而为的服务代价设置比较低,对实时服务代价设置的比较高
- 支持按照不同的代价计算最优路径,如:按照时间和延迟分别计算最优路径
- 对单播和多播的集成支持:
- Multicast OSPF (MOSPF) 使用相同的拓扑数据库,就像在OSPF中一样
- 在大型网络中支持层次性OSPF(划分区域)
OSPF的区域
为了使OSPF能够运用于规模大的网络,OSPF将一个AS在划分为若干个更小的范围,称为区域。每个区域都有一个32位的区域标识符(点分十进制表示)区域也不能太大,在一个区域内路由器最好不超过200个
此图中R3、R4、R7既是区域边界路由器也是主干路由器
区域边界路由器: “汇总(聚集)”到自己区域内网络的距离, 向其它区域边界路由器通告.主干路由器: 仅仅在骨干区域内,运行OSPF路由自治系统边界路由器:链接其他AS‘s区域内部路由器: 顾名思义
2.自治系统外部
自治系统外部使用的是BGP协议,做简单了解(这个协议本身十分复杂)
- BGP (Border Gateway Protocol): 自治区域间路由协议“事实上的”标准
- “将互联网各个AS粘在一起的胶水”
- BGP 提供给每个AS以以下方法:
- eBGP: 从相邻的ASes那里获得子网可达信息
- iBGP: 将获得的子网可达信息传遍到AS内部的所有路由器
- 根据子网可达信息和策略来决定到达子网的“好”路径
- 允许子网向互联网其他网络通告“我在这里”
- 基于距离矢量算法(路径矢量)
- 不仅仅是距离矢量,还包括到达各个目标网络的详细路径(AS序号的列表)能够避免简单DV算法的路由环路问题
BGP报文
使用TCP协议交换BGP报文.
BGP 报文:
- OPEN: 打开TCP连接,认证发送方
- UPDATE: 通告新路径 (或者撤销原路径)
- KEEPALIVE:在没有更新时保持连接,也用于对OPEN 请求确认
- NOTIFICATION: 报告以前消息的错误,也用来关闭连接
- 路由器可能获得一个网络前缀的多个路径,路由器必须进行路径的选择,路由选择可以基于:
- 本地偏好值属性: 偏好策略决定
- 最短AS-PATH :AS的跳数
- 最近的NEXT-HOP路由器:热土豆路由
- 附加的判据:使用BGP标示
- 一个前缀对应着多种路径,采用消除规则直到留下一条路径
BGP路径通告
- 路由器AS2.2c从AS3.3a接收到的AS3,X路由通告 (通过 eBGP)
- 基于AS2的输入策略,AS2.2c决定接收AS3,X的通告,而且通过iBGP)向AS2的所有路由器进行通告
- 基于AS2的策略,AS2路由器2a通过eBGP向AS1.1c路由器通告AS2,AS3,X 路由信息,路径上加上了
- AS2自己作为AS序列的一跳
网关路由器可能获取有关一个子网X的多条路径,从多个eBGP会话上:
- AS1 网关路由器1c从2a学习到路径:AS2,AS3,X
- AS1网关路由器1c从3a处学习到路径AS3,X
- 基于策略,AS1路由器1c选择了路径:AS3,X,而且通过iBGP告诉所有AS1内部的路由器
4.内外部不同
策略:
- Inter-AS: 管理员需要控制通信路径,谁在使用它的网络进行数据传输;
- Intra-AS: 一个管理者,所以无需策略;
- AS内部的各子网的主机尽可能地利用资源进行快速路由
规模:
- AS间路由必须考虑规模问题,以便支持全网的数据转发
- AS内部路由规模不是一个大的问题
- 如果AS 太大,可将此AS分成小的AS;规模可控
- AS之间只不过多了一个点而已
- 或者AS内部路由支持层次性,层次性路由节约了表空间, 降低了更新的数据流量
性能:
- Intra-AS: 关注性能
- Inter-AS: 策略可能比性能更重要
5.三种协议不同
三、 SDN控制平面
1.SDN简单介绍:
在 每一个路由器 中的单独路由器算法元件,在控制平面进行交互
SDN方式:逻辑上集中的控制平面
一个不同的(通常是远程的)控制器与本地控制代理(CAs)交互
- 网络管理更加容易:避免路由器的错误配置,对 于通信流的弹性更好
- 解耦合
- 基于流表的转发,允许“可编程”的路由器
- 集中式“编程”更加容易:集中计算流表然后分发
- 传统方式分布式“编程”困难:在每个单独的路由器上分别运行分布式的算法,得到转发表(部署和升级代价低)
- 而且要求各分布式计算出的转发表都得基本正确
- 控制平面的开放实现(非私有)
- 新的竞争生态
2.OpenFlow 协议
OpenFlow协议是SDN和路由器上的控制器交互所用到的协议,采用TCP协议,3种OpenFlow报文类型①控制器>交换机 ②异步(交换机>控制器)③对称 (misc)
其报文特点:
- 特性:控制器查询交换机特性,交换机应答
- 配置:交换机查询/设置交换机的配置参数
- 修改状态:增加删除修改OpenFlow表中的流表
- packet-out:控制器可以将分组通过特定的端口发出
- 分组进入: 将分组(和它的控制)传给控制器,见来自控制器的packet-out报文
- 流移除: 在交换机上删除流表项
- 端口状态: 通告控制器端口的变化
1)交换例子
- S1, 经历了链路失效,采用OpenFlow报文通告控制器:端口状态报文
- SDN 控制器接收OpenFlow报文,更新链路状态信息
- Dijkstra路由算法应用被调用(前面注册过这个状态变化消息)
- Dijkstra路由算法访问控制器中的网络拓扑信息,链路状态信息计算新路由
- 链路状态路由app和SDN控制器中流表计算元件交互,计算出新的所需流表
- 控制器采用OpenFlow在交换机上安装新的需要更新的流表
四、ICMP:因特网控制报文协议
- 由主机、路由器、网关用于传达网络层控制信息
- 错误报告:主机不可到达、网络、端口、协议
- Echo 请求和回复(ping)
- ICMP处在网络层,但是是在IP协议的上面
- ICMP消息由IP数据报承载
- ICMP 报文:
- 类型
- 编码
- 加上IP数据报的头8B
- 第一个导致该ICMP报文的IP数据报
文章图片来源网络、《王道计算机网络》课程
文章当个人笔记使用,如有侵权请联系删除