网络层 (network layer)

  由于早期电信网的成功经验,有些人认为应该让网络层像电信网一样,两台主机通信前先建立连接(虚电路 Virtual Circuit),然后沿着已建立的连接发送分组,网络负责可靠交付。但因特网却提出一种新的设计思路,因为电信网的终端(话机)非常简单,没有差错处理能力,因此电信网必须提供可靠交付。但因特网的终端是具有差错处理能力的计算机,所以在网络层只向上提供简单灵活的、无连接的、尽最大努力交付的数据报服务。网络在发送分组时不需要先建立连接,每一个分组(IP数据报)独立发送,也不进行编号,网络层不提供服务质量的承诺,所传分组可能出错、丢失、重复、失序或者交付时限。由于传输网络不提供端到端二点可靠服务就使网络中的路由器可以做的比较简单,而且价格低廉,如果主机种的进程间通信需要可靠服务,就由运输层负责(包括差错控制、流量控制等)。使网络造价大大降低,运行方式灵活,可以适应多种应用。

虚拟互联网络

  如果要把全世界范围内的网络都互连起来,并且能够互相通信,没有一种单一的网络能适应所有用户的需求,另外随着技术不断发展也会有新的网络技术产生,所以将网络互相连接在一起需要使用一些中间设备,中间设备又称为中间系统中继系统(relay)。根据设备所在的层次,可以有以下五种中间设备:

  • 物理层中继系统:转发器(repeater 中继器)、集线器 HUB;
  • 数据链路层中继系统:网桥或桥接器(bridge)、交换机(switch);
  • 网络层中继系统:路由器(router);
  • 网桥和路由器的混合物:桥路器(brouter)、三层交换机;
  • 网络层以上的中继设备: 网关(gateway);用网关在应用层面连接两个不兼容的系统。

当中继系统是转发器或网桥等数据链路层以下的设备时,一般不称之为网络互连,仅仅是把一个网络扩大了,而着仍然是一个网络(局域网)。由于历史原因,许多有关TCP/IP的文献将网络层使用的路由器称为网关。网络互连都是指用路由器进行网络互连路由选择

IP网概念

IP网概念
上图表示有许多计算机网络通过路由器进行互连,由于参加互连的计算机网络都使用相同的网际协议IP(Internet Protocol),因此可以把互连起来的计算机网络看成一个巨大的虚拟互联网络(internet)。围殴为虚拟互连网络也就是逻辑互连网络,他的意思是互连起来的各种物理网络的异构型贝莱是客观存在的,但是我们利用协议IP就可以使这些性能各异的网络在网络层上看起来好像是一个统一的网络。这种使用协议IP的虚拟互连网络可简称为IP网

网际协议 IP

网际协议IP及其配套协议
  网际协议IP是TCP/IP体系种两个最主要的协议之一,也是最重要的因特网标准协议之一,与IP协议配套使用的还有四个协议:

  • 地址解析协议 ARP(Address Resolution Protocol)
  • 反向地址转换协议 RARP(Reverse Address Resolution Protocol)
  • 网际控制报文协议 ICMP(Internet Control Message Protocol)
  • 网际组管理协议 IGMP(Internet Group Management Protocol)

  但反向地址转换协议 RARP现在已经淘汰不使用了,由于网际协议IP是用来使互联的许多计算机网络能够进行通信,因此TCP/IP体系中的网络层常常被称为网际层(Internet layer)IP层

IP地址及其表示方法

  我们因特网看成为一个单一的、抽象的网络。IP地址就是给每个连接在互联网上的主机(或路由器)的每一个接口分配一个在全世界范围唯一的32位的标识符。IP地址由互联网名字和数字分配机构ICANN(Internet Corporation for Assigned Names and Numbers)进行分配。北京计算机应用研究所于1993年6月4日从APNIC处获得了一个C类的IP地址。CNNIC以国家互联网络注册机构(NIR)的身份于1997年1月成为APNIC的联盟会员,成立了以CNNIC为召集单位的分配联盟,已为多家ISP提供IP地址。

点分十进制记法
  在主机中,IP地址都是32位的二进制代码,为了提高可读性我们常每隔8位插入一个空格(实际在机器中没有),为了我们方便书写和记忆,常用其等效的十进制数字表示,并且在每段数字之间加上一个小数点,这就叫做点分十进制记法(dotted decimal notation)
IP地址中的网络号和主机号字段
  我们给每个接口分配一个IP地址,其含义就是这个IP地址不但标志了这个主机(或路由器),而且还标志了此接口所连接的网络。因此32位的IP地址采用两级接口,由两个字段组成。第一个字段是网络号,它标志这个主机(或路由器)所连接的网络。一个网络号在整个互联网范围内必须是唯一的。第二个字段是主机号,它标志着该主机。

分类的IP地址

  在互联网发展早期采用的是分类的IP地址,将32位的IP地址划分为若干类,如下图。
分类的IP地址以及各类地址所占的比例
一般不使用的特殊IP地址
|网络号|主机号|源地址使用|目的地址使用|代表意思|
|:-:|:-:|:-:|:-:|:-:|
|0|0|可以|不可|在本网络上的本主机|
|0|X|可以|不可|在本网络上主机号为X的主机|
|全1|全1|不可|可以|只在本网络上进行广播(各路由器均不转发)|
|Y|全1|不可|可以|对网络号为Y的网络上的所有主机进行广播|
|127|非全0或全1的任何数|可以|可以|用于本地软件环回测试|

分类IP地址优点:

  • IP地址管理机构在分配IP地址是只需要分配网络号,剩下的主机号由单位自行分配,方便了IP地址的管理;
  • 路由器仅根据目的主机所连接的网络号转发分组而不考虑目的主机号,这样就可以使路由表中的项目数大幅减小,从而减小了路由表所占的存储空间。

无分类编址CIDR

  由于早期对IP地址资源的浪费和20世纪90年代互联网迅猛的发展,IP地址将在不久后枯竭,而且互联网主干网上的路由表中的项目急剧增长(从几千个增长到几万个)。为提高IP地址资源利用率,产生了变长子网掩码VLSM(Variable Length Subnet Mask),后在VLAM的基础上又进一步研究出无分类编制方法 CIDR(Classless Inter-Domain Routing)
  CIDR消除了A类、B类和C类地址以及划分子网的概念,更加有效地分配IPv4的地址空间。CIDR采用变长的网络前缀(network-prefix)代替分类地址中的网络号子网号,剩下的后面部分仍然使主机号,有些文献也称之为后缀(suffix)
CIDR表示的IP地址

无分类的两级编址的记法

  CIDR使用斜线记法(slash notation)或称CIDR记法,即在IP地址后面加上一个斜线”/“,然后协商网络前缀所占的位数(这个数值对应三级编址中子网掩码中1的个数)。例如:220.78.168.0/24

CIDR地址块

  CIDR把网络前缀都相同的连续的IP地址组成CIDR地址块,一个地址块包含的IP数目取决于网络前缀的位数。如128.14.32.0/20表示的地址块共有2^12个地址,起始地址是128.14.32.0同时也是地址块中最小地址最大地址为128.14.47.255。全0和全1的主机号地址不使用。
  128.14.32.0/20除了表示一个地址块,也表示一个网络前缀,还是这个地址块中主机号全为0的地址。
一些特殊的地址块

  • 前缀n=32,即32位IP地址都是前缀,没有主机号。这其实就是一个IP地址,这个特殊地址用于主机路由;
  • 前缀n=31,这个地址块中只有两个IP地址,其主机号分别为0和1,这个地址块用于点对点链路;
  • 前缀n=0,同时IP地址也全是0,即0.0.0.0/0。用于默认路由。
地址掩码

  地址掩码常称为掩码,由一连串1和接着一连串0组成,1的个数就是网络前缀的长度。地址掩码又称为子网掩码。

路由聚合

  一个CIDR地址块可以表示很多地址,这种地址的聚合常称之为路由聚合(route aggregation),它使得路由表中的一个项目可以表示很多个原来的传统分类地址的路由。减小了路由器之间路由选择信息的交换,提高了整个互联网的性能。CIDR虽然不使用子网了,但仍然使用掩码这一名词(但不叫子网掩码)。路由聚合也称为构成超网(supernetting)。前缀长度不超过23位的CIDR地址块都包含了多个C类地址,这些C类地址合起来就构成了超网。CIDR的一个好处是可以更加有效的分配IPv4的地址空间,可以根据客户的需要分配适当大小的CIDR地址块。
CIDR子网划分
  对于点对点链路构成的特殊网络现在也常常不分配IP地址,这种特殊网络叫做无编号网络[RFC 3021]或匿名网络。

IP地址与MAC地址

  从层次的角度看,MAC地址是数据链路层使用的地址,是固化在网卡ROM中的物理地址,而IP地址是网络层和以上各层使用的地址,是软件实现的一种逻辑地址。
