一、IPv4 地址规划¶
1.1 IPv4地址¶
1.1.1 IPv4地址组成¶
IPv4地址分成网络部分和主机部分
1.1.2 IPv4地址分类¶
IPv4地址根据定义可分为:A类地址、B类地址、C类地址
A类地址:第一字节的第一位为0的IP地址,第一字节的数值范围为1-126(数字0和127不作为A类地址,数字127保留给内部回环地址) B类地址:第一字节的第一和第二位为10的一组地址,第一字节的数值范围为128-191 C类地址:第一字节的第一、第二和第三位为110的一组地址,第一字节的数值范围为192-223
1.2 主网及子网划分¶
1.2.1 主网¶
主网段采用自然掩码,即A类网络中使用8位掩码,B类网络中使用16位掩码,C类网络中使用24位掩码。在相应自然掩码的后面继续添加掩码位所定义出来的网络是主网的子网,其掩码称为子网掩码。
子网掩码用来和IP地址"与"运算后计算出网络地址,子网掩码的形式是一串1后跟随一串0组成,其中,1对应的是IP地址中的网络位,而0在IP地址对应的是主机位。
1.2.2 子网划分¶
1、层次性 实现网络的层次性划分,需要综合考虑地域和业务因素,采用自顶向下的方法划分,达到有效管理网络、简化路由表的目的,一般情况下: * 对于大骨干网络和大城域网络相结合的网络,采用层次性划分的方式; * 对于行政区类型的网络,采用多级网络分配方式。 2、连续性 连续地址在层次结构的网络中易于进行路由聚合,大大缩减路由表数量,提高路由查找的效率。尽量为每个区域分配连续的IP地址空间。尽量为具有相同业务和功能的设备分配连续的IP地址。 3、扩展性 分配地址时,在每一层次上都要留有余量。当网络规模扩展时能保证地址分配的连续性,实现网络的长远规划。 4、高效性 利用可变长子网掩码VLSM(Variable Length Subnet Mask)技术分配IP地址,充分合理地利用地址资源。
1.3 IPv4报文¶
IPv4头的长度至少为20Byte,最多为60Byte。报文格式如下:

- 版本号(Version):长度4bit。标识目前采用的IP协议的版本号,二进制为0100代表IPv4,二进制为0110代表IPv6。
- 报文头长度(Header Length):长度为4bit。这个字段的作用是为了描述IP报文头的长度,因为在IP报文头中有变长的可选部分。该部分占4位,取值范围从5到15,即本区域值=IP头部长度(单位为bit)/(84)。因此,一个IP报文头部长度最长为"1111",即154=60个Byte,IP报文头部最小长度为20Byte。
- 服务类型(Type of Service):长度为8bit,用于实施QoS。
- 报文总长度(Total Length):长度为16bits。以Byte为单位计算的IP报文的长度(包括报文头部和数据),所以IP报文的最大长度为65535Byte。
- 标识符(Indentifier):长度为16bit。该字段与Flags和Fragment Offest字段联合使用,对较大的上层数据包进行分段(fragment)操作。路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分。
- 标记(Flags):长度3bit。该字段第1位不使用。第2位是DF(Don't Fragment)位,DF设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个ICMP错误信息。第3位是MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP报文的头中将MF位设为1。
- 片偏移(Fragment Offset):长度13bit。表示该IP报文在该组分片中的位置,接收端靠此来组装还原IP报文。
- 生存时间(TTL):长度8bit。当IP报文进行传送时,先会对该字段赋予某个特定的值,当IP报文经过每一个沿途的路由器的时候,每个沿途的路由器会将IP报文的TTL值减少1,如果TTL减少为0,则IP报文就会被丢弃,这个字段可以防止由于路由环路而导致IP报文在网络中不断被转发。
- 协议(Protocol):长度8bit。标识了上层所使用的协议。例如ICMP(协议号为1)、IGMP(协议号为2)、OSPF(协议号为89)。
- 头部校验(Header Checksum):长度16bit。用来做IP头部的正确性检测,但不包含数据部分。因为每个路由器都要改变TTL值,所以路由器会为每个通过的数据包重新计算这个值。
- 源和目标地址(Source and Destination Addresses):这两个地段都是32bits。标识了这个IP报文的起源和目标地址,要注意除非使用NAT,否则整个输出过程中,这两个地址不会改变。
- 可选项(Options):这是一个可变长的字段。该字段属于可选项,主要用于测试,由起源设备根据需要改写。可选项目包含以下内容。
- 松散源路由(Loose Source Routing):给出一连串路由器接口的IP地址,IP包必须沿着这些IP地址传送,但是允许在相继的两个IP地址之间跳过多个路由器。
- 严格源路由(Strict Source Routing):给出一连串路由器接口的IP地址,IP包必须沿着这些IP地址传送,如果下一跳不在IP地址表中则表示发生错误。
- 路由记录(Record Route):当IP包离开每个路由器的时候记录路由器的出战接口的IP地址。
- 时间戳(Timestamps):当IP包离开每个路由器的时候记录时间。
- 填充(Padding):因为IP报文头长度(Header Length)部分的单位为32bit,所以IP报文头长度为32bit的整数倍。因此,在可选项后面,IP协议会填充若干个0,以达到32bit的整数倍。
二、IP路由表和FIB¶
2.1 IP路由转发和标签转换¶
2.1.1 传统转发方式¶
根据IP报文的目标地址,查找IP路由表中所有路由条目,做最长的匹配后确定转发接口。因其对路由表做逐行扫描,这种IP转发方式消耗较大CPU资源。
2.1.2 目前转发方式¶
在设备内部,构建了一张转发表Forwarding Information Base(FIB),FIB包含所有已知路由表中的全部路由,只要路由表中有新的路由出现,就一定出现在FIB表中,它是由路由表中的路由条目的变化驱动的。进入FIB中的转发条目并不会超时消失,所以任何时候数据包都可以根据FIB做路由转发,而不需要使用RIB表。
2.2 IP路由表和FIB表¶
路由器转发数据包的关键是路由表和FIB表,每个路由器都至少保存着一张路由表(RIB)和一张FIB表。路由器通过路由表选择路由,并通过FIB表指导报文进行转发,所以FIB表处于数据平面。而RIB则处于控制层面。
2.2.1 路由表¶
- IP路由表 路由器使用IP路由表来保存各路由协议的最佳路由和决策优选路由,并负责把优选路由下发到FIB表,通过FIB表指导报文进行转发。IP路由表依据各种路由协议的优先级和度量值来选择路由。 说明:如果路由器上定义了VPN-Instance,则每个VPN-Instance中仅包含一个IP路由表和一个FIB表。
- 协议路由表 协议路由表中存放着该路由协议发现的路由信息
- 路由表中关键项
- Destination:表示此路由的目的地址。用来标识IP包的目的地址或目的网络。
- Mask:表示此目的地址的子网掩码长度。
- Proto:表示学习到此路由的路由协议
- Pre:表示此路由的路由协议优先级。优先级高(数值小)者将成为当前的最优路由。
- Cost:路由开销。当到达同一目的地的多条路由具有相同的路由优先级时,路由开销最小的将成为最优路由。
- NextHop:表示此路由的下一跳地址,指明数据转发的下一个设备。 说明:Preference用于不同路由协议间路由优先级的比较,Cost用于同一种路由协议的不同路由条目的比较。
- Interface:表示此路由的出接口,指明数据从本地路由器哪个接口转发出去。 说明:无论动态还是静态生成的路由表项,只有在出接口状态是Up的情况下,才能通过命令dis ip rou查到相应的路由信息,否则该路由为非激活状态,可以通过命令dis ip rou protocol查询路由是否为激活状态。
2.2.2 FIB工作机制¶
在路由表选择出路由后,路由表会将激活路由下发到FIB表中。当报文到达路由器时,会通过查找FIB表进行转发。
为了连接不同的网络拓扑需要不同的路由协议,这样就产生了RIB(Routing Information Base)。RIB是创建FIB的基础,路由器会根据路由管理策略,从RIB中提取出最小转发信息并放入FIB。用户还可通过路由管理向FIB中添加静态路由。
在路由表选择出路由后,路由表会激活路由下发到FIB表中。当报文到达路由器时,会通过查找FIB表进行转发。FIB可下发到各个板卡,数据报文在板卡上执行硬件交换,无需经过CPU,一旦在FIB中找不到对应的条目,报文继续发送给CPU去处理。
FIB表的匹配遵循最长匹配原则,查找FIB表时,报文的目的地址和FIB中各表项的掩码进行按位"逻辑与",得到的地址符合FIB表项中的网络地址相匹配。最终选择一个最长匹配的FIB表项转发报文。
2.2.2.1 FIB操作部分组成¶
- 控制平面 负责在创建FIB表前与路由管理的接口工作,将FIB下载到转发引擎,对于分布式系统,还需要将FIB下载到I/O板。
- 转发平面 直接查找FIB表项,然后根据查找的结果转发数据。每个FIB表项中都指明报文到某网段或者某主机的出接口,及下一跳地址或者目的主机地址。
2.2.2.2 display fib注释¶
- FIB Table:FIB表
- Total number of Routes:路由表总数
- Destination/Mask:目的地址/掩码长度
- Nexthop:下一跳
- Flag:当前标志,G、H、U、S、D、B的组合
- G(Gateway网关路由):表示下一跳是网关;
- H(Host 主机路由):表示该路由为主机路由;
- U(Up可用路由):表示该路由状态是Up;
- S(Static 静态路由)
- D(Dynamic动态路由)
- B(Black Hole黑洞路由):表示下一跳是空接口;
- L(Vlink Route):表示Vlink类型路由
- TimeStamp:时间戳,表示该表现项存在的时间,单位是秒
- Interface:到目的地址的出接口
- TunnelID:隧道标识符。如果报文到下一跳需通过MPLS转发,其Tunnel ID不为0;如果报文通过IP转发,其Tunnel ID为0
2.3 路径选择¶
2.3.1 选路规则¶
路由设备上多个协议同时提供到同一目标网络的路由,仅最佳路由进入路由表。最佳路由选择规则如下: * 规则1:首先选择Preference高的路由(数值越小表明优先级越高),若无法选择,进入规则2; * 规则2:如果路由具有相同的Preference,再选择协议内部优先级高的路由,若无法选择,进入规则3; * 规则3:如果路由具有相同优先级又属于同一协议,则优选cost值低的路由,如果路由cost值相同则有条件形成负载分担,如果形成负载分担的路由条数超出系统限定的最大值,则只能选取前m条作为活跃路由。
2.3.2 负载分担转发¶
网络节点在转发流量时,将负载(流量)分摊到多条链路上进行转发,包括路由负载分担、隧道负载分担和Eth-Trunk负载分担。
2.3.3 优点¶
- 负载分担将流量分担到多条链路上,可以增加链路总带宽,并减少由于某些链路负担过重造成的阻塞状况;
- 由于负载分担的链路之间相互形成备份关系,其中一条链路故障时,流量可以自动切换到其他可用的链路上继续转发,从而提高链路可靠性;
2.3.4 缺点¶
- 由于流量转发具有一定的随机性,因此负载分担可能不利于对业务流量的管理。
2.3.5 负载分担转发分类(依据对接收的连续数据包处理)¶
- 逐包负载分担 路由器在转发去往同一目的地的连续多个报文时,根据路由表的路径,在IP层依次通过各条路径发送,也就是总是选择与上次不同的下一跳地址发送报文。
- 逐流负载分担 路由器根据IP报文中五元组信息(源地址、目的地址、源端口、目的端口、协议)进行路由转发。当发现五元组信息相同时,路由器总是选择与上一次相同的下一跳地址发送报文。当发现五元组信息不同时,路由器会根据Hash计算的散列值选取路径进行转发。FIB的转发都是基于流完成的。 注意:默认情况下,VRP使用基于流的负载分担,可以通过命令load-balance packet改变负载分担方式为逐包方式,目前,支持负载分担的路由协议为RIP、OSPF、BGP、IS-IS、静态路由(最多8条)。路由协议可自定义最大可支持的等价路由的数量,使用命令maximum load-balancing number,number最大为8!
2.3.6 负载分担算法¶
逐包负载分担,设备启用了一个定时器,每来一个包,计数器加1,根据计数器的值选择出接口。
逐流负载分担采用哈希算法。
2.3.7 逐流和逐包对比¶
逐包比逐流的负载均衡好。逐流的均衡程度取决于负载分担的规则和业务流量特征。
逐包的缺点是可能导致报文乱序。影响报文乱序的因素如下: * 链路质量差导致报文乱序。当链路质量较差时,会存在不同延时,链路丢包、错包,因此导致报文到达对端先后乱序 * 数据包大小不均,被混合发送时,在链路传输效率一定的情况下,长度较小的数据包即使晚于长度较大的数据包被送到链路上,也可能会到达对端。因此采用逐包负载分担时,需要考虑现网业务是否容忍乱序,所在链路是否有保序的功能。 * 由于逐包方式可能导致报文乱序,对报文顺序非常敏感的语音、视频等关键业务不建议使用逐包方式。
2.3.8 负载分担分类¶
负载分担有两种,"等成本"负载分担和"不等成本"负载分担。
2.3.8.1 等成本负载分担(ECMP)¶
- 定义:到达同一目的地有多条等价链路,流量在这些等价链路(到达目的地的cost值相等的链路/路径)上平均分配,不会考虑链路带宽的差异。
- 缺点:在路径间带宽差异大时,带宽利用率低。
2.3.8.2 非等成本负载分担(UCMP)¶
- 定义:到达同一目的地有多条带宽不同的等价链路,流量根据带宽按比例分担到各条链路上。
- 优点:所有链路可根据带宽比例分担流量,提高链路带宽利用率
- 说明
- UCMP目前只支持逐流方式。如果同时配置UCMP和逐包方式,则采用逐包方式的等成本负载分担,UCMP不生效。
- 在各条非等价负载分担路径中,任一条链路的带宽不能小于总带宽的1/16。否则该链路不参与非等价负载分担。
- 目前,支持非等成本负载功能的接口包括Ethernet接口、ATM接口、Serial接口、MP接口、GE接口、POS接口、IP-Trunk接口、Eth-Trunk接口、TE Tunnel接口。
2.3.9 华为负载分担实现¶
- 华为的ECMP实现
- 如果存在相同前缀的多条路由,则其中有几条活跃的静态路由,就形成几路负载分担,静态路由负载分担不要求cost值相等。
- 对于一条静态路由,如果它是活跃的,且存在多个迭代下一跳,则有几个迭代下一跳,就形成几路负载分担。这种情况称为迭代负载分担。
- 华为的UCMP实现
- 华为提供基于接口的UCMP功能,使等价路由可根据出接口带宽不同而分担不同比例的流量,这种出接口上实现的UCMP功能和路由协议无关,可应用在任何场景下。
- 用户在出接口配置非等价负载分担UCMP功能,开启UCMP功能需要在出接口子视图下输入load-balance unequal-cost enable,这样等价链路可根据带宽不同而分担不同比例的流量,使负载分担更合理。
- 对于逻辑接口,也可以使能UCMP功能,但必须先执行load-balance bandwidth <1-10000000>命令手动配置带宽,此命令仅支持在三层接口下进行配置。针对子接口,仅以以太网子接口(Dot1q终结子接口和QinQ终结子接口)和Eth-trunk子接口(Dot1q终结子接口)支持配置非等价负载分担功能。
- 说明
- 只有当所有等价链路的出接口都使能UCMP功能,且触发了FIB表项重新下发后,各等价链路才在设备上进行非等价负载分担。如果其中任一接口没有使能UCMP功能,即使触发了FIB表项重新下发,各等价链路仍进行等价负载分担。
- 等价链路的出接口启用或者关闭UCMP功能后,需要在接口子视图模式下,使用shutdown 和undo shutdown 命令复位该接口,从而触发FIB表项重新刷新生效。
2.3.10 路由备份¶
根据实际情况,设计到同一目的地的多条路由,其中一条路由的优先级最高,作为主路由;其余路由优先级较低,作为备份路由。主路由会出现在路由表中,而备份路由不会出现在IP路由表中,仅仅存放在协议路由表中,当路由表中主路由由于故障原因在路由表删除后,最优的备份路由将进入路由表中,实现路由备份功能。
路由备份有3种实现方式: * 通过Preference的优先级别实现,Preference小的为主路由 * 调整Cost,Cost小的为主路由 * 等价多路径情况下,通过调整某条路由的weight来影响进路由表的路由。该命令目前仅支持在IS-IS、OSPF路由协议下使用。命令格式:Nexthop ip-address weight <1-255>,值越小,优先级越高。 说明:指定下一跳权重,取值范围是1~254,该值越小,路由优先级越高。默认情况下,未配置weight的下一跳其权值为255,级别最低。
2.4 路由度量¶
路由度量(metric)标示出了这条路由到达指定目的地址的代价
2.4.1 影响路由度量的因素:¶
- 路径长度 路径长度是最常见的影响路由度量的因素。
- 网络带宽 网络带宽是一个链路实际的传输能力。
- 负载 负载是一个网络资源的使用程度
- 通信开销 衡量一条链路的运营成本
2.5 下一跳¶
路由表中任何条目都需要直连的下一跳,下一跳即是控制平面的路由通告设备,同时也是数据报文转发的路由器。
2.5.1 直连下一跳¶
直连下一跳是在IGP路由协议中,由直连邻居通告的路由,下一跳是通告路由器。数据报文转发直接给通告路由的下一跳路由器。
2.5.2 非直连下一跳¶
非直连下一跳出现在静态路由和BGP场景下 * RIB表把路由表的路由向FIB下放时,迭代下一跳为直连的下一跳或接口。 * FIB表中任何路由都会关联直连接口和直连的下一跳。
2.5.3 路由指向出口或下一跳¶
在路由需要迭代的场景中,当IGP路由或隧道发生切换时,快速刷新FIB转发路径,实现流量的快速收敛,降低业务的目的影响。
三、有类和无类路由¶
3.1 有类路由¶
3.1.1 概念¶
有类路由协议在产生路由更新时,并没有包含路由所对应的子网掩码。接收路由器要根据该路由是在主网内还是主网外来判定是否为掩码。如RIPv1属于有类路由协议。
3.1.2 查找方式¶
1、首先查看路由表或FIB表,是否有对应的A类或B类或C类主网路由条目。如果有对应的主网路由,则继续判断是否该主网中有对应的子网。如果没有匹配的子网,则报文丢弃。即使路由表中有缺省路由,也不会去匹配到该路由。 2、如果没有主网路由条目,则可以查找是否有缺省路由条目,如果有,则按缺省路由来转发报文。如果没有缺省路由,则报文丢弃。 说明:这种路由查找方式并非按掩码长度查找最佳路由。
3.2 无类路由¶
3.2.1 概念¶
无类路由协议会在通告的路由中携带子网掩码。如RIPv2、OSPF及IS-IS、BGP则属于无类路由协议。
3.2.2 查找方式¶
1、首先查看路由表或FIB表,参考最长的匹配原则进行匹配。 2、如果路由表中最长匹配都没有找到路由,那么将会匹配到最不精确的缺省路由。 说明:华为路由器默认采用无类路由器进行查找。
四、静态路由¶
4.1 概述¶
路由协议是路由器之间维护路由表的规则,用于发现路由,生成路由表,并指导报文转发。
- 路由协议分类(依据来源)
- 直连路由:通过链路层协议发现的路由
- 静态路由:通过网络管理员手动配置的路由
- 动态路由:通过动态路由协议发现的路由
4.2 对比静态路由和动态路由¶
- 静态路由
- 优点:配置方便,对系统要求低,适用于拓扑结构简单且稳定的小型网络。
- 缺点:不能自动适应网络拓扑的变化,需要人工干预。
- 动态路由
- 优点:自动适应网络拓扑的变化,适用于一定数量三层设备的网络。
- 缺点:配置对用户要求比较高,对系统的要求高于静态路由。同时占用一定的网络资源和系统资源。
4.3 静态路由目的¶
静态路由在不同网络环境中有不同的目的: * 当网络结构比较简单时,只需配置静态路由就可以使网络正常工作。 * 在复杂的网络环境中,配置静态路由可以减少不必要的动态路由协议更新报文开销,改进网络的性能。静态路由可以增加网络的稳定性。 * 静态路由比动态路由使用更少的带宽,并且不占用CPU资源来计算和分析路由更新。
4.4 静态路由主要参数¶
1、目的地址和掩码 IPv4的目的地址为点分十进制格式,掩码既可以用点分十进制又可以用掩码长度表示。当目的地址和掩码全为0时,表示静态缺省路由。 2、出接口和下一跳地址 根据不同的出接口类型,指定出接口和下一跳地址。
- 点到点类型:只需指定出接口。如PPP或HDLC协议的链路,可以不指定下一跳地址。
- NBMA类型:只需配置下一跳。因为除了配置IP路由外,还需要在链路层建立IP地址到链路层地址的映射。
- 广播类型和VT(Virtual-Template)类型:必须指定通过该接口转发报文时对应的下一跳地址。
说明:下一跳地址一定是直连的下一跳地址,否则会引入迭代过程,增加查表延迟和CPU负荷。 3、静态路由优先级 对于不同的静态路由,可以为它们配置不同的优先级,优先级数字越小,优先级越高。
配置到达相同目的地的多条静态路由,如果指定相同优先级,则可以实现负载分担;如果指定不同优先级,则可实现路由备份。 说明:华为设备静态路由如果不配置优先级,默认优先级为60.
五、动态路由协议¶
5.1 概述¶
动态路由能够自动学习并构建路由表,它能够实时地适应网络发生的变化。如果拓扑发生了变化,路由协议会通过各自的算法重新计算路径并生成新的路由信息。动态路由协议更适用于网络规模大及复杂的网络。
5.2 分类¶
1、按照应用范围分类 * IGP(内部网络协议):工作在一个自治系统以内的路由协议,比如:RIP、OSPF、IS-IS。 * EGP(外部网关协议):工作在不同自治系统以内的路由协议,比如:BGPv4协议。 2、按照类别分类 * 有类路由协议:规定路由协议按照IP地址类别的方式来通告路由,并在路由更新时,只有IP前缀而不携带IP子网掩码信息。 * 无类路由协议:该类型的协议在路由更新时不仅有IP前缀也有网络掩码,而掩码精细划分出网络ID和主机ID。 3、按照算法分类 * 距离矢量协议 * 路径矢量协议 * 链路状态协议
5.3 矢量路由协议¶
5.3.1 距离矢量协议¶
所有路由信息都是经过邻居路由器来通告的。每台路由器收到路由后计算出最优路径放入到路由表中,然后再将路由表所有条目通告给其他邻居设备,收敛相对比较慢。如RIP协议。 * 工作特点 * 路由器不需要维持整个网络拓扑的信息,所有路由条目都是来自邻居路由器所通告的路由。 * 报文简单,通过周期性地发送更新报文来更新路由; * 每台设备收到邻居的更新后,首先自己计算路由,然后再通告给其他的邻居,收敛速度慢; * 邻居通告有问题的路由(可能是自己在其他方向通告出去的路由,被邻居路由器通告回来),当前路由器按正常路由接收,容易形成环路。
5.3.2 路径矢量协议¶
所有路由信息中包含了路径信息,以AS作为一个节点。BGP通过AS号来判断距离,也可以通过其防止环路的发生。
5.4 链路状态协议¶
链路状态路由选择协议又被称为最短路径优先协议,如OSPF、IS-IS。它们都是基于Edsger Dijkstra的最短路径优先(SPF)算法。路由器的链路信息称为链路状态,包括:接口的IP网段和掩码、链路的开销、链路上相邻的路由器等。链路状态路由器间并不传递"路由",而是通告这些链路状态信息,这些链路状态信息泛洪到每一台路由器,最终,每台路由器都有一致且完整的链路状态数据库,此时再使用该数据库和最短路径优先算法计算通向每个网络的首选(即最短)路径。在全网拓扑可知的情况下计算路由,所以链路状态路由协议内绝对无环。 * 工作特点 * 每台路由器都要描述直连接口的网络及拓扑信息,并把"链路'状态使用LSU(链路状态更新)沿所有链路通过给邻居,采用非周期的方式更新; * 每台设备收到LSU后,回送确认并把它复制到LSDB,并向其他非入口邻居以外的其他邻居通告,收到LSA的路由器快速收敛到全网; * 每台路由器周期或当拓扑变化时根据LSDB中的信息执行SPF计算; * 当拓扑变化时,全网所有路由器都在执行同样的SPF计算,不易形成环路。
5.5 链路状态协议和矢量路由协议对照表¶
| 链路状态路由协议 | 距离矢量路由协议 | |
|---|---|---|
| 优点 | 路由收敛快,不易于出现环路 | 原理简单,易部署;路由过滤及汇总灵活 |
| 缺点 | 对系统要求高,路由计算开销大;Flooding对带宽要求高;路由控制及过滤不灵活 | 易于出现环路;路由收敛慢 |
| 适用场景 | 适合中大型网络;要求收敛时间快;对开销无要求的场合 | 小型网络;对收敛时间无要求;路由控制要求高的场合 |
六、IPv6¶
6.1 IPv6概述¶
6.1.1 IPv6产生背景¶
1、能够提供的地址空间不足且分配不均 2、互联网骨干路由器的路由表非常庞大,对骨干设备的处理能力和内存空间带来较大压力,影响了数据包的转发效率。
6.1.2 IPv4地址短缺的解决方案¶
- CIDR(无类域间路由)
- 可以支持任意变长子网掩码,使ISP能够根据用户的需求数量分配相应的地址,从而提高了地址空间的利用率。
- NAT(网络地址转换)
- 优点:缓解了IP地址缺乏的问题
- 缺点:不支持端到端安全(由于NAT设备会对IP头部甚至数据部分进行修改,在需要对数据包进行完整性验证将会出错)
- 缺点:网络重新部署或扩容困难(由于可能使用相同的私有地址段,在网络合并时容易出现冲突,需要重新划分地址或者使用2次NAT实现互访,增加维护的复杂性和难度。)
- 缺点:破环了端到端的模型(NAT设备需要建立和维护一张NAT的状态表,增加了网络的复杂性,一些需要从外部发起连接的应用将无法实现。部分应用比如FTP,在数据部分会携带IP层的地址信息,针对这些应用需要单独设计ALG——应用程序层网关,实现对数据部分的修改,这样便增加了复杂程度,且不易于扩展。)
6.1.3 IPv6的优势¶
1、地址空间巨大 IPv6可以提供2的128次方个地址空间。 2、层次化的路由设计 前3位固定,第4~16位是顶级聚合,互联网骨干设备上的IPv6路由表只有8192(2的13次方) 3、效率高,扩展灵活 IPv6把报头分为基本头和扩展头,基本头中只包含选路所需要的8个基本选项,很多其他的功能都设计为扩展头。 4、支持即插即用 5、更好的安全性保障 由于IPv6协议通过扩展头的形式支持IPSEC协议,无需借助其他安全加密设备,可直接为上层数据提供加密和身份验证。 6、引入流标签的概念 使用IPv6新增加的FLOW LABEL字段,加上相同的源地址和目的地址。可以标记数据包同属于某个相同的流量,业务可以根据不同的数据流进行更细的分类,实现优先级控制。
6.2 IPv6地址¶
6.2.1 IPv6地址表示¶
把16位分为1块,一共分为8块,每块用":"相隔。同时,可以在原有基础上对IPv6地址表达方式进行简化,其简化规则为: * 每一个地址块的起始部分的0可以省略掉。 * 有1个或连续多个0组成的地址块可以用"::"取代。
6.2.2 IPv6地址结构¶
每个IPv6地址由网络前缀(相当于IPv4的网络位)和接口ID(相当于IPv4的主机位)。
6.2.3 EUI-64¶
接口ID可以由EUI-64方式获得,配合无状态自动配置一起自动生成IPv6地址,或者接口启动IPv6并配置IPv6地址后会自动生成Link-local地址。
- EUI-64自动生成
- 将FFFE插入MAC地址的公司标识(MAC地址的前24位)和扩展标识符(MAC地址的后24位)之间
- 将高7位的0改为1,表示此接口标识全球唯一。
- 举例:MAC地址为F8-A9-63-1E-A1-07
- 首先在F8A963和1EA107之间添加FFFE
- 其次F8二进制表示为11111000,将第7位由0反转为1,变成11111010。转换成十六进制数为FA。
- 最后得出的结果是FAA9:63FF:FE1E:A107
6.2.4 单播Unicast¶
一个单播地址只能标识一个接口,但一个接口可以有多个单播地址。其中单播地址可以细分为链路本地地址(Link Local Address)、唯一本地地址(Unique Local Address)、全球单播地址(Global Unicast Address)、嵌入IPv4地址的IPv6地址。 1、链路本地地址 链路本地地址只在同一链路上的节点有效,在IPv6启动后就自动生成,使用了特定的前缀FE80::/10,接口ID使用EUI-64自动生成,也可以使用手动配置。路由表中路由的下一跳或主机的默认网关都是链路本地地址。
2、唯一本地地址 唯一本地地址是IPv6网络中可以自己随意使用的私网地址,用来取代已作废的RFC3879定义的站点本地地址(Site-local地址),使用特定的前缀FC00/7。 唯一本地地址的设计使私有网络地址具有唯一性。 IPv6唯一本地地址格式如下:
| Prefix/L/Global ID/Subnet ID/Interface ID | Global ID | Subnet ID | Interface ID |
|---|---|---|---|
- Prefix:前缀,固定为7bit,FC00/7。
- L:L标志位,值为1时代表该地址在本地网络范围内使用的地址;值为0,被保留用作以后扩展。
- Global ID:40bit,全球唯一前缀;通过伪随机方式产生。
- Subnet ID:16bit,工程师根据网络规划自定义的子网ID。
- Interface ID:64bit,相当于IPv4中的主机位。
3、全球单播地址 全球单播地址相当于IPv4的公网地址。
全球单播地址格式:
| 001 | TLA | RES | NLA | SLA | Interface ID |
|---|---|---|---|---|---|
- 001:3bit,目前已分配的固定前缀为001。
- TLA(Top Level Aggregation)顶级聚合:13bit,IPv6的管理机构根据TLA分配不同的地址给某些骨干网的ISP,最大可以得到8192个顶级路由。
- RES:8bit,保留使用,为未来扩充TLA或者NLA预留。
- NLA(Next Level Aggregation)次级聚合:24bit,骨干网ISP根据NLA为各个中小ISP分配不同的地址段,中小ISP也可以针对NLA进一步分割不同地址段,分配给不同用户。
- SLA(Site Level Aggregation)站点级聚合:16bit,公司或企业内部根据SLA把同一大块地址分成不同的网段,分配给各站点使用,一般用作公司内部网络规划,最大可以有65536个子网。
4、嵌入IPv4的IPv6地址 * 兼容IPv4的IPv6地址 * 优点:这种IPv6地址的低32位携带一个IPv4的单播地址,一般主要用于IPv4兼容IPv6的自动隧道。 * 缺点:每个主机都需要一个单播IPv4地址,扩展性差,基本已经被6to4隧道取代。 * 映射IPv4的IPv6地址 地址的最前80bit全为0,后面16bit全为1,最后32bit是IPv4地址。 * 6to4地址 6to4地址用在6to4隧道,使用指定IANA指定的2002::/16为前缀,其后是32位的IPv4地址,6to4地址中后80位由用户自己定义,可对其中前16位划分,定义多个IPv6子网。不同的6to4网络使用不同的48位前缀,彼此之间使用其中内嵌的32位IPv4地址的自动隧道来连接。
IPv6单播地址分类
| 地址类型 | 高位二进制 | 十六进制 |
|---|---|---|
| 链路本地地址 | 1111111010 | FE80::/10 |
| 站点本地地址(已废除) | 1111111011 | FEC0::/10 |
| 唯一本地地址 | 11111101 | FC00::/7 |
| 全球单播地址(已分配) | 001 | 2000::/4或者3000::/4 |
| 全球单播地址(已分配) | 其余所有地址 |
6.2.5 任播(Anycast)¶
任播主要为DNS和HTTP提供服务。IPv6没有为任播规定单独的地址空间,任播地址和单播地址使用相同的地址空间。多台设备可以有相同的任播地址,以任播地址为目标的数据包会通过路由器的路由表被路由到离源设备最近的拥有该目标地址的设备。 * 优点 源节点不需要了解为其提供服务的具体节点,而可以接收特定服务,当一个节点无法工作时,带有任播地址的数据包又被发往其他主机节点。 * 分类 * 基于网络层任播 仅仅依靠网络本身(如路由表)来选择目标服务器节点 * 基于应用层任播 基于一定的探测手段和算法来选择性能最好的目标服务器节点。
6.2.6 组播(Multicast)¶
1、IPv6组播地址构成
| FF | Left time | Scope | Group id |
|---|---|---|---|
- FF:8bit,IPv6组播地址前8位都是FF/8,以FF::/8开头。
- Left time:4bit,第1位都是0,格式|0|r|p|t|。
- r位:取0表示非内嵌RP,取1表示内嵌RP
- p位:取0表示非基于单播前缀的组播地址,取1表示基于单播前缀的组播地址,p位取1,则t位必须为1。
- t位:取0表示永久分配组播地址,取1表示临时分配组播地址。
- Scope:4bit,标识传播范围。
- 0001-node(节点)
- 0010-link(链路)
- 0101-Site(站点)
- 1000-organization(组织)
- 1110-global(全球)
- Group id:12bit,组播组标识号。 2、IPv6固定的组播地址 所有节点的组播地址:FF02::1(相当于IPv4中的广播) 所有路由器的组播地址:FF02::2(相当于224.0.0.2) 所有OSPFv3路由器地址:FF02::5(相当于224.0.0.5) 所有OSPFv3DR和BDR地址:FF02::6(相当于224.0.0.6) 所有RIP路由器:FF02::9(相当于224.0.0.9) 所有PIM路由器:FF02::D(相当于224.0.0.13) 被请求节点组播地址:由固定前缀FF02::1:FF00:0/104和单播地址的最后24位组成。 3、特殊地址 0:0:0:0:0:0:0:0(::)未指定地址:不能分配给任何节点,表示当前状态下没有地址。如发送RA消息,DAD(重复地址检测)。 0:0:0:0:0:0:0:1(::1)环回地址:节点用它作为发送后返回给自己的IPv6报文,不能分配给任何物理接口,它被看作属于链路本地范围,可以当作虚拟接口的链路本地单播地址。相当于IPv4中的127.0.0.1。
6.3 IPv6的报文格式¶
6.3.1 IPv6基本报头¶
IPv6基本头定长40Byte,其中包含8个字段,相比IPv4报头,减掉了6个字段,新增加1个字段。

- Version:4bit,指定IPv6,数值=6。
- Traffic Class:8bit,等同于IPv4中的TOS字段,用来区分不同类型或优先级的IPv6数据包。其中使用了6bit作为DSCP,可以表示的DSCP值的范围为0~63。
- Flow Label:20bit,用作标识同一个数据流,可以标记一个流中的所有数据包,提高处理效率。
- Payload Length:16bit,数据包的有效载荷,指IPv6基本头后面的长度,包含扩展头部分。IPv6的有效载荷字段只是指数据部分的长度,不包含IPv6基本报头。
- Next Header:8bit,指明跟在基本头后面是哪种扩展头或者上层协议中的协议类型。如果只有基本报头而无扩展报头,那该字段的值指示的是数据部分所承载的协议类型。
- Hop Limit:8bit,功能类似于IPv4中的TTL字段,最大值为255,报文每经过一跳,该字段值会减1,减到0后数据包被丢弃。
- Source Address:128bit,数据包的源IPv6地址,必须是单播地址。
- Destination Address:128bit,数据包的目标IPv6地址,可以是单播或组播地址。
| Next header值 | 对应的扩展头或高层协议类型 |
|---|---|
| 0 | 逐跳选项扩展头 |
| 6 | TCP |
| 17 | UDP |
| 43 | 路由选择扩展头 |
| 44 | 分段扩展头 |
| 50 | ESP扩展头 |
| 51 | AH扩展头 |
| 58 | ICMPv6 |
| 60 | 目的选项扩展头 |
| 80 | OSPFv3 |
6.3.2 与IPv4报头的比较¶
IPv4报头中包含13个字段,其中包含版本、IHL、服务类型、总长度、标识、Flags、分段偏移、生存期、协议类型、首部校验、源地址、目的地地址、选项、填充。
IPv6采用头部定长40Byte设计,所以去除了IHL(头部长度)字段。分段功能由IPv6分段扩展头实现,所以去除了标识、Flags、分段偏移这三个字段。去除首部校验和的原因有三个,一是由于数据链路层大部分都已对数据进行了校验,保证了三层不需要再对数据包进行校验,二是由于四层协议也有类似的校验功能,三是由于TTL值每跳都在改变,路由器要频繁地进行校验和的重新计算,影响了数据包的转发速率。
6.3.3 IPv6扩展头结构¶
IPv6扩展头是可选报头,放在IPv6基本头后面(取代IPv4报头中的选项部分),同时大大提高了中间节点对IPv6数据包的转发速率。
目前IPv6扩展头只有6个,分别是逐跳选项报头、目的选项报头、路由报头、分段报头、认证报头、封装安全净载报头。其中逐跳选项报头和目的选项报头都采用类型-长度-值(TLV)的选项设计,其选项格式具体如下:
| Option Type | Opt Data Len | Option Data |
|---|---|---|
Option Type:8bit,标识类型,最高2位表示当设备部识别此扩展头时的处理方法。 * 00:跳过这个选项 * 01:丢弃数据包,不通知发送方 * 10:丢弃数据包,不论目的地址是否为组播,向发送方发1个ICMPv6的错误信息报文。 * 11:丢弃数据包,当目的地址不是组播时,向发送方发1个ICMPv6的错误信息报文。
第3位表示在选路过程中,Data部分是否可以被改变。 * 0:表示Option不能被改变。 * 1:表示Option能被改变。 说明:如果存在认证扩展头,在计算数据包的校验值时,可变化Data部分需要被当成8bit的全0处理。 Opt Data Len:8bit,标识Option Data部分长度,不包含Option Type和Opt Data Len部分的长度。 Option Data:长度可变,最大为255Byte,包含选项的具体数据内容。
6.3.4 IPv6已定义的扩展头¶
1、逐跳选项扩展头 * 概念 Next Header值=0 * 作用 用于携带在报文发送路径上必须被每一跳路由器检查和处理的可选信息,类似于IPv4中的ROUTER ALERT选项。 * 组成 Next Header——8bit,指明跟在基本头后面是哪种扩展头或者上层协议中的协议类型。 Hdr Ext Len——8bit,标识Options头的长度。 Options——可以携带不定数量采用TLV格式的选项。 2、路由选择扩展头 * 概念 Next Header值=43 * 作用 包含IPv6数据包到达目的地所要经过的中间节点,使源端可以强制数据包经过哪些节点,类似于IPv4的宽松源站选路。 * 组成 Next Header——8bit,指明跟在基本头后面是哪种扩展头或者上层协议中的协议类型。 Hdr Ext Len——8bit,标识Options头的长度。 Routing Type——8bit,目前只定义了类型0,表示数据包需要经过的中间路由器的地址。 Segment Left——8bit,表示数据包到达目的地址所需要经过的中间节点的数量。 type-specific data——内容由Routing Type决定。 Reserved保留部分为32Bit,Address[1]、Address[2]等表示数据包需要经过的中间节点。 说明:使用路由选择扩展头时,初始状态源端主机发出的数据包目的地址并非是实际的最终目的地址,而是需要经过的第一个中间节点,其Segments Left等于需要经过的节点数量,当它为0表示此路由器节点就是最终目的地址。 3、分段扩展头 * 概念 Next Header值=44 * 作用 如果源端需要发送的数据包超过Path MTU大小,源端在发送前需要将数据包先分段。在IPv4中,数据包超过接口的MTU值,中间节点路由器将对数据包进行分段处理;而在IPv6中,中间路由器不能对数据包分段,会直接丢弃。同时路由器会发送一个ICMPv6的错误信息报文给源端。 * 组成 Next Header——8bit,指明跟在基本头后面是哪种扩展头或者上层协议中的协议类型。 Reserved——8bit,目前保留未用为0。 Fragment Offset——13bit,等同于IPv4中的分段偏移字段。如该值为150,表示该报文的数据位于原报文的1200Byte处后。 Res——2bit,保留目前未用为0。 M——1bit,表示后续是否还有分段,如为1表示后续还有分段报文,为0表示该报文是最后一个分段报文。 Identification——32bit,该字段等同于IPv4的标识字段,为32位。源节点为每个被分段的IPv6包都分配一个标识符,用来唯一标识同一组分段的报文,便于接收端根据相同标识重组报文。 4、ESP扩展头(Encapsulating Security Payload) * 概念 Next Header值=50 * 作用 提供对数据包的完整性验证和加密,ESP将需要加密保护的字段加密后放入ESP头的数据部分,ESP与AH联合使用,用来提供认证和加密。 * 组成 SPI——32bit,与目的地址和AH协议组合,唯一标识本数据包的SA。 Sequence Num——32bit,是一个单调递增的数,用作防重攻击。 Payload Data——可变长,加密数据。 Padding——填充 Pad Length——8bit,标识Padding部分长度,0表示无填充。 Next Header——8bit,作用同基本头的Next Header Authentication Data——可变长,身份验证。 5、认证报头扩展头(Authentication Header) * 概念 Next Header值=51 * 作用 为报文提供完整性验证,在传输过程中不被改变的字段会被用作认证信息的计算,在传输过程中可能改变的字段如Hop limit字段,作为0处理。 * 组成 Next Header——8bit,指明跟在基本头后面是哪种扩展头或者上层协议中的协议类型。 Padload Len——8bit,标识认证报头的总长度。 RESERVED——16bit,保留,填充为0。 SPI——32bit,与目的地址和AH协议组合,唯一标识本数据包的SA。 Sequence Num——32bit,是一个单调递增的数,用作防重攻击。 Integrty Check Value——可变长,必须是4字节的整数倍,其内容用作完整性检查。 6、目的选项扩展头 * 概念 Next Header值=60 * 作用 取代了IPv4中的选项字段,携带了只能由目的地址才能处理的信息。 * 组成 Next Header——8bit,指明跟在基本头后面是哪种扩展头或者上层协议中的协议类型。 Hdr Ext Len——8bit,标识Options头的长度。 Options——可以携带不定数量采用TLV格式的选项。 7、扩展头出现顺序 * IPv6基本报头 * 逐跳选项扩展头 * 目的选项扩展头 * 路由选择扩展头 * 分段扩展头 * 认证报头扩展头 * 封装安全有效载荷扩展报头 * 目的选项扩展头(指那些被分组报文的最终目的地处理的选项) * 上层协议数据报文 说明:除了逐跳选项扩展头外,其余扩展头在传输路径不被路由器查看,保证了转发数据的高效。除了目的地址选项扩展头最多出现两次(一次在路由选择扩展头前,一次在上层协议头部前)以外,每个扩展头应当只出现一次。
6.4 ICMPv6¶
ICMPv6的协议类型号是58,在原有IPv4基础上,添加了邻居发现、无状态自动配置、PMTU等作用。同时,ICMPv6的错误报文的最高位必须是0,信息报文的最高位必须是1。
6.4.1 ICMPv6报文格式¶
1、type 8bit,表明消息的类型0~127是错误报文;128~255是消息报文。
| Type | Code | 备注 |
|---|---|---|
| 1(目的地不可达) | 0 | 没有去往目的地的路由 |
| 1(目的地不可达) | 1 | 与目的地的通信被管理员禁止 |
| 1(目的地不可达) | 2 | 超出源地址范围 |
| 1(目的地不可达) | 3 | 地址不可达 |
| 1(目的地不可达) | 4 | 端口不可达 |
| 1(目的地不可达) | 5 | 源地址在进出策略中拒绝 |
| 1(目的地不可达) | 6 | 拒绝去目的地的路由 |
| 2(数据包过大) | 0 | 此报文必须由路由器发送,用于响应数据包大于出接口的MTU值不能被转发,此报文会携带本接口的MTU发给源端,是PMTU发现的基础 |
| 3(超时) | 0 | 超出TTL限制 |
| 3(超时) | 1 | 分片重组超时 |
| 4(参数错误) | 1 | 基本头或者扩展头有错误的字段 |
| 4(参数错误) | 2 | 有不可识别的next header字段 |
| 4(参数错误) | 3 | 扩展头有未知的选项 |
| 128 | 0 | Echo Request |
| 129 | 0 | Echo Reply |
| 2、Code | ||
| 8bit,表明具体的原因。 | ||
| 3、Checksum | ||
| 16bit,校验和。 | ||
| 4、Message Body | ||
| 可变长,数据部分。 | ||
| ### 6.4.2 RS | ||
| 1、场景 | ||
| 当主机刚刚接入网络并配置为自动获取地址,主机需要自动获取前缀、前缀长度、默认网关等信息时,会发送RS信息。 | ||
| 源IP是发送接口的Link Local地址或未指定地址,目的地址为FF02::1或FF02::2,路由器收到RS消息后立刻回送RA消息(主机想要的单播地址的前缀及前缀长度消息)给主机。 | ||
| 2、报文格式 | ||
| (1)Type | ||
| 8bit,值133 | ||
| (2)Code | ||
| 8bit,值0 | ||
| (3)Checksum | ||
| 16bit,ICMPv6校验和,用于验证IPv6报头的完整性。 | ||
| (4)Reserved | ||
| 32bit,保留为0 | ||
| (5)Options | ||
| 选项,目前只定义一个,包含发送者的链路层地址,如果源地址为未指定地址,则RS消息中不能包含此选项。 | ||
| ### 6.4.3 RA | ||
| 1、场景 | ||
| 路由器周期性地发送RA消息,或者在收到主机发送的RS消息后立即发送,主要为主机提供编址信息以及其他配置信息。源IP是发送消息接口的Link Local地址,目的地址为FF02::1或为收到的RS消息中的源地址。 | ||
| 2、报文格式 | ||
| (1)Type | ||
| 8bit,值134 | ||
| (2)Code | ||
| 8bit,值0 | ||
| (3)Checksum | ||
| 16bit,ICMPv6校验和,用于验证IPv6报头的完整性。 | ||
| (4)Cur Hop Limit | ||
| 8bit,表示主机跳数限制,路由器建议采用无状态自动配置的主机在IP包的跳数限制在该字段中的值,该值为0时,表示路由器不推荐跳数限制值,由主机自己设置各自的跳数限制值。 | ||
| (5)M位 | ||
| 1bit,管理地址配置位,该位置0表示使用无状态自动配置;置1表示告诉主机使用DHCPv6服务器来获取配置信息,当置1时O位无意义,因为所有参数可以通过DHCPv6获得。 | ||
| (6)O位 | ||
| 1bit,表示其他配置标志位,该位置0表示DHCPv6服务器没有其他可用信息。该位置1时,其他参数用DHCPv6服务器获得,包括路由器生存时间、邻居可达时间、邻居重传时间、链路的MTU信息和DNS相关信息等。 | ||
| 说明:如果两个标记都不设置,表示无法通过DHCPv6服务器获取配置信息。 | ||
| (7)Reserverd | ||
| 保留字段,6bit,该字段未使用。 | ||
| (8)Router Lifetime | ||
| 16bit,表示主机把路由器作为默认网关的有效时间(华为默认1800s),当主机收到等于0的RA消息时,不会将通告该RA消息的源路由器配置为自己的默认网关。主机每次收到RA消息时,都会刷新此计时器。 | ||
| (9)Reachable Time | ||
| 32bit,表示通告邻居的可达时间,用作邻居不可达检测,为0表示未指定。 | ||
| (10)Retrans Timer | ||
| 重传计时器,表示主机在重传邻居请求信息前应该等待的时间,为0表示未指定。该字段一般用作地址解释和邻居不可性检测。 | ||
| (11)Options | ||
| 可能包含的选项有发送RA消息的路由器的链路层地址、MTU、前缀信息。 | ||
| 说明:IPv6设备可以利用RS和RA消息完成无状态自动配置和路由器发现。 | ||
| ### 6.4.4 NS消息 | ||
| 1、场景 | ||
| 当节点不知道目标地址的链路层地址时,将发送NS消息。此时NS消息的源地址是发送接口的global地址,目标地址是被访问的地址所对应的被请求节点的组播地址。此消息包含发送端的链路层地址(MAC地址),类似于ARP请求。 | ||
| NS还可以用来检测邻居的可达性和进行地址冲突检测,当节点需要验证邻居的可达性时,将发送单播的NS消息;在DAD(重复地址检测)过程中,源地址为未指定地址。 | ||
| 2、消息格式 | ||
| (1)Type | ||
| 8bit,值135 | ||
| (2)Code | ||
| 8bit,值0 | ||
| (3)Checksum | ||
| 16bit,ICMPv6校验和,用于验证IPv6报头的完整性。 | ||
| (4)Reserved | ||
| 32bit,未使用,保留为0 | ||
| (5)Target Address | ||
| 128bit,请求的目标设备的IPv6地址,该字段不能使用组播地址。 | ||
| (6)Options | ||
| 选项,目前只定义一个,包含发送者的链路层地址,如果源地址为未指定地址,则NS消息中不能包含此选项。### NA消息 | ||
| 1、场景 | ||
| 当节点接受到NS消息后,会快速响应NA消息,或者当节点需要快速传播新的消息(非请求)时,会发送NA消息。对于收到NS后回复的NA消息是以单播的形式发送的,源IP是被访问的IP地址,目的IP是NS消息中的源地址。 |
如果收到的NS消息中的源地址是未指定地址,则NA消息的目的地址为所有节点的组播地址,类似于ARP响应。对于非请求的NA消息,目的地址也未所有节点的组播地址。 2、消息格式 (1)Type 8bit,值136 (2)Code 8bit,值0 (3)Checksum 16bit,ICMPv6校验和,用于验证IPv6报头的完整性。 (4)R位 1bit,路由器标记位,置1表示该节点为路由器,在邻居不可达检测中检测路由器是否变成主机。 (5)S位 1bit,请求标记位,置1表示该NA消息是收到消息的回应。S位在邻居可达性检测时被用作可达性确认。 (6)O位 1bit,替代标记位,置1表示需要替代当前已缓存的IPv6地址的链路层地址,从而更新邻居缓存表项。置0表示该NA消息不更新现有的链路层地址,如果没有相应的链路层地址,则添加新的表项。 32bit,未使用,保留为0 (7)Reserved 29bit,该字段未使用,保留为0。 (8)Target Address 128bit,如果用作NS回应的NA消息,此字段应该是收到NS消息中的Target Address字段的值,对于非响应的NA消息,此字段应该是链路层地址发生变化的IPv6地址。 (6)Options 选项,包含此NA消息发送者的链路层地址,对于回应组播NS请求的NA消息必须包含此项;对于回应单播NS请求的NA消息可以不包含此选项,因为单播NS请求的发送者有正确的链路层地址。
6.4.5 重定向消息¶
1、场景 路由器既可以ICMPv6重定向消息通知主机在去往目的地址的路径有更好的下一跳,也可以用于通知目的地址就是邻居。 消息的源地址是发生接口的链路本地地址。目的地址是触发此重定向报文的源地址。 重定向消息只对主机有效,对路由器无效。 2、消息格式 (1)Type 8bit,值为137 (2)Code 8bit,值0 (3)Checksum 16bit,ICMPv6校验和,用于验证IPv6报头的完整性。 (4)Reserved 32bit,该字段未使用,保留为0。 (5)Target Address 通知到主机的最优下一跳路由器,必须是该下一跳路由器的Link-local地址;当目的地址是邻居时,Target Address必须是Destination Address,否则是重定向后的下一跳路由器地址。 (6)Destination Address 需要被重定向的目的地址。 (7)Options 选项,包含目标地址(重定向后使用的下一跳路由器)的链路层地址。
七、NDP¶
7.1 NDP概述¶
节点使用ND,可以确定连接在同一链路上的邻居的链路层地址,快速清除已经变成无效的缓存值。
主机也使用ND发现能为其转发报文的路由器。
7.1.1 IPv6的NDP(邻居发现协议)解决问题¶
1、路由器发现 主机如何找到连接在同一链路上的路由器。 2、前缀发现 主机如何发现前缀集合 3、参数发现 节点如何发现链路上的参数,以及互联网参数。 4、地址自动配置 允许节点采用无状态自动配置接口所需要的IP地址。 5、地址解析 仅知道目的地IP地址时,如何获得目的地的链路层地址,类似ARP 6、下一跳确定 映射目的地IP地址到邻居地址的算法,发送给该目的地的流量将会发送给该邻居地址,下一跳可以是路由器或者目的地本身。 7、邻居不可达检测 节点如何确定邻居不可达,如果邻居被用作路由器,其不可达时需要尝试替代默认路由器。 8、重复地址检测 用作节点确定自己想使用的地址是否已经被另一节点所使用。 9、重定向 路由器如何通知主机有到达目的地更好的下一跳。
7.1.2 NDP(邻居发现协议)使用地址¶
1、未指定地址 表示发送者暂时无地址 2、链路本地地址 只有链路范围内的单播地址 3、FF02::1(所有节点组播地址) 到本链路范围内的所有节点地址 4、FF02::2(所有路由器多播地址) 到本链路范围内的所有路由器地址 5、被请求节点组播地址 由固定前缀FF02::1:FF00:0/104和单播地址的最后24位组成。
7.1.3 NDP(邻居发现协议)主要消息¶
1、路由器请求(RS)消息 2、路由器通告(RA)消息 3、邻居请求(NS)消息 4、邻居通告(NA)消息 5、重定向消息
7.2 无状态自动配置¶

1、PC发送RS信息,向路由器进行请求。RS消息是通过类型为133的ICMPv6报文来发送的,发送到目标地址FF02::2。 2、路由器以RA消息作为回应。该消息包括PC所需要的前缀、前缀长度等消息;该消息发送到所有主机地址为FF02::1。 3、PC接收到RA消息后,使用其中的前缀和前缀长度信息完成地址的自动配置;PC还会将RA消息中宣告的链路本地地址添加到本地的默认路由器列表中,并将该路由器作为默认网关。 4、PC完成地址的自动生成过程后,在使用该地址前还会进行DAD(重复地址检测)的过程以确认该地址是否被其他设备使用。
7.3 路由器发现¶

7.3.1 RA消息通告优先级¶
主机根据路由器在各自RA消息中通告的优先级选择默认网关,总共有三个优先级:low、medium、high。主机会以路由器中间选择优先级高的路由器作为默认网关。如果所有路由器的优先级都一样,主机将这些路由器都用作默认网关,即使用负载分担的方式。 说明:华为路由器发出的RA消息中的默认级别为中级。同时,华为路由器默认不开启RA通告,可以使用undo ipv6 nd ra halt开启IPv6 RA通告功能。
7.3.2 优选地址和试验地址¶
1、优选地址 在试验地址的基础上,进行DAD检测无冲突后,即可视为优选地址。 2、试验地址 当一个IPv6地址刚被配置在接口时,此时这个地址为试验地址
7.3.3 优选生存期和有效生存期¶
1、优选生存期 主机以无状态自动配置方式生成的地址视为优选地址的时间。 2、有效生存期 主机收到的来自路由器RA消息中的前缀可以使用的时间。 说明:有效生存期必须大于优选生存期。
7.4 地址解析¶
7.4.1 概念¶
使用NS和NA消息来完成IPv6地址到链路层地址映射的过程。
7.4.2 案例分析¶

1、PC1向PC2的请求节点的组播地址发送NS消息,该消息是通过类型为135的ICMPv6报文来承载,目的地址是PC2的IPv6单播地址。 2、PC2收到NS消息后,以单播的方式向PC1回应NA消息,该消息中包含了PC2的MAC地址。PC2还会将PC1的IPv6地址和MAC地址添加到本地的邻居缓存表中。 3、PC1收到来自PC2的NA消息后,将PC2的IPv6地址以及它的MAC地址添加到本地的邻居缓存表。
7.5 DAD(重复地址检测)¶

1、PC1配置了地址2001::1 2、PC1发出NS消息以确定网络中是否还有其他设备使用IPv6地址。 3、如果这时PC2的IPv6地址是2001::1,那么它在收到PC1的NS消息后,会用NA消息进行响应,告诉PC1它也在使用该地址;否则不会响应。 4、PC1会在发送出NS消息后设置一个定时器,如果定时器内接收到了NA响应,说明该试验地址已经被其他设备占用,PC1会停止使用该地址;如果在定时器内,没有收到NA响应,说明该地址可以使用,那么该地址会从试验状态切换到已分配状态。
7.5.1 NUD(邻居不可达性检测)¶
NUD用来检测邻居状态的进程,通过定期发送NS以确定邻居的状态。其中邻居状态如下: 1、INCOMPLETE(未完成状态):此状态表示地址解析还在进行,本机已经发送NS消息,但还没收到NA消息。 2、REACHABLE(可达状态):此状态表示已经收到了对方发送的NA消息,获得了对方的链路层地址。 3、STALE(过期状态):邻居可达时间超时,表示未知是否可达。或者收到了邻居状态发送的非请求的NA消息,携带的链路层地址和本地表项中地址不符合,该邻居状态立刻变成STALE状态。 4、DELAY(延迟状态):DELAY状态不是一个稳定的状态,而是一个延时等待状态。当向处于STALE状态的邻居发送报文时,该邻居状态变成DELAY状态,并发送NS消息。 5、PROBE(探测状态):节点会处于PROBE状态的邻居持续发送单播NS的报文,如持续收不到NA回应,将删除表项,如收到NA回应,邻居状态变为REACHABLE。 6、EMPTY(空闲状态):表示节点上没有相关邻接点的邻居缓存表项。
邻居状态及状态之间的关系转换图:

7.5.2 邻居状态跟踪与地址解析的区别¶
1、地址解析的NS消息目的地址是被请求节点组播地址,而邻居状态跟踪的NS消息目的地址是单播。 2、邻居状态跟踪的NS消息中S位必须置位。
7.6 重定向原理¶
1、路由器发送重定向消息满足规则如下: * 检查收到的数据包的源地址,是本设备的邻居表中的邻居 * 下一跳的接口等于收到数据包的接口 * 数据包的目的地址不是一个组播地址 2、主机可以接收到的重定向消息满足的条件: * 报文的源地址必须是一个Link Local地址。路由器必须使用它们的Link Local地址作为RA消息以及重定向消息的源地址,以便主机能够唯一识别路由器 * HOP LIMIT字段必须等于255,报文不可能被路由器转发。 * ICMP校验和有效 * ICMP Code必须是0 * ICMP 报文的长度必须是40Byte或以上。 * 所有包含的选项长度必须大于0。
八、思考题¶
1、查RIB和查FIB有什么区别?数据报文的查表过程。 答:RIB表是路由表,FIB是快速转发表。数据报文根据报文FIB查表转发,FIB工作在数据平面,RIB是控制平面的内容。只有FIB无法路由的报文会转发给RIB继续查表,如有ACL应用的场合。如果是查路由表,就是基于进程的处理,即我们常说的基于CPU的处理,比较耗时。是因为要拆/封一次数据。而基于FIB表转发,则直接用FIB表中的MAC直接封装后转发。 2、是否矢量路由协议就出环,而链路状态路由协议没有环路?请解释一下。 答:矢量路由路由协议的路由学习是从邻居学习到的,学来的路由中没有拓扑信息,所以路由器容易相信任何有问题的路由并把它当成合理的路由放到路由表中,易于出现环路。链路状态路由协议通过泛洪链路状态使每台路由器了解全网的拓扑信息,继而执行SPF计算,所以在泛洪的区域中是不会有环的,但是链路状态路由协议在边界的位置,如区域或路由域的边界是矢量行为,可能出现像矢量路由协议一样的环路问题。 3、链路状态路由协议是如何做到ECMP的? 答:矢量路由协议直接接收的是路由,可以从多个方向收到等成本的路由。而链路状态路由协议是通过SPF计算出多条路由。 4、IPv6的NDP协议中,DAD功能是否在IPv4中有类似的功能? 答:在IPv6网络中,DAD用来检测是否存在冲突的地址;在IPv4网络中,类似的功能是通过免费ARP机制来完成的。IPv4网络中的设备在手工或自动配置IP地址后,立刻针对本地IP发一个ARP请求,如果接收到ARP应答,那么就存在地址冲突后的问题,该IP是不可使用的;反之,如果没有接收到任何ARP回应,那么该IP是可以使用的。 5、IPv4的地址的自动配置和IPv6有什么不同? 答:在IPv4网络中,地址的自动配置只能通过DHCP服务器来完成,而在IPv6网络中,地址的自动配置可分为无状态自动配置和有状态自动配置,利用普通的IPv6路由器就可以实现无状态自动配置,网络中可以没有DHCPv6服务器;另外,利用DHCPv6服务器可以实现地址的无状态自动配置和有状态自动配置。 6、ICMPv6在IPv6的作用有哪些? 答:ICMPv6是IPv6网络中最重要的基础协议。在IPv6网络中,邻居发现、DAD、无状态自动配置、Path MTU发现、MLD等功能都是使用ICMPv6报文来实现的。 7、IPv6协议较IPv4的协议的优点有哪些? 答: (1)更大的地址空间; (2)更简洁的报头; (3)地址配置和重新编址更方便灵活; (4)可以更方便地进行层次网络部署,从而更好地进行路由聚合,提高了路由转发速率; (5)更好地支持端到端的安全; (6)更好地支持QoS; (7)IP移动特性更加优化; 8、IPv6中请求节点组播地址(solicited-node multicast address)可以用来替代广播地址嘛? 答:IPv6中,使用组播地址来替代广播地址做原广播地址的工作行为,但DAD和地址解析这两类行为是目前请求节点组播地址的唯一用途。请求组播地址ff02::1:ff00:0000/104根据单播地址而生成,其所有成员是后24位地址一样的节点集合,其工作范围是本网段。