第四章 网络层(下)

226 阅读1小时+

路由器的基本工作原理

路由器是一种具有多个输入端口和输出端口的专用计算机,其任务是转发分组

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

image.png

路由选择部分的核心构件是路由选择处理机,它的任务是根据所使用的路由选择协议,周期性地与其他路由器进行路由信息的交换,以便构建和更新路由表

分组转发部分由三部分构成:交换结构、一组输入端口、一组输出端口

信号从某个输入端口进入路由器,输入端口的物理层将信号转换成比特流后,向上送交给(输入端口的)数据链路层处理

(输入端口的)数据链路层从比特流中识别出帧,去掉帧头和帧尾后,向上送交给(输入端口的)网络层处理

如果送交(输入端口的)网络层的分组是普通待转发的数据分组,则根据分组首部中的目的地址进行查表转发,若找不到匹配的转发条目,则丢弃该分组,否则按照匹配条目中所指示的端口进行转发

(输出端口的)网络层更新数据分组首部某些字段的值,例如将数据分组的生存时间减1...,然后向下送交给(输出端口的)数据链路层进行封装,(输出端口的)数据链路层将数据分组封装成帧,送交(输出端口的)物理层处理,(输出端口的)物理层将帧看作是比特流,将其变换成相应的电信号进行发送

如果送交(输入端口的)网络层的是携带有路由报文的路由分组,则把路由报文送交路由选择处理机,路由选择处理机根据路由报文的内容来更新自己的路由表

  • 路由表一般仅包含从目的网络到下一跳的映射

  • 路由表需要对网络拓扑变化的计算最优化

  • 转发表是从路由表得出的

  • 转发表的结构应当使查找过程最优化

    本课程并不对路由表和转发表做严格区分,而是统称为路由表

路由选择处理机除了处理收到的路由报文外,还会周期性地给其他路由器发送自己所知道的路由信息

路由器的各端口还应具有输入缓冲区和输出缓冲区

输入缓冲区用来暂存新进入路由器但还来不及处理的分组

输出缓冲区用来暂存已经处理完毕但来不及发送的分组

路由器的端口一般同时具有输入和输出的功能,上图将输入端口和输出端口分开是为了更形象地展示路由器的结构和更好地描述工作过程

网际控制报文协议ICMP

为了更有效地转发IP数据报和提高IP数据报交付成功的机会,TCP/IP体系结构在网际层使用了网际控制报文协议ICMP(Internet Control Message Protocol)

主机或路由器使用ICMP协议来发送差错报告报文和询问报文

ICMP报文被封装在IP数据报中发送(即作为IP数据报的数据载荷)

image.png

ICMP是网际层协议

ICMP报文类型

ICMP报文分为以下两大类:

  • 差错报告报文

    用来向主机或路由器报告差错情况

  • 询问报文

    用来向主机或路由器询问情况

ICMP差错报告报文

ICMP差错报告报文共有以下五种:

  • 终点不可达

    当主机或路由器不能交付IP数据报时,就向源点发送终点不可达报文

    具体可再根据ICMP的代码字段细分为目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等13种错误

image.png

如图所示,主机H1给H2发送IP数据报,H1会将IP数据包发送给路由器R1,由R1帮其转发

若R1的路由表中没有与网络N3匹配的路由条目(没有H2特定主机路由、N3的路由以及默认路由),则R1就不知道如何转发该数据报,只能将其丢弃并向发送该数据报的源主机H1发送ICMP差错报告报文,具体类型为终点不可达

  • 源点抑制

    当路由器或主机由于拥塞而丢弃数据报时,就向发送该数据报的源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢

image.png

主机H1给H2发送IP数据报,当该IP数据报传送到路由器R2时,由于R2拥塞(也就是R2比较繁忙),R2根据自己的丢包策略丢弃了该IP数据报,并向发送该数据报的源主机H1发送ICMP差错报告报文,具体类型为源点抑制

同理,主机也有可能出现因拥塞丢弃IP数据报并发送ICMP差错报告报文的情况

image.png

  • 时间超过

    当路由器收到一个目的IP地址不是自己的IP数据报,会将其生存时间TTL字段的值减1

    若结果不为0,则将该IP数据报转发出去

    若结果为0,除丢弃该IP数据报外,还要向发送该数据报的源点发送时间超过报文

    当终点在预先规定的时间内不能收到一个数据报的全部数据片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过报文

image.png

主机H1该H2发送IP数据报,该IP数据报从H1发出时,其首部的生存时间字段的值被设置为2

当该数据报传送到路由器R1后,R1将其TTL字段的值减1,结果为1,这表明该数据报的生存时间还没有结束,R1将其转发出去

当该数据报传送到路由器R2后,R2将其TTL字段的值减1,结果为0,这表明该数据报的生存时间结束了,R2丢弃该数据报,并向该数据报的源主机H1发送ICMP差错报告报文,具体类型为时间超过

  • 参数问题

    当路由器或目的主机收到IP数据报后发现其首部中有不正确的字段值时,就丢弃该数据报,并向发送该数据报的源点发送参数问题报文

image.png

主机H1给H2发送了一个IP数据报,但该数据报在从H1到路由器R1的传送过程中受到了干扰,其首部出现了误码

当该数据报传送到R1后,R1检测到该数据报的首部出错,于是丢弃该数据报,并向发送该数据报的源主机H1发送ICMP差错报告报文,具体类型为参数问题

  • 改变路由(重定向)

    路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器,这样可以通过更好的路由到达目的主机

image.png

假设给主机H1指定的默认网关是路由器R1,则H1要发往网络N2的IP数据报都会传送给R1,由其帮忙转发

当R1发现H1发往N2的数据报的最佳路由不应经过R1,而应经过R4时,就用改变路由报文把这个情况告诉H1,于是H1就在自己的路由表中添加一个项目,即到达N2应经过R4而不是默认网关R1

之后,H1要发往N2的IP数据报都会传送给R4,由其帮忙转发

以下情况不应发送ICMP差错报告报文:

  • 对ICMP差错报告报文不再发送ICMP差错报告报文
  • 对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文
  • 对具有多播地址的IP数据报都不发送ICMP差错报告报文
  • 对具有特殊地址(如127.0.0.0或0.0.0.0)的IP数据报不发送ICMP差错报告报文

ICMP询问报文

常见的ICMP询问报文有以下两种:

  • 回送请求和回答报文

    ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出询问

    收到此报文的主机或路由器必须给发送该报文的源主机或路由器发送ICMP回送回答报文

    这种询问报文用来测试目的站是否可达及了解其有关状态

  • 时间戳请求和回答报文

    ICMP时间戳请求报文用来请求某个主机或路由器回答当前的日期和时间

    在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒

    这种询问报文用来进行时钟同步和测量时间

ICMP的应用举例

  • 分组网间探测PING(Packet InterNet Groper)

    PING用来测试主机或路由器间的连通性

    PING是TCP/IP体系结构的应用层直接使用网际层ICMP的一个例子,它并不使用运输层的TCP或UDP

    PING应用所使用的ICMP报文类型为回送请求和回答

  • 跟踪路由(traceroute)

    跟踪路由用来探测IP数据报从源主机到达目的主机要经过哪些路由器

    在UNIX版本中,具体命令为“traceroute”,其在运输层使用UDP协议,在网络层使用ICMP报文类型只有差错报告报文

    在Windows版本中,具体命令为“tracert”,其应用层直接使用网际层的ICMP协议,所使用的ICMP报文类型有回送请求和回答报文以及差错报告报文

以Windows版本的tracert命令为例:

假设主机H1想知道到达主机H2要经过哪些路由器

H1给H2发送ICMP回送请求报文,该报文被封装在IP数据报中发送

IP数据报首部中生存时间TTL字段的值被设置为1,IP数据报到达路由器R1后其TTL字段的值被减1,结果为0,因此,R1丢弃该数据报并向发送该数据报的源主机H1发送封装有ICMP差错报告的IP数据报,ICMP差错报告类型为时间超过,这样H1就知道了到达H2的路径中的第一个路由器的IP地址

image.png

H1继续发送下一个封装有ICMP回送请求报文的IP数据报,其首部中的TTL字段的值被设置为2,经过R1的转发后,该数据报的TTL字段的值被减少为1

该数据报到达R2后,其TTL字段的值被减1,结果为0,因此R2丢弃该数据报,并向发送该数据报的源主机H1发送封装有ICMP差错报告报文的IP数据报,ICMP差错报告类型为时间超过,这样H1就知道了到达H2路径中的第二个路由器的IP地址

image.png

H1继续发送下一个封装有ICMP回送请求报文的IP数据报,其首部中TTL字段的值被设置为3,经过R1和R2的1转发后,该数据报到达H2,其首部中TTL字段的值被R1和R2减小到1

H2解析该数据报,发现其内部封装的是ICMP回送请求报文,于是就给H1发送封装有ICMP回送回答报文的IP数据报

这样H1就知道已经跟踪到路径中的最后一站,也就目的主机H2

image.png

虚拟专用网VPN与网络地址转换NAT

虚拟专用网VPN

利用公用的因特网作为本机构各专用网之间通信载体,这样的专用网又称为虚拟专用网VPN(Virtual Private Network)

假设这是某机构部门A和B的专用网,部门A位于北京,部门B位于是上海

image.png

如何在这两个专用网络之间进行通信,一种方法是租用电信公司的通信线路,这种方法简单方便,但租金很高

image.png

另一种方法是利用公用的因特网作为本机构各专用网之间的通信载体,这样形成的专用网又称为虚拟专用网

image.png

出于安全考虑,专用网内的各主机并不应该直接“暴露”在公用的因特网身上,因此,给专用网内各主机配置的IP地址应使各主机在专用网内可以相互通信,而不能直接与公用网的因特网通信

即给专用网内各主机配置的IP地址应该使各主机在该专用网内可以相互通信,而不能直接与公用的因特网通信