IP地址和MAC地址
  在IP层抽象的互联网上只能看到IP数据报,虽然IP数据报要经过路由器转发,但源地址和目的IP地址始终不变,路由器只根据目的站的IP地址进行转发,数据报中间经过的路由器的IP地址并不出现在IP数据报的首部中。
  在局域网的链路层只能看见MAC帧,传输过程中需走协议栈不断变更源MAC地址和目的MAC地址。MAC帧首部的这种变更在上面的IP上是看不见的,尽管互连在一起的网络的MAC地址体系各不相同,但IP层抽象的互联网屏蔽了下层这些很复杂的细节,只要在网络层上探讨问题就能够使用统一的、抽象的IP地址研究主机和主机或路由器间的通信。
不同层次看IP地址和MAC地址

地址解析协议ARP

  计算机在通信时使用了两个地址,分别是网络层的IP地址和数据链路层的MAC地址。通信时知道了主机或路由器的IP地址,需要找出其相应的MAC地址就使用了地址解析协议ARP。ARP是解决同一个局域网上的主机或路由器的的IP地址和MAC地址的映射问题。
ARP协议
  ARP协议请求广播帧形式发送,所有主机接收该帧;ARP响应单播帧形式发送,除目标主机外,其他主机全部丢弃。

ARP高速缓存

  每台主机都设有一个ARP高速缓存(ARP cache),里面存有本局域网各主机和路由器的IP地址到MAC地址的映射表,存放最近获得的IP地址和MAC地址的绑定,以减少ARP广播的数量。实现方法是不论时收到ARP请求或是相应都互相记录下IP与MAC的映射存入表中。

ARP报文格式

ARP协议是封装到MAC帧里的
ARP报文格式
当主机A欲向本局域网上的某个主机B发送IP数据报时。先在其ARP cache中查看有无主机B的IP地址。如果有就直接查出其对应的硬件地址,再将此硬件地址写入MAC的目的MAC地址,然后通过局域网将该MAC帧发送;如果没有,ARP进程会在本局域网上广播发送一个ARP请求分组,收到ARP响应后就将得到的目标主机MAC地址和IP地址的映射写入ARP cache然后通过局域网将该MAC帧发送。

ARP协议注意问题

  ARP协议不能穿透路由器,ARP时用于解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题,如果所要找的主机和源主机不在同一个局域网上,那么就要通过ARP找到一个位于本局域网上的某个路由器的硬件地址,然后把分局发送给这个路由器,让这个路由器把分组转发给下一个网络。从IP地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。只要主机或路由器要和本网络上另一个已知IP地址的主机或路由器进行通信,协议ARP就会自动把这个IP地址解析为链路层所需要的MAC地址,然后插入到MAC帧中。(中间人攻击风险)

使用ARP的四种典型情况
使用ARP的四种典型情况

IP数据报格式

IP数据报格式
IP数据报由首部和数据两部分组成,首部的前一部分是固定长度共20字节,固定部分后面是一些可选字段,其长度是可变的。

  • 版本: 占4位,指IP协议的版本,目前为4即IPv4。
  • 首部长度: 占4位,可表示的最大数值是15个单位(一个单位4字节),IP的首部最大长度是60字节,最小仅有固定部分20字节也就是对应值为0101。
  • 区分服务: 占8位,指明期望获得哪种类型的服务。
  • 总长度: 占16位,首部+数据的长度单位为字节,数据报的最大长度为65535字节,注意总长度与MTU的关系(以太网MTU为46~1500字节)。
  • 标识: 占16位,与标志和片偏移字段与IP分片有关,IP数据报总长度超过MTU时,IP需要分片。标识是一个计数器,用来产生一个标识,所有IP分片的标识与原始IP数据报一致,便于接收方还原原始IP数据报。
  • 标志: 占3位,最高位无意义,中间位DF(Don’t Fragment) DF=1时不允许分片(常用来探测路径最小MTU);DF=0允许分片。最低位MF(More Fragment) MF=1 后面还有分片,MF=0时这是最后一片。
  • 片偏移: 占13位,分片后某片在原始IP数据报中的相对位置,以8字节为单位。
  • 生存时间: 占8位,生存时间英文缩写为TTL(Time To Live),表示数据报在网络中的寿命,由发出数据报的源点设置该字段,目的是为了防止无法交付的数据报无限制的在互联网中兜圈子而白白消耗网络资源,最初的设计以秒为单位,每经过一个路由器就前去数据报在路由器所消耗掉的一段时间(小于1s按1算),当TTL减为0时就丢弃这个数据。随着技术进步就把TTL字段功能改为跳数限制,因此现在TTL的单位为跳数。若把TTL设为1就表示该条数据报只能在本局域网中传送。
  • 协议: 占8位,表示该数据报文所携带的数据所使用的协议类型。以便使目的主机的IP层知道应将数据部分上交给哪个协议来处理。不同的协议有专门不同的协议号,常用如下。
协议名 ICMP IGMP IP TCP EGP UDP IPv6 ESP AH ICMP-IPv6 OSPF
1 2 4 6 8 9 17 41 50 51 58 89
  • 首部检验和(checksum): 占16位用于校验数据报的首部,但不包括数据部分。数据报每经过一个路由器,首部的字段都可能发生变化(如TTL),所以需要重新校验。而数据部分不发生变化,所以不用重新生成校验值。为了进一步减小计算工作量,不采用复杂的CRC校验码,而采用简单的分16位序列的反码和校验。
  • 源地址: 占32位,表示发送数据报的源IP地址。
  • 目的地址: 占32位,表示接收数据报的目的IP地址。
  • 可选字段: 该字段用于一些可选的报头设置,主要用于测试、调试和安全的目的。这些选项包括严格源路由(数据报必须经过指定的路由)、网际时间戳(经过每个路由器时的时间戳记录)和安全限制。
  • 填充:由于可选字段中的长度不是固定的,使用若干个0填充该字段,可以保证整个报头的长度是 32 位的整数倍。
  • 数据部分: 表示传输层的数据,如保存 TCP、UDP、ICMP 或 IGMP 的数据。数据部分的长度不固定。

IP层转发分组过程

基于终点的转发

  按目的主机号来制作路由表则所得出的路由表就会过于庞大,按主机所在的网络地址(前缀)制作路由表就可以使路由表大大简化。路由表没有给分组指明到某个网络的完整路径,路由表指出到某个网络应当先到某个路由器(即吓一跳路由器),到达下一跳路由器后继续查找其路由表,ARP协议获取下一跳MAC地址封装成帧再交给下一跳,直到最后到达目的网络。

最长前缀匹配

  使用CIDR时,路由表中的每个项目由网络前缀和下一跳地址组成,在查找路由表时可能会得到不止一个匹配结果。这时应当从匹配结果中选择具有最长网络前缀的路由这叫做最长前缀匹配(longest-prefix matching)。因为网络前缀越长,其地址块就越小,路由就越具体,最长前缀匹配又称为最长匹配最佳匹配

特定主机路由

  互联网所有的分组转发都是基于目的主机所在的网络,但允许有这样的特例,即为特定的目的主机指明一个理由。采用特定主机路由可以使网络管理人员能更方便地控制网络和测试网络,同时也可在需要考虑某种安全问题时采用这种特定主机路由。

默认路由(default route)

  路由器采用默认路由以减少路由表所占用的空间和搜索路由表所用的时间。末端网络(存根网络)也就是网络只用一个路由器和互联网连接,这种情况下使用默认路由(0.0.0.0)。

路由器分组转发流程
路由器分组转发流程

网际控制报文协议ICMP(Internet Control Message Protocol)

  为了更有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP辅助IP协议工作。ICMP分担了IP的一部分功能:

  • 差错报告: 目的不可达、源站抑制、超时、参数问题、重定向;
  • 查询: 回送请求/应答、地址掩码请求/应答、时间戳请求/应答;

  ICMP使主机或路由器报告差错情况和提供有关异常情况的报告,ICMP报文虽然是装在IP数据报中,作为其中的数据部分,看起来好像是高层协议,但实际是辅助IP协议工作的是网络层的协议。

ICMP报文格式

  • 类型: ICMP报文有两种类型,即差错报告报文和询问应答报文。
  • 代码: 对类型进一步细化的说明
  • 检验和: 对整个ICMP报文进行校验

几种常用的类型代码组合

ICMP差错报告报文

  ICMP差错报告报文共有四种

  • 终点不可达 包括目标主机没开机、目标主机中的进程没有开启、主机所在目标网络不可达等。
  • 时间超过 TTL为0。
  • 参数问题 当路由器或目的主机收到IP数据报的首部中有的字段值不正确时(首部检验和出错),就丢弃该数据报并向源点发送参数问题报文。
  • 改变路由(重定向) 找到了更好的路由

ICMP差错报告报文数据字段
  ICMP差错报告报文数据字段,是原始出错IP数据报的首部加上原始出错IP中的数据字段前8个字节。是为了告诉源IP数据报发送端,是哪个进程(端口)发送的IP数据报出错。

不应发送ICMP差错报告报文的几种情况
  • 对封装到IP中的ICMP差错报告报文不再发送ICMP差错报告报文;
  • 对第一个分片的数据报分片的所有后续数据报分片都不发送差错报告报文;
  • 对具有多播地址的数据报都不发送差错报告报文;
  • 对具有特殊地址(如127.0.0.0或0.0.0.0)的数据报不发送差错报告报文;
