· 概述:
· 网络层分组交付的方法有:数据报模式和虚电路模式。
· 网络层所提供的服务:在发送主机和接收主机对之间发送段(segment);在发送端将段封装到数据报中;在接收端,将段上交给传输层实体。
· · 网络层重要的功能:转发和路由
· · 网络层主要可以分为两个层面:控制平面和数据平面。
· · · 路由:
· · · 控制平面的功能——路由(全局功能),决定数据报从源到目标主机之间的端到端路径。常见的两个控制平面算法:传统路由算法(在路由器中实现)、software- defined-network(SDN,在远程服务器中实现)。
· · · 转发:
· · · 数据平面的功能——转发(局部功能),是每个路由器的功能,决定了从路由器输入端口到达的 分组的分组如何转发到输出端口。常见转发功能:传统方式:基于目标地址+转发表:、SDN方式:基于多个(字段+流表)的方式。
· · 不同方式下的网络层:
· · 传统方式 下的网络层,每一个路由器中的单独路由器算法元件,在控制平面进行交互,是分布式进行的。控制平面算出路由表,在数据平面,通过IP协议由转发表决定了IP数据报在此路由器上的局部转发。
· · SDN方式 下的网络层,是逻辑集中的控制平面,物理实体可能是分布式的。是一个不同的(通常是远程的)控制器与本地控制代理(CAs)交互,这种方式下网络是可编程的。
· · 转发表:
· · 路由器通过检查到达分组首部字段的值来转发分组,然后使用该值在路由器的转发表中索引查询,储存在转发表项中的该首部的值指出了该分组将被转发的路由器的输出链路接口。分组首部的值可能是该分组的目的地址或该分组所属连接的指示(取决于网络层协议,路由选择算法决定了插入路由器的转发表中的值)。
· · 网络服务模型
· · 定义了分组在发送与接收端系统之间的端到端的运输特性。
· · · 对单个数据报的服务:
· · · 确保交付:该服务要确保分组最终会到达目的地。
· · · 具有时延上界:该服务不仅要确保分组的交付,而且在一定的时延范围内交付分组。
· · · 对数据流的服务:
· · · 保证数据传送。
· · · 保证流的最小带宽:只要发送主机以低于特定的传输速率,分组就不会丢失,且在一定延时内到达。
· · · 保证分组间的时延差:确保发送的两个分组所各自用的延时不会超过一定的延时差。
· · · 安全性服务:使用仅由源和目的主机所知晓的一个秘密会话密钥,在源主机的网络层能够加密的向目的主机发送所有数据报的负载。而在目的主机的网络层负责解密该负载。
· · · 其他的网络层模型:
· · · 恒定比率(Constant Bit Rate,CBR)ATM网络服务:使网络连接看起来像一条专用的、固定带宽的传输链路,用相同性质的虚拟管道来提供分组流(信元流)。
· · · 可用比特率(Available Bit Rate,ABR)ATM网络服务:ABR服务下的信元也许会丢失,和因特网提供的服务差不多,信元不能被重排序,最小传输速率是可以保证的。
· · 网络的连接性:
· · 是某些网络架构中的第三个重要功能:ATM、frame relay、X.25。在传输分组前,在主机之间,在通过一些路由器所构成的路径上建立一个网络层连接。传输层的连接是面向端系统之间的(是两个进程之间的)、网络层的连接是路径上每个路由器之间的连接。
· 虚电路和数据报网络:
· 网络层能够在两台主机之间提供无连接服务或有连接服务。
· 网络层向运输层提供的是主机到主机之间的服务,而运输层向应用层提供进程到进程的服务。
· 仅在网络层提供连接服务的是虚电路(Virtual-Circuit,VC)网络,仅在网络层提供无连接服务的是数据报网络。
· 运输层面向连接的服务是在网络边缘实现的;而网络层连接服务除了在端系统,也在网络核心的路由器中实现。
· 虚电路来源于电话界,是真正的电路。如因特网中的数据报网络,可以将计算机连接在一起。
· · 虚电路网络:
· · 许多网络体系结构(ATM、帧中继的体系结构)是虚电路网络。属于虚电路的每一个分组在首部都有一个VC号。因为一条虚电路在路径中的每条中间链路上可能有不同的VC号,所以分组的旧VC号在经过中间路由器时,会被新的VC号代替。
· · · 组成:
· · · 源主机与目的主机之间的路径(即路由器、交换机、链路等)。
· · · VC号,沿着该路径的每段链路的一个号码。
· · · 沿着该路径的每台路由器中的转发表项。
· · · 虚电路网络中的路由器需要维持网络状态信息。
· · · 虚电路的历程阶段
· · · 虚电路建立。首先,运输层与网络层联系,指定目的地址,然后等待网络层建立虚电路,由网络层决定传送路径,为路径上的每一条链路决定一个VC号,并在路由器中增加表项。
· · · 进行数据传输:
· · · 进行拆除,网络层通知网络的目的主机结束呼叫,并更新路径上的每台分组路由器中的转发表以表示该虚电路已不存在。
· · 这里只对虚电路进行简单的介绍,用来传输虚电路中的报文被称为信令报文,通过信令协议被传输。更多详细参见[Black 1997]/[ITU-T Q.2931 1995]。
· · 数据报网络
· · 每当端系统要发送一个分组时,它直接在分组头部加上一个目的端系统的地址,然后放入网络中,路由器会进行寻址并进行转发分组(路由器拥有一个将目的地址映射到链路接口的转发表),路由器不需要维护任何虚电路的状态信息。
· · 路由器用分组的目的地址的前缀与表中的表项进行匹配(使用最长前缀匹配规则),然后转发该分组。路由器在转发表中维护了转发状态信息。在数据报网络中的转发表能被随时修改,所以从端系统到端系统的一个分组流可能会经由不同的路由器来转发,并可能会无序到达。
· 路由器工作原理
· · 路由器体系结构:
· · 主要包含输入端口、 交换结构、输出端口、路由选择处理器。
· · 一台路由器的输入端口、交换结构、输出端口共同实现了转发功能,通常是用硬件实现的,被称为路由器的数据平面(转发平面)。传统下的转发方式是:基于目标地址+转发表来转发;SDN方式是:基于分组中的多个字段+流表来实现转发功能。
· · 而路由器的控制功能(即路由选择协议等等)被路由器控制平面通过软件进行实现。传统方式下的控制平面是CPU,在路由器中实现;目前较为流行的是SDN(software-defined network)方式,控制平面的功能在远程的服务器中实现。
· · 输入端口:
· · 输入端口的线路端接功能与链路层的处理实现了各个输入链路的物理层和链路层。
· · 每个输入端口都会储存一个转发表的副本(从路由选择处理器通过独立的总线被复制到线路卡),有了副本,转发决策便能在每个输入端口本地做出,不需要调用中央路由选择处理器,避免了集中式处理的瓶颈。
· · 输入端会根据数据报的头部的信息(如目的地址)选出合适的输出端口,采取了 “匹配+动作” 的方式,也就是说,根据数据报头部的一些字段进行匹配,对于不同的匹配结果,有不同的处理方式(转发、拦截、重写等)。
· · 交换结构:
· · 将分组从输入端传输到合适的输出端口,运行速度通常是一条输入/输出链路速率的N倍,N与端口数有关。
· · 有三种典型的交换结构:
· · · 通过内存进行交换:
· · · 最早、最简单的路由器是传统的计算机,在输入端口和输出端口之间的交换是在CPU(路由选择处理器)的直接控制下完成的。当一个分组到达输入端时,会被复制到处理器内存中,然后由路由选择处理器在转发表中找到合适的输出端口,将该分组复制到输出端口中的缓存中。
· · · 通过总线交换:
· · · 输入端口使用一条共享总线将分组直接传送到输出端口,不需要路由选择处理器的干预。让输入端口为分组预先设置一个交换机内部的标签(首部),指示本地输出端口,是分组在总线上传送和传输到输出端口,随后被抹除标签。在总线上一次只能有一个分组被传送,所以路由器的交换带宽受到总线速率的限制。
· · · 经过互联网交换:
· · · 这种方式克服了共享的、单一的总线带宽,使用一种纵横式的总线网络。由2N条总线构成,连接了N个输出端口和N个输入端口,每条垂直的总线在交叉点与每条水平的总线交叉,交叉点通过交换结构控制器能够在任何时候开启和关闭。这种方式可以并行转发多个分组,但是如果来自两个不同输入端口的分组传输向同一输出端口,则一个分组必须在输入端等待。
· · 输出端口:
· · 输出端口处理取出存放在输出端口内存中的分组,并将其发送到输出链路上。
· · · 排队现象:
· · · 在输出端或输入端会出现分组排队现象,这取决于流量负载、交换结构的相对速率和线路速率,当路由器的缓存空间被耗尽时,在这之后到达分组就会被丢失。
· · · 我们要考虑的是在输入端丢失分组和在输出端丢失分组的情况。假设输入端和输出端的传输速率为Rl,交换结构的传送速率为Rs。
· · · 当Rl是Rs的N倍时,那么在输入端会出现丢包现象,因为交换结构在一定时间内不足以将输入端的分组全部传输到输出端,所以输入端会出现排队现象。
· · · 当Rl是Rs的N倍时,输出端可能会出现排队现象。我们考虑这种极端情况,当所有的输入端都向一个输出端发送分组,而交换结构能够很快地将分组放至输出端,但是因为输出端的传输速率很低,所以分组都会堆积在输出端,最后导致丢包现象。
· · · 根据这种现象,我们只能控制缓存大小,据了解,当少量的TCP流流过一条链路时,路由器缓存大小 = RTT * C;当大量的TCP流流过一条链路时,路由器缓存大小 = RTT * C / N1/2,C为链路容量,N为端口数目。
· · · 输出端口通过分组调度程序从排队分组中选择一个来发送,调度规则有:加权公平排队调度(WFQ,在一段时间内,每个队列得到的服务时间和权重成正比,每个类在每一个循环中获得不同权重的服务量。),先来先服务(FCFS)调度,RR调度(Round Robin 调度,循环扫描不同类型的队列, 发送完一类的一个分组,再发送下一个类的一个分组,直到循环 发送完所有类中的分组。)等。
· · · 当没有足够缓存区容纳一个分组时,会用丢弃策略(丢弃刚到的分组、根据优先级丢弃分组,随机地丢弃分组等)。
· · 路由选择控制平面
· · 目前网络范围的路由选择控制平面是分布式的,不同的部分执行在不同的路由器上,并且通过彼此发送控制报文进行交互。
· · 随着网络的发展,会将软件控制平面与数据平面分离,简化了路由选择,并允许不同的用户定制的控制平面在快速的硬件数据平面上运行。
· IP协议:
· 因特网的网络层有三个主要组件:IP协议、路由选择协议、ICMP协议。
· · 数据报格式:
· · IPv4的数据报格式如下:
· · 版本号:目前有IPv4和IPv6的版本
· · 首部长度:因为一个IP数据报中可能含有可变数量的选项(包含于头部中),所以需要4bit确定IP数据报中的数据部分从哪里开始,一般的IP数据报头部有20字节。
· · 服务类型:服务类型(TOS)包含在首部中,使不同类型的IP数据报能够相互分开(比如低延时、高吞吐量和可靠性的数据报)。
· · 数据报长度:IP数据报的总长度(以字节为计量单位),该字段占16bit,理论长度为216-1字节,但实际的数据报很少有超过1500字节的。
· · 标识、标志、偏移量:与IP分片有关。
· · 寿命:Tmie-To_Live,TTL字段确保了数据报不会永远的在网络中循环,每当经过一个路由器时,就会使该字段减一,当减为0时,该数据报必须被丢弃。
· · 协议:该字段指示了IP数据报的数据部分应交给哪个运输层协议(6——TCP,17——UDP),协议号将网络层和运输层连接到一起,就像报文段中的端口号将运输层和应用层连接到一起。
· · 首部校验和:用于帮助路由器检测收到的IP数据报中的bit错误。将首部中的每2个字节当做一个数,用反码运算对这些数求和,每台路由器都要重复计算校验和,并将将重复计算出的校验和放入原处,因为首部中有些字段的值可能会改变(如TTL)。IP携带的不一定是TCP/UDP报文,所以除了TCP/UDP需要在运输层进行校验和检测,网络层也需要进行检测。
· · 源IP地址和目的IP地址
· · 选项:选项字段意味着IP首部可以被扩展,但在IPv6中被淘汰了。
· · 数据(有效荷载):这里承载的是交付给目的地的运输层的报文段(TCP或UDP),还可以承载其他类型的数据,如ICMP报文。
· · · IP数据报分片
· · · 一个链路层帧能承受的最大数据量叫做最大传送单元MTU,链路层的每种协议可能具有不同的MTU。
· · · 所以可能出现,IP分组比MTU大的情况,这时候我们需要将IP分组分片,分成较小的IP数据报,用单独的链路层帧封装这些较小的IP数据报这些较小的IP数据报被称为片(分片在路由器中进行,但是数据报的重新组装工作放在端系统中)。
· · · 在IPv4版本中,标识、标志和片偏移字段被放在IP数据报的首部中,发送主机通常将它发送的每个数据报的标识号加1,路由器将一个数据报分得的片中包含源、目的IP和标识号,这样目的主机可以根据标识号知道哪些片是同一数据报中的。并且同一数据报中的最后一个片的标志bit置为0,其余的置为1,并用偏移量指定该片在原数据报中的位置,这样目的主机就可以按顺序合成数据报了。
· · · 一个4000字节的数据报(20字节的IP首部和3980字节的有效载荷)的分割情况如下:
· · · 如果一个数据报的其中某些片没有到达目的主机,则该数据报就会被丢弃。
· · IPv4编址
· · 一个IP地址技术上是和一个接口相关联的,而不是和包括该接口的主机或路由器相关联的。每个IP地址长度为32bit(4字节),总共有232个可能的IP地址,记名方法为:分点十进制记法。如:193.32.216.9为11000001 00100000 11011000 00001001.
· · 每台主机和路由器上的每个接口,必须要有一个全球唯一的IP地址,这些IP地址的一部分是需要和连接的子网来决定的。如图:
图中共有三个子网,其中每一些互联的主机接口与一个路由器接口的网络形成一个子网,IP编址为这个子网分配一个地址:223.1.1.0/24,其中的/24是子网掩码(另一种表示为255.0.0.0),指的是32bit地址的最左侧的24个bit,它定义了子网的网络地址。图中的子网223.1.1.0/24是由(223.1.1.1、223.1.1.2、223.1.1.3)和一个路由器接口(223.1.1.4)组成。
· · 子网的定义: 分开主机和路由器的每个接口,产生几个隔离的网络岛,使用接口端接这些隔离的网络的端点,这些隔离的网络中的每一个都是子网。下图便有六个子网:
· · · 分类编址:
· · · 在很久之前,IP地址的网络部分被限制为长度为8、26、24bit,具有这些子网地址的子网被称为A、B、C类网络。如图:
· · · 但是由于这种固定的限制,导致可以被分配的网络太少,导致地址空间被迅速损耗,并且分配的地址块利用率可能会较低(如为具有2000台主机的组织分配了B类地址,B类地址可以支持65534个接口的地址空间,导致剩下的63000多个地址不能被其他组织利用)。
· · · 特殊的IP地址, IP广播地址255.255.255.255,当一个主机发出的目的地址为255.255.255.255的数据报时,该报文会交付给同一网络中的所有主机。
· · · 专用地址(内网地址) ,专用地址永远不会被当做公用地址来分配,不会和共用地址重复,只在局域网内有意义,用来区分局域网内部的不同设备。路由器不会对目标地址是专用地址的分组进行转发。专用地址的范围有(MASK)为掩码:
· · · CIDR(Classless Interdomain Routing)无类别域间路由选择:
· · · 形如a.b.c.d/x的地址的x最高bit构成了IP地址的网络部分,称为改地址的前缀。一个组织通常被分配一块连续的地址,即具有相同前缀的一段地址。这样可以减少路由器中的转发表的长度。而32-x的剩余bit可以被划分为该区域内部设备的地址,这些设备具有相同的前缀a.b.c.d/x。
· · · 地址聚合: 使用单个网络前缀通告多个网络的能力,也称为路由聚合。下图是一个路由聚合的例子:
Fly-By-Night-ISP向外界通告一个网络前缀,这样便使用了一个网络,就可以接收多个IP地址的数据报。
· · · 假设上图中Fly-By-Night-ISP想要将组织1与ISPs-R-Us相连,我们可以直接改变组织1内所有路由器和主机的IP地址,使他连接到ISPs-R-Us下面,但是这种花费太大,取而代之的是,我们可以让ISPs-R-Us通告组织1的IP地址(200.23.18.0/23),当在因特网上的其他路由器看见了地址块为200.23.16.0/23(来自Fly-By-Night-ISP)和200.23.18.0/23(来自ISPs-R-Us)时,会采取最长前缀匹配,向ISPs-R-Us路由,因为ISPs-R-Us通告的是目的地址的最长前缀。如下图:
这样就实现了组织1与ISPs-R-Us相连。
· · · 地址的分配:
· · · 子网获取一块地址: 网络管理员会和它的ISP联系,该ISP可能会从已分给它的更大的地址块中提供一些地址。所有的IP地址是由因特网名字和编号分配机构(Internet Corporation for Assigned Names and Numbers,ICANN)管理,它不仅分配IP地址,还管理DNS根服务器,并分配域名和解决域名纠纷。
· · · 获取主机地址:DHCP 一个组织获取了一块地址之后,就可以给它内部的主机和路由器接口分配地址,除了手动的分配地址之外,还可以使用动态主机配置协议(Dynamic Host Configuration,DHCP)。
DHCP允许主机自动获取一个IP地址,网络
管理员通过设置DHCP,使某个主机每次与网络
相连的时候获得相同的IP地址或者被分配一个
临时的IP地址(该地址在每次连接的时候可能
是不同的)。除了地址分配外,DHCP还提供
给主机它的子网掩码、第一条路由器的地址
(默认网关)与它的本地DNS服务器地址。当
主机加入或者离开时,DHCP服务器会更新其
可用的IP地址表。
DHCP协议的实现:
DHCP服务器的发现:一台新来的主机通过
使用“本主机”源地址0.0.0.0向广播地址
255.255.255.255发送DHCP发送报文, 这样
DHCP服务器就会收到这个报文。
DHCP服务器的提供:当DHCP接收到DHCP发
现报文时,就会用一个DHCP提供报文向客户
做出响应(任然使用广播地址),提供报文
中包括:收到发现报文的事务ID、向客户推荐
的IP地址、子网掩码以及IP地址租用期。
DHCP请求:新加入的客户会从多个DHCP提
供报文(来自不同的DHCP服务器)选一个,
向选中的服务器发送一个DHCP请求报文,
返回需要配置的参数。
DHCP ACK:服务器用DHCP ACK报文对
DHCP请求报文进行响应,并认可所要求的
参数。
这样就完成了地址的请求,当超过该租用期时还希望使用该地址时,DHCP也提供了相应的机制来更新客户对一个IP地址的租用。
· · · 网络地址转换(Network Address Translation,NAT):
· · · NAT指所有离开一个子网的数据报都要具有一个相同的源地址,并具有不同的端口号,不管是子网中哪个主机发送的数据报,在穿出内网时,会将所有主机的数据报的源地址转化为一个相同的源地址,并将端口号转化为新的不会重复的端口号。
· · · 在一个子网中,我们可以使用专用网络如:10.0.0.0/24对网络内部的主机进行编址,使得彼此之间相互转发分组,但是当内网内部的主机使用专用地址向网络外部发送数据报时,是没有意义的,因为外网无法判断该专用地址是从哪个内网发送的,这时就需要进行网络地址转换NAT。
· · · NAT使能路由器对于外部网络来说不像是一部路由器,像是一个具有单一IP地址的单一设备。所有流出内网的数据报都会被替换源IP地址,NAT使能路由器对外界隐藏了内网的细节,NAT转换表中会储存相应的(IP-端口-新IP-新端口)转换对。
· · · 在数据报传出内网时,会替换源地址和端口号为NAT IP地址和新1端口号,目标IP和端口号不变;在NAT转换表中会存储每个替换对(源IP,端口,新IP,新端口);进入的数据报会被替换目标IP地址和端口号,采用储存在NAT转换表中的表项。
· · · NAT目前被广泛应用,但是遭到很多人的反对,原因有以下几点:
1.端口号是用来进程编址的,而不是用于主机编址的,
可能会引起某些问题,因为有些服务器进程在固定端口号上等待入请求。
2.路由器最多应处理第三层的分组。
3.NAT协议违反了端到端的原则,修改了IP地址和端口号。
4.应该用IPv6去解决地址短缺的问题,而不是用NAT这种方式。
5.NAT还阻碍了P2P应用程序的发展,包括文件共享和
P2PIP语音应用。可以用接下来的UPnP解决。
· · · NAT穿越:上面介绍的是在NAT使能路由器之后的主机向外界不在NAT使能路由器之后的主机进行连接,但如果是两个都在NAT使能路由器之后的主机想要建立连接的情况,就不能像上面那样建立连接,这种问题被称为NAT穿越。解决方案是这样的:首先对等方A先通过一个中间对等体C与对等体B联系,其中,C不位于NAT之后且已经和B建立连接了,对等方A就能够等待C请求B,发起直接返回A的连接,这样A和B就能建立连接了。
· · · UPnP
· · · UPnP是一种允许主机发现并配置附近NAT的协议。在主机上的应用程序能够使用UPnP为某些请求的公用端口号请求一个NAT映射(专用IP地址,专用端口号——公共IP地址,公共端口号),因此该应用程序就能向外界通告它的存在。
· · · UPnP提供了有效的NAT穿越解决方案,允许外部主机使用TCP或UDP连接向NAT化的主机发起通信。更多详细参见[Huston 2004; Cisco NAT 2012]。
· · ICMP(因特网控制报文协议)
· · ICMP被主机和路由器用来彼此沟通网络层的信息。常用于差错报告。ICMP是IP的一部分,因为ICMP报文时承载在IP分组中的,是作为IP有效载荷承载的,但从体系结构上来看,ICMP是位于IP之上的。当一个主机收到指明上层协议为ICMP的IP报文时,它就会取出数据报的内容交给ICMP,就像交给UDP和TCP一样。
· · · ICMP报文:
· · · ICMP报文有一个类型字段和一个编码字段,还包含引起该ICMP报文首次生成的IP数据报的首部和前8字节的内容(方便主机确定引起该差错的数据报)。
· · · 以下为ICMP的报文类型:
· · IPv6
· · 由于IPv4类型的IP地址被耗尽,所以IETF需要研发出一种新的协议,可以支持大量的IP地址,IPv5(ST-2)协议被舍弃掉了。
· · · IPv6数据报格式:
· · · 扩大的地址容量:IPv6将IP地址长度从32bit增加到了128bit,而且除了单播地址和多播地址以外,IPv6还引入了任播地址的新型地址(这种地址可以将数据报交付给一组分组的任意一个,用于向一组给定文档的镜像站点中最近的一个发送一个请求报文)。
· · · 简化了首部:只包含了40字节的内容,IPv4的许多字段被舍弃了,可以更快的处理IP数据报,新的选项编码可以进行更灵活的选项处理。
· · · 流标签和优先级:IPv6有一个对于流的定义,该字段可用于对特殊的分组加上标签,这些特殊流是发送方要求进行特殊处理的流。首部中还有一个8bit的流量类型字段,就像IPv4中的TOS字段,给出了流中一些数据报的优先级,指明了一些数据报比其他数据报有更高的优先权。
· · · 版本:4bit被用于标识IP版本号IPv6将该字段置为6,将该字段置为4不能建立一个合法的IPv4数据报。
· · · 还具有流量类型、流标签。
· · · 有效载荷长度:该16bit值作为一个无符号整数,给出了IPv6数据报中给定长的40字节数据报首部后面的字节数。
· · · 下一个首部:该字段标识了数据报的内容需要交付给哪个协议,与IPv4中的协议字段相同。
· · · 跳限制:与IPv4中的TTL作用一样。
· · · 源地址和目的地址:128bit的格式在RFC 4291中进行了描述。
· · · 数据:有效载荷部分。
· · ·其中,分片/重新组装被遗弃了,IPv6不允许在中间路由器上进行分片和组装,只能在主机上进行。如果路由器收到的IPv6数据报太大而不能转发到出链路,则该路由器会丢弃该分组,并向发送方返回一个“分组太大”的标签的ICMP差错报文。
· · · 选项,选项部分不再是IP首部了,而是出现在了IPv6首部由“下一个首部”指出的地方。也就是说,TCP和UDP的协议的首部可以是IP分组中的“下一个首部”,选项字段也能是“下一个首部”。
· · · 从IPv4到IPv6的迁移:
· · · 由于大量主机和路由器搭建的都是IPv4协议,所以要突然变为IPv6协议是不可能实现的,必须循序渐进的将IPv6协议代替IPv4协议,具体方法如下:
· · · 我们引入一个IPv6使能节点,这样的节点还保留IPv4的实现,具有发送和接收IPv6和IPv4数据报的功能,当与IPv4节点交互时,发送IPv4数据报;当与IPv6节点交互时,发送IPv6数据报;所以这种节点需要具备IPv4和IPv6两种地址,还要确定与它交互的另一个节点是IPv4还是IPv6使能的(这个问题可以由DNS解决,如果要解析的节点名字是IPv6使能的,那么DNS会返回一个IPv6地址,否则返回一个IPv4地址,当然如果发送给DNS请求的是IPv4使能的,那么DNS必须返回一个IPv4地址)。
· · · 如图,在将IPv6数据报转化为IPv4数据报时,可以直接将IPv6数据报包含在IPv4的数据部分,并做相应的地址映射。
· · · 这样先搭建一些IPv6/IPv4使能路由器,然后不断的将IPv4路由器转化为IPv6路由器,最终就可以实现所有的IPv4路由器被转化为IPv6路由器。这种方法叫双栈方法,还有建隧道的双栈方法。
· · · 如图:
假设两个IPv6节点使用IPv6报文进行交互,但它们中间都是IPv4路由器,我们将这些IPv4路由器称为一个隧道,我们可以将IPv6报文放到IPv4的数据部分(有效载荷),将该IPv4数据报的目的地址设为接收端的IPv6节点,然后通过隧道就可以发送到IPv6路由器了。
· · IPv6的安全性:
· · IPsec协议是新型的网络层协议(面向连接的),与IPv4和IPv6兼容。使用这种协议,两台主机会在它们之间建立一个IPsec会话,使用这种会话,两台主机之间发送的所有TCP和UDP报文段都将享受IPsec提供的安全服务。在发送端,运输层会向IPsec传递一个报文段,然后由IPsec加密,并附上安全性字段,并分装在一个普通的IP数据报的有效载荷,然后发送给接收方,然后接收方的IPsec会解密报文段并上交给运输层。
· · IPsec提供的服务:
· · · 密码技术约定:这种机制允许两台通信的主机对加密算法和密钥达成一致。
· · · IP数据报有效载荷的加密:在发送方加密,接收方解密。
· · · 数据完整性:IPsec允许接收主机验证数据报的首部字段,并保证被加密的有效载荷在其数据报从源到目的主机的路由器传输时不被修改。
· · · 初始鉴别:当一台主机从受信任的源(具有一个受信任的密钥)接受到一个IPsec数据报时,该主机确信在数据报中的源IP地址是该数据报的实际源。
· 路由选择算法:
· 主机通常直接与一台路由器相连接,该路由器为该主机的默认路由器(第一跳路由器),当主机发送一个分组时,会将该分组传送给该主机的第一跳路由器。路由选择算法是找出一条从源路由器到目的路由器的较好的路径,我们只考虑最短路径(最低费用路径),不考虑其他相关因素。
· 对路由选择算法的第一种分类方式:
全局路由选择算法:用完整的、全局性的信息,
算出最低费用路径,全局算法具有关于连通性和
链路费用方面的完整信息,也被称为链路状态算法(LS算法)。
分散式路由选择算法:以迭代、分布式的方式
计算出最低费用路径,每个路由器仅知道与它相连的
链路信息,不知道完整网络的链路信息。
· 对路由选择算法的第二种分类方式:
静态路由选择算法:这种方式下,路由信息的变化
通常是非常缓慢的,我们只需要人为的进行编辑路由信息。
动态路由选择算法:能够感知网络流量负载或
拓扑的变化而改变路由选择路径。一个动态算法可以周期性的运行
或直接响应拓扑或链路费用的变化而运行。
· 对路由选择算法的第三种分类方式:
负载灵敏算法:链路费用会动态的变化,
以体现出当前的底层链路的拥塞水平。
负载迟钝算法:链路的费用不会反应出当前的拥塞水平。
· · 链路状态路由选择算法:
· · 在链路状态选择算法中,网络拓扑和所有的链路费用都是已知的,可以让每个节点向网络中的所有其他节点广播链路状态分组来完成,其中每个链路状态分组包含它所连接的链路的特征和费用(通过链路状态广播算法完成)。
· · 常见的链路状态路由选择算法是Dijkstra算法(单源最短路径算法),还有Prim算法(实现最小生成树)。
· · 当LS算法运行完毕后,对于每个节点都得到了从源节点沿着它的最低费用路径的前一节点,这样我们就可以构建出从源节点到所有目的节点的完整路径,我们可以在u节点上构造转发表,存放的是对于网络中的每个目的节点从u到目的地的最低费用路径上的下一跳节点,如图所示:
· · · 拥塞敏感的路由选择的震荡:
· · · 震荡可能会出现在任何依赖拥塞或时延来判断链路状态的算法中,当路由选择算法的链路费用依赖所承载的流量时,可能会出现如下图的现象:
一种解决方案是,确保大部分节点不同时运行LS算法,我们可以使路由器以相同周期运行LS算法,在每台路由器上错开运行LS算法,但是运行一段时间后,算法会在路由器上逐渐保持同步运行并维持,这样的话,我们可以让每台路由器发送链路通告的时间随机化来解决这个问题。
· · 距离向量路由选择算法:
· · 距离向量(Distance-Vector,DV)算法是一种迭代的、异步的和分布式的算法,而LS算法是一种使用全局信息的算法。这种算法的每一个节点都要从一个或多个直接相连邻居接收信息,然后进行计算并将计算结果分发给邻居,这种算法是自我终止的,当没有要计算的信号时,就停止了。
· · 这种算法和Bellman-Ford算法有关,Bellman-Ford方程为:dx(y) = minv{ c(x,v) + dv(y) },这个方程表明从x->y的路径费用是从x->v + v->y中对x的所有邻居v的最小值。
· · 使用DV算法,每个节点维护的信息有:
从x到直接相连的所有邻居v的费用c(x, v)。
节点x的距离向量D(x),包含了x到所有目的地y的费用的估计值。
此节点的邻居节点的距离向量,即对x的所有邻居v,x节点还维护了每个邻居v的D(v)向量。
· · 在这种算法中,每个节点不时地向它的所有邻居发送它的距离向量副本。当节点x从它的任何一个邻居v接收到一个新的距离向量时会保存下来,然后会根据v的距离向量,使用Bellman-ford方程去更新自己的距离向量。这样当节点x更新之后,x会向它的每个邻居发送其更新后的距离向量。只要所有节点以异步的方式交换它们的距离向量,每个费用Dx(y)会收敛到从x到y的最低费用。
· · 在DV算法中,当节点x发现它的直接相连的链路费用变化或者从某个邻居接收到一个距离向量的更新时,它就会更新它的距离向量。它只需要知道,从它到目的地y的最短路径中,它的下一跳路由器节点即可,并不需要保存路径上每个节点。
· · 每个节点的路由选择表包括了:该节点的距离向量和它的每个邻居的距离向量(每一行都是一个距离向量)。如图:
从邻居那里接收到并更新距离向量、重新计算路由选择表的表项和通知邻居它到目的地的最低费用路径的费用已经变化,这个过程会持续到无更新报文发送为止,该算法会进入静止状态,直到一条链路发生改变。
· · · 距离向量算法:链路故障:
· · · 链路费用改变时的链路故障:因为运行DV算法的节点检测到自己到邻居的链路费用发生变化时,就会更新距离向量,并且如果最低费用路径发生变化时,还会通知邻居自己的新的距离向量。我们考虑下图的这种情况:
在链路费用发生变化之前,Dy(x) = 4, Dy(z) = 1, Dz(x) = 5,当x到y的链路费用从4增加到60后,Dy(x)会发生这种变化:Dy(x) = min{ c(y, x) + Dx(x), c(y, z) + Dz(x)} = 6,但是,这样算出来的结果是错误的,因为当我们改变x到y链路的费用时,y节点更新距离向量的时候用的还是之前的Dz(x),所以会导致出现错误,而且这种情况还会继续下去,不断地在y和z节点之间进行更新,这种情况叫做:路由选择环路。这种情况会持续到z最终算出它经过y到x的路径费用大于从z直接到x的路径时,才会终止。如果y到x的链路不是变为了60,如果变为了10000,而且x到z的链路费用是9999,那么y和z之间进行迭代会更加多,这种问题就被称为无穷计数问题。
· · · 增加毒性逆转:对于由于链路费用改变而引起的链路故障,我们可以使用毒性逆转的方法进行避免。这种思想是:如果z通过y路由选择到目的地x,则z会通告y,z到x的距离为无穷大。这样的话,当链路更新后,y节点会知道Dz(x)为无穷大,y节点就会选择y->x这条链路,而不是y->z->x这条链路,随后更新自己的向量表并发送给z,而当z接收到之后,便会立即将它到x的路径费用切换到(z,x)这条链路的费用,因为这条链路不会经过y节点,所以z会向y通知它到x的链路费用不是无穷大,这样y会比较两条链路的费用,最后决定出最短的一条链路费用并通告z节点。但是毒性逆转并没有解决复杂链路的环路问题。
· · LS和DV算法的比较:
LS算法要求每个节点都必须知道网络中所有链路的费用,
当一条链路发生改变时,必须向所有节点发送性的链路费用;
而DV算法只需在每次迭代时,在两个相邻节点之间进行报文交换。
LS算法的实现是一个要求O(|N| |E|)个报文的O(|N|^2)算法,
DV算法收敛比较慢,而起还可能会遇到路由选择环路,会遇到无穷计数问题。
对于LS算法,路由器能够向其连接的一条链路广播不正确的费用,
一个节点也可以丢弃它收到的任何LS广播分组,LS算法的路由计算可以说是分离的,
提供了一定的稳定性。而DV算法的一个节点可以向任何节点(或者所有节点)
通告其不正确的最低链路费用,最终会导致传播到整个网络。
· · 层次路由选择:
· · LS和DV算法都是对一个网路中的所有路由器节点进行路由,但是在因特网中路由器的规模太大,开销将非常大,并且有些组织希望能够按照自己的意愿来运行和管理网络,所以就有了自治系统(Autonomous System, AS)。
· · 每个AS都由一组在相同管理下的路由器组成,在相同的AS中的路由器都运行这相同的路由选择算法,且拥有彼此的信息,在一个自治系统内运行的路由选择算法叫做:自治系统内部路由选择协议,当AS互联时,这些AS之间运行的是自治系统间路由选择协议,并且在AS内部需要一些特殊的路由器用来和外部的AS互联(转发分组),这些路由器就叫做网关路由器。如图:
运行在AS1、AS2和AS3中的AS内部路由选择协议可以是不同的,1b、1c、2a、3a都是网关路由器。
· · 当允许在AS1中的路由器C想要向AS2中的路由器D发送一个分组时,C首先将分组发送至AS1中的网关路由器,然后由AS1的网关路由器发送至AS2的网关路由器,随后由AS2中的网关路由器发送至D。
· · 自治系统间路由选择协议处理的任务有:从相邻AS获取可达性信息、向该AS中所有路由器传播可达性信息。此协议涉及了两个AS之间的通信,这两个通信AS必须运行相同的自治系统间路由选择协议(因特网中的所有AS都运行这BGP4协议),每台路由器接收一个来自AS内部路由选择协议和一个AS间路由选择协议的信息,并使用这两个信息来配置它的转发表。
· · 在实际中,可能会存在AS1内部的分组可以经过AS2或AS3到达目的地,可以使用热土豆路由选择去抉择从哪个AS发送分组,在这种选择中,AS会尽快地扔掉分组。一旦选择了路径,就会在转发表中增加目的子网的表项。
· · 热土豆路由选择的思想是:将分组发给最近的网关路由器,用尽可能最低开销将分组送出其所在 AS。之所以称之为热土豆,就是当分组被类比为“热土豆”时,由于烫手,所以我们要尽可能快地把“热土豆”扔给下一个人。因此热土豆路由选择是一种自私的算法,它只考虑到减小自己 AS 内传输分组的开销,但是忽略了 AS 外端到端的其他开销。
如图:
而当一个AS从一个相邻的AS知道了一个目的地,该AS能够向它的某些其他AS通告该路由信息。
· 因特网中的路由选择
· AS内部路由选择协议又被称为网关协议,有路由信息选择协议(Routing Information Protocol,RIP)和开放最短路优先(Open Shortest Path First,OSPF)。
· · 因特网中的自治系统内部的路由选择:RIP
· · RIP是一种距离向量协议,和DV协议有很多相似之处,在RFC 1085中定义到的RIP版本使用跳数作为费用测度,即每条链路的费用是1。跳数就是沿着源路由器到目的子网(包括目的子网)的最短路径所经过的子网数量。如下图所示:
· · 在RIP中,一条路径的最大费用被限制为15,因此RIP的使用限制在网络直径不超过15跳的自治系统中。路由选择更新信息在邻居之间通过一种RIP报文来交换去实现,大约每30秒交换一次,一个响应报文包含了该AS内的多个目的子网(最多有25个)的列表,以及发送方到每个目的子网的距离,响应报文又被称为RIP通告。
· · 每台路由器维护一张路由选择表(RIP表),包括了该路由器的距离向量和该路由器的转发表。该算法的表项更新和DV算法的差不多,当新的链路或路由器加入了该AS,就可能会改变AS中的最短路径。
· · 如果一台路由器超过180秒没有从邻居收到报文,则该邻居就会被认为是不可达的(要么邻居死机了,要么链路中断了)当这种情况发生时,RIP会修改本地的路由器选择表,然后向它的相邻路由器(可达的)通告该信息。路由器还可以通过使用RIP请求报文,请求它的邻居到指定目的地的费用。路由器在UDP上使用端口520来发送RIP请求报文和响应报文,所以RIP使用一个位于网络层协议(IP)上的运输层协议(UDP)来实现网络层功能(路由选择算法)。
· · 在UNIX中,一个称为routed的进程执行RIP,即维护路由选择信息并与相邻路由器中的routed进程交换报文。因为RIP是被一个应用层进程来实现的,它能在一个标准套接字上发送和接收报文,并使用一个标准的运输层协议,所以RIP是一个应用层协议。如图:
更多RIP内容参见[ Quagga 2012 ]。
· · 因特网中自治系统内部的路由选择:OSPF
· · OSPF通常被设置在上层ISP中,而RIP被设置在下层ISP和企业网中,OSPF中的开放指的是路由选择协议规范是公众可用的。
· · OSPF其实就是使用了洪泛链路状态信息的链路状态协议和Dijkstra最低费用路径算法。路由器使用OSPF构建了一幅关于整个AS的完整拓扑图,运行Dijkstra算法,确定以自身为根节点的到所有子网的最短路径树,网络管理员可以设置链路费用,然后使用OSPF确定最短路径。
· · 在OSPF中,路由器向AS中的所有其他路由器广播路由选择信息,而不仅仅是向其相邻路由器广播。当链路状态信息发生变化时,路由器就会广播链路状态信息,即使链路状态没有发生变化,路由器也会周期性地广播链路状态。
· · OSPF通告包含在OSPF报文中,该OSPF报文直接由IP承载,对OSPF的上层协议的值是89,OSPF必须自己实现可靠报文传输、链路状态广播等功能。
· · · OSPF的优点:
· · · 安全:可以鉴别OSPF路由器之间的交换(如链路状态更新),只允许受信任的路由器能参与一个AS内的OSPF协议。在默认状态下,路由器间的OSPF报文是未被鉴别的,并且还可以被伪造。路由器能够配置两种不同的鉴别方式,简单的和MD5的,使用简单的鉴别,每台路由器配置了相同的口令,以明文的方式包含口令,并发送OSPF分组。而MD5鉴别基于配置在所有路由器上的共享秘密密钥。对于每个发送的OSPF分组,路由器会对附加秘密密钥的分组内容计算MD5散列值。然后包括在该OSPF分组中,该路由器使用预配置的秘密密钥计算出该分组的MD5散列值,并与该分组携带的散列值进行比较,从而验证了该分组的真实性。
· · · 多条相同费用的路径:当对到达目的地的最低费用路径存在多条时,OSPF允许使用多条路径(也就是说,不需要选择单一的路径来承载所有分组流量)。
· · · 支持在单个路由选择域内的层次结构,并对单播与多播路由选择的综合支持,多播OSPF(MOSPF)对OSPF进行了简单的扩展,方便提供多播路由选择。
· · · 一个OSPF自治系统可以配置成多个区域,每个区域都运行自己的OSPF链路状态路由选择算法,一个区域内的每台路由器都向该区域内的其他所有路由器广播其链路状态。并且在一个区域内,一台或多台区域边界路由器负责为流向该区域之外的分组提供了路由选择。并且AS内会有一个OSPF区域被配置成主干区域,主干区域的主要作用是为AS内其他区域之间的流量提供了路由选择。该主干包含了AS内部所有的边界路由器(可能会包含一些非边界路由器)。在AS内的区域间的路由选择要求分组首先到一个区域边界路由器,在通过主干路由到位于目的区域的区域边界路由器,然后再路由到最终目的地。
· · 自治系统间的路由选择协议:BGP
· · BGP为源和目的不在同一个AS的路由提供了路径选择。它为每个AS提供了以下的功能:
从相邻AS出获得子网可达信息;
向本AS内部的所有路由器传播这些可达信息;
基于可达性信息和AS策略,决定到达子网的最优路径
使每个子网向因特网的其余部分通告它的存在,并确保所有AS都知道如何到达该子网。
· · · BGP基础:
· · · 在BGP中,路由器对通过使用179端口的半永久TCP连接来交换路由选择信息。对于每条直接连接位于两个不同的AS中的路由器的链路来说,通常都有一条这样的BGP连接,而在一个AS中的路由器之间也有许多半永久BGP的TCP连接。
· · · 对于每条TCP连接,位于该连接端点的两台路由器称为BGP对等方,沿着该连接发送所有BGP报文的TCP连接被称为BGP会话,而跨越多个AS的BGP会话被称为外部BGP会话(eBGP),在同一个AS中两台路由器之间的BGP会话被称为内部BGP会话(iBGP)。如图:
· · · BGP使得每个AS知道经过其相邻AS可以到达哪些目的地。在BGP中,目的地不是主机而是CDIR化的网络前缀,每个前缀都是一个子网或一个子网的集合。如上图所示,AS1和AS2通过它们的网关路由器1b和2a交换其可达性信息,在任何AS中的网关路由器接收到eBGP传送过来的前缀后,该路由器会使用它的iBGP会话向该AS内所有的路由器发布这些前缀,而当一台路由器得知一个新前缀时,它会为该前缀在其转发表中创建一个表项。
· · · · 示例过程:
· · · · 当一个组织A想要创建一个小型的服务器网络时,组织A需要拥有一台网关路由器时,会与本地ISP相连接。这种连接可以是通过现有的电话基础设施的DSL连接、一条到ISP的租用线等。然后本地ISP会为A提供一个IP地址块,当拥有物理连接和IP地址范围时,A就会为该地址范围内分配IP地址:分别给Web、邮件、DNS、网关服务器等。
· · · · 然后A还需要和一个因特网注册机构签约,方便获取一个域名,这个域名必须在DNS系统中存在。而当外部连接要与你的DNS服务器联系以获取服务器的IP地址,所以还需要注册DNS服务器的IP地址。注册机构会将组织A的DNS服务器(域名、IP地址)放入.com顶级域名服务器中的一个表项中。
· · · · 如果想要人们发现组织A的Web服务器的IP地址,就需要在组织A的DNS服务器中加入一个Web服务器名字映射为其IP地址的表项,还可以加入其他服务器的表项,如邮件服务器等等。
· · · · 假设B知道组织A的Web服务器的IP地址,然后B会向此IP地址发送一个IP数据报,这个数据报将通过因特网进行路由,访问位于许多不同AS的一系列路由器,然后最后到达Web服务器。这些路由器中的任何一个接收到该报文段,将去转发表查找表项,以决定它转发该报文段的出口,所以,每台路由器都需要知道组织A的网络前缀的存在。
· · · · 而一台路由器同BGP知道组织A的网络前缀的存在,当A联系一个ISP并分配到前缀时,该ISP会使用BGP来向它连接的ISP通告该前缀。那些ISP则将会依次使用BGP来传播该通告。所以,最终所有的路由器都将会知道A的前缀。
· · · 路径属性和BGP路由:
· · · 在BGP中,一个AS由其全局唯一的自治系统号(ASN)所标识,并不是每一个AS都有ASN,有一种AS称为桩AS就没有ASN,这种AS仅承载源地址或目的地址为本AS的流量,ASN也由ICANN地区注册机构分配。
· · · 当一台路由器通过BGP会话通告一个前缀时,它在前缀中会包括一些BGP属性,这个前缀被称为路由。其中两个重要的属性有:AS-PATH、NEXT-HOP:
AS-PATH:该属性包括了此通告已经通过的AS,
当一个前缀被传送到一个AS时,该AS会将它的ASN添加到AS-PATH中,
路由器使用该AS-PATH属性来检测和防止循环通告,
当检测到一个通告的AS-PATH中已经有自己的ASN时,该AS就会拒绝该通告。
NEXT-HOP是一个从开始某个AS-PATH的路由器接口,
路由器使用NEXT-HOP属性正确地配置了它们的转发表。
下图是一个使用了AS-PATH和NEXT-HOP的例子:
· · · 在AS1中的路由器知道到x的路径有两条,这两条路径具有相同的AS-PATH和不同的NEXT-HOP,根据NEXT-HOP值可以确定这两条链路是不同的路径,路由器使用NEXT-HOP的值和AS内部路由选择算法,确定到每条对等链路的路径费用,然后根据热土豆路由选择来决定适当的出口。
· · · 当一台网关路由器接收到一台路由器通告时,它会使用输入策略来决定是否接收或过滤该路由、是否设置某种属性等操作。
· · · BGP路由选择:
· · · 路由器可能知道多条路由去到达一个相同的前缀,这时BGP会顺序地调用下列消除规则,直到保留下一条路由:
1、比较本地偏好:路由会拥有一个本地偏好属性,
该属性的值是一种策略性决定,它取决于 AS 的网络管理员。
本地偏好信息可能从该路由器设置,或者相同 AS 中的其他路由器学习到,
拥有较高本地偏好的路由会被选择;
2、在剩余路由中,选择具有最短AS-PATH的路由,
当BGP只使用此规则进行路由选择时,使用DV算法来决定最短路径,
其中距离使用的是AS跳的数目。
3、在剩余路由中,将选择最靠经NEXT-HOP路由器的路由。
4、如果还剩余多条路由,就根据BGP标志符来选择路由。
· · · 路由器中的转发表表项的设置:
· · · 路由器转发表的表项是由前缀(a.b.c.d/x)和一个对应的路由器输出端口组成。我们假设有一条外部前缀(来自不同的AS),当路由器通过接收iBGP或eBGP的通告,知道了该外部前缀后,需要指定适当的输出端口(即以该前缀为目的地址的数据报应该从哪个端口发出)。如果接收到对该前缀的多个通告时,路由器会使用BGP路由选择进程,找出对于该前缀的最好的路由。选定之后,该路由包括了NEXT-HOP属性,它是沿着这条路径的该路由器AS之外的第一台路由器的IP地址,该路由器则使用OSPF来确定通向NEXT-HOP路由器的最短路径,最后便得到了对于该路由,路由器的输出端口号,然后将前缀-端口号加入到转发表中。
· · · 路由选择策略:
· · · W和Y是桩网络(只和一个AS相连接),X是个多宿桩网络(连接了两个不同的AS),对与所有进入桩网络的流量一定是去往该网络的,都有离开桩网络的流量一定是源于该网络的。
· · · 如图,显示了6个互联的自治系统:
· · · 由于提供商网络会提供 AS 间的路由服务,因此它们会交互彼此之间知道的路由信息。由于 B->C 的路由有 2 条(还可以是 B->X->C),但是 x 作为一个客户只想要享受服务,而不愿意转发 B->C 的流量。所以 X 将不会通告 B 或 C 关于存在 B->X->C 路径的事实,规避转发 B->C 流量。X通告自己没有通向(除了自身外)任何其他目的地路径,那么X就会起到一个桩网络的作用。
· · · 对于运行的ISP都遵循:任何穿越某ISP主干网的流量必须是其源或目的位于某个客户网络中。如果不遵循这个原则,B可能会转发来自C的流量,通往A->W,这样B不会得到任何收益,因为A、C都不是B的客户,都是提供商网络,所以B会确保C和A可以直接连接从而引导A客户的流量是A和C的工作(费用),和B没有关系。
· · · BGP 报文
· · · BGP-4 共使用四种报文:
打开 (OPEN) 报文:用来与相邻的另一个网关路由器建立关系。
更新 (UPDATE) 报文:用来发送某一路由的信息,以及列出要撤消的多条路由。
保活 (KEEPALIVE) 报文:用来确认打开报文和周期性地证实邻站关系。
通知 (NOTIFICATION) 报文:用来发送检测到的差错。
· · · AS间和AS内部路由选择协议的对比:
· · · 策略:在AS间中,策略问题起主导地位,因为一个给定AS产生的流量也许不能穿过另一个特定的AS,或许与之相反;而在AS内部,并不会考虑策略问题,因为都是在相同的管理下进行的。
· · · 规模:通过层次路由可以节省路由表的大小,减少路由产生的流量。通过将单个较大的 ISP 分成多个 AS,可以适应大规模的互联网。
· · · 性能:对于AS间路由选择协议,性能往往不是第一考虑因素,策略才是,如果AS间存在一条费用很大的链路,但考虑到策略时,说不定也会采用该路径。而在AS内部对策略的因素不会考虑太多了,而是更关注一条路由的性能、费用等。
· 广播和多播路由选择:
· 单播路由选择协议:单个源节点基于这种协议向单个目的节点发送分组。
· 广播路由选择协议:一种从源节点到网络中其他所有节点交付分组的服务。
· 多播路由选择协议:使单个源节点能够向其他网络节点的一个子集发送分组的副本。
· · 广播路由选择算法:
· · 无控制洪泛: 实现广播的最常见的技术是泛洪方法:要求该节点向它的所有相邻节点发送分组的副本。这种方法虽然会最终将分组交给网络中的所有节点,但是如果该网络中存在环,则每个广播分组的多个副本会进行无穷地循环。除了这个缺点外,还有个缺点是:如果每个节点都和多个节点相连,那么最后会生成大量的分组副本,导致广播风暴。
· · 使用序号的受控洪泛: 我们使用序号控制洪泛,源节点将其地址或者其它唯一标识符,以及广播序号放入广播分组中。每个节点维护它已经收到的、复制的和转发的源地址和每个广播分组的序号列表。每当节点收到一个广播分组时,就会检查该分组是否在列表中,如果在,则丢弃改分组,如果不在,复制该分组并向所有邻居节点转发。
· · 反向路径的受控洪泛: (Reverse Path Forwarding,RPF)。当一台路由器接收到具有给定源地址的广播分组时,仅当该分组到达的链路是位于它自己的返回其源的最短单播路径上,它才会向所有出链路转发报文;否则路由器会丢弃该报文,不会向任何出链路转发该分组。RPF仅需知道在它到发送方的单播最短路径上的下一个邻居,这样,它就可以考虑是否泛洪接收到的这个广播分组。如图:
A会向B、C发送广播分组,然后B、C判断出该分组是来自自己到A的单播最短路径上的,所有B、C洪泛此分组,当C收到来自B的分组时,因为不是沿着A到C单播最短路径上的分组,所以C不会洪泛此分组,以此类推。
· · 生成树广播: 虽然受控洪泛避免了广播风暴,但它们不能完全避免冗余广播分组的传输。所以我们考虑这种算法——最小生成树算法:将图中的每个节点用树结构连接到一起,如果有n个节点,那么只需要n-1条链路。构造最小生成树的方法很多,有Prime算法(加点算法)、Kruskal算法(加边算法)等。如图是一个基于Prim算法的生成树构造:
· · 实践中的广播算法: 广播协议被用于应用层和网络层,应用层中的Gnutella使用TLL字段限制转发一个洪泛请求通过的跳数,当一个Gnutella进程接受并复制一个请求时,它会在请求转发之前减小TLL字段,所以Gnutella的洪泛机制是范围受限洪泛。在OSPF路由选择算法和中间系统到中间系统(IS-IS)路由选择算法中,使用了一种序号控制洪泛来广播链路状态通告(LSA),OSPF使用了一个32bit序号,以及一个16bit年龄字段来标识LSA。年龄字段起到了类似TTL字段的作用。
· · 多播路由选择算法:
· · 多播分组被交付给网络节点的一个子集。在因特网体系结构中,多播数据报使用间接地址来编址,用一个标识来表示一组接收方,一组接收方使用这个单一标识符,当寻址找到该组的分组副本会被交付给所有与该组相关联的多播接收方。在因特网中表示一组接收方的单一标识就是一个D类多播地址,与之相关的接收方小组是多播组,每台主机有一个唯一的IP单播地址,该单播地址完全独立与它参与的多播组的地址。
· · · 因特网组管理协议:
· · · IGMP运行在一台主机与其直接相连的路由器之间,IGMP可以让主机通知与其相连的路由器:在主机上运行的一个应用程序想要加入一个特定的多播组,然后通过多播路由选择协议使多播数据报能路由到所有的多播组。所以因特网的网络层多播由IGMP和多播路由选择协议构成。
· · · IGMP只有三种报文类型,IGMP报文被封装在一个IP数据报中,使用的IP协议号为2。
· · · membership_query报文是路由器向与之相连的主机发送的报文,用来确认主机已经加入的所有多播组的集合。
· · · membership_report报文是用来响应membership_query报文的。当一个应用程序首次加入一个多播组时,也可以由主机产生一个membership_report报文,不需要等待来自路由器的membership_query报文。
· · · leave_group报文,该报文由主机发出,当主机离开组播组时发送此报文,向组播路由器报告离开了特定的组播组。(这种报文是可选的)。
· · · 软状态:由一个端系统发送的周期性状态更新报文的概念,状态可能会在一次传输失败(或崩溃)中丢失,但是会自动地由后面的更新报文所恢复(除非后面的更新报文也丢失),所以这种机制对端系统来说不需要调用任何显示的崩溃恢复过程。IGMP使用软状态机制的一个例子:当没有主机响应一个具有给定地址的membership_query报文时,该路由器就推断出已经没有主机在这个组了。
· · · 多播路由选择算法:
· · · 多播路由选择的目的就是发现一颗链路树,这些链路连接了所有属于该多播组的相连主机的路由器,这样多播分组就能沿着这棵树发送到所有多播组中的主机(当然该树中可能会包含一些不属于该多播组的与主机相连的路由器)。
· · · 使用一棵组共享树的多播路由选择: 这种路由选择主要是构建一棵树,并且该树要包括所有具有属于该多播组的相连主机的边缘路由器。我们可以使用类似构造最小生成树的Prim算法的思想去构造多播路由选择树,在多播组中的与主机相连的路由器会向中心节点(经过单播)发送加入报文,直到加入报文到达了已经属于多播树的一台路由器或到达该中心节点。
· · · 使用一棵基于源的树的多播路由选择: 组共享树多播路由选择构建了单一的、共享的路由选择树,方便路由所有发送方的分组。而现在要讲的方法为多播组中的每个源构建一棵多播路由选择树,源节点x使用了RPF(反向路径转发)算法来构造一棵多播转发树,方便用于源于源节点x的多播数据报。如果一台路由器在一个多播组中,并且与这台路由器相连的有许多未加入该多播组的主机,当我们传输多播分组时,会给这些未加入多播组的主机发送分组,这就导致了很多不可避免的分组传输,所以我们可以使用一种剪枝的方法解决此问题:如果一台接收到多播分组的多播路由器没有加入该组的相连主机,则它会向上游路由器发送一个剪枝报文,如果一台路由器从它每个下游路由器收到剪枝报文,则它就能向上游转发一个剪枝报文。剪枝报文用来告诉路由器不用再转发该多播组的多播分组了。
· · · 因特网中的多播路由器选择:
· · · 距离向量多播路由选择协议(Distance Vector Multicast RoutingProtocol,DVMRP),DVMRP实现了具有反向路径转发与剪枝算法的基于源节点的树(RFP算法)。
· · · 协议无关的(Protocol Independent Multicast,PIM)多播路由选择协议,PIM协议可以辨识两种多播分发情况(稠密模式、稀疏模式)。
稠密模式中,多播组的成员位置分布稠密;
也就是说,在该区域内的许多路由器需要参与到
多播数据报路由选择的过程中,使用了一种洪泛与剪枝反向路径转发思想,
类似于DVMRP。
稀疏模式中,具有相连组成员的路由器数量比较少,
且成员分布较为分散。使用聚集点来建立多播分法树。
· · · 通过对BGP的多协议扩展,使得BGP能够为其它协议承载路由选择信息,包括多播信息。使用多播源发现协议(MSDP)能够将不同的PIM稀疏模式域中的聚集点连接在一起(更多请参见RFC 4271)。