因此,给专用网内各主机配置的IP地址应该是该专用网所在机构可以自行分配的IP地址,这类IP地址仅在机构内部有效,称为专用地址(Private Address),不需要向因特网的管理机构申请

RFC 1918规定以下三个CIDR地址中的地址作为专用地址:

  • 10.0.0.0 ~ 10.255.255.255(CIDR地址块10/8)
  • 172.16.0.0 ~ 172.31.255.255.255(CIDR地址块172.16/12)
  • 192.168.0.0 ~ 192.168.255.255(CIDR地址块192.168/16)

因此,全世界可能有很多不同机构的专用网具有相同的专用地址,但这并不会引起麻烦,因为这些专用地址仅在机构内部使用

注意:因特网中的所有路由器,对目的地址是专用地址的IP数据报一律不进行转发,这需要由因特网服务提供者ISP对其拥有的因特网进行设置来实现

假设给部门A和部门B各自专用网中的主机都配置好了相应的专用地址

在部门A和部门B各自的专用网中,至少需要一个路由器具有全球合法的IP地址,这样部门A和B各自的专用网才能利用公用的因特网进行通信

另外还要在这两个路由器上进行相应的VPN配置

image.png

假设部门A中的主机H1要给部门B中的主机H2发送数据,H1将待发送的数据封装成内部IP数据报发送给路由器R1,内部IP数据报首部中源地址字段的值为H1的IP地址,目的地址字段的值为H2的IP地址

image.png

R1收到该内部IP数据报后,发现其目的网络必须通过因特网才能到达,就将该内部IP数据报进行加密,这样就确保了内部IP数据报的安全,然后重新添加一个首部封装成可在因特网上传送的外部数据报

外部IP数据报首部中源IP地址的值为路由器R1的全球唯一的公有IP地址,目的地址为路由器R2的全球唯一的公有IP地址

image.png

R1将外部数据报通过因特网发送给R2,R2收到该外部数据报后去掉其首部,将其数据载荷即加密后的内部IP数据报进行解密,恢复出原来的内部IP数据报

image.png

这样就可以从内部IP数据报首部中提取出源地址和目的IP地址,并根据目的地址将该内部IP数据报发送给目的主机H2

image.png

虽然两个专用网内的主机发送的数据报是通过公用的因特网传送的,但从效果上就好像是本机构的专用网上传送一样,这也是虚拟专用网中“虚拟”的含义

IP数据报在因特网中可能要经过多个网络和路由器,但从逻辑上看,路由器R1和R2之间好像是一条直通的点对点链路,因此也被称为IP隧道技术

image.png

同一机构内不同部门的内部网络所构成的虚拟专用网VPN又称为内联网VPN

有时,一个机构的VPN需要有某些外部机构(通常是合作伙伴)参加进来,这样的VPN就称为外联网VPN

在外地工作的员工需要访问公司内部的专用网络时,只要在任何地点接入因特网,运行驻留在员工PC中的VPN软件,在员工的PC和公司的主机之间建立VPN通道,即可访问专用网络的资源,这种VPN称为远程接入VPN

网络地址转换NAT

虽然因特网采用了无分类编址方式来减缓IPv4地址空间耗尽的速度,但由于因特网用户数目的激增,特别是大量小型办公室网络和家庭网络接入因特网的需求不断增加,IPv4地址空间即将面临耗尽的危险仍然没有被解除

网络地址转换NAT(Network Address Translation)能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源,缓解了IPv4地址空间即将耗尽的问题

这种方法需要在专用网络连接到因特网的路由器上安装NAT软件

装有NAT软件的路由器称为NAT路由器,它至少有一个有效的外部全球地址IPG,这样,所有使用内部专用地址的主机在和外部因特网通信时,都要在NAT路由器上将其内部专用地址转换成IPG

网络地址转换 —— 最基本的NAT方法

主机A位于专用网中,其IP地址为专用地址IP[A],主机B位于因特网中,其IP地址为全球地址IP[B],该路由器为NAT路由器,它至少拥有一个有效的外部全球地址IP[G]

image.png

主机A给主机B发送一个IP数据报,该数据报首部中的源地址为主机A的专用地址IP[A],目的地址为主机B的全球地址IP[B]

该数据报必须经过NAT路由器的转发,NAT路由器收到该数据报后,从自己的全球地址池中为主机A选择一个临时的全球地址IP[G],将数据报首部中的源地址修改为IP[G],并在自己的NAT转换表中记录IP[A]与IP[B]的对应关系

image.png

之后将修改过源地址的数据报转发到因特网

主机B收到该IP数据报后给主机A发回一个IP数据报,该数据报首部中的源地址为主机B的全球IP地址IP[B],目的地址为NAT路由器为主机A选择的临时全球地址IP[G]

image.png

当NAT路由器从因特网上收到该数据报时,根据NAT转换表中的相关记录,NAT路由器会将该数据报转发给专用网中的主机A,因此NAT路由器将数据报首部中的目的地址修改为主机A的专用地址IP[A]后,转发给专用网中的主机A

image.png

最基本的NAT方法有一个缺点,即如果NAT路由器拥有n个全球IP地址,那么专用网内最多可以同时有n台主机接入因特网

若专用网内的主机数量大于n,则需要轮流使用NAT路由器中数量较少的全球IP地址

网络地址转换 —— 网络地址与端口号转换方法

由于目前绝大多数基于TCP/IP协议栈的网络应用都使用运输层的传输控制协议TCP或用户数据报协议UDP,为了更加有效地利用NAT路由器中的全球IP地址,现在常将NAT转换和运输层端口号结合使用

这样就可以使内部专用网中使用专用地址的大量主机,共用NAT路由器上的1个全球IP地址,因而可以同时与因特网中的不同主机进行通信

将NAT和运输层端口号结合使用,称为网络地址与端口号转换(Network Address and Port Translation, NAPT)

现在很多家用路由器将家中各种智能设备(手机、平板、笔记本电脑、物联网设备等)接入因特网,这种路由器实际上就是一个NAPT路由器,但往往并不允许路由选择协议

专用网中的主机A给因特网中的主机C发送封装有运输层PDU的IP数据报,源地址为主机A的IP地址,源端口号为30000,目的地址为主机C的IP地址,目的端口号为80

image.png

NAPT路由器收到A发来的IP数据报后,对其进行相应修改,然后转发到因特网,具体的修改内容为将其源地址从内部专用网地址修改为NAPT路由器的外部全球地址,将其封装的运输层PDU的源端口号修改为一个新的运输层端口号,这是由NAPT路由器动态分配的

NAPT路由器还要将相关修改内容记录到自己的NAPT转换表中

image.png

假设专用网中的主机B给因特网中的主机C发送封装有运输层PDU的IP数据报,源地址为主机B的IP地址,源端口号为30000,目的地址为主机C的IP地址,目的端口号为80

image.png

需要说明的是,主机B与主机A选择的源端口号相同,这属于巧合,因为端口号仅在本主机中有意义,此例是为了能更好地说明NAPT路由器还会对源端口号重新动态分配

NAPT路由器收到B发来的IP数据报后,将其进行相应修改然后转发到因特网,修改内容为“将其源地址从内部专用网地址修改为NAPT路由器的外部全球地址,将其封装的运输层PDU的源端口号修改为一个新的运输层端口号”

NAPT路由器还要将相关修改内容记录到自己的NAPT转换表中

image.png

假设因特网中的主机C收到专用网中的主机A发来的IP数据报后给主机A发回一个封装有运输层PDU的IP数据报(其源地址和源端口号为218.75.230.30:80,目的地址和目的端口号为113.218.175.235:50001)

image.png

NAPT路由器收到该数据报后根据NAPT转换表中的相关记录,NAPT路由器就可知道该数据报要发送给专用网中的主机A,因此,NAPT路由器将数据报首部中的目的地址和所封装的运输层PDU的目的端口号按NAPT转换表中的记录进行修改,然后将数据报转发给主机A

image.png

尽管NAT(和NAPT)的出现在很大程度上缓解了IPv4地址资源紧张的局面,但NAT(和NAPT)对网络应用并不完全透明,会对某些网络应用产生影响

NAT的重要特点就是通信必须由专用网内部发起,因此拥有内部专用地址的主机不能直接充当因特网服务器

即外网主机不能主动向内网主机发起通信

image.png

对于目前P2P这类需要外网主机主动与内网主机进行通信的网络应用,在通过NAT时会遇到问题,需要网络应用自己使用一些特殊的NAT穿透技术来解决问题

IP多播技术的相关基本概念

多播(Multicast,也称为组播)是一种实现“一对多”通信的技术,与传统单播“一对一”通信相比,多播可以极大地节省网络资源

在因特网上进行的多播,称为IP多播

image.png

共有60个主机要接收来自视频服务器的同一个视频节目,如果采用单播方式,则视频服务器需要发送60个该视频节目,这些视频节目通过各路由器的转发,最终到达各主机

如果采用多播方式,可将这60个主机看作是同一个多播组的成员,视频服务器只要向该多播组发送1个视频节目即可

由于路由器R1支持IP多播,R1在转发该视频节目时,需要把该视频节目复制成2个副本,分别向路由器R2和R3转发1个副本

当该视频节目到达目的局域网时,由于局域网具有硬件多播功能,因此不需要复制该视频节目,在局域网上的该多播组成员都能收到该视频节目

当多播组的成员很大时,采用多播方式可以显著地减少网络中各种资源的消耗

IP多播地址和多播组

在IPv4中,D类地址被作为多播地址

  • 最小多播地址:224.0.0.0;最大多播地址:239.255.255.255

    image.png

  • IPv4多播地址的数量为2^28^个

  • 多播地址只能作为目的地址,不能作为源地址

  • 用一个D类地址来标识一个多播组,使用同一个IP多播地址接收数据报的所有主机就构成了一个多播组

    每个多播组的成员是可以随时变动的,一台主机可以随时加入和离开多播组

    多播组成员的数量和所在的地理位置也不受限制,一台主机可以属于多个多播组

  • 非多播组成员也可以向多播组发送IP多播数据报

  • 与IP数据报相同,IP多播数据报也是“尽最大努力交付”,不保证一定能够交付给多播组内的所有成员