ICMP询问报文

  询问报文目前使用的有以下两种:

  • 回送请求或回送回答 ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问,收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。用来测试目的站是否可达以及了解其有关状态。请求type = 8, code = 0;回答type = 0, code = 0。(ping用的就是此ICMP报文)
  • 时间戳请求或时间戳回答 在ICMP时间戳请求报文发出后就能够收到对方回应的ICMP时间戳回答报文,利用在报文中记录的时间戳发送方很容易计算出当前网络的往返时延。请求type = 13, code = 0;回答 type = 14, code = 0。
ICMP应用举例

  ICMP的一个重要应用就是分组网间探测PING(Packet InterNet Groper),用来测试两台主机之间的连通性。PING使用了ICMP回送请求与回送回答报文。另外PING是应用层直接使用网络层ICMP的一个例子,它没有通过运输层的TCP或UDP。

IPv6

IPv6分组格式

  为了解决IP地址耗尽的根本措施就是采用具有更大地址空间的新版本IP,即IPv6.经过多年的研究和时延,2017年7月发布了IPv6的正式标准[RFC 8200, STD86]。IPv6 仍支持无连接的传送,但将协议数据单元 PDU 称为分组,而不是 IPv4 的数据报。为方便起见,本书仍采用数据报这一名词。
IPv6 所引进的主要变化如下:

  • 更大的地址空间。 IPv6 把地址从IPv4 的32位增大到4倍,即增大到128位,使地址空间增大了2^96倍。这样大的地址空间在可预见的将来是不会用完的。
  • 扩展的地址层次结构。 IPv6 由于地址空间很大,因此可以划分为更多的层次。
  • 灵活的首部格式。 IPv6 数据报的首部和 IPv4 的并不兼容。 IPv6 定义了许多可选的扩展首部,不仅可提供比 IPv4 更多的功能,而且还可提高路由器的处理效率,这是因为路由器对扩展首部不进行处理(除逐跳扩展首部外)。
  • 改进的选项。 IPv6 允许数据报包含有选项的控制信息,因而可以包含一些新的选项。但 IPv6 的首部长度是固定的,其选项放在有效载荷中。我们知道, IPv4 所规定的选项是固定不变的,其选项放在首部的可变部分。
  • 允许协议继续扩充。这一点很重要,因为技术总是在不断地发展(如网络硬件的更新)而新的应用也还会出现。但我们知道, IPv4 的功能是固定不变的。
  • 支持即插即用(即自动配置)。 因此 IPv6 不需要使用 DHCP。
  • 支持资源的预分配。 IPv6 支持实时视像等要求保证一定的带宽和时延的应用。
  • IPv6 首部改为 8 字节对齐(即首部长度必须是 8 字节的整数倍)。原来的 IPv4 首部是 4 字节对齐。

具有多个可选扩展首部的 IPv6 数据报的一般形式

IPv6 数据报由两大部分组成,即基本首部(base header)和后面的有效载荷(payload)。有效载荷也称为净负荷。有效载荷允许有零个或多个扩展首部(extension header),再后面是数据部分。但请注意,所有的扩展首部并不属于 IPv6 数据报的首部。

与 IPv4 相比, IPv6 对首部中的某些字段进行了如下的更改:

  • 取消了首部长度字段,因为它的首部长度是固定的(40 字节)。
  • 取消了服务类型字段,因为优先级和流标号字段实现了服务类型字段的功能。
  • 取消了总长度字段,改用有效载荷长度字段。
  • 取消了标识、标志和片偏移字段,因为这些功能已包含在分片扩展首部中。
  • 把 TTL 字段改称为跳数限制字段,但作用是一样的(名称与作用更加一致)。
  • 取消了协议字段,改用下一个首部字段。
  • 取消了检验和字段,这样就加快了路由器处理数据报的速度。我们知道,在数据链路层对检测出有差错的帧就丢弃。在运输层,当使用 UDP 时,若检测出有差错的用户数据报就丢弃。当使用 TCP 时,对检测出有差错的报文段就重传,直到正确传送到目的进程为止。因此在网络层的差错检测可以精简掉。
  • 取消了选项字段,而用扩展首部来实现选项功能。

由于把首部中不必要的功能取消了,使得 IPv6 首部的字段数减少到只有 8 个(虽然首部长度增大了一倍)。下面解释 IPv6 基本首部中各字段的作用。
IPv6 基本首部和有效载荷

  1. 版本(version) 占 4 位。它指明了协议的版本,对 IPv6 该字段是 6。
  2. 通信量类(traffic class) 占 8 位。这是为了区分不同的 IPv6 数据报的类别或优先级,和IPv4的区分服务字段的作用相似,目前正在进行不同的通信量类性能的实验。
  3. 流标号(flow label) 占 20 位。 IPv6 的一个新的机制是支持资源预分配,并且允许路由器把每一个数据报与一个给定的资源分配相联系。 IPv6 提出流(flow)的抽象概念。所谓“流”就是互联网络上从特定源点到特定终点(单播或多播)的一系列数据报(如实时音频或视频传输),而在这个“流”所经过的路径上的路由器都保证指明的服务质量。所有属于同一个流的数据报都具有同样的流标号。因此,流标号对实时音频/视频数据的传送特别有用。对于传统的电子邮件或非实时数据,流标号则没有用处,把它置为 0 即可。
  4. 有效载荷长度(payload length) 占 16 位。它指明 IPv6 数据报除基本首部以外的字节数(所有扩展首部都算在有效载荷之内)。这个字段的最大值是 64 KB(65535 字节)。
  5. 下一个首部(next header) 占 8 位。它相当于 IPv4 的协议字段或可选字段。当 IPv6 数据报没有扩展首部时,下一个首部字段的作用和 IPv4 的协议字段一样,它的值指出了基本首部后面的数据应交付 IP 层上面的哪一个高层协议(例如: 6或 17 分别表示应交付运输层 TCP 或 UDP);当出现扩展首部时,下一个首部字段的值就标识后面第一个扩展首部的类型。
  6. 跳数限制(hop limit) 占 8 位。用来防止数据报在网络中无限期地存在。源点在每个数据报发出时即设定某个跳数限制(最大为 255 跳)。每个路由器在转发数据报时,要先把跳数限制字段中的值减 1。当跳数限制的值为零时,就要把这个数据报丢弃。
  7. 源地址 占 128 位。是数据报的发送端的 IP 地址。
  8. 目的地址 占 128 位。是数据报的接收端的 IP 地址。

IPv6的拓展首部有以下六种:
1.逐跳选项 2.路由选择 3.分片 4.鉴别 5.封装安全有效载荷 6.目的站选项
每一个扩展首部都由若干字段组成,他们的长度也各不同,但所有的拓展首部的第一个字段都是8位的下一个首部字段。此字段的值指出了在该扩展首部后面的扩展首部是什么。当使用多个拓展首部时应按以上顺序先后出现。 IPv4 的数据报如果在其首部中使用了选项,那么沿着数据报传送的路径上的每一个路由器都必须对这些选项一一进行检查,这就降低了路由器处理数据报的速度。IPv6把原来IPv4首部中的选项功能都放在拓展首部中,数据报若使用了拓展首部在其基本首部的下一个首部字段就会指出在有效载荷字段中使用了何种拓展首部,所有拓展首部的第一个字段都是下一个首部,这就使得路由器能迅速判断待转发的IPv6数据报有无需要本路由器处理的选项。

IPv6地址

一个IPv6数据报的目的地址可以是以下三种基本类型地址之一:

  • 单播(unicast) 单播就是传统的点对点通信;
  • 多播(multicast) 多播是一点对多点的通信,数据报发送到一组计算机中的每一个。 IPv6 没有采用广播的术语,而是将广播看作多播的一个特例。
  • 任播(anycast) 这是 IPv6 增加的一种类型。 任播的终点是一组计算机,但数据报只交付其中的一个,通常是按照路由算法得出的距离最近的一个。

地址编写规范

  由于IPv6使用128位地址,为了使地址再简洁些,IPv6使用冒号十六进制记法(colon hexadecimal notation 简写为 colon hex),就是把每个16位的值用十六进制值表示,各值之间用冒号分隔。

另外用这种方法表示的地址还有三种压缩的方法:

  • 每组地址0开头可以省略;
  • 每组连续多个0可以用一个0表示;
  • 连续多组0信息可以用双冒号表示(零压缩,但双冒号只能用一次)

地址压缩例子

IPv6地址分类

IPv6地址分类情况
IPv6地址分类

单播地址

单播地址
三级结构划分法
全球路由选择前缀: 48位,前三位为001,第一级地址,分配给ISP等机构,相当于IPV4的网络号。
子网标识: 16位,第二级地址,ISP等机构创建自己的子网。
接口ID: 64位,第三级地址,指明主机或路由器单个的网络接口,相当于IPv4的主机号。除组播地址外,格式前缀空间001~111,必须有位接口ID。可以将各种接口的硬件地址直接进行编码,只需提取出最后64位就可以得到硬件地址,不需要ARP进行地址解析。

聚合全局单播地址