IP多播地址又可分为预留的多播地址(永久多播地址)、全球范围可用的多播地址以及本地管理的多播地址

IP多播可以分为以下两种:

  • 只在本局域网上进行的硬件多播
  • 在因特网上进行的多播

目前大部分主机都是通过局域网接入因特网的,因此,在因特网上进行多播的最后阶段,还是要把IP多播数据报在局域网上用硬件多播的方式交付给多播组的所有成员

在局域网上进行硬件多播

由于MAC地址(也称为硬件地址)有多播MAC地址这种类型,因此只要把IPv4多播地址映射成多播MAC地址,即可将IP多播数据报封装在局域网的MAC帧中,而MAC帧首部的目的MAC地址字段的值,就设置为由IPv4多播地址映射成的多播MAC地址

这样,可以很方便地利用硬件多播实现局域网内的IP多播

如图所示,这是一个IP多播数据报

在数据链路层,该数据报会被添加一个帧头和一个帧尾,使之封装成为一个多播MAC帧

IP多播数据报首部中的目的IP地址字段的值是某个IP多播地址,多播MAC帧帧头中的目的MAC地址就是由该IP多播地址映射而来的某个多播MAC地址

image.png

当给某个多播组的成员主机配置其所属多播组的IP多播地址时,系统就会根据映射规则从该IP多播地址生成相应的局域网多播MAC地址

因特网号码指派管理局IANA,将自己从IEEE注册管理机构申请到的以太网MAC地址块中从01-00-5E-00-00-00到01-00-5E-7F-FF-FF的多播MAC地址,用于映射IPv4多播地址

这些多播MAC地址的左起前25个比特都是相同的,剩余23个比特可以任意变化,因此共有2^23^个

image.png

若将剩余23比特全部取0,即为最小的多播MAC地址:01-00-5E-00-00-00

若将剩余23比特全部取1,即为最大的多播MAC地址:01-00-5E-7F-FF-FF

32比特的IPv4多播地址映射成48比特的多播MAC地址

32比特的IPv4多播地址的前4位比特固定为1110,剩余28比特可以任意变化

但48比特的MAC地址只有低23比特可以任意变化,因此,只能与多播IP地址的低23比特进行映射,而IP多播地址可变化的28比特的前5个比特无法映射到MAC地址,这就会造成IP多播地址与多播MAC地址的映射关系不是唯一的(即多个IP多播地址可能对应同一个多播MAC地址)

image.png

映射方法:将IP多播地址的低23位直接作为MAC地址的可变部分,就可得到映射出的多播MAC地址

如果不同的IP多播地址之间的不同之处仅出现在不能映射的那5个比特,则这些IP多播地址会映射出同一个多播MAC地址

这是两个不同的IP多播地址,它们前四比特固定为1110,表示这是IP多播地址

而剩余可变的28比特中的高位5个比特无法映射,因此只有剩余23比特可映射到多播MAC地址低23比特

多播MAC地址的左起前25个比特固定不变,将IP多播地址的低23比特映射到或者说作为MAC多播地址的低23位,这样就得出了IP多播地址相应的多播MAC地址

可以看出,如果不同的IP多播地址之间的不同之处仅出现在不能映射的那5个比特,则这些IP多播地址会映射出同一个多播MAC地址

image.png

由于IP多播地址与多播MAC地址的映射关系不是唯一的,因此收到IP多播数据报的主机还要在网际层利用软件进行过滤,把不是主机要接收的IP多播数据报丢弃

如图所示,左边部分的主机属于IP多播组226.0.9.26,中间部分主机属于IP多播组226.128.9.26,右边部分主机属于IP多播组228.1.1.1

image.png

从网际层角度看,这是3个不同的IP多播组,它们各自映射的多播MAC地址如图所示

IP多播组226.0.9.26与226.128.0.26映射出的以太网多播MAC地址是相同的,这与IP多播组228.1.1.1映射出的以太网多播MAC地址是不同的,因此从MAC层的角度看,图中有2个不同的硬件多播组

image.png

假设有一个封装有IP多播数据报的多播MAC帧传送到了这些多播组所在的局域网,IP多播数据报的目的IP地址为IP多播地址226.128.9.26,多播MAC帧的目的MAC地址就是该IP多播地址映射出的多播MAC地址

image.png

当该多播MAC帧到达各主机后,各主机需要根据该多播MAC帧的目的MAC地址决定是否接受该多播MAC帧,若接受该多播MAC帧,还要根据帧中封装的IP多播数据报的目的IP地址来决定是否在网际层接受该IP多播数据报

属于硬件多播组01-00-5E-01-01-01的各成员主机从MAC层就判断出该多播MAC帧不是发送给自己所在硬件多播组的,各成员将其丢弃

image.png

属于硬件多播组01-00-5E-00-09-1A的所有主机收到该多播帧后,根据多播帧的目的MAC地址就可知道这是发送给自己的多播帧,于是MAC层接受该帧,并将其封装的IP多播数据报向上交付给网际层处理

image.png

IP多播组226.0.9.26的网际层根据多播数据报的目的IP地址为IP多播地址226.128.9.26就可知道这不是发送给IP多播组226.0.9.26的IP多播数据报,因此该IP多播组的所有成员丢弃该IP多播数据报

而IP多播组226.128.9.26的所有成员会接受该IP多播数据报

image.png

在因特网上进行IP多播需要的两种协议

要在因特网上进行IP多播,就必须考虑IP多播数据报经过多个多播路由器进行转发的问题

多播路由器必须根据IP多播数据报首部中的IP多播地址,将其转发到有该多播组成员的局域网

image.png

如图,主机A、B和C都是多播组226.128.9.26的成员,显然去往该多播组的IP多播数据报应当传送到路由器R1和R2,而不应传送给R3,因为与R3相连的局域网上现在没有该多播组的成员

各路由器需要使用TCP/IP体系结构的网际层中的网际组管理协议IGMP来获取自己各接口所在局域网中是否有某个多播组的成员

网际组管理协议(Internet Group Management Protocol,IGMP)是TCP/IP体系结构网际层中的协议,其作用是让连接在本地局域网上的多播路由器知道本局域网是否有主机(实际上是主机中的某个进程)加入或退出了某个多播组

IGMP仅在本网络有效,使用IGMP并不能知道多播组所包含的成员数量,也不能知道多播组的成员都分布在哪些网络中

仅使用IGMP并不能在因特网上进行IP多播

连接在局域网上的多播路由器还必须和因特网上的其他多播路由器协同工作,以便把IP多播数据报用最小的代价传送给所有的多播组成员,这就需要使用多播路由选择协议

多播路由选择协议的主要任务是:在多播路由器之间为每个多播组建立一个多播转发树

多播转发树连接多播源和所有拥有该多播组成员的路由器

IP多播数据报只要沿着多播转发树进行洪泛,就能被传送到所有拥有该多播组成员的多播路由器

之后,在多播路由器所直连的局域网中,多播路由器通过硬件多播,将IP多播数据报发送给该多播组的所有成员

image.png

如图,分布在不同局域网上的这些主机都是多播组226.128.9.26的成员,各路由器使用IGMP协议就可获知自己所连接的局域网上是否有某个多播组的成员

红虚线标记的是由多播路由选择协议为该多播组建立的多播转发树,去往该多播组的IP多播数据报只要沿着该多播转发数进行洪泛,就能被传送到所有拥有该多播组成员的多播路由器

之后,在多播路由器所直连的局域网内,多播路由器通过硬件多播将IP多播数据报发送给该多播组的所有成员

针对不同的多播组需要维护不同的多播转发树,而且必须动态地适应多播组成员的变化,但此时网络拓扑并不一定发生变化,因此多播路由选择协议要比单播路由选择协议(RIP、OSPF)复杂得多

即使某个主机不是任何多播组的成员,它也可以向任何多播组发送多播数据报

为了覆盖多播组的所有成员,多播转发树可能要经过一些没有多播组成员的路由器(如上例中的R2)

网际组管理协议IGMP

网际组管理协议IGMP的三种报文类型

网际组管理协议IGMP目前的最新版本是2002年10月公布的IGMPv3

IGMP有三种报文类型:

  • 成员报告报文
  • 成员查询报文
  • 离开组报文

IGMP报文被封装在IP数据报中传送(作为IP数据报的数据部分)

  • IP数据报首部的协议字段值为2,表示数据载荷为IGMP报文

  • IP数据报首部的目的地址字段根据所封装IGMP报文类型各有不同,但都属于IP多播地址

    即封装有IGMP报文的IP数据报都是IP多播数据报

  • IP数据报首部的生存时间TTL字段的值为1,这就避免了封装IGMP报文的IP多播数据报被路由器转发到其他网络

image.png

特殊的IP多播地址:

  • 224.0.0.1:特殊的IP多播地址,在本网络中所有参加多播的主机和路由器的网际层都会接受该多播数据报
  • 224.0.0.2:特殊的IP多播地址,在本网络中所有多播路由器的网际层都会接受该多播数据报(主机则不会)

IGMP的基本工作原理

加入多播组

当一个主机(中的某个进程)要加入某个多播组时,该主机会向其所在网络中发送一个封装有IGMP成员报告报文的IP多播数据报

IGMP成员报告报文中包含要加入的IP多播组的地址

封装该IGMP成员报告报文的IP多播数据报的目的地址也为要加入的IP多播组的地址

该IP多播数据报会被本网络中属于该多播组的所有成员主机以及多播路由器接收

如果本网络中还有同组的其他成员要发送IGMP成员报告报文加入该多播组,则监听到该IP多播数据报后就取消发送

多播路由器收到一个未知多播组的IGMP成员报告报文,就会将该多播组的地址添加到自己的多播组列表中

image.png