聚合全局单播地址
聚合全局单播地址(Aggregate Global Unicast Addresses)又称为AGUA地址,设备上配置的公网IP地址。起始地址为2000:0000:0000:0000:0000:0000:0000:0000结束地址为3FFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF 因为前三位001二进制不能动,相当于网络位。
其中又分三种:

  • 主机分配的: 2001::/16,目前实际用于IPv6因特网运作的;
  • 设备使用的: 2002::/16,用于实现6-to-4隧道(过渡节点保留);
  • 测试: 3FFE::/16 早期用于6bone测试目的的前缀;
本地链路单播地址

本地链路地址
本地链路地址(link-local unicast address)是在一个节点启用IPv6,启动时节点的每个接口自动生成的。在本链路上路由表中看到的下一跳都是对端的本地链路地址,不是公网IP地址。可以作为路由表中的下一跳地址,路由器与路由器之间使用。没有申请到公网IP地址时,实现路由器设备之间的地址配置通信。相当于IPv4中的169.254.0.0/16。当需要把分组发往单一链路的设备而不希望该分组被转发到此链路范围以外的地方时可以使用这种特殊地址,这类地址占IPv6地址总数的1/1024。

本地站点单播地址

本地站点单播地址
本地站点单播地址(site-local unicast address)也称为私有IPv6地址,相当于IPv4的专用地址,在单位或机构内使用,并没有连接到互联网上。这类地址占IPv6地址总数的1/1024。

其他地址
  • 组播地址 IPv6没有广播地址,以组播地址替代,前缀: FF00::/8,功能和IPv4一样,这类地址占总地址数的1.256;
  • 未指明地址 这是16字节全0的地址,可缩写为::,这个地址不能用作目的地址,而只能将某台主机当作源地址使用,条件是这台主机还有没配置到一个标准的IP地址。这类地址仅此一个;
  • 环回地址 IPv6的环回地址是0:0:0:0:0:0:0:1,可缩写为::1,和IPv4的环回地址一样,这类地址仅此一个;

从IPv4向IPv6过渡

  互联网规模太大,向IPv6过渡只能采用逐步演进的办法,同时还要使新安装的IPv6系统向后兼容,也就是说IPv6系统必须能够接收和转发IPv4的分组,并且能为IPv4分组选择路由。下面是两种过渡策略,即双协议栈和隧道技术。

双协议栈

  双协议栈(dual stack)是指在完全过渡到IPv6之前,使一部分主机或路由器同时装有IPv4和IPv6这两种协议栈。在和IPv6主机通讯时采用IPv6地址,而和IPv4主机通信时采用IPv4地址。通过域名系统DNS查询解决决定,要是返回IPv6就用IPv6地址,返回IPv4就用IPv4地址。不过因为要装上两套协议开销较大。

隧道技术

  向 IPv6 过渡的另一种方法是隧道技术(tunneling)。下图给出了隧道技术的工作原理。这种方法的要点就是在 IPv6 数据报要进入 IPv4 网络时,把 IPv6 数据报封装成为 IPv4数据报。现在整个的 IPv6 数据报变成了 IPv4 数据报的数据部分。这样的 IPv4 数据报从路由器 B 经过路由器 C 和 D,传送到 E,而原来的 IPv6 数据报就好像在 IPv4 网络的隧道中传输,什么都没有变化。当 IPv4 数据报离开 IPv4 网络中的隧道时,再把数据部分(即原来的IPv6 数据报)交给主机的 IPv6 协议栈。图中的一条粗线表示在 IPv4 网络中好像有一个从 B到 E 的“IPv6 隧道”,路由器 B 是隧道的入口而 E 是出口。请注意,在隧道中传送的数据报的源地址是 B 而目的地址是 E。
隧道技术
要使双协议栈的主机知道 IPv4 数据报里面封装的数据是一个 IPv6 数据报,就必须把IPv4 首部的协议字段的值设置为 41(41 表示数据报的数据部分是 IPv6 数据报)。

ICMPv6

  IPv6也不保证数据报的可靠交付,因为互联网中的路由器可能会丢弃数据报。因此IPv6也需要使用ICMP来反馈一些差错信息。新版本称为ICMPv6,它比ICMPv4 要复杂得多。地址解析协议 ARP 和网际组管理协议 IGMP 的功能都已被合并到 ICMPv6中(下图)。
新旧版本中的网络层的比较
ICMPv6 是面向报文的协议,它利用报文来报告差错,获取信息,探测邻站或管理多播通信。 ICMPv6 还增加了几个定义报文功能及含义的其他协议。在对 ICMPv6 报文进行归类时,不同的文献和 RFC 文档使用了不同的策略,有的把其中的一些报文定义为 ICMPv6 报文,而把另一些报文定义为邻站发现 ND (Neighbor-Discovery)报文或多播听众交付 MLD(Multicast Listener Delivery)报文。其实所有这些报文都应当是 ICMPv6 报文,只是功能和作用不同而已。因此我们把这些报文都列入 ICMPv6 的不同类别。使用这种分类方法的原因是所有这些报文都具有相同的格式,并且所有报文类型都由 ICMPv6 协议处理。其实,像 ND和 MLD 这样的协议都是运行在 ICMPv6 协议之下的。基于这样的考虑,可把 ICMPv6 报文分类如下图所示。请注意,邻站发现报文和组成员关系报文分别是在 ND 协议和 MLD 协议的控制下进行发送和接收的。

ICMPv6是作为IPv6报文的拓展封装到报文里面,在下一个首部字段的值为58指明数据部分是ICMPv6。
ICMPv6格式
ICMPv6消息类型
MAC地址转换为IPv6实验

互联网的路由选择协议

理想的路由算法

  路由选择协议的核心就是路由选择算法,一个理想的理由选择算法应具有如下的一些特点:

  • 算法必须是正确的和完整的,这里正确是指沿着各路由表所指引的路由,分组一定能够最终稿到达目的网络和目的主机。
  • 算法在计算上应简单。路由选择的计算不应使网络通信量增加太多额外开销。
  • 算法应能适应通信量和网络拓扑的变化,要有自适应性。当网络中的通信量发生变化时,算法能自适应地改变路由以均衡各链路的负载。或当某些节点、链路发生故障不工作时,算法也能及时地改变路由。有时称这种自适应性为稳健性(robustness)。
  • 算法应具有稳定性 在网络通信量和网络拓扑相对稳定的情况下,路由算法应收敛于一个可以接受的解,不应使得出的路由不停地变化。
  • 算法应是公平的 路由选择算法应对所有用户都是平等的。(除少数优先级高的用户)
  • 算法应是最佳的 路由选择算法应能够找出最好的路由,使得分组平均时延最小而网络吞吐量最大。对于某些网络,网络的可靠性有时要比最小的分组平均时延或最大吞吐量更重要,因此所谓最佳也只能是相对于某种一种特定要求下得出的较为合理的选择而已。

  从路由算法的自适应性可以分为两大类,即静态路由选择策略与动态路由选择策略。

  • 静态路由选择策略也叫做非自适应路由选择,其特点是简单和开销较小,但不能及时适应网络状态的变化,对于简单的小网络完全可以采用静态路由选择,人工配置每一条路由。
  • 动态路由选择策略也叫做自适应路由选择,其特点是能较好地适应网络的变化,但实现起来较为复杂,开销也比较大。动态路由选择适用于较复杂的大网络。

分层次的路由选择协议

  互联网采用的路由选择协议主要是自适应的(即动态的)、分布式路由选择协议。互联网规模非常大,如果让所有的路由器知道所有的网络应怎样到达,则这种路由表将非常大,处理起来也太花时间。而所有这些路由器之间交换路由信息所需的带宽就会使互联网的通信链路饱和。此外许多单位不愿外接了解自己单位网络的布局细节和本部门所采用的路由选择协议,但同时还希望连接到互联网上。为此可以把整个互联网划分为许多较小的自治系统(autonomous system)一般记为AS。自治系统AS是在单一技术管理下的许多网络,IP地址以及路由器,这些路由器使用一种自治系统内部的路由选择协议和共同的度量(跳数、带宽、时延、吞吐量等指标)。现在对自治系统AS的定义是强调尽管一个AS使用了多种内部路由选择协议和度量,但重要的是一个每个AS对其他AS表现出的是一个单一的和一致的路由选择策略。这样互联网就把路由选择协议划分为两大类,即:

  1. 内部网关协议IGP(Inner Gateway Protocol) 即在一个自治系统内部使用的路由选择协议,目前这类路由选择协议使用的最多的是RIPOSPF
  2. 外部网关协议EGP(External Gateway Protocol)若源主机和目的主机处在不同的自治系统中,就需要使用一种协议将路由选择信息传递到另一个自治系统中,这种协议就是外部网关协议,目前使用的最多的是BGP-4

自治系统和内/外部网关协议

  • 自治系统之间的路由选择也叫做域间路由选择(interdomain routing)
  • 在自治系统内部的路由选择叫做域内路由选择(intradomain routing)
内部网关协议RIP

  RIP(Routing Information Protocol)是内部网关协议IGP中最先得到广泛使用的协议,它的中文译名是路由信息协议RIP是一种分布式的基于距离向量的路由选择协议,其最大优点是简单。网络中运行RIP路由器都要维护从它自己到每一个目的网络的距离记录。
  对距离的定义为:从一路由器到直接连接的网络距离定义为1,从一路由器到非直接连接的网络的距离定义为所经过的路由器加1。RIP的距离也称为跳数(hop count)。RIP认为好的路由就是它通过的网络数目(路由器数目)少,即距离短。RIP允许一条路径最多只能包含15个路由器,因此距离等于16时即相当于不可达。可见RIP只适用于小型互联网。RIP选择一个具有最少路由器的路由,哪怕还存在另一条高速低时延但路由器较多的路由。
  RIP协议三个特点:

  • 和谁交换信息?
    仅和相邻路由器交换信息。
  • 交换什么信息?
    交换的信息是当前本路由器所知道的全部信息,即自己完整的路由表。
  • 什么时候交换?
    按固定的时间间隔交换路由信息,例如每隔30秒。当网络拓扑发生变化时,路由器也及时向相邻路由器通告拓扑变化后的路由信息。网络中的主机虽然也运行RIP协议,但只被动地接收路由器发来的路由信息。

  路由器刚开始工作时路由表是空的,然后路由器就得出到直接连接的几个网络的距离(定义为1),然后每个路由器也只和相邻路由器交换并更新路由信息。经过若干次更新后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址。RIP路由表项包括目的网络、距离以及下一跳。在一般情况下RIP协议可以收敛(自治系统中所有的结点都得到正确的路由选择信息的过程)且收敛较快。

距离向量算法

  路由表更新的原则就是找出每个目的网络的最短距离,这钟更新算法又称为距离向量算法。距离向量算法的基础就是Bellman-Ford算法,这种算法的要点是:
假设X是结点A到B的最短路径上的一个节点,若把路径A->B拆成两端路径A->X和X->B,则每一段路径也都分别是结点A到X和结点X到B的最短路径。换句话说我到目的地的最小距离等于我到邻居距离与邻居到目的地最小距离之和(存在一个或多个邻居)的最小值。
对于每一个相邻路由器发送过来的RIP报文执行以下步骤:
距离向量算法流程
若3分钟还没有收到相邻路由器的更新路由表,就把此相邻路由器标记为不可达路由器,即把距离置为16。

RIPv2报文格式

RIP协议实际属于应用层协议,封装在UDP中, 端口520。
RIPv2报文格式

  RIP协议特点是好消息传播的快,坏消息传播的慢,当网络出现故障时,要经过比较长的时间(例如数分钟)才能将此消息传送到所有的路由器,使更新过程收敛时间过长。另外由于路由器之间交换的是完整的路由表,所以随着网络规模的扩大开销增加,因此RIP限制了网络规模,它能使用的最大距离为15。协议的优点就是实现简单,开销较小。

内部网关协议OSPF
开放最短路径优先OSPF

  这个协议的名字是开放最短路径优先(Open Shortest Path First)是为了克服RIP的缺点在1989年开发出来的,OSPF的原理很简单但实现起来却较复杂。开放表明OSPF协议不受某一家厂商控制而是公开发表的。最短路径优先是因为使用了Dijkstra提出的最短路径算法SPF。OSPF只是个协议的名字,并不表示其他路由选择协议不是最短路径优先,OSPF最主要的特征就是使用**链路状态协议(link state protocol)**。以累计链路开销作为路由参考,信息传递与路由计算分离。OSPF的三个要点是:

  1. 和谁交换信息?
    使用 洪泛法(flooding) 向本自治系统中所有路由器发送信息(通过所有端口向向所有仙林的路由器发送信息)。
  2. 交换什么信息?
    发送的信息就是与本路由器相邻的所有路由器的链路状态(就是说明本路由器都和哪些路由器相邻,以及该链路的度量metric),但这只是路由器所知道的部分信息。
  3. 什么时候交换信息?
    只有当链路状态发生变化或每隔一旦时间如30分钟,路由器才用洪泛法向所有路由器发送此信息。

  所有的路由器最终都能建立一个链路状态数据库(link-state database)。这个数据库实际上就是全网的拓扑结构图,他在全网范围内是一致的(者称为数据链路状态数据库的同步)。OSPF的链路状态数据库能较快的进行更新,使各个路由器能及时更新其路由表,OSPF的更新过程收敛的快是其重要的优点。

OSPF的区域

  为了使OSPF能够用于规模很大的网络,OSPF将一个自治系统再划分为若干个更小的范围,叫做区域(area)。每一个区域都有一个32位的区域标识符(用点分十进制表示)。区域也不能太大,在一个区域内的路由器最好不超过200个。
  划分区域的好处就是将洪泛法交换链路状态信息的范围局限于每一个区域,减少了网络上的通信量。同一个区域内的路由器只知道本区域的完整网络拓扑结构,不知道其他区域的网络拓朴。上层的区域叫做主干区域(backbone area) ,其标识符规定为0.0.0.0,主干区域的作用是用来连通其他区域的。
OSPF划分区域

OSPF几个特点
  • OSPF不用UDP而是直接用IP数据报传送。OSPF构成的数据报很短,可以较少路由信息的通信量。数据报短的另一个好处是不必将长的数据报分片传送。
  • OSPF对不同的链路可根据IP分组的不同服务类型TOS而设置成不同的代价,对于不同类型的业务计算出不同的路由。
  • 如果到同一个目的网络有多条相同代价的路径,那么可以将通信量分配给这几条路径,实现多路径间的负载均衡(load banlancing)。
  • 所有在OSPF路由器之间交换的分组都具有鉴别的功能,保证了仅在可信赖的路由器之间交换链路状态信息。
  • 支持可变长度的子网划分和无分类的标志CIDR。
  • 每一个链路状态都嗲上一个32位的序号,序号越大状态越新。
  • 与网络规模无关,里尤其的链路状态只涉及到与相邻路由器的联通状态,因而与整个互联网的规模无直接关系,当互联网规模很大时,OSPF协议要比距离向量协议RIP好得多。
OSPF报文格式

OSPF报文格式

OSPF各字段说明
OSPF共有五种类型的分组分别是:

  1. 类型1,问候(Hello)分组,用来发现和维持邻站可达性,设置参数metric、mask、area_id、router_id等。
  2. 类型2,数据库表述(Database Description)分组,向邻站给出自己的链路状态数据库中的所有链路状态项目的摘要信息。
  3. 类型3,链路状态请求(Link state Request)分组,向对方请求发送某些链路状态项目的详细信息。
  4. 类型4,链路状态更新(Link state Update)分组,用洪泛法对全网更新链路状态,路由器使用这种分组将其链路状态通知给邻站。该分组共用五种不同的链路状态。
  5. 类型5,链路状态确认(Link state Acknowledgement)分组,对链路更新分组的确认,向最早发送更新的路由器确认,称为可靠的洪泛法。

  OSPF规定每隔一段时间,如30分钟,要率先那一次数据库中的链路状态。OSPF没有坏消息传播的慢的问题,其相应网络变化的时间小于100ms。

指定路由器

  若N个路由器连接在一个以太网上,则每个路由器要向其他(N-1)个路由器发送链路状态信息,因而要有N(N-1)个链路状态要在这个以太网上传送。OSPF协议对这种多点接入的局域网采用了指定路由器(designated router) 的方法,使广播的信息量大大减小。指定的路由器代表局域网上所有的链路向连接到该网络上的各路由器发送状态信息。
指定路由器
DR和BDR是通过发HELLO包选举产生的。

外部网关协议BGP

动态路由协议分类:

  • IGP 工作在同一个AS内(RIP、OSPF),为AS内的主机提供路由信息交换。
  • EGP 工作在AS与AS之间(BGP),在AS之间他提供无环路的路由信息交换。

  外部网关协议(或边界网关协议)BGP(Border Gateway Protocol)是一种增强的距离矢量路由协议,拥有丰富的策略控制技术。BGP是不同自治系统的路由器之间交换路由信息的协议。互联网的规模太大,不同自治系统所用的度量不同,当一条路径通过几个不同AS时,计算出有意义的代价时不太可能的,比较合理的做法是在AS之间交换可达性信息。另外自治系统之间的路由必须考虑有关策略(控制路由),包括政治、安全或经济方面的考虑。BGP寻找一条能够到达目的网络且比较好的路由(不能兜圈子),不是寻找一条最佳路由。BGP采用TCP协议,目的端口号为179源端口号随意,这种TCP连接又称为半永久性连接(即双方交换完信息仍保持着连接状态)。域间路由协议稳定性要高,所以要用TCP协议保证信息可靠,

BGP的特点

  为了使AS之间能够做路由信息的交换,每个AS要选择至少一个路由器作为该自治系统的BGP发言人,和相邻AS的BGP发言人交换路由信息。两个BGP发言人都是通过一个共享网络连接在一起的。

  • 和谁交换信息?
    与邻居AS的BGP发言人交换信息。
  • 交换什么信息?
    交换网络可达性信息,即到达某个网络所要经过的一系列AS(增量更新,只发送更新的路由)。
  • 什么时候交换?
    网络拓朴发生变化时,更新有变化的部分。
BGP路由

  当两个边界路由器(例如图中的R1和R2)进行通信时,必须先建立TCP连接,这种TCP连接又称为半永久性连接(即双方交换完信息后仍然保持着连接状态)。像R1 和R2之间的这种连接称为eBGP连接(e表示外部external)。现在,边界路由器R1可通过eBGP向对等端R2发送BGP路由X,AS1,R1,意思是“从R1经AS1可到达X”。这样通过eBGP连接,AS2中的边界路由器R2就知道了到达AS1中的前缀X的BGP路由。