如图所示,以太网中有主机A、B、C和D共4台主机,还有一台多播路由器R1

R1被设置为接收所有的IP多播数据报

主机C属于多播组228.1.1.1,在R1的多播组列表中已经记录有该多播组

主机D不属于任何多播组

主机A和B都希望加入多播组226.0.9.26,这需要它们各自发送IGMP成员报告报文

假设主机B首先向以太网发送IGMP成员报告报文,该报文被封装在IP多播数据报中,而IP多播数据报被封装在以太网多播帧中

IGMP成员报告报文的内容主要是所希望加入的多播组的IP多播地址226.0.9.26,封装该IGMP成员报告报文的IP多播数据报的目的地址也是所希望加入的多播组的IP多播地址226.0.9.26,封装该IP数据报的以太网多播组帧的目的地址是由所希望加入的多播组的IP多播地址映射而来的多播MAC地址01-00-5E-00-09-1A

image.png

以太网中的主机A、C和D以及多播路由器R1都会收到该多播帧,由于D不属于任何多播组,因此直接将收到的多播帧丢弃

主机C发现多播帧的目的地址与自己所在多播组的多播MAC地址相同,因此在MAC层接收该多播帧,并将其所封装的IP多播数据报交付给上层的网际层处理,但网际层发现该多播数据报的目的地址与自己所希望加入的多播组的IP多播地址不同,因此在网际层丢弃该多播数据报

image.png

主机A发现该多播帧的目的地址与自己希望加入的IP多播组的多播MAC地址相同,因此在MAC层接受该多播帧,并将其所封装的IP多播数据报交付给上层的网际层处理

网际层发现该多播数据报的目的地址与自己所希望加入的多播组的IP多播地址相同,因此接受该多播数据报,并将其所封装的IGMP成员报告报文交付给IGMP进行解析,这样主机A就知道这是来自同一IP多播组的另一个成员的IGMP成员报告报文,于是取消自己准备发送的IGMP成员报告报文,取消的原因是:多播路由器R1只关心自己直连网络中有哪些多播组存在,而不关心每个多播组中的成员数量以及都有哪些成员

image.png

多播路由器R1收到该多播帧后,提取出其中的IGMP成员报告报文,解析该报文后就知道了自己所直连网络中有一个新的IP多播组226.0.9.26,因此将IP多播组地址226.0.9.26添加到自己的多播组列表中

image.png

监听多播组成员变化

多播路由器默认每隔125秒就向其直连网络发送一个封装有IGMP成员查询报文的IP多播数据报,IGMP成员查询报文封装在IP多播数据报中,而IP多播数据报被封装在以太网多播帧中

IGMP成员查询报文的内容主要是全0的IP地址,表示要查询网络中的全部多播组

封装该成员查询报文的IP多播数据报的目的地址为224.0.0.1,这是一个特殊的IP多播地址,在本网络中的所有参加多播的主机和路由器,都会接受以该多播地址为目的地址的IP数据报

封装该IP数据报的以太网多播帧的目的地址是由这个特殊的IP多播地址映射而来的多播MAC地址01-00-5E-00-00-01

image.png

根据共享总线以太网的信号传播特性(即天然的广播特性),该网络中的全部主机都会收到该多播帧

由于主机D不属于任何多播组,因此直接将收到的多播帧丢弃

而主机A、B、C都会接受该多播帧,这是因为该多播帧封装的是目的地址为224.0.0.1这个特殊的IP多播地址的IP多播数据报

主机A、B、C中的IGMP对收到的IGMP成员查询报文的内容进行解析,发现这是对本网络中所有多播组的查询,因此主机A、B、C都要准备进行响应,但不是立即响应,而是在1 ~ 10秒内随机选择一个延迟时间

image.png

延迟所选择的时间后才发送IGMP成员报告报文作为响应

假设主机B选择的随机延迟时间为2秒,主机A选择的随机延迟时间为4秒,主机C选择的随机延迟时间为6秒

image.png

之所以要选择一个随机的延迟时间后再进行发送,是因为多播路由器只关心自己的直连网络中有哪些多播组存在,而不关心每个多播组中的成员数量以及都有哪些成员,多播组中只要还有一个成员,这个多播组就存在,因此为减少对多播路由器的不必要的重复响应,每个多播组只需要有一个响应即可

对于本例,主机B在延迟2秒后会发送IGMP成员报告报文作为响应,而此时主机A的剩余延迟时间还有2秒,主机C的剩余延迟时间还有4秒

image.png

主机A、C、D都会收到该多播帧,由于主机D不属于任何多播组,因此直接将收到的多播帧丢弃

主机C的MAC层接受该多播帧,但网际层会丢弃该多播帧封装的IP多播数据报

主机A的MAC层会接受该多播帧,网际层也会接受该多播帧封装的IP多播数据报,并将其所封装的IGMP成员报告报文交付给IGMP进行解析,这样主机A就知道了这是来自同一个IP多播组的另一个成员发送的IGMP成员报告报文,于是取消自己准备发送的IGMP成员报告报文

image.png

路由器R1收到该多播帧后,提取出其中的IGMP成员报告报文,解析该报文后就知道了自己所直连网络中还有IP多播组226.0.9.26的成员,因此在自己的多播组列表中更新对该多播组的相关记时

image.png

主机C4秒后进行响应的过程与其类似

IGMP退出多播组.png

image.png

假设主机C不在是多播组226.128.9.26的成员

多播路由器R1默认每隔125秒就向其直连网络发送一个IGMP成员查询报文,报文的封装细节如图所示:

image.png

根据共享总线以太网的信号传播特性(即天然的广播特性),该网络中的全部主机都会收到该多播帧

由于主机D不属于任何多播组,因此直接将收到的多播帧丢弃

由于主机C此时已经不属于任何多播组,因此也会直接将收到的多播帧丢弃

而主机A、B各自的MAC层都会接受该多播帧,网际层也会接受该多播帧封装的IP多播数据报,并将其封装的IGMP成员查询报文交付IGMP进行解析,之后主机A和B会进行延迟响应

image.png

响应的过程不在赘述

多播路由器R1由于长时间收不到来自多播组226.128.9.26成员的响应,因此会将该多播组从自己的多播组列表中删除

image.png

退出多播组

IGMPv2在IGMPv1的基础上增加了一个可选项:当主机要退出某个多播组时,可主动发送一个离开组报文,而不必等待多播路由器的查询。这样可使多播路由器能够更快地发现某个组有成员离开

假设主机C要退出多播组226.128.9.26,主机C可以主动发送一个IGMP离开组报文,而不必等待多播路由器R1的周期性检查

IGMP离开组报文的内容主要是:主机要退出的多播组的IP多播地址

封装该离开组报文的IP多播数据报的目的地址为:224.0.0.2,这是一个特殊的IP多播地址,在本网络中的所有多播路由器都会接受该多播数据报

封装该IP多播数据报的以太网多播帧的目的地址是由这个特殊的IP多播地址映射而来的多播MAC地址

image.png

该网络中的主机A、B、D以及多播路由器R1都会收到该多播帧

主机A、B、D都会收到该多播帧,而多播路由器R1会接受该多播帧并提取出其中封装的IGMP离开组报文

之后R1就知道了有成员要离开该多播组226.128.9.26,但R1暂时不会从多播组列表中删除该多播组,而是立即发送针对该多播组的特定IGMP成员查询报文以探测该多播组是否还有其他成员

image.png

针对该多播组的特殊IGMP成员查询报文的内容和封装该报文的IP多播数据报的目的地址,都为该多播组的地址226.128.9.26

image.png

在R1发送该IGMP成员查询报文时,主机C已不再是多播组226.128.9.26的成员

之后的过程不在赘述

选举查询路由器

image.png

同一网络中的多播路由器可能不止一个,但没有必要每个多播路由器都周期性地发送IGMP成员查询报文

只要在这些多播路由器中选择一个作为查询路由器,由查询路由器发送IGMP成员查询报文,而其他的多播路由器仅被动接收响应并更新自己的多播组列表即可

选择查询路由器的方法:

  • 每个多播路由器若监听到源IP地址比自己的IP地址小的IGMP成员查询报文则退出选举
  • 最后,网络中只有IP地址最小的多播路由器成为查询路由器

多播路由选择协议

多播路由选择协议的主要任务是:在多播路由器之间为每个多播组建立一个多播转发树

多播转发树连接多播源和所拥有该多播组成员的路由器

目前有以下两种方法来构建多播转发树:

  • 基于源树(Source -Base Tree)的多播路由选择
  • 组共享树(Group-Shared Tree)的多播路由选择

基于源树的多播路由选择

基于源树的多播路由选择的最典型算法是反向路径多播(Reverse Path Multicasting,RPM)算法

RPM算法包含以下两个步骤:

  • 利用反向路径广播(Reverse Path Broadcasting,RPB)算法建立一个广播转发树
  • 利用剪枝(Pruning)算法,剪除广播转发树中的下游非成员路由器,获得一个多播转发树

要建立广播转发树,可以使用洪泛(Flooding)法,但这种方法仅适用于无环路的网络拓扑,否则会出现广播分组在环路中兜圈的现象

image.png

如图所示,路由器R1向其邻居路由器R3发送广播分组,R3收到后复制该广播分组,并向自己的所有下游邻居路由器转发,即向除R1外的所有邻居路由器转发。以此类推,这种方法最终可将广播分组副本传送到网络中的所有结点,

如果网络中存在环路,使用洪泛法会产生严重问题,即广播分组的一个或多个副本将在环路中永久兜圈。这种无休止的广播分组的复制和转发,最终将导致该网络中产生大量的广播分组,使得网络带宽被完全占用

利用反向路径广播RPB算法生成的广播转发树,不会存在环路,因此可以避免广播分组在环路中兜圈

RPB算法的要点是:每一台路由器在收到一个广播分组时,先检查该广播分组是否从源点经过最短路径传送来的