AS之间的eBGP连接和内部的IBGP连接
  但是,仅有边界路由器R2知道“到AS1的前缀X的BGP路由”是远远不够的。边界路由器R2应当把获得的BGP路由,再转发给AS内部的其他路由器。为此,协议BGP规定,在AS内部,两个路由器之间还需要建立iBGP(i表示内部internal),iBGP也使用TCP连接传送BGP报文。图(b)中表示边界路由器R2在三个iBGP连接上,向AS2内部的其他三个路由器转发自己收到的BGP路由。至此,AS2内的所有路由器都知道了这条BGP路由信息。由此可见,协议BGP并非仅运行在AS之间,而且也要运行在AS的内部。AS中的路由器,除了运行协议BGP外,还必须运行内部网关协议。但注意BGP并没有根据路由算法发现AS内部路由,BGP协议是用来解决在众多AS之间的路由选择问题。协议BGP规定,在一个AS内部所有的iBGP必须是全连通的。即使两个路由器之间没有物理连接,但它们之间仍然有iBGP连接。
在AS内路由器之间的物理连接与iBGP连接

BGP路由通告原则
  • 只将最优路由发布给对等体。
  • 只发送更新的BGP路由。
  • 从eBGP邻居学到的路由,通告给所有BGP邻居(iBGP/eBGP)。
  • 从iBGP邻居学到的路由,不通告给其他iBGP邻居(水平分割原则),避免环路。
  • 从iBGP邻居学到的路由,是否通告给eBGP邻居取决于BGP同步规则。
BGP路由格式

BGP路由格式

三种不同的自治系统

  互联网中自治系统AS的数量非常之多,其连接图也是相当复杂的,但归纳起来,可以把AS划分为三大类即末梢AS(stub AS)、穿越AS(transit AS)和对等AS(peering AS)。
三种不同的自治系统

  • 穿越AS: 高速通信干线的主干AS,其任务就是为其他的AS有偿转发分组。
  • 末梢AS: 多归属AS,不允许其他AS穿透访问。
  • 对等AS: 事先协商的两个AS,彼此之间的发送或接收分组不收费。
BGP路由选择方式

  BGP路由选择方式又称路由选择策略,从一个AS到另一个AS的前缀X如果只有一条BGP路由,那么就不存在BGP路由选择的问题,因为这时BGP路由唯一。但如果到前缀X有两条或更多的BGP路由可供选择,那么就应根据以下原则,按这里给出的先后顺序选择一条较好的BGP路由。(有13条之多,课本列出4条)

  • 首先选择**本地偏好(LOCAL-PREFerence)**值最高的路由,本地偏好也称为本地优先,从本AS开始的、到同一个前缀的不同BGP路由中,挑选一个偏好值最高的路由(默认100),只能在本AS内传递。这可由路由器管理员根据政治或经济上的策略来设置。
  • 选择具有AS跳数最小的路由,跳数最小是以AS为单位,但不一定最佳。
  • 使用热土豆路由选择算法,如果前两种方法都无法选择最好的路由,那么就要在进入BGP路由的AS执行热土豆路由选择算法。需要使用内部网关协议(RIP、OSPF)让分组经过最少的转发次数离开本AS。
  • 选择路由器BGP标识符的数值最小的路由,以上方法都无法找出最好的BGP路由时,可以使用BGP标识符来选择路由,在BGP进行交互的报文中,其首部有一4字节的字段,叫佐BGP标识符,记为BGP ID,这个字段被赋予一个无符号整数作为运行BGP的路由器的唯一标识符。具有多个接口的路由器有多个IP地址。BGP ID就是用该路由器的IP地址中数值最大的那个。
BGP的四种报文
  1. OPEN (打开)报文,与相邻的另一个BGP发言者建立关系,使通信初始化;
  2. UPDATE (更新)报文,通告某一路由的信息,以及列出要撤销的多条路由;
  3. KEEPALIVE (保活)报文,用来周期性地证与对等端的连通性。
  4. NOTIFICATION (通知)报文,用来发送检测到的差错。

BGP报文用TCP报文传送

对于通用首部:

  • 标记: 用检查BGP对等体的同步信息是否完整,以及用于BGP验证的计算(鉴别)。一般为32个十六进制F。
  • 长度: 整个BGP报文的长度,单位字节,最小为19,最大4096。
  • 类型: 1~4,分别对应四种类型的BGP报文。

路由器的构成

  路由器是一种具有多个输入输出端口的专用计算机,连通不同的网络,其任务是转发分组(转发给下一跳的网络),直到该分组到达终点为止。

典型的路由器结构

  整个路由器的结构可划分为两大部分: 路由选择部分和分组转发部分。

  • 路由选择部分(软件实现): 也称控制部分或控制层面,核心构件是路由选择处理机。路由选择处理机的任务是根据所选定的路由选择协议构造出路由表,并和相邻路由器交换路由信息,并不断地更新和维护路由表。
  • 分组转发部分(硬件实现):也称数据部分或数据层面,它由三部分组成: 交换结构、一组输入端口和一组输出端口(这里的端口就是硬件接口)。

  路由器如果收到交换路由信息的分组,就交给路由选择处理机;如果收到数据分组,则依照转发表转发分组。
  关于路由选择(routing)和转发(forwarding)是有区别的,转发就是路由器根据转发表把收到的IP数据报从路由器合适的端口转发出去。转发表是从路由表得出的,转发仅仅涉及一个路由器。而路由选择则设计很多路由器,路由表则是许多路由器协同工作的结果。这些路由器按照路由算法得到的关于网络拓朴的变化情况,动态地改变所选择的路由。将装发表和路由表用不同的数据结构实现会带来一些好处,在转发分组时,转发表的结构应当是查找过程最优化,但路由表则需要对网络拓朴变化的计算优化。路由表总是用软件实现,但转发表可以用特殊的硬件实现。

输入端口

输入端口对线路上收到分组的处理
  输入端口中的查找和转发功能在路由器的交换功能中是最重要的,为了使交换功能分散化,往往把复制的转发表放在每一个输入端口中。路由选择处理机负责对各转发表的副本进行更新。这些副本常称为影子副本(shadow copy) 分散化交换可以避免在路由器中的某一点上出现瓶颈。
  当一个分组正在查找转发表时,后面有紧跟着从这个输入端口收到另一个分组,这个后到的分组就就必须在队列中排队等待,因而产生了一定的时延。

输出端口

输出端口对线路上收到分组的处理
  若路由器处理分组的速率赶不上分组进入队列的速率,则队列的储存空间最终必定减小到零,这就是后面再进入队列的分组由于没有储存空间而只能被丢弃。路由器中的输入或输出队列产生益处时造成分组丢失的重要原因。当然设备或线路出故障也可能使分组丢失。

交换结构

  交换结构是路由器的关键构建,正是这个交换结构把分组从一个输入端口转移到某个合适的输出端口。实现这样的交换有多种方法,下面给出了三种常见的交换方法。
三种常用的交换方法

IP多播

  因为现在许多应用需要一个远点发送到多个终点,即一对多的通信如实时信息的交付(如新闻、股市行情、在线直播等)、软件更新、交互式会议等。随着互联网用户数目的急剧增加,以及多媒体通讯的开展,有更多的业务需要多播来支持。
  传统的点对点应用以单个用户为单位提供服务,不同的用户与服务提供端的通信数据存在差异。而新型点到多点的应用以一组用户为单位提供服务,同组用户与服务提供端的通信数据无差异。与单播相比,多播可以大大节约网络资源。
单播与多播的比较
  使用多播方式向属于同一个多播组的90个成员传送节目时,视频服务器只需要把视频分组当作多播数据报来发送,并且只需要发送一次。路由器R1在转发分组时需要把收到的分组复制成3个副本,分别向下面路由器各转发一个副本。当分组到达局域网时,由于局域网具有硬件多播的功能,因此不需要复制分组,在局域网上的多播组成员都能收到这个视频分组。在互联网范围的多播要靠路由器来实现,这些里尤其必须则增加一些能够识别多播是数据报的软件。能够运行多播协议的路由器称为多播路由器。多博路由器当然亦可以转发普通的单播IP数据报。使用多播方式部署点到多点应用无重复流量,节省设备与带宽资源,安全性高,有偿性有保障。但由于大部分多播协议是基于UDP(面向非连接的,不可靠的)的,所以多播也是尽力而为的,而且没有拥塞控制机制,还可能会造成报文重复和报文失序。