若是,本路由器就从自己除刚才接收该广播分组的接口的所有其他接口转发该广播分组

否则,丢弃该广播分组

如果本路由器有多个邻居路由器都处在到源点的最短路径上,也就是存在多条同样长度的最短路径,那么只能选取一条最短路径。选取的规则是选取这几条最短路径中的邻居路由器的IP地址最小的那条最短路径

RPB中“反向路径”的意思是:在计算最短路径时把源点当做终点

为简单起见,假设各路由器之间的路径距离为1

源点向路由器R1发送了一个广播分组,R1收到后,向其邻居路由器R2和R3转发

image.png

R2收到R1转发来的广播分组后,发现R1就在R2自己到源点的最短路径上,因此R2向其邻居路由器R3和R4转发该广播分组

同理,R3收到R1转发来的广播分组后,向其邻居路由器R2和R5转发

image.png

R2收到R3转发来的广播分组后,发现R3不在R2自己到源点的最短路径上,因此丢弃R3转发来的广播分组

同理R3丢弃R2转发来的广播分组

image.png

R4收到R2转发来的广播分组后,发现R2就在R4自己到源点的最短路径上,因此R4向其邻居路由器R5、R6和R7转发该广播分组

同理,R5收到R3转发来的广播分组后,向其邻居路由器R4、R7和R8转发该广播分组

image.png

R4收到R5转发来的广播分组后,发现R5不在R4自己到源点的最短路径上,因此丢弃R5转发来的广播分组

同理,R5丢弃R4转发来的广播分组

image.png

从图中可以看出,R7到源点存在两条最短路径,分别是R7 → R4 → R2 → R1 → 源点,和R7 → R5 → R3 → R1 → 源点

假设R4的IP地址小于R5的IP地址,因此选择经过R4的那条最短路径,即R7只转发R4转发来的广播分组,而丢弃R5转发来的广播分组

image.png

经过上述过程,最终可以得出转发广播分组的广播转发树,以后就按该广播转发树转发广播分组,这样就避免了广播分组兜圈子,同时每一个路由器也不会收到重复的广播分组

image.png

RPB虽然很好地解决了转发环路的问题,但只是实现了广播,要实现真正的多播,还要将像R8这样的没有多播组成员的非成员结点从广播转发树上剪除

R8通过IGMP协议发现自己没有多播组成员,若R8也没有下游路由器(即R8是叶结点),则R8向其上游路由器R5发送一个剪枝报文,将自己从多播转发树上剪除

image.png

如果被剪枝的路由器通过IGMP又发现了新的多播组成员,则会向上游路由器发送一个嫁接报文,并重新加入到多播转发树中

image.png

注意:尽管R2没有多播组成员,但也要保留R2确保多播转发树的连通性

组共享树的多播路由选择

组共享树多播路由选择采用基于核心的分布式生成树算法来建立共享树

该方法在每个多播组中指定一个核心(core)路由器,以该路由器为根,建立一棵连接多播组的所有成员路由器的生成树,作为多播转发树

每个多播组中除了核心路由器,其他所有成员路由器都会向自己多播组中的核心路由器单播加入报文

加入报文通过单播朝着核心路由器转发,直到它到达已经属于该多播生成树的某个节点或者直接到达核心路由器

加入报文所经过的路径,就确定了一条从单播该报文的边缘节点到核心路由器之间的分支,而这个新分支就被嫁接到现有的多播转发树上

image.png

如图,假设这些主机都是同一个多播组的成员,路由器R5被选择作为该多播转发树的核心路由器

R4首先加入该多播转发树,R4向R5单播加入报文,链路R4到R5就成为该多播转发树的初始生成树

image.png

R3通过R6向R5单播加入报文,以加入该生成树,单播路径从R3经过R6到达R5,这会使路径R3、R6、R5被嫁接到该生成树上

image.png

R2向R5直接单播加入报文以加入该生成树,使链路R2到R5被嫁接到该生成树上

image.png

R7通过向R5单播加入报文来加入该生成树,由于R7到R5的单播路径要经过R6,而R6已经加入了该生成树,因此R7的加入报文到达R6就会使链路R7到R6立即被嫁接到该生成树上

image.png

经过上述过程就形成了以R5为核心路由器的多播转发树

由于R1没有该多播组成员,因此R1不会向R5单播加入报文,所以R1不在该生成树上

假设源主机给该多播组发送了一个多播分组,当R1收到后会将该多播分组封装到目的地址为核心路由器R5的单播分组中,将该单播分组发送给R5

R5收到后,将封装在单播分组中的多播分组解封出来,在多播转发树上进行洪泛转发

image.png

因特网的多播路由选择协议

目前还没有在整个因特网范围使用的多播路由选择协议

下面是一些建议使用的多播路由选择协议:

  • 距离向量多播路由选择协议(Distance Vector Multicast Routing Protocol, DVMRP) [RFC 1075]
  • 开放最短路径优先的多播扩展(Multicast Extensions to OSPF,MOSPF) [RFC 1585]
  • 协议无关多播-稀疏方式(Protocol lndependent Multicast-Sparse Mode,PIM-SM) [RFC 2362]
  • 协议无关多播-密集方式(Protocol lndependent Multicast-Dense Mode,PIM-DM) [RFC 3973]
  • 基于核心的转发树(Core Based Tree,CBT) [RFC 2189,RFC 2201]

尽管因特网工程任务组ETF努力推动着因特网上的全球多播主干网(Multicast Backbone On the Internet,MBONE)的建设,但至今在因特网上的IP多播还没有得到大规模的应用

主要原因是:改变一个已成功运行且广泛部署的网络层协议是一件极其困难的事情

目前IP多播主要应用在一些局部的园区网络、专用网络或者虚拟专用网中

另外,P2P技术的广泛应用推动了应用层多播技术的发展,许多视频流公司和内容分发公司,通过构建自己的应用层多播覆盖网络来分发它们的内容

但上述多播路由选择协议的算法思想在应用层多播中依然适用

移动IP技术概述

移动IP技术的相关基本概念

移动IP(Mobile IP)是因特网工程任务组IETF开发的一种技术,该技术使得移动主机在各网络之间漫游时,仍然能够保持其原来的IP地址不变

移动IP技术还为因特网中非移动主机提供了相应机制,使得它们能够将IP数据报正确发送到移动主机

  • 每个移动主机都有一个默认连接的网络或初始申请接入的网络,称为归属网络(Home Network)

    移动主机在归属网络中的IP地址在其整个移动通信过程中是始终不变的,因此称为永久地址(Permanent Address)或归属地址(Home Address)

    在归属网络中,代表移动主机执行移动管理功能的实体称为归属代理(Home Agent)

    归属代理通常就是连接在归属网络上的路由器,然而它作为代理的特定功能则是在网络层完成的

  • 移动主机当前漫游所在的网络称为外地网络(Foreign Network)或被访网络(Visited Network)

    在外地网络中,帮助移动主机执行移动管理功能的实体称为外地代理(Foreign Agent)

    外地代理通常就是连接在外地网络上的路由器

    外地代理会为移动主机提供一个临时使用的属于外地网络的转交地址(Care-of Address)

移动IP技术的基本工作原理

代理发现与注册

image.png

当移动主机从归属网络漫游到外地网络中后,移动主机会通过自己的代理发现协议与外地网络中的外地代理建立联系,并从外地代理获得一个属于该外地网络的转交地址,同时向外地代理注册自己的永久地址和归属代理的地址

image.png

外地代理会将该移动主机的永久地址记录在自己的注册表中,并向移动主机的归属代理注册该移动主机的转交地址(也可由移动主机直接进行注册)

归属代理会将移动主机的转交地址记录下来,此后归属代理会代替移动主机接收所有发送给该移动主机的IP数据报,并利用IP隧道技术将这些数据报转发给外地网络中的移动主机

当移动主机不在归属网络时,归属代理会以自己的MAC地址应答所有对该移动主机的ARP请求,即归属代理采用ARP代理技术

为了使归属网络中其他各主机和路由器能够尽快更新各自的ARP高速缓存,归属代理还会主动发送ARP广播,并声称自己是该移动主机

这样,所有发送给该移动主机的IP数据报都会发送给归属代理

固定主机向移动主机发送IP数据报

image.png

固定主机向移动主机发送IP数据报时,该数据报会被路由到移动主机的归属网络,归属代理会代替移动主机接收该数据报,该数据报的源地址为固定主机的IP地址,目的地址为移动主机的归属地址

image.png

归属代理会将该数据报封装到一个新的IP数据报中(将原IP数据报整个作为新IP数据报的数据部分),新IP数据报的首部目的地址为移动主机的转交地址(转交地址其实就是外部代理的IP地址)

image.png

归属代理将这个新的IP数据报通过IP隧道发送给外地代理,外地代理收到后,将其数据载荷(原IP数据报)解封出来,根据该原IP数据报首部中的目的地址,直接转发给位于外地网络中的移动主机

image.png

注意:当外地代理和移动主机不是同一台设备时,转交地址实际上是外地代理的地址而不是移动主机的地址,转交地址既不会作为移动主机发送IP数据报的源地址,也不会作为移动主机所接收到的IP数据报的目的地址,转交地址仅仅是归属代理到外地代理的IP隧道的出口地址

所有使用同一外地代理的移动主机,都可以共享同一个转交地址

当外地代理从IP隧道中收到并解封出原IP数据报时,会在自己的代理注册表中查找移动主机的永久地址所对应的MAC地址,并将该数据报封装到目的地址为该MAC地址的帧中发送给移动主机,这与IP数据报的正常转发流程是不同的,否则会造成该数据报又被发回移动主机的归属网络

移动主机向固定主机发送IP数据报

image.png

假设位于外地网络中的移动主机向位于其他网络中的固定主机(移动主机和固定主机不在同一个网络中)发送一个IP数据报,该IP数据报中的源地址为移动主机的归属地址,目的地址为固定主机的IP地

image.png

该IP数据报会按照正常的发送流程发送出去