多播IP地址

  在互联网上进行多播就叫做IP多播。IP多播所传送的分组需要使用多播IP地址。显然,这个多播数据报的目的地址一定不能写入这台主机的 IP 地址。这是因为在同一时间可能有成千上万台主机加入到同一个多播组。多播数据报不可能在其首部写入这么多主机的 IP 地址。因此,在多播数据报的目的地址写入的是一个多播组标志符,然后设法让加入到这个多播组的主机的 IP 地址与多播组的标识符关联起来。
  实际上多播组的标识符就是 IP 地址中的D类地址。D类地址的前4位是1110,因此D类地址范围为:224.0.0.0 ~ 239.255.255.255。我们使用每一个D类IP地址标识一个多播组。这样,D类地址一共可以标识2^28个多播组,也就是说,在同一时间允许有超过2.6亿的多播组在互联网上运行。多播数据报也是“尽最大努力交付”,不保证一定能够交付多播组内的所有成员。因此,多播数据报与一般的IP数据报的区别就是它使用D类IP地址作为目的地址,并且首部中的协议字段值是2,表明它使用的是网际组管理协议(IGMP)。
  显然,多播地址只能用于目的地址,而不能用于源地址。此外,对多播数据报不产生ICMP(网际控制报文协议)差错报文。因此,若在 ping 命令后面键入多播地址,将永远不会收到响应。
多播IP地址
周所周知的部分多播地址。
周所周知的部分多播地址
IP多播常见模型分为ASM模型和SSM模型。
多播模型

在局域网上进行硬件多播

  以太网MAC地址字段中第一字节的最低位为1时即为多播地址,IANA只拿出2^23个地址即01-00-5E-00-00-00到01-00-5E-FF-FF-FF的地址作为以太网多播地址,前25位固定不变只有后23位可用作多播。但D类IP地址可供分配的有28位,这28位中有后23位才映射以太网多播地址中的后23位,因此是多对(32对1)一的映射关系。(后面IP层再判断是否为发往本机的多播帧)
D类IP地址与以太网多播地址的映射关系

多播的两种协议

  连接在局域网上的多播路由器必须和互联网上的其他多播路由器协同工作,以便把多播数据报用最小代价传送给所有的组成员,这就需要多播路由选择协议,多播路由选择协议必须在点对点路由选择协议的基础上才能实现。多播转发必须动态适应多播组成员的变化(网络拓补并未发生变化)。多播路由器在转发多播数据报时,不仅仅根据多播数据报中的目的地址,而是还要考虑这个多播数据报从什么地方来和要到什么地方去。多播数据报可由没有加入多播组的主机发出,也可以通过没有组成员接入的网络。
  此外接收端本地需要一个协议进行成员的管理,网际组管理协议IGMP(Internet Group Management Protocol) 是让链接在本地的局域网上的多播路由器知道本局域网上有否有主机参加或退出了某个多播组。仅在本地网络范围内有效。
多播的两种协议

网际组管理协议IGMP

  和网际控制报文协议ICMP相似,IGMP使用IP数据报传递其报文(即IGMP报文加上IP首部构成IP数据报),但它也向IP提供服务。因此我们不把IGMP看成是一个单独的协议,而是属于整个网际协议IP的一个组成部分。
  IGMP是运行在最后一跳路由器和用户之间的协议。在IP主机和与其直接相邻的多播路由器之间建立、维护多播关系。多播路由器通过IGMP协议了解每个接口连接的网段上是否存在多播接收者,如果有组播路由器将数据报转发到这个网段,否则不转发。

  从概念上讲, IGMP 的工作可分为两个阶段。

  • 第一阶段:当某台主机加入新的多播组时,该主机应向多播组的多播地址发送一个IGMP 报文,声明自己要成为该组的成员。本地的多播路由器收到 IGMP 报文后,还要利用多播路由选择协议把这种组成员关系转发给互联网上的其他多播路由器。
  • 第二阶段:组成员关系是动态的。本地多播路由器要周期性地探询本地局域网上的主机,以便知道这些主机是否还继续是组的成员。只要有一台主机对某个组响应,那么多播路由器就认为这个组是活跃的。但一个组在经过几次的探询后仍然没有一台主机响应,多播路由器就认为本网络上的主机已经都离开了这个组,因此也就不再把这个组的成员关系转发给其他的多播路由器。

  IGMP为了避免了多播控制信息给网络增加大量的开销采用了如下一些具体措施:

  1. 在主机和多播路由器之间的所有通信都是使用 IP 多播。只要有可能,携带 IGMP报文的数据报都用硬件多播来传送。因此在支持硬件多播的网络上,没有参加 IP 多播的主机不会收到 IGMP 报文。
  2. 多播路由器在探询组成员关系时,只需要对所有的组发送一个请求信息的询问报文,而不需要对每一个组发送一个询问报文(虽然也允许对一个特定组发送询问报文)。认的询问速率是每 125 秒发送一次(通信量并不太大)。
  3. 当同一个网络上连接有几个多播路由器时,它们能够迅速和有效地选择其中的一个来探询主机的成员关系。因此,网络上多个多播路由器并不会引起 IGMP 通信量的增大。
  4. 在 IGMP 的询问报文中有一个数值 N,它指明一个最长响应时间(默认值为 10秒)。当收到询问时,主机在 0 到 N 之间随机选择发送响应所需经过的时延。因此,若一台主机同时参加了几个多播组,则主机对每一个多播组选择不同的随机数。对应于最小时延的响应最先发送。
  5. 同一个组内的每一台主机都要监听响应,只要有本组的其他主机先发送了响应,自己就可以不再发送响应了。这样就抑制了不必要的通信量。
多播路由选择协议

  虽然在TCP/IP中IP多播协议已成为建议标准,但多播路由选择协议(用来在多播路由器之间传播路由信息)尚未标准化。多播路由选择实际上就是管理和维护多播路由,建立从源到多个接收端的无环数据传输路径,构建多播分发树。
多播路由选择协议
域内使用的多播路由选择协议:

  • 协议无关多播-密集模式协议 PIM-DIM(Protocol Independent Multicast-Dense Mode)
    适用于组成员的分布非常集中的情况,不使用核心路由器而是用洪泛方式转发数据报。采用Push方式,假设网络的每个子网至少有一个组播接收点,信息扩散至所有节点,采用扩散、剪枝和嫁接来维护多播分发树(SPT)。
  • 协议无关多播-系数模式协议 PIM-SM(Protocol Independent Multicast-Sparse Mode)
    适用于组成员非常分散、大规模网络的情况。采用Pull方式,多播信息被拉入网络中的接收点。假设多播数据不被需求,除非又加入申请,否则不会传播给接收者。
  • 链路状态协议 MOSPF(Multicast extensions to OSPF)
    是单播路由选择协议OSPF的一个扩充,适用于一个机构内。MOSPF使用多播链路状态路由选择创建出基于源点的多播转发树。
反向路径广播 RPB

  适用于组成员密集的情况,一开始路由器转发多播数据报使用洪泛的方法(广播),为了避免兜圈子,采用了反向路径广播 RPB(Reverse Path Broadcasting)的策略。RPB的要点是没一个路由器收到一个多播数据报时先检查数据报是否是从源点经最路径传送来的。进行这种检查很容易,只要从本路由器寻找到源点的最短路径上(之所以叫做反向路径,因为在计算最短路径时是把源点当作终点)的第一个路由器是否就是刚才把多播数据报送来的路由器。若是,就向所有其他方向转发刚才收到的多播数据报(但进入的方向除外),否则就丢弃而不转发。如果本路由器有好几个相邻路由器都处在到源点的最短路径上(也就是说,存在几条同样长度的最短路径),那么只能选择一条最短路径,选择的准则就是看这几条最短路径中的相邻路由器谁的 IP 地址最小。
反向路径广播和剪除
  如果在多播转发树上的某个路由器发现它的下游树枝(即叶节点方向)已没有该多播组的成员,就应把它和下游的树枝一起剪除。例如,在图中虚线椭圆表示剪除的部分。当某个树枝有新增加的组成员时,可以再接入到多播转发树上。

隧道技术 tunneling

  隧道技术适用于多播组的位置在地理上很分散的情况。例如在下图中,网 1 和网 2 都支持多播。现在网 1 中的主机向网 2 中的一些主机进行多播。但路由器 R1 和 R2 之间的网络并不支持多播,因而 R1 和 R2 不能按多播地址转发数据报。为此,路由器 R1 就对多播数据报进行再次封装,即再加上普通数据报首部,使之成为向单一目的站发送的单播(unicast)数据报,然后通过“隧道” (tunnel)从 R1 发送到 R2。
隧道技术在多播中的应用
  单播数据报到达路由器 R2 后,再由路由器 R2 剥去其首部,使它又恢复成原来的多播数据报,继续向多个目的站转发。这一点和英吉利海峡隧道运送汽车的情况相似。英吉利海峡隧道不允许汽车在隧道中行驶。但是,可以把汽车放置在隧道中行驶的电气火车上来通过隧道。过了隧道后,汽车又可以继续在公路上行驶。这种使用隧道技术传送数据报又叫做 IP中的 IP (IP-in-IP)。

基于核心的发现技术

  这种方法对于多播组的大小在较大范围内变化时都适合。这种方法是对每一个多播组 G 指定一个核心(core)路由器,给出它的 IP 单播地址。核心路由器按照前面讲过的方法创建出对应于多播组 G 的转发树。如果有一个路由器 R1 向这个核心路由器发送数据报,那么它在途中经过的每一个路由器都要检查其内容。当数据报到达参加了多播组 G 的路由器 R2 时, R2 就处理这个数据报。如果 R1 发出的是一个多播数据报,其目的地址是 G 的组地址, R2 就向多播组 G 的成员转发这个多播数据报。如果 R1 发出的数据报是一个请求加入多播组 G 的数据报, R2 就把这个信息加到它的路由中,并用隧道技术向R1 转发每一个多播数据报的一个副本。这样,参加到多播组 G 的路由器就从核心向外增多了,扩大了多播转发树的覆盖范围。