这是因为IP路由器并不关心IP数据报的源地址,因此该IP数据报被(外地代理)直接路由到固定主机,而无须再通过归属代理进行转发

image.png

为此移动主机可以将外地代理作为自己的默认路由器,也可以通过代理发现协议从外地代理获取外地网络中其他路由器的地址,并将其设置为自己的默认路由器

同址转交地址

外地代理除了可以配置在外地网络中的路由器上,也可以直接运行在移动主机上

image.png

为此,移动主机需要运行额外的外地代理软件

外地网络也需要提供相应机制,使移动主机能够自动获取一个外地网络中的地址作为自己的IP地址和外地代理的地址,被称为同址转交地址(Co-Located Care-of Address)

这样,移动主机自己将接收所有发往转交地址的IP数据报

三角形路由问题

image.png

假设位于外地网络中的固定主机向位于同一网络中的移动主机发送IP数据报,这会出现三角形间接路由问题,造成IP数据报转发的低效性

换句话说,即使在固定主机与移动主机之间存在一条更有效的路径,发往移动主机的IP数据报也要先发送给归属代理,造成IP数据报转发的低效

解决三角形路由问题的一种方法:

  • 给固定主机配置一个通信代理,固定主机发送给移动主机的IP数据报,都要通过该通信代理转发

    通信代理先从归属代理获取移动主机的转交地址,之后所有发送给移动主机的IP数据报,都利用转交地址直接通过IP隧道发送给移动主机的外地代理,而无须再通过移动主机的归属代理进行转发

    这种方法以增加复杂性为代价,并要求固定主机也要配置通信代理,也就是对固定主机不再透明

IPv6引进的主要变化

IPv4地址的设计存在以下缺陷:

  • IPv4的设计者最初并没有想到协议会在全球范围内广泛使用,因此将IPv4地址的长度规定为他们认为足够长的32比特
  • IPv4地址早期的编址方法(分类的IPv4地址和划分子网的IPv4地址)也不够合理,造成IPv4地址资源的浪费

如果没有网络地址转换NAT技术的广泛应用,IPv4早已停止发展

然而,NAT仅仅是为了延长IPv4使用寿命而采取的权宜之计,解决IPv4地址耗尽的根本措施是采用具有更大地址空间(IP地址的长度128比特)的新版本IP,即IPv6

直接将因特网的核心协议从IPv4更换成IPv6是不可行的

到目前为止,IPv6还处于草案标准阶段

IPv6的主要变化

  • 更大的地址空间

    IPv6将IPv4的32比特地址空间增大到了128比特,在采用合理编址方法的情况下,在可预见的未来是不会用完的

  • 扩展的地址层次结构

    可划分为更多的层次,这样可以更好地反映出因特网的拓扑结构,使得对寻址和路由层次的设计更具有灵活性

  • 灵活的首部格式

    IPv6的首部格式与IPv4的首部格式并不兼容。IPv6定义了许多可选的扩展首部,不仅可提供比IPv4更多的功能,而且还可以提高路由器的处理效率,因为路由器对逐跳扩展首部外的其他扩展首部都不进行处理

  • 改进的选项

    IPv6允许分组包含有选项的控制信息,因而可以包含一些新的选项

    然而IPv4规定的选项却是固定不变的

  • 允许协议继续扩充

    技术总是不断发展的,而新的应用也会层出不穷

    而IPv4的功能却是固定不变的

  • 支持即插即用(即自动配置)

    IPv6支持主机或路由器自动配置IPv6地址及其他网络配置参数,因此IPv6不需要是使用DHCP

  • 支持资源的预分配

    IPv6能为实时音视频等要求保证一定带宽和时延的应用,提供更好的服务质量保证

IPv6数据报的基本首部和扩展首部

IPv6数据报的基本首部

image.png

IPv6数据报由长度为40字节的基本首部和长度可变但最大不超过65535字节的有效载荷

有效载荷由零个或多个扩展首部及其后面的数据部分构成

注意:所有的扩展首部并不属于IPv6数据报的首部,它们与其后面的数据部分合起来构成有效载荷(payload,也称为净负荷)

image.png

IPv6将IPv4数据报首部中不必要的功能取消了,这使得IPv6数据报基本首部中字段数量减少到只有8个

但由于IPv6地址的长度扩展到了128比特,因此使得IPv6数据报基本首部的长度反而增大到了40字节,比IPv4数据报首部固定部分的长度(20字节)增大了20字节

与IPv4的首部相比,IPv6数据报首部:

  • 取消了首部长度字段

    因为IPv6数据报的首部长度固定为40字节

  • 取消了区分服务(服务类型)字段

    因为IPv6数据报首部中的通信量类和流标号字段实现了区分服务字段的功能

  • 取消了总长度字段

    改用有效载荷长度字段

    这是因为IPv6数据报的首部长度是固定的40字节,只有其后面的有效数据载荷长度是可变的

  • 取消了标识、标志、片偏移字段

    因为这些功能已包含在IPv6数据报的分片扩展首部中

  • 把生存时间TTL字段改称为跳数限制字段

    这样名称与作用更加一致

  • 取消了协议字段

    改用下一个首部字段

  • 取消了首部检验和字段

    这样可以加快路由器处理IPv6数据报的速度

  • 取消了可选字段

    改用扩展首部来实现选项功能

IPv6基本首部中各字段的含义
  • 版本字段

    长度为4比特,用来表示IP协议的版本,对于IPv6该字段的值为6

  • 通信量类字段

    长度为8比特,用来区分不同的IPv6数据报的类别或优先级

    目前正在进行不同的通信量类性能的实验

  • 流标号字段

    长度为20比特

    IPv6提出了流的抽象概念

    “流”就是因特网上从特定源点到特定终点(单播或多播)的一系列IPv6数据报(如实时音视频数据的传送),而在这个“流”所经过的路径上的所有路由器都保证指明的服务质量

    所有属于同一个流的IPv6数据报都具有同样的流标号。换句话说,流标号用于资源分配

    流标号对于实时音视频数据的传送特别有用,但对于传统的非实时数据,流标号则没有用处,把流标号字段的值置为0即可

  • 有效载荷长度字段

    长度为16比特,它指明IPv6数据报基本首部后面的有效载荷(包括扩展首部和数据部分)的字节数量

    该字段以1字节为单位,最大取值为65535

  • 下一个首部字段

    长度为8比特,该字段相当于IPv4数据报首部中的协议字段或可选字段

    当IPv6数据报没有扩展首部时,该字段的作用与IPv4的协议字段一样,它的值指出了IPv6数据报基本首部后面的数据是何种协议数据单元PDU

    • 字段值 = 6时,表示有效载荷部分是TCP报文段
    • 字段值 = 17时,表示有效载荷部分是UDP用户数据报

    当IPv6数据报基本首部后面带有扩展首部时,该字段的值就标识后面第一个扩展首部的类型

    IPv6数据报的扩展首部中也有下一个首部字段,作用是标识(当前扩展首部的)下一个扩展首部的类型

  • 跳数限制字段

    长度为8比特,该字段用来防止IPv6数据报在因特网中永久兜圈

    源点在每个IPv6数据报发出时即设定某个跳数限制(最大255跳)

    每个路由器在转发IPv6数据报时,要先把跳数限制字段中的值减1

    当跳数限制字段的值为0时,就把这个IPv6数据报丢弃(即不转发)

    该字段的作用和IPv4数据报首部中的生存时间TTL字段完全一样

    IPv6将名称改为跳数限制后,可使名称与作用更加一致

  • 源地址字段和目的地址字段

    长度均为128比特,分别用来填写IPv6数据报的发送端的IPv6地址和接收端的IPv6地址

IPv6数据报的扩展首部

IPv4数据报如果在其首部中使用了可选字段,则在数据报的整个传送路径中的全部路由器,都要对可选字段进行检查,这就降低了路由器处理数据报的速度

实际上,在路径中的路由器对很多选项是不需要检查的

因此,为了提高路由器对数据报的处理效率,IPv6把原来IPv4首部中的选项字段都放在了扩展首部中,由路径两端的源点和终点的主机来处理,而数据报传送路径中的所有路由器都不处理这些扩展首部(但除逐跳选项扩展首部外)

在[RFC 2460]中定义了以下六种扩展首部:

  1. 逐跳选项
  2. 路由选择
  3. 分片
  4. 鉴别
  5. 封装安全有效载荷
  6. 目的站选项

每一个扩展首部都由若干个字段组成,它们的长度也各不相同

所有扩展首部中的第一个字段都是8比特的下一个首部字段,该字段的值指出在该扩展首部字段后面是何种扩展首部

当使用多个扩展首部时,应按以上的先后顺序出现

IPv6地址

IPv6地址空间大小

在IPv6中,每个地址占128个比特,因此IPv6的地址空间大小为2^128^

IPv6地址的表示方法

IPv6地址采用冒号十六进制记法

  • 将128比特的IPv6地址的每十六个比特分为1组,共8组,每组之间使用冒号“ : ”分隔
  • 将每组中的每4个比特转换为1个十六进制数

已知一个128比特的某个IPv6地址:

00100000000000010000110110111000010000000000010000000000000100000000000000000000000000000000000001100101010000110000111111111101

将128比特的IPv6地址的每十六个比特分为1组,共8组,每组之间使用冒号“ : ”分隔

0010000000000001:0000110110111000:0100000000000100:0000000000010000:0000000000000000:0000000000000000:0110010101000011:0000111111111101

将每组中的每4个比特转换为1个十六进制数

0010 0000 0000 0001:0000 1101 1011 1000:0100 0000 0000 0100:0000 0000 0001 0000:0000 0000 0000 0000:0000 0000 0000 0000:0110 0101 0100 0011:0000 1111 1111 1101

2 0 0 1:0 d b 8:4 0 0 4:0 0 1 0:0 0 0 0:0 0 0 0:6 5 4 3:0 f f d

注意:该十六进制表示法不区分大小写

在IPv6地址的冒号十六进制记法的基础上,再使用“左侧零”省略和“连续零”压缩,可使IPv6地址的表示更加简洁

  • “左侧零”省略是指一组十六进制数中最前面的一串0可以省略不写

    若4个十六进制都是0,则需要使用一个0表示该组数都为0(使用“连续零”压缩的情况除外)

  • “连续零”压缩是指一连串连续的0可以用一对冒号取代

采用冒号十六进制记法的IPv6地址:

2 0 0 1:0 d b 8:4 0 0 4:0 0 1 0:0 0 0 0:0 0 0 0:6 5 4 3:0 f f d

通过“左侧零”省略和“连续零”压缩后得到:

2 0 0 1:d b 8:4 0 0 4:1 0::6 5 4 3:f f d

注意:在一个IPv6地址中只能使用一次“连续零”压缩,否则会导致歧义

image.png

image.png

冒号十六进制记法还可结合点分十进制的后缀,这在IPv4向IPv6过渡阶段非常有用

即将冒号十六进制的最后两组使用点分十进制表示,0:0:0:0:0:ffff:192.168.1.1

CIDR的斜线表示法在IPv6中仍然有用

2001:db8:4004:10::6543:ffd/60/60指明了网络前缀为60比特

IPv6地址的分类

IPv6数据报的目的地址有三种基本类型:

  • 单播(unicast)

    即传统的点对点通信

  • 多播(multicast)

    即一点对多点的通信

    数据报发送到一组计算机中的每一个

    IPv6没有采用广播的术语,而将广播看作多播的一个特例

  • 任播(anycast)

    是IPv6新增的一种类型

    任播的终点是一组计算机,但数据报只交付其中的一个,通常是按照路由算法得出的距离最近的一个

[RFC 4291]对IPv6地址进行了分类:

  • 未指明地址

    128个比特为“全0”的地址,可缩写为两个冒号“::”

    该地址不能用作目的地址,只能用于还没有配置到一个标准IPv6地址的主机用作源地址

    未指明地址仅有一个

  • 环回地址

    最低比特为1,其余127比特位“全0”,即0:0:0:0:0:0:0:1,可缩写为“::1”

    该地址的作用与IPv4的环回地址相同,但IPv6的环回地址只有一个

  • 多播地址

    最高8比特为“全1”的地址,可记为FF00::/8

    IPv6多播地址的功能与IPv4多播地址相同

    这类地址占IPv6地址空间的1/256

  • 本地链路单播地址

    最高10比特位1111111010的地址,可记为FE80::/10

    即使用户网络没有连接到因特网,但仍然可以使用TCP/IP协议

    连接在这种网络上的主机都可以使用本地链路单播地址进行通信,但不能和因特网上的其他主机通信

    这类地址占IPv6地址空间的1/1024

  • 全球单播地址

    全球单播地址是使用最多的一类地址

    IPv6全球单播地址采用三级结构,这是为了使路由器可以更快地查找路由

    • image.png
    • 全球路由选择前缀分配给公司和机构,用于因特网中路由器的路由选择,相当于IPv4分类地址中的网络号
    • 子网标识符用于各公司和机构构建自己的子网
    • 接口标识符用于指明主机或路由器的单个网络接口,相当于IPv4分类地址中的主机号。有64个比特,足以将各种接口的硬件地址直接进行编码,这样就不需要使用ARP

从IPv4向IPv6过渡

因特网上使用IPv4的路由器的数量太大,要让所有路由器都改用IPv6并不能一蹴而就

因此,从IPv4转变到IPv6只能采用逐步演进的方法

另外,新部署的IPv6系统必须能够向后兼容,也就是IPv6系统必须能够接收和转发IPv4数据报,并且能够为IPv4数据报选择路由

两种从IPv4向IPv6过渡的策略:

  • 使用双协议栈
  • 使用隧道技术

双协议栈技术

双协议栈(Dual Stack)是指在完全过渡到IPv6之前,使一部分主机或路由器装有IPv4和IPv6两套协议栈

双协议栈主机或路由器既可以和IPv6系统通信,又可以和IPv4系统通信

双协议栈主机或路由器记为IPv6/IPv4,表明它具有一个IPv6地址和一个IPv4地址

双协议栈主机与IPv6主机通信时采用IPv6地址,而与IPv4主机通信时采用IPv4地址

双协议栈主机通过域名系统DNS查询目的主机采用的IP地址

  • 若DNS返回的是IPv4地址,则双协议栈的源主机就使用IPv4地址
  • 若DNS返回的是IPv6地址,则双协议栈的源主机就使用IPv6地址

双协议栈技术会对IP数据报的信息造成损失

主机A和B都使用IPv6,路由器R2和R3是IPv4路由器,路由器R1和R4是IPv4/IPv6双协议栈路由器

假设主机A给主机B发送一个IPv6数据报

如图,其IPv6数据报首部中的流标号字段的值为X,源地址字段的值是A的IPv6地址,目的地址的值是B的IPv6地址

路由器R1不能向R2转发IPv6数据报,因为R2只使用IPv4协议,由于R1是IPv6/IPv4双协议栈路由器,因此R1可把IPv6数据报首部转换为IPv4数据报首部,这样就使IPv6数据报转换成了IPv4数据报

IPv4数据报首部中的源地址和目的地址是从IPv6地址转换而来的IPv4地址

然而IPv6首部中的某些字段无法转换,例如流标号字段

R2将转换后的IPv4数据报转发给R3,R3再将其转发给R4

由于R4是IPv6/IPv4双协议栈路由器,因此R4把IPv4数据报恢复成原来的IPv6数据报发送给主机B

然而,流标号却无法恢复

这种信息的损失是使用首部转换方法所不能避免的

image.png

使用隧道技术

隧道技术(Tunneling)的核心思想是:

  1. 当IPv6数据报要进入IPv4网络时,将IPv6数据报重新封装成IPv4数据报,即整个IPv6数据报称为IPv4数据报的数据载荷
  2. 封装有IPv6数据报的IPv4数据报在IPv4网络中传输
  3. 当IPv4数据报要离开IPv4网络时,再将其数据载荷(即原来的IPv6数据报)取出并转发到IPv6网络

注意:要使双协议栈路由器R4知道IPv4数据报的数据载荷是IPv6数据报,则IPv4数据报首部中协议字段的值必须设置为41

image.png

主机A发送给主机B的IPv6数据报如图所示,其首部中流标号字段的值为X,源地址字段的值是A的IPv6地址,目的地址字段的值是B的IPv6地址

路由器R1收到后,将其当做IPv4数据报的数据载荷,为其添加一个新的IPv4首部使之成为IPv4数据报并转发给路由器R2

IPv4首部中的源地址是路由器R1的IPv4地址,目的地址是路由器R4的IPv4地址

R2将该IPv4数据报转发给R3,R3将其再转发给R4,R4将该IPv4数据报的数据载荷解封出来得到IPv6数据报,并将其转发给主机B

对于本例,使用隧道技术就好像在路由器R1和R4之间为IPv6数据报的传送打通了一条专用的隧道,R1是隧道的入口,R4是隧道的出口

网际控制报文协议ICMPv6

网际控制报文协议ICMPv6概述

由于IPv6与IPv4一样,都不确保数据报的可靠交付,因此IPv6也需要使用网际控制报文协议ICMP来向发送IPv6数据报的源主机反馈一些差错信息,相应的ICMP版本为ICMPv6

ICMPv6比ICMPv4要复杂得多,它合并了原来的地址解析协议ARP和网际组管理协议IGMP的功能

因此与IPv6配套使用的网际层协议就只有一个ICMPv6这一个协议

ICMPv6报文的封装

ICMPv6报文需要封装成IPv6数据报进行发送(即ICMPv6报文作为IPv6数据报的数据载荷,若有扩展首部,则ICMPv6报文在扩展首部之后的位置)

若IPv6数据报的整个数据载荷封装的是IPv6报文,则IPv6数据报的基本首部中下一个首部字段的值为58,表明数据载荷为ICMPv6报文

image.png

若IPv6数据报的有效载荷中包含扩展首部,且在扩展首部之后封装的是ICMPv6报文,则在ICMPv6报文前面的那个扩展首部中的下一个首部的值必须设置为58,表示该扩展首部后面是ICMPv6报文

image.png

ICMPv6报文的分类

ICMPv6报文可被用来报告差错、获取信息、探测邻站或管理多播通信

在对ICMPv6报文进行分类时,不同的RFC文档使用了不同的策略:

  • 在[RFC 2463]中定义了六种类型的ICMPv6报文
  • 在[RFC 2461]中定义了五种类型的ICMPv6报文
  • 在[RFC 2710]中定义了三种类型的ICMPv6报文

常用的几种ICMPv6报文

ICMP报文种类类型的值ICMP报文的类型
差错报告报文1目的站不可达
差错报告报文2分组太长
差错报告报文3时间超过
差错报告报文4参数问题
回送请求与回答报文128回送请求
回送请求与回答报文129回送回答
多播听众发现报文130多播听众查询
多播听众发现报文131多播听众报告
多播听众发现报文132多播听众完成
邻站发现报文133路由器询问
邻站发现报文134路由器通告
邻站发现报文135邻站询问
邻站发现报文136邻站通告
邻站发现报文137改变路由
  • ICMPv6多播听众发现报文,替代了原来的IGMP协议
  • 邻站询问和邻站通告替代了原来的ARP协议

软件定义网络SDN

传统路由器的功能:

  • 为主机间的通信提供转发服务
  • 路由选择

路由器之间传送的信息:

  • 主机间的分组
  • 路由信息

路由器之间交互路由信息,并利用路由算法得出路由表,再根据路由表得出转发表

可以把路由器的网络层划分为两个层面:

  • 控制层面,即路由器通过路由协议所使用的路由算法得出路由表的过程
  • 数据层面,即路由器根据自己的转发表来转发分组的过程

image.png