虚拟专用网 VPN

私有IP地址

  由于IP地址的紧缺,一个机构能申请到的IP地址往往小于机构所拥有的主机。而且考虑到互联网并不安全,一个机构内并不需要把所有的主机介入到外部互联网,在许多情况下,还是和本机构内其他主机通信。假定在机构内的计算机通信也采用TCP/IP协议,那么在机构内就可以由本机构自行分配仅在本机构内有效的IP地址(本地地址)。
  为结局这一问题RFC1918指明了一些专用地址(private address),这些地址只能用于机构内部通信。在互联网中的所有路由器对目的地址是专用地址的数据报一律并不进行转发。
本地地址
采用这样的专用IP地址的互连网络称为专用互联网本地互联网或简称为专用网。专用IP地址也叫做可重用地址(reusable address)。但有时一个很大的机构有许多部门分布范围很广(在世界各地),而在每一个地点都有自己的专用网。假定这些分布在不同地点的专用网需要经常进行通信。这时,可以有两种方法:
(1)第一种方法是租用电信公司的通信线路为本机构专用。这种方法的好处是简单方便,但线路的租金太高。
(2)第二种方法是利用公用的因特网作为本机构各专用网之间的通信载体,这样的专用网又称为虚拟专用网VPN (Virtual PrivateNetwork)
  之所以称为“专用网”是因为这种网络是为本机构的主机用于机构内部的通信,而不是用于和网络外非本机构的主机通信。如果专用网不同网点之间的通信必须经过公用的因特网,但又有保密的要求,那么所有通过因特网传送的数据都必须加密。“虚拟”表示“好像是”,但实际上并不是,因为现在并没有使用专线,而VPN只是在效果上和真正的专用网一样。专用表示用户可以定制最符合自身需求的网络,用于内部通信,一个机构要构建自己的VPN就必须为它的每一个场所购买专门的硬件和软件,并进行配置,使每一个场所的VPN系统都知道其他场所的地址。一般使用IP隧道技术实现虚拟专用网。
隧道技术实现虚拟专用网
  在隧道的两端通过封装以及解封装技术在公网上建立一条数据通道,使用这条数据通道对数据进行传输。隧道是由隧道协议构建形成的。
常用隧道协议
  由同一机构内部网络所构成的虚拟专用网VPN又称为**内联网(intranet),有时一个机构的VPN需要有些些外部结构参加进来这样的VPN就称为外联网(extranet)。内联网和外联网都采用了互联网技术,即都是基于TCP/IP协议的。还有一种类型的VPN就是个人对机构的远程接入VPN(remote access VPN)**,主要解决员工外地办公问题。
远程接入VPN

网络地址转换 NAT

什么是NAT

  在专用网上使用专用地址的主机如果想要和互联网上的主机通信(不需要加密),因为很难申请到全球IP地址,所以采用网络地址转换NAT(Nets Address Translation) 。NAT是指通过专用网络地址转换为公用地址,从而对外隐藏内部管理的IP地址,它使得整个专用网只需要一个全球IP就可以访问互联网,由于专用网IP地址是可以重用的,所以NAT大大节省了IP地址的消耗。此方法是1994年提出的,这种方法需要在专用网(私网IP)连接到因特网(公网IP)的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址(公网IP地址)。这样,所有使用本地地址(私网IP地址)的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。

NAT工作过程

  内部主机与外部主机通信时,在NAT路由器上发生了两次地址转换。离开专用网时,替换源地址,将内部地址替换为全球地址。进入专用网时替换目的地址,将全球地址替换为内部地址。
NAT工作过程

多对多方式

  当NAT路由器具有N个全球IP地址时,专用网内最多可以同时有N台主机接入到互联网。这样就可以使专用网内较多的数量的主机轮流使用NAT路由器有限数量的全球IP地址。通过NAT路由器的通信必须由专用网内的主机发起,专用网内部的主机不能充当服务器。

一对多方式

  为了有效利用NAT路由器上的全球IP地址,常用的NAT转换表常利用运输层的端口号。多个拥有本地地址的主机公用NAT路由器上的一个全球IP地址,使用端口号的NAT叫做网络地址与端口号转换 NAPT(Network Address and Port Translation) 相对的不适用端口号的NAT就叫做传统NAT。
网络地址与端口号转换

静态NAT

  为内网某台服务器指定一个固定转换的公网IP(一对一的)。对节约公网IP没有太大意义,外面主机可以使用这个共有IP访问服务器资源。

多协议标签交换 MPLS

  三层转发(forwarding)过程:需要解封装,获取三层地址(软件实现,速度慢),根据目的IP地址查找路由表并获取下一跳硬件地址,封装成帧后发送至下一跳(硬件实现速度快)流量工程方面有缺陷。而二层交换(switch)直接用硬件转发,速度快。多协议标签交换 MPLS(MultiProtocol Lable Switching) 技术就是使用二层技术实现三层数据报的交换,来提高路由器分组转发速度。

MPLS原理

  MPLS就是在MPLS域的入口处给每一个IP数据报打上固定长度的标签,然后对打上标签的IP数据报用硬件进行转发,称为标签交换。这样在转发时就不需要上升到第三层查找转发表,而是根据标签在第二层(数据链路层)用硬件进行转发。MPLS可使用多种链路层协议,如PPP、以太网、ATM、帧中继等。
MPLS协议基本原理
  MPLS域(MPLS domain)是指该域中有许多彼此相邻的路由器,且所有的路由器都是支持MPLS技术的**标签交换路由器LSR(Label Switching Router)**。LSR同时具有标签交换和路由选择这两种功能,标签交换是为了快速转发,但在这之前LSR需要使用路由选择共呢个构造转发表。

MPLS基本工作过程

  • 首先采用标签分配协议LDP(Label Distribution Protocol) 交换报文,生成标签交换路径LSP(Label Switched Path)(单向)
  • 当IP数据报进入MPLS域 时,MPLS入口节点(ingress node) 给它打上标签(实际就是插入一个MPLS首部),并按照转发表把它转发给下一个LSR。给IP数据报打标签的过程叫做分类,严格的第三层(网络层)分类 只是用了IP首部中的字段,如源IP地址和目的IP地址等。大多数运营商实现了第四层(运输层)分类 ,除了检查IP首部外还要检查TCP或UDP首部中的协议端口号。还有些运营商则实现了第五层(应用层)分类,更进一步地检查数据报的内部并考虑其有效载荷。
  • 分组每经过一个LSR,LSR就要做两件事,一是转发;二是更换新的标签,即把如标签更换为出标签,这叫做标签对换(label swapping)。标签仅在两个LSR路由器之间才有意义。
  • 当IP数据报离开MPLS域时,MPLS出口节点把MPLS的标签去除,并将IP数据报交付给非MPLS的主机或路由器,以后就按照普通方法发进行转发。

注意,MPLS需依赖IGP协议(OSPF、RIP等)。

MPLS结构

MPLS结构

转发等价类 FEC

  MPLS有个很重要的概念就是转发等价类 FEC(Forwarding Equivalence Class) ,所谓FEC就是路由器按照同样的方式对待IP数据报的集合。按照同样方式对待表示从同样接口转发到同样的下一跳地址,并且具有同样服务类别和同样丢弃优先级等。划分FEC的方法不受什么限制,都是由网络管理员来控制。属于同样的FEC的IP数据报都指派同样的标签,FEC和标签是一一对应的关系。
FEC的例子: 目的IP地址与某一个特定IP地址的前缀匹配的IP数据报、所有源地址和目的地址都相同的IP数据报、具有某种服务质量需求的IP数据报。
网络管理员采用自定义的FEC就可以更好的管理网络资源。这种负载均衡的做法也称为流量工程 TE(Traffic Engineering)通信量工程

MPLS报文格式

  从层次的角度看,MPLS首部处于第二层和第三层之间。 给IP数据报打上标签实际上就是在以太网帧的首部和IP数据报的首部之间插入4字节的MPLS首部(可插入多个标签)。
MPLS报文格式
MPLS首部一共包括以下四个字段32bit:

  • 标签 占20位,因此理论上讲最多可以有2^20个标签也就是说可以最多容纳2^20个流(即1048576个流)。
  • 实验 占3位,目前保留用于实验Qos。
  • BOS栈底位 占1位,S(Stack)表示栈,可以给一个分组压多层标签,最后一个标签的BOS位置1,当处理到这层,分组则为普通的IP数据报分组。
  • 生存时间TTL 占8位,最大255,通常在加标签时直接复制普通IP分组中的TTL,用来防止MPLS分组在MPLS域中兜圈子。

多层标签

MPLS多层标签

软件定义网络 SDN

  相对稳定的网络架构设计及系统运维难以应对日益多变的网络应用与业务,上层应用需要在规模扩展、服务能力上要求更大的灵活性,难以以客户为中心的引用服务。
软件定义网络SDN
SDN网络架构