在控制层面中,每一个路由器无法独自创建自己的路由表,路由器必须和相邻的路由器周期性地交换路由信息然后才能够创建出自己的路由表。根据路由选择协议所使用的路由算法计算路由,需要由软件来完成,这需要花费较多的时间,一般为秒数量级

在数据层面中,每一个路由器基于自己生成的转发表来转发分组,为了提高转发速率,现在的路由器一般都基于硬件进行转发,单个分组的转发时间为纳秒数量级

在SDN体系结构中,路由器中的路由软件都不存在了,因此,路由器之间不再交换路由信息

在控制层面中,有一个在逻辑上集中的远程控制器

逻辑上集中的远程控制器在物理上可由不同地点的多个服务器组成

远程控制器掌握各主机和整个网络的状态,其能够为每一个分组计算出最佳的路由,远程控制器为每一个路由器生成其正确的转发表

这样,路由器的工作就变得非常单纯了,也就是对收到的分组进行查表转发即可

image.png

SDN这种新型网络体系结构的核心思想是:把网络的控制层面和数据层面分离,而让控制层面利用软件来控制数据层面中的许多设备

OpenFlow协议与SDN体系结构的关系

OpenFlow协议是一个得到高度认可的标准,在讨论SDN时往往与OpenFlow一起讨论

OpenFlow协议可被看成是SDN体系结构中控制层面与数据层面之间的通信接口

OpenFlow协议使得控制层面的控制器可以对数据层面中的物理设备进行直接访问和控制

image.png

OpenFlow协议的技术规范由非营利性的产业联盟开放网络基金会(Open Networking Foundation,ONF)负责制定

  • ONF的任务是致力于SDN的发展和标准化
  • SDN并未规定必须使用OpenFlow,只不过大部分SDN产品采用了OpenFlow作为其控制层面与是数据层面的通信接口

传统意义上的数据层面的任务:根据转发表转发分组

转发分组分为以下两个步骤:

  1. 进行“匹配”:查找转发表中的网络前缀,进行最长前缀匹配
  2. 执行“动作”:把分组从匹配结果指明的接口转发出去

”匹配 + 动作“的转发方式在SDN中得到了扩充,增加了新的内容,变成了广义转发

SDN的广义转发分为以下两个步骤:

  1. 进行“匹配”:能够对网络体系结构中各层(数据链路层、网络层、运输层)首部中的字段进行匹配
  2. 执行“动作”:不仅转发分组,还可以负载均衡、重写IP首部(类似NAT路由器中的地址转换)、人为地阻挡或丢弃一些分组(类似防火墙一样)

在SDN的广义转发中,完成“匹配 + 动作”的设备并不局限在网络层工作,因此不在称为路由器,而称为“OpenFlow交换机”或“分组交换机”,或更简单地称为“交换机”

相应的,在SDN中取代传统路由器中转发表的是“流表(Flow Table)”

  • 一个流就是穿过网络的一种分组序列,而在此序列中的每个分组都共享分组首部某些字段的值。例如,某个流可以是具有相同源IP地址和目的IP地址的一连串分组
  • OpenFlow交换机中的流表是由SDN远程控制器来管理的。SDN远程控制器通过一个安全信道,使用OpenFlow协议来管理OpenFlow交换机中的流表

尽管网络设备可以由不同的厂商来生产,并可以使用在不同类型的网络中,但从SDN远程控制器看到的,是统一的逻辑交换功能

每个OpenFlow交换机必须有一个或多个流表

image.png

每一个流表可以包含多个流表项

每个流表项包含三个字段:首部字段值(或称匹配字段)、计数器、动作

  • 首部字段值字段包含一组(子)字段,用来使入分组(Incoming Paceket)的对应首部与之匹配,因此又称为匹配字段。匹配不上的分组就被丢弃,或被发送到SDN远程控制器做更多处理

image.png

在OpenFlow交换机中,既可以处理数据链路层的帧,也可以处理网际层的IP数据报,还可以处理运输层的TCP或UDP报文

  • 计数器字段是一组计数器:

    记录已经与该流表项匹配的分组数量的计数器

    记录该流表项上次更新到现在经历时间的计数器

  • 动作字段是一组动作,当分组匹配某个流表项时,执行该流表项中动作字段指明的以下某个或多个动作:

    把分组转发到指明的端口

    丢弃分组

    把分组进行复制后再从多个端口转发出去

    重写分组的首部字段(包括数据链路层、网际层以及运输层的首部)

image.png

如图,在这个简单网路中,有H1 ~ H6共6台主机

其IP地址标注在各自的旁边,还有S1 ~ S3共3台OpenFlow交换机,每台交换机都有4个端口,其端口号标注在各自端口的旁边,另外还有一台SDN远程控制器来控制这些OpenFlow交换机的“匹配 + 动作”

假设设定的转发规则是“H1或H2发往H3或H4的分组,其转发路径应为S1 → S3 → S2”

根据这条转发规则,SDN远程控制器应该给OpenFlow交换机S1设置如左上角所示的流表项

在匹配中的源IP地址为10.0.1.*表明,左起前三个十进制数分别为10.0.1的任何IP地址

主机H1和H2的IP地址都是其中的地址,同理目的IP地址为10.0.2.*表明左起前三个十进制数分别是10.0.2的任何IP地址,主机H3和H4的IP地址都是其中的地址,在动作中的转发(3)表明,OpenFlow交换机S1应从自己的端口3转发所匹配的分组

左下角是SDN远程控制器给OpenFlow交换机S3设置的流表项,与S1的流表项相比多了入端口=1的匹配条件,表明只有从S3自己端口1进入的分组才能与该流表项的后续项目进行匹配

右上角是SDN远程控制器给S2配置的流表项

image.png

为了均衡链路S2-S3和S1-S3的通信量,制定了以下规则“凡是从H4发往H5或H6的分组,其转发路径应为S2-S3

凡是从H3发送H5或H6的分组,其转发路径应为S2 → S1 → S3”

显然,采用基于目的IP地址的传统转发方法是不能实现这种负载均衡的,但本例中只需要在S2的流表项中设置好合适的匹配项目即可

image.png

假设在OpenFlow交换机S2中设置防火墙,此防火墙的作用是“仅仅接收来自于OpenFlow交换机S1相连的主机所发送的分组,而不管这些分组是从S2自己的哪个端口进来的”

根据这样的规则可得出S2的流表项,如右上角所示

SDN体系结构及其四个关键特征

  • 基于流的转发

    由SDN控制器控制的分组交换机分布在数据层面中,而分组的转发可以基于数据链路层、网络层和运输层协议数据单元PDU中的首部字段的值进行,这与传统路由器仅根据IP数据报的目的IP地址进行转发有着明显区别

    各分组交换机流表中的流表项都是由SDN控制器进行计算、管理和安装的

    这样,SDN的转发规则都详细规定在各分组交换机的流表中

  • 数据层面与控制层面分离(二者不在同一设备中)

    在传统的转发设备路由器中数据层面和控制层面都位于同一个设备中,但在SDN中,数据层面和控制层面是分离的,也就是二者不在同一个设备中

    数据层面有许多相对简单而快速的分组交换机,这些分组交换机基于各自的流表执行“匹配 + 动作”的规则

    控制层面则由若干服务器和相应的软件组成,这些服务器和软件计算并管理这些分组交换机中的流表

  • 位于数据层面分组交换机之外的网络控制功能

    SDN的控制层面是由各类软件实现的,而且这些软件还可以处于不同的机器上,并且还可能原理位于数据层面的分组交换机

    SDN控制层面的软件实现包含两个构件,一个构件是SDN控制器,也就是网络操作系统,另一个构件是若干个网络控制应用程序

    SDN控制器维护准确的网络状态信息,例如远程链路、分组交换机和主机的状态,并把这些信息提供给运行在控制层面的各种控制应用程序

    另外还会提供一些方法使得这些控制层面的应用程序能够对数据层面中的分组交换机进行监视、编程和控制

  • 可编程的网络

    通过在SDN控制层面中的一些网络控制应用程序,使得整个SDN网络成为可编程的网络,SDN控制器使用这些网络控制应用程序来控制数据层面中的各分组交换机,例如路由选择网络控制应用程序能够确定源点和终点之间的端到端链路,网络控制应用程序可以决定哪些分组在进入某个分组交换机时必须被阻挡,也就是进行接入控制

    另外,网络控制应用程序还可以配置分组交换机在转发分组时执行负载均衡的措施

image.png

从SDN体系结构的四个关键特征可以看出,SDN把网络的许多功能都分离开了,数据层面的交换机、控制层面的SDN控制器和许多网络控制应用程序,这些都是可以分开的实体,可由不同厂商和机构来提供,这与传统网络截然不同

在传统网络中,路由器或交换机是由单独的厂商提供的,其控制层面和数据层面以及协议的实现都是集成在一个设备里面的

需要注意的是,SDN控制器与其下面的数据层面中的受控设备的通信接口称为南向API,SDN控制器与其上面的控制层面中的网络控制应用程序的接口称为北向API

在SDN体系结构中,SDN控制器是最复杂的

SDN控制器

image.png

SDN控制器可划分成三个层次,分别是通信层、网络范围的状态管理层、到网络控制应用程序层的接口

通信层是SDN控制器中的底层,其任务是通过南向API接口完成SDN控制器与位于数据层面中的受控的网络设备之间的通信

网络范围的状态管理层是SDN控制器的中间层,SDN控制层面若要做出任何最终的控制决策,例如在所有的分组交换机中配置流表以便进行端到端的转发或实现负载均衡或实现某种特殊的防火墙能力,就需要让控制器掌握全网的主机信息、链路信息和分组交换机信息以及其它受SDN控制器控制的设备的信息

到网络控制应用程序层的接口是SDN控制器的顶层,SDN控制器与网络控制应用程序的交互都需要通过北向API接口完成,该API接口允许网络控制应用程序对网络范围的状态管理层中的网络状态和流表进行读写操作