文章目录
- 网络层
- 网络层概述
-
- 分组转发和路由选择
-
- 分组转发
- 路由选择
- 网络层向其上层提供的两种服务
-
- 面向连接的虚电路服务
- 无连接的数据报服务
- 网际协议(IP)
-
- 异构网络互连
- IPv4地址及其编址方法
-
- IPv4地址的表示方法
- 分类编址
-
- A类地址的细节
- B类地址的细节
- C类地址的细节
- 总结
- IPv4分类编址的缺点
- 划分子网
-
- 子网掩码
- 默认子网掩码
- 无分类编址
-
- 路由聚合
- IPv4地址的应用规划
-
- 采用定长的子网掩码进行子网划分
- 采用变长的子网掩码进行子网划分
- IPv4地址与MAC地址
-
- IPv4地址与MAC地址的封装位置
- 数据包传送过程中IPv4地址与MAC地址的变化情况
- IPv4地址与MAC地址的关系
- 地址解析协议ARP
-
- ARP协议的基本工作原理
- IP数据报的发送和转发过程
-
- 主机发送IP数据报
- 路由器转发IP数据报
- IPv4数据报的首部格式
-
- 版本
- 首部长度、可选字段和填充
- 区分服务
- 总长度
- 标识、标志和片偏移
-
- IPv4数据报分片概念
- 生存时间
- 协议
- 首部检验和
- 源IP地址和目的IP地址
- 静态路由配置
-
- 直连路由和非直连路由
- 默认路由和特定主机路由
-
- 默认路由
- 特定主机路由
- 因特网的路由选择协议
-
- 路由选择分类
- 因特网采用分层次的路由选择协议
- 路由信息协议(RIP)
-
- RIP的基本工作过程
- RIP的距离向量算法
- RIP存在的问题
- RIP版本和相关报文
- RIP的优缺点
- 开放最短路径优先协议(OSPF)
-
- 相关概念
-
- 1)链路状态
- 2)邻居关系的建立和维护
- 3)链路状态通告
- 4)链路状态更新分组
- 5)链路状态数据库
- 6)基于LSDB进行最短路径优先计算
- OSPF的五种分组类型
- OSPF的基本工作过程
- 多点接入网络中的OSPF路由器
- 0SPF划分区域
- 边界网关协议(BGP)
-
- BGP边界路由器
- BGP-4的四种报文
- 路由器的基本工作原理
- 网际控制报文协议
-
- ICMP差错报告报文
-
- 终点不可达
- 源点抑制
- 时间超过(超时)
- 参数问题
- 改变路由(重定向)
- ICMP询问报文
-
- 回送请求和回答
- 时间戳请求和回答
- ICMP的典型应用
-
- 分组网间探测
- 跟踪路由
-
- traceroute和tracert
- tracert的基本实现原理
- 虚拟专用网和网络地址转换
-
- 虚拟专用网
- 网络地址转换
-
- 最基本的NAT方法
- 网络地址与端口号转换
- IP多播
-
- IP多播地址和多播组
- 在局域网上进行硬件多播
- 网际组管理协议(IGMP)
-
- IGMP报文
- IGMP的基本工作原理
-
- 1)加入多播组
- 2)监视多播组的成员变化
- 3)退出多播组
- 多播路由选择协议
-
- 基于源树的多播路由选择
-
- 洪泛(Flooding)法
- 反向路径广播(RPB)
- 组共享树多播路由选择
- 移动IP技术
-
- 基本概念
-
- 归属网络、归属地址(永久地址)以及归属代理
- 外地网络(被访网络)、外地代理以及转交地址
- 移动IP的工作过程
- 移动IP技术的基本工作原理
-
- 代理发现与注册
- 固定主机向移动主机发送IP数据报
- 移动主机向固定主机发送IP数据报
- 同址转交地址
- 三角形路由问题
- 下一代网际协议IPv6
-
- IPv6引进的主要变化
- IPv6数据报的基本首部
- IPv6数据报的扩展首部
- IPv6地址
-
- IPv6地址空间大小
- IPv6地址的表示方法
- IPv6地址分类
- 从IPv4向IPv6过渡
-
- 使用双协议栈
- 使用隧道技术
- 网际控制报文协议ICMPv6
- 软件定义网络
-
- 网络层的数据层面和控制层面
- OpenFlow 协议
-
- 传统意义上的数据层面的任务
- SDN中的广义转发
- OpenFlow交换机和流表
-
- OpenFlow交换机、流表、SDN远程控制器三者之间的关系
- 流表中的各字段
- SDN体系结构
-
- SDN体系结构的四个关键特征
-
- 基于流的转发
- 数据层面与控制层面分离
- 位于数据层面分组交换机之外的网络控制功能
- 可编程的网络
- SDN控制器
-
- 通信层
- 网络范围的状态管理层
- 到网络控制应用程序层的接口
网络层
网络层概述
网络层是作为法律标准的OSI体系结构自下而上的第三层,其主要任务是将分组从源主机经过多个网络和多段链路传输到目的主机。
分组转发和路由选择
网络层的主要任务就是将分组从源主机经过多个网络和多段链路传输到目的主机,可以将该任务划分为分组转发和路由选择两种重要的功能。
分组转发
当路由器从自己的某个接口所连接的链路(或网络)上收到一个分组后,将该分组从自己其他适当的接口转发给下一跳路由器或目的主机,这就是所谓的“分组转发”。
为此,每个路由器都需要维护自己的一个转发表(Forwarding Table),路由器根据分组首部中的转发标识在转发表中进行查询,根据查询结果所指示的接口进行分组转发。
路由选择
源主机和目的主机之间可能存在多条路径,网络层需要决定选择哪一条路径来传送分组,这就是所谓的“路由选择(Routing)”。
路由选择方式主要有以下三种:
1)集中式路由选择:由某个网络控制中心执行路由选择,并向每个路由器下载路由信息。
2)分布式路由选择:在每个路由器上运行路由选择协议,各路由器相互交换路由信息并各自计算路由。
3)人工路由选择:由网络运维人员配置路由。
网络层向其上层提供的两种服务
网络层可以向其上层提供面向连接的虚电路服务和无连接的数据报服务。
面向连接的虚电路服务
面向连接的虚电路服务的核心思想是“可靠通信应由网络自身来保证”
- 当两台计算机进行通信时,应当首先建立网络层的连接,也就是建立一条虚电路(Virtual Circuit,VC),以保证通信双方所需的一切网络资源。
- 双方沿着已建立的虚电路发送分组。
- 通信结束后,需要释放之前所建立的虚电路。
虚电路是一条逻辑上的连接,分组都沿着这条逻辑连接按照存储转发方式传送,而不是真正建立了一条物理连接。分组的首部仅在连接建立阶段使用完整的目的主机地址,之后每个分组的首部只需携带一条虚电路编号即可。这种通信方式如果再使用可靠传输的网络协议,就可使所发送的分组最终正确(无差错按序到达、不丢失、不重复)到达接收方。然而,因特网的先驱者并没有采用这种设计思路,而是采用了无连接的数据报服务。
无连接的数据报服务
无连接的数据报服务的核心思想是“可靠通信应当由用户主机来保证”。在因特网所采用的TCP/IP体系结构中,网际层向其上层提供的是简单灵活的、无连接的、尽最大努力交付的数据报服务。
- 当两台计算机进行通信时,它们的网络层不需要建立连接。
- 每个分组可走不同的路径。因此,每个分组的首部都必须携带目的主机的完整地址。这种通信方式所传送的分组可能误码、丢失、重复和失序。
- 通信结束后,没有需要释放的连接。
由于网络自身不提供端到端的可靠传输服务,这就使得网络中的路由器可以做得比较简单,比电信网交换机价格低廉。因特网就采用了这种设计思想。
- 将复杂的网络处理功能置于因特网的边缘(即用户主机和其内部的运输层)
- 将相对简单的尽最大努力(即不可靠)的分组交付功能置于因特网核心。
采用这种设计思想的好处是:网络的造价大大降低、运行方式灵活、能够适应多种应用。因特网能够发展到今日的规模,充分证明了当初采用这种设计思想的正确性。
网际协议(IP)
网际协议IP(即IP协议)是TCP/IP体系结构网络层中的核心协议。
由于网际协议IP是TCP/IP体系结构网络层中的核心协议,因此TCP/IP体系结构的网络层常被称为网际层或IP层。在网际层中,与IP协议配套使用的还有以下四个协议:
- 地址解析协议(Address Resolution Protocol,ARP)。
- 逆地址解析协议(Reverse Address Resolution Protocol,RARP)。
- 网际控制报文协议(Internet Control Message Protocol, ICMP)。
- 网际组管理协议(Internet Group Management Protocol,IGMP)。
-
在网际层中,RARP和ARP画在IP的下面,这是因为IP协议经常要使用这两个协议。
-
ICMP和IGMP画在IP的上面,因为它们要使用I协议。
-
需要说明的是,RARP协议现在已被淘汰不使用了。
异构网络互连
因特网是由全世界范围内数以百万计的网络通过路由器互连起来的。这些网络的拓扑、性能以及所使用的网络协议都不尽相同,这是由用户需求的多样性造成的,没有一种单一的网络能够适应所有用户的需求。要将众多的异构网络都互连起来,并且能够互相通信,则会面临许多需要解决的问题。
例如:
- 不同的网络接入机制。
- 不同的差错恢复方法。
- 不同的路由选择技术。
- 不同的寻址方案。
- 不同的最大分组长度。
- 不同的服务(面向连接服务和无连接服务)。
异构网络的网络层都使用相同的网际协议IP,从网络层的角度看,它们好像是一个统一的网络,即IP网。
使用IP网的好处是,当IP网上的主机进行通信时,就好像在一个单个网络上通信一样,它们看不见互连的各网络的具体异构细节(例如寻址方案、路由选择协议等)。
IPv4地址及其编址方法
IPv4地址是给IP网上的每一个主机(或路由器)的每一个接口分配的一个在全世界范围内唯一的32比特的标识符。
IPv4地址的编址方法经历了如图4-5所示的三个历史阶段:
1)分类编址:最基本的编址方法,早在1981年就通过了相应的标准协议。
2)划分子网:对分类编址的改进,其标准[RFC950]在1985年通过。
3)无分类编址:目前因特网正在使用的编址方法。它消除了分类编址和划分子网概念,1993年提出后很快就得到了推广应用。
目前IPv4地址的前两种编址方法已成为历史。
IPv4地址的表示方法
由于32比特的IPv4地址不方便阅读、记录以及输入等,因此IPv4地址采用点分十进制表示方法以方便用户使用。将某个32比特IPv4地址中每8个比特分为一组,写出每组8比特所对应的十进制数,每个十进制数之间用“.”来分隔,就可以得到该IPv4地址的点分十进制形式。
分类编址
分类编址方法将32比特的IPv4地址分为以下两部分:
- 网络号:用来标志主机(或路由器)的接口所连接到的网络。
- 主机号:用来标志主机(或路由器)的接口。
同一个网络中,不同主机(或路由器)的接口的IPv4地址的网络号必须相同,表示它们属于同一个网络,而主机号必须各不相同,以便区分各主机(或路由器)的接口。
分类编址的IPv4地址分为以下五类:
- A类地址:网络号占8比特,主机号占24比特,网络号的最前面1位固定为0。
- B类地址:网络号和主机号各占16比特,网络号的最前面2位固定为10。
- C类地址:网络号占24比特,主机号占8比特,网络号的最前面3位固定为110。
- D类地址:多播地址,其最前面4位固定为1110。
- E类地址:保留地址,其最前面4位固定为1111。
当给网络中的主机(或路由器)的各接口分配分类编址的IPv4地址时,需要注意以下规定:
- 只有A类、B类和C类地址可以分配给网络中的主机(或路由器)的各接口。
- 主机号为“全0”(即全部比特都为0)的地址是网络地址,不能分配给网络中的主机(或路由器)的各接口。
- 主机号为“全1”(即全部比特都为1)的地址是广播地址,不能分配给网络中的主机(或路由器)的各接口。
A类地址的细节
A类地址的8比特网络号的最前面1位固定为0。
当8比特网络号的低7位全部取0时,就是A类网络的最小网络号,其十进制值为0,该网络号被保留,不能指派。因此,A类网络最小可指派的网络号为8比特网络号的最前面1位固定为0,低7位为0000001,其十进制值为1。将24比特的主机号全部取0,就可以得到该网络的网络地址,其点分十进制为1.0.0.0。
当8比特网络号的低7位全部取1时,就是A类网络的最大网络号,其十进制值为127,该网络号被用于本地软件环回测试,不能指派。因此,A类网络最大可指派的网络号为8比特网络号的最前面1位固定为0,低7位为1111110,其十进制值为126。将24比特的主机号全部取0,就可以得到该网络的网络地址,其点分十进制为126.0.0.0。
将127开头的IPv4地址的24比特主机号的最低位取1、其他位取0,就可得到最小的本地软件环回测试地址,其点分十进制为127.0.0.1。将127开头的IPv4地址的24比特主机号的最低位取0、其他位取1,就可得到最大的本地软件环回测试地址,其点分十进制为127.255.255.254。
基于以上细节可知:
- 可指派的A类网络的数量为2(-1)-2=126,这是因为A类网络的网络号占8比特,并且其最前面1位固定为0,因此网络号有2(-1)个组合,从这些组合中再减去2的原因是,要去掉最小网络号0和最大网络号127,它们不能指派。
- 每个A类网络中可分配的地址数量为224-2=16777214,这是因为A类网络的主机号占24比特,因此主机号有224个组合,从这些组合中再减去2的原因是,要去掉主机号为“全0”的网络地址和主机号为“全1”的广播地址。
B类地址的细节
B类地址的16比特网络号的最前面2位固定为10。
当16比特网络号的低14位全部取0时,就是B类网络的最小网络号,其点分十进制为128.0,该网络号是B类网络最小可指派的网络号。将16比特的主机号全部取0,就可以得到该网络的网络地址,其点分十进制为128.0.0.0。
当16比特网络号的低14位全部取1时,就是B类网络的最大网络号,其点分十进制为191.255,该网络号是B类网络最大可指派的网络号。将16比特的主机号全部取0,就可以得到该网络的网络地址,其点分十进制为191.255.0.0。
基于上述细节可知:
- 可指派的B类网络的数量为2(16-2)=16384,这是因为B类网络的网络号占16比特,并
且其最前面2位固定为10,因此网络号有2(16-2)个组合。 - 每个B类网络中可分配的地址数量为21-2=65534,这是因为B类网络的主机号占16比特,因此主机号有21个组合,在这些组合中再减去2的原因是,要去掉主机号为“全0”的网络地址和主机号为“全1”的广播地址。
C类地址的细节
C类地址的24比特网络号的最前面3位固定为110。
当24比特网络号的低21位全部取0时,就是C类网络的最小网络号,其点分十进制为192.0.0,该网络号是C类网络最小可指派的网络号。将8比特的主机号全部取0,就可以得到该网络的网络地址,其点分十进制为192.0.0.0。
当24比特网络号的低21位全部取1时,就是C类网络的最大网络号,其点分十进制为223.255.255,该网络号是C类网络最大可指派的网络号。将8比特的主机号全部取0,就可以得到该网络的网络地址,其点分十进制为223.255.255.0。
基于上述细节可知:
- 可指派的C类网络的数量为2024-3)-2097152,这是因为C类网络的网络号占24比特,
并且其最前面3位固定为110,因此网络号有224-3)个组合。 - 每个C类网络中可分配的地址数量为28-2=254,这是因为C类网络的主机号占8比特,因此主机号有28个组合,在这些组合中再减去2的原因是,要去掉主机号为“全0”的网络地址和主机号为“全1”的广播地址。
总结
1)根据IPv4地址左起第1个十进制数的值,可以判断出网络类别:
- 127以下的为A类。
- 128~191的为B类。
- 192~223的为C类。
2)根据网络类别,可找出IPv4地址中的网络号和主机号:
- A类地址的网络号为左起第1个十进制数,而主机号为剩余3个十进制数。
- B类地址的网络号为左起前2个十进制数,而主机号为剩余2个十进制数。
- C类地址的网络号为左起前3个十进制数,而主机号为剩余1个十进制数。
3)以下三种情况的地址是不能分配给主机或路由器接口的:
- A类网络号0和127。
- 主机号为“全0”的网络地址。
- 主机号为“全1”的广播地址。
IPv4分类编址的缺点
路由器R1的接口1所连接的网络中有65534台主机,每台主机需要分配1个IPv4地址,R1的接口1也要分配1个IPv4地址,再加上该网络的网络地址和广播地址,该网络需要的IPv4地址数量为65537。由于1个A类网络所包含的IPv4地址数量为16 777 216,1个B类网络所包含的IPv4地址数量为65 536,1个C类网络所包含的IPv4地址数量为28-256,因此只能给该网络从A类网络号1~126中挑选1个A类网络号。
同理,对于路由器R1的接口2所连接的网络,只能从B类网络号128.0~191.255中挑选1个B类网络号。
通过本例可以看出,IPv4分类编址方法最大的缺点就是容易造成IPv4地址的大量浪费。例如,路由器R1的接口2所连接的网络中有254台主机,每台主机需要分配1个IPv4地址,R1的接口2也要分配1个IPv4地址,再加上该网络的网络地址和广播地址,该网络需要的IPv4地址数量为257。由于1个C类网络所包含的IPv4地址数量为256,无法满足该网络对IPv4地址数量的需求,因此不得不为该网络分配1个B类网络号。然而,1个B类网络所包含的IPv4地址数量为65536,而该网络只需要257个地址,因此会造成大量地址浪费。
为了解决上述问题,因特网工程任务组IETF提出了划分子网的编址改进方法。
划分子网
随着更多的中小网络加入因特网,IPv4分类编址方法不够灵活、容易造成大量IPv4地址资源浪费的缺点就暴露出来了。如果可以从IPv4地址的主机号部分借用一些比特作为子网号,来区分不同的子网,就可以利用原有网络中剩余的大量IPv4地址,而不用申请新的网络地址了。
子网掩码
与IPv4地址类似,子网掩码也是由32比特构成的。子网掩码可以表明分类IPv4地址的主机号部分被借用了几个比特作为子网号。
在32比特的子网掩码中,用左起多个连续的比特1对应IPv4地址中的网络号和子网号,之后的多个连续的比特0对应IPv4地址中的主机号。
1)第一行为未划分子网的IPv4地址,它由网络号和主机号两部分构成。
2)第二行为划分子网的IPv4地址,也就是从主机号部分借用一些比特作为子网号,这使得IPv4地址从两级结构的分类IPv4地址,变成了三级结构的划分子网的IPv4地址。
3)第三行为子网掩码,也就是用连续的比特1来对应网络号和子网号,用连续的比特0来对应主机号,这样就构成了这个划分子网的IPv4地址的32比特的子网掩码。
4)将划分子网的IPv4地址与相应的子网掩码进行逐比特的逻辑与运算,就可得到该IPv4地址所在子网的网络地址。这是因为运算结果为IPv4地址的网络号和子网号保留不变,而主机号被全部清零。之前曾介绍过,主机号为“全0”的地址用作网络地址。
默认子网掩码
默认子网掩码是指在未划分子网的情况下使用的子网掩码
A类IPv4地址由8比特网络号和24比特主机号构成。根据子网掩码的构成规则,用8个连续的比特1对应A类IPv4地址中的8比特网络号,用24个连续的比特0对应A类IPv4地址中的24比特主机号,这样就构成了A类地址的默认子网掩码,其点分十进制为255.0.0.0。
B类IPv4地址由16比特网络号和16比特主机号构成。根据子网掩码的构成规则,用16个连续的比特1对应B类IPv4地址中的16比特网络号,用16个连续的比特0对应B类IPv4地址中的16比特主机号,这样就构成了B类地址的默认子网掩码,其点分十进制为255.255.0.0。
C类IPv4地址由24比特网络号和8比特主机号构成。根据子网掩码的构成规则,用24个连续的比特1对应C类IPv4地址中的24比特网络号,用8个连续的比特0对应C类IPv4地址中的8比特主机号,这样就构成了C类地址的默认子网掩码,其点分十进制为255.255.255.0。
无分类编址
IPv4划分子网的编址方法在一定程度上缓解了因特网在发展中遇到的困难,但因特网的IPv4地址仍在加速消耗,整个IPv4地址空间面临全部耗尽的威胁。
为此,因特网工程任务组IETF又提出了采用无分类编址的方法,来解决IPv4地址资源紧张的问题。
1993年,IETF发布了**无分类域间路由选择(Classless Inter-Domain Routing,CIDR)**的RFC文档[RFC 1517~1519,RFC1520]。CIDR消除了传统A类、B类和C类地址以及划分子网的概念,因此可以更加有效地分配IPv4地址资源,并且可以在IPv6使用之前允许因特网的规模继续增长。
CIDR把32比特的IPv4地址从划分子网的三级结构(网络号、子网号、主机号)又改回了与分类编址相似的两级结构(网络号、主机号),不同之处有以下两点:
- 分类编址中的网络号在CIDR中称为网络前缀(Network-Prefix)。
- 网络前缀是不定长的,这与分类编址的定长网络号(A类网络号固定为8比特,B类网络号固定为16比特,C类网络号固定为24比特)是不同的。
在分类编址中,给定一个IPv4地址,根据其左起第1个十进制数(或前几个比特)就可以确定其类别,进而找出其网络号和主机号。但在无分类编址中,由于网络前缀是不定长的,仅从IPv4地址自身是无法确定其网络前缀和主机号的。为此,CIDR采用了与IPv4地址配合使用的32位地址掩码(Address Mask)。
CIDR地址掩码左起多个连续的比特1对应网络前缀,剩余多个连续的比特0对应主机号。这与划分子网中的子网掩码是一样的,只不过由于CIDR中消除了划分子网的概念,因此称为地址掩码,但人们往往更习惯称其为子网掩码。
假设给定的无分类编址的IPv4地址为128.14.35.7,配套给定的地址掩码为255.255.240.0。将给定的地址掩码写成32比特形式为1111 1111.1111 1111.1111 0000.0000 0000,可以看出左起有20个连续的比特1,这就表明该IPv4地址左起前20个比特为网络前缀,剩余12个比特为主机号。
为了简便起见,可以不明确给出配套的地址掩码的点分十进制形式,而是在无分类编址的IPv4地址后面加上斜线“/”,在斜线之后写上网络前缀所占的比特数量(其实是地址掩码中左起连续比特1的数量),这种记法称为斜线记法(Slash Notation)或CIDR记法。
实际上,CIDR是将网络前缀都相同的、连续的多个无分类IPv4地址,组成一个“CIDR地址块”,只要知道CIDR地址块中的任何一个地址,就可以知道该地址块的以下全部细节:
- 地址块中的最小地址。
- 地址块中的最大地址。
- 地址块中的地址数量。
- 地址块中聚合某类网络(A类、B类、C类)的数量。
- 地址掩码。
举例说明:
1)斜线“/”后面的数字为20,表明该地址的左起前20个比特为网络前缀。也就是说,该地址的左起第1、2个十进制数以及第3个十进制数的前4个比特,构成20比特的网络前缀,剩余12比特为主机号。因此,需要将该地址的第3、4个十进制数转换成二进制形式,这样可以很容易地看出20比特的网络前缀和12比特的主机号。
2)将20比特的网络前缀保持不变,12比特的主机号全部取0,再转换成点分十进制形式,可以得到该地址所在地址块中的最小地址。
3)将20比特的网络前缀保持不变,12比特的主机号全部取1,再转换成点分十进制形式,可以得到该地址所在地址块中的最大地址。
4)该地址所在地址块的地址数量为232-20,这是因为32比特的IPv4地址的左起前20个比特为网络前缀,剩余12比特为主机号,因此主机号可有21个组合。
5)该地址所在地址块聚合C类网的数量,可用该地址所在地址块的地址数量232-20除以1个C类网所包含的地址数量28得出。
6)该地址的地址掩码由左起20个连续的比特1和其后12个连续的比特0构成,20个连续的比特1用来对应该地址的20比特网络前缀,12个连续的比特0用来对应该地址的12比特主机号,最后将32比特的地址掩码转换成点分十进制形式,就可以得到该地址的地址掩码。
使用CIDR的一个好处是,可以更加有效地分配IPv4的地址空间,可根据客户的需要分配适当大小的CIDR地址块。
路由聚合
由于一个CIDR地址块中包含很多个地址,所以在路由器的路由表中就可利用CIDR地址块来查找目的网络。这种地址的聚合常称为路由聚合(route aggregation),它使得路由表中的一个项目可以表示原来传统分类地址的很多条(例如上千条)路由。
路由聚合也称为构造超网(supernetting),这有利于减少路由器之间路由选择信息的交换,从而提高整个因特网的性能。
- 为了减少路由记录对路由表的占用,以及路由通告信息对网络资源的占用,R1可将自己直连的5个网络聚合成1个网络,其方法是“找共同前缀”,也就是找出5个网络地址的共同前缀。
- 5个网络地址的左起前2个十进制数都是相同的,从第3个十进制数开始不同。因此,只需将第3个十进制数转换成8个比特,这样可以很容易地找出5个网络地址的共同前缀,共22个比特,将其记为“/22”。
- 将共同前缀保持不变,而剩余的10个比特全部取0,然后写成点分十进制形式并放在“/22”的前面,这样就可得到聚合后的CIDR地址块,也称为超网。因此,R1就可以只发送这1条路由记录给R2。
通过上述例子还可以看出:网络前缀越长,地址块就越小,路由就越具体。
需要说明的是,若路由器查表转发分组时发现有多条路由条目匹配,则选择网络前缀最长的那条路由条目,这称为最长前缀匹配,因为这样的路由更具体。
IPv4地址的应用规划
IPv4地址的应用规划是指将给定的IPv4地址块(或分类网络)划分成几个更小的地址块(或子网),并将这些地址块(或子网)分配给互联网中的不同网络,进而可以给各网络中的主机和路由器的接口分配IPv4地址。一般有以下两种方法:
- 用定长的子网掩码。
- 采用变长的子网掩码。
采用定长的子网掩码进行子网划分
在使用定长的子网掩码(Fixed Length Subnet Mask,FLSM)划分子网时,所划分出的每个子网都使用同一个子网掩码,并且每个子网所分配的IPv4地址数量相同,容易造成地址资源的浪费。
假设申请到的C类网络为218.75.230.0,使用定长的子网掩码给下图所示的小型互联网中的各设备分配IPv4地址。
1)对于网络1,有6台主机和1个路由器接口需要分配地址,再加上网络1自身的网络地址和广播地址,总共需要9个IPv4地址。
2)对于网络2,有25台主机和1个路由器接口需要分配地址,再加上网络2自身的网络地址和广播地址,总共需要28个IPv4地址。
3)同理,可统计出网络3总共需要15个IPv4地址,网络4总共需要13个IPv4地址。
4)对于两个路由器之间的直连链路,可将其看成一个无主机的网络(网络5),该网络中主机需要的地址数量为0,有2个路由器接口需要分配地址,再加上网络5自身的网络地址和广播地址,总共需要4个IPv4地址。
通过上述统计可知:需要从给定的C类网络218.75.230.0的主机号部分借用3个比特作为子网号,这样可以划分出8个子网(若借用2个比特,则只能划分出4个子网,无法满足5个子网的需求)
用24个连续的比特1对应C类网络218.75.230.0的网络号部分,其后再跟3个连续的比特1,表明从主机号部分借用3个比特作为子网号,随后再跟5个连续的比特0对应主机号部分,这样就可得到划分子网所使用的子网掩码,将其写成点分十进制形式,即255.255.255.224。
存在的问题:
通过本例可以看出:采用定长的子网掩码进行子网划分,每个子网所分配的IPv4地址数量相同,容易造成地址资源的浪费。例如,本例中的网络5只需要4个IPv4地址,但是不得不给它分配32个地址,这样就造成了地址资源的严重浪费。如果采用变长的子网掩码进行子网划分,可以在很大程度上改善这种状况。
采用变长的子网掩码进行子网划分
在使用变长的子网掩码(Variable Length Subnet Mask,VLSM)划分子网时,所划分出的每个子网可以使用不同的子网掩码,并且每个子网所分配的IPv4地址数量可以不同,这样就尽可能地减少了对地址资源的浪费。
假设申请到的CIDR地址块为218.75.230.0/24,使用变长的子网掩码给图4-29所示的小型互联网中的各设备分配IPv4地址。
首先需要统计一下该小型互联网中各网络所需IPv4地址的数量,统计结果如下:
1)网络1需要9个IPv4地址,因此分配给网络1的IPv4地址的主机号应为4个比特,这样分配给网络1的CIDR地址块中就可以包含2个地址。由于使用4个比特作为主机号,因此剩余28(32-4)个比特作为网络前缀。
2)网络2需要28个IPv4地址,因此分配给网络2的IPv4地址的主机号应为5个比特,这样分配给网络2的CIDR地址块中就可以包含25个地址。由于使用5个比特作为主机号,因此剩余27(32-5)个比特作为网络前缀。
述了。
3)同理可得分配给网络3、网络4和网络5各自的CIDR地址块。
接下来的工作是从已申请到的CIDR地址块218.75.230.0/24中划分出5个子块(1个“/27”地址块,3个“/28”地址块,1个“/30”地址块),并按需分配给该小型互联网中的5个网络。划分子块的原则是,每个子块的起点位置不能随意选取,只能选取块大小为整数倍的地址作为起点。建议从大的子块开始划分。因此,划分方案不止一种。
通过本例可以看出,采用变长的子网掩码进行子网划分,可以按需划分出相应数量的子网,每个子网所分配到的IPv4地址数量可以不相同,尽可能减少了对IPv4地址资源的浪费。
IPv4地址与MAC地址
IPv4地址与MAC地址的封装位置
从TCP/IP体系结构的角度看,IP地址是网际层和以上各层使用的地址,而MAC地址(也称为硬件地址或物理地址)是网络接口层中数据链路层使用的地址。
源IP地址和目的IP地址被封装在IP数据报(网际层协议数据单元PDU)的首部,而源MAC地址和目的MAC地址被封装在帧(数据链路层协议数据单元PDU)的首部。
数据包传送过程中IPv4地址与MAC地址的变化情况
在分组从源主机发出经过多个路由器转发最终到达目的主机的过程中,源IP地址和目的IP地址始终保持不变,而源MAC地址和目的MAC地址会逐网络(或逐链路)变化。
上图所示的是分组在传输过程中其所携带的IP地址和MAC地址的变化情况:
1)主机H1将分组发送给路由器R1。在网际层封装的IP数据报的首部中,源IP地址段应填入主机H1的IP地址IP1,目的IP地址字段应填写主机H2的IP地址IP2,也就是从IP1发送给IP2。而在数据链路层封装的帧的首部中,源MAC地址字段应填入主机H1的MAC地址MAC1,目的MAC地址字段应填入路由器R1的MAC地址MAC3,也就是从MAC1发送给MAC3。
2)路由器R1将收到的分组转发给路由器R2。在网际层封装的IP数据报的首部中,源P地址字段和目的IP地址字段的内容保持不变,仍然是从IP1发送给IP2。而在数据链路层封装的帧的首部中,源MAC地址字段应填入路由器R1的转发接口的MAC地址MAC4,目的MAC地址字段应填入路由器R2的MAC地址MAC5,也就是从MAC4发送给MAC5。
3)路由器R2将收到的分组转发给主机H2。在网际层封装的IP数据报的首部中,源IP地址字段和目的IP地址字段的内容保持不变,仍然是从IP1发送给IP2。而在数据链路层封装的帧的首部中,源MAC地址字段应填入路由器R2的转发接口的MAC地址MAC6,目的MAC地址字段应填入主机H2的MAC地址MAC2,也就是从MAC6发送给MAC2。
IPv4地址与MAC地址的关系
如果仅使用MAC地址进行通信,则会出现以下主要问题:
- 因特网中的每台路由器的路由表中就必须记录因特网上所有主机和路由器各接口的MAC地址。
- 手工给各路由器配置路由表几乎是不可能完成的任务,即使使用路由协议让路由器通过相互交换路由信息来自动构建路由表,也会因为路由信息需要包含海量的MAC地址信息而严重占用通信资源。
- 包含海量MAC地址的路由信息需要路由器具备极大的存储空间,并且会给分组的查表转发带来非常大的时延。
因特网的网际层使用IP地址进行寻址,就可使因特网中各路由器的路由表中的路由记录数量大大减少,因为只需记录部分网络的网络地址,而不是记录每个网络中各通信设备的各接口的MAC地址。路由器在收到IP数据报后,根据其首部中的目的IP地址的网络号部分,基于自己的路由表进行查表转发。
地址解析协议ARP
路由器查表转发的结果可以指明IP数据报的下一跳路由器的IP地址,但无法指明该IP地址所对应的MAC地址。因此,在数据链路层封装该IP数据报成为帧时,帧首部中的目的MAC地址字段就无法填写,这需要使用网际层中的地址解析协议来解决。
地址解析协议的主要功能是,通过已知IP地址找到其相应的MAC地址。
ARP协议的基本工作原理
上图所示的是一个共享总线型以太网。假设主机B知道主机C的IP地址,并且要给主机C发送分组。然而主机B不知道主机C的MAC地址,因此主机B的数据链路层在封装MAC帧时,就无法填写目的MAC地址字段,也就无法构建出要发送的MAC帧。
每台主机都会维护一个ARP高速缓存表。ARP高速缓存表中记录有IP地址和MAC地址的对应关系。
当主机B要给C发送分组时,会首先在自己的ARP高速缓存表中查找主机C的IP地址所对应的MAC地址,但未找到。
主机B需要发送ARP请求报文来获取主机C的MAC地址。该ARP请求报文的内容是“我的IP地址为192.168.0.2,我的MAC地址为00-E0-F9-A3-43-77。我想知道IP地址为192.168.0.3的主机的MAC地址”。
ARP请求报文被封装在MAC帧中发送,MAC帧的目的地址为广播地址(FF-FF-FF-FF-FF-FF)。
主机B将封装有ARP请求报文的广播帧发送出去,总线上的其他主机都能收到该广播帧。
主机A的网卡收到该广播帧后,将其所封装的ARP请求报文送交上层处理。上层的ARP进程解析该ARP请求报文,发现所询问的IP地址不是自己的IP地址,因此不予理会。
主机C的网卡收到该广播帧后,将其所封装的ARP请求报文送交上层处理。上层的ARP进程解析该ARP请求报文,发现所询问的I地址正是自己的I地址,需要进行响应。
主机C首先将ARP请求报文中所携带的主机B的I地址与MAC地址,记录到自己的ARP高速缓存表中,然后给主机B发送ARP响应报文,告知主机C自己的MAC地址。
ARP响应报文的内容是“我的IP地址是192.168.0.3,我的MAC地址为00-0C-CF-B8-4A-82”。
ARP响应报文被封装在MAC帧中发送,目的地址为主机B的MAC地址(即单播地址)。
主机A的网卡收到该单播帧后,发现其目的MAC地址与自己的MAC地址不匹配,直接丢弃该帧。
主机B的网卡收到该单播帧后,发现其目的MAC地址就是自己的MAC地址,于是接受该单播帧,并将其所封装的ARP响应报文送交上层处理。上层的ARP进程解析该ARP响应报文,将其所包含的主机C的IP地址与MAC地址记录到自己的ARP高速缓存表中。
ARP高速缓存表中的每一条记录都有其类型,分为动态和静态两种:
- 动态类型是指记录是由主机通过ARP协议自动获取到的,其生命周期默认为2分钟。当生命周期结束时,该记录将自动删除。这样做的原因是IP地址与MAC地址的对应关系并不是永久性的。例如,在主机的网卡坏了,更换新的网卡后,主机的IP地址并没有改变,但主机的MAC地址改变了。
- 静态类型是指记录是由用户或网络维护人员手工配置的。在不同操作系统中,静态记录的生命周期不同,例如系统重启后不存在或系统重启后依然有效。
注意:ARP协议解决同一个局域网上的主机或路由器的IP地址和MAC地址的映射问题,不能跨网络使用。
IP数据报的发送和转发过程
IP数据报的发送和转发过程包含以下两个过程:
- 主机发送IP数据报。
- 路由器转发IP数据报。
主机发送IP数据报
同一个网络中的主机之间可以直接通信,这属于直接交付。不同网络中的主机之间的通信,需要通过默认网关(路由器)来中转,这属于间接交付。
对于直接交付,源主机只需通过ARP协议获取到同一网络中的目的主机的MAC地址,就可将IP数据报封装成帧后发送给目的主机。
对于间接交付,源主机需要通过ARP协议获取到同一网络中的默认网关的MAC地址,然后将IP数据报封装成帧后发送给默认网关,由默认网关替源主机进行转发。
这就引出了一个问题:源主机如何知道要发送的IP数据报属于直接交付还是间接交付呢?换句话说,源主机如何知道目的主机是否与自己在同一个网络中呢?下面举例说明。
假设图4-45中的主机A给C和D分别发送一个IP数据报。
1)主机A的IP地址为192.168.0.1/25,这表明网络前缀为该IP地址左起前25个比特,剩余7个比特为主机号。将网络前缀保持不变,主机号全部清零,写成点分十进制形式为192.168.0.0,这就是主机A所在网络的网络地址。
2)要判断主机C是否与主机A在同一个网络,需要将主机C的IP地址192.168.0.3的左起前25个比特保持不变,剩余7个比特全部清零,写成点分十进制形式为192.168.0.0,这与主机A所在网络的网络地址相同,因此主机A可判断出主机C与自己在同一网络中。
3)要判断主机D是否与主机A在同一个网络,需要将主机D的IP地址192.168.0.129的左起前25个比特保持不变,剩余7个比特全部清零,写成点分十进制形式为192.168.0.128,这与主机A所在网络的网络地址192.168.0.0不相同,因此主机A可判断出主机D与自己不在同一个网络中。
路由器转发IP数据报
路由器收到某个正确的IP数据报(IP数据报生存时间未结束且首部无误码)后,会基于IP数据报首部中的目的IP地址在自己的路由表中进行查询。
如果查询到匹配的路由条目,就按照该路由条目的指示进行转发。
如果查询不到匹配的路由条目,就丢弃该IP数据报,并向发送该IP数据报的源主机发送差错报告。
假设主机A给D发送一个IP数据报。该IP数据报首部中的源地址字段的值为主机A的IP地址192.168.0.1,目的地址字段的值为主机D的IP地址192.168.0.129。
1)在给路由器R的接口0配置IP地址192.168.0.126和相应的地址掩码255.255.255.128(由网络前缀“/25”得出)后,路由器R就会自行得出自己的接口0与网络192.168.0.0是直连的。
2)同理,在给路由器R的接口1配置IP地址192.168.0.254和相应的地址掩码255.255.255.128(由网络前缀“/25”得出)后,路由器R就会自行得出自己的接口1与网络192.168.0.128是直连的。
路由器R根据IP数据报的目的地址192.168.0.129,在自己的路由表中查找匹配的路由条目,并按匹配的路由条目中的“下一跳”的指示转发IP数据报。
1)将IP数据报的目的地址192.168.0.129,与第1条路由条目中的地址掩码255.255.255.128,进行逐比特逻辑与运算,得到网络地址192.168.0.128,该网络地址与第1条路由条目中的目的网络地址192.168.0.0不相同,因此第1条路由条目不匹配。
2)将IP数据报的目的地址192.168.0.129,与路由表中的第2条路由条目中的地址掩码255.255.255.128,进行逐比特逻辑与运算,得到网络地址192.168.0.128,该网络地址与第2条路由条目中的目的网络地址192.168.0.128相同,因此第2条路由条目匹配。
3)路由器R根据匹配的路由条目中的“下一跳”的指示,从自己的接口1直接交付IP数据报给主机D。路由器R只需通过ARP协议,获取到与自己的接口1处于同一网络中的目的主机D的MAC地址,就可将IP数据报封装成帧后发送给目的主机D。
注意:如果路由器收到的是目的地址为广播地址的IP数据报,则不会对这种IP数据报进行转发。
IPv4数据报的首部格式
IP数据报的首部格式及其内容是实现IP协议各种功能的基础。IPv4数据报的首部由20字节的固定部分和最大40字节的可变部分组成。
所谓固定部分,是指每个IPv4数据报的首部都必须要包含的部分。某些IPv4数据报的首部,除了包含20字节的固定部分,还包含一些可选的字段来增加IPv4数据报的功能。
在TCP/IP标准中,各种数据格式常常以32比特(即4字节)为单位来描述。每一行都由32个比特(即4个字节)构成,每个格子称为字段或者域。每个字段或某些字段的组合用来表达IPv4协议的相关功能。
版本
版本字段的长度为4个比特,用来表示IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议的版本号为4(即IPv4)
首部长度、可选字段和填充
首部长度字段的长度为4个比特,该字段的取值以4字节为单位,用来表示IPv4数据报首部的长度。
该字段的最小取值为二进制的0101,即十进制的5,再乘以4字节单位,表示IPv4数据报首部只有20字节固定部分。
该字段的最大取值为二进制的1111,即十进制的15,再乘以4字节单位,表示IPv4数据报首部包含20字节固定部分和最大40字节可变可选字段的长度从1字节到40字节不等,用来支持排错、测量以及安全措施等功能。
虽然可选字段增加了IPv4数据报的功能,但这同时也使得IPv4数据报的首部长度成为可变的。这就增加了因特网中每一个路由器处理IPv4数据报的开销。实际上,可选字段很少被使用。
填充字段用来确保IPv4数据报的首部长度是4字节的整数倍,使用全0进行填充。由于IPv4数据报的首部长度字段的值以4字节为单位,因此IPv4数据报的首部长度一定是4字节的整数倍。由于IPv4数据报首部中的可选字段的长度从1个字节到40个字节不等,那么当20字节固定部分加上1到40个字节长度不等的可变部分,会造成IPv4数据报的首部长度不是4字节的整数倍的情况。对于这种情况,就用取值为全0的填充字段填充相应个字节,以确保IPv4数据报的首部长度是4字节的整数倍。
区分服务
区分服务字段的长度为8个比特,用来获得更好的服务。该字段在旧标准中叫作服务类型,但实际上一直没有被使用过。1998年,因特网工程任务组(IETF)把这个字段改名为区分服务。利用该字段的不同取值可提供不同等级的服务质量。只有在使用区分服务时该字段才起作用。一般情况下都不使用该字段。
总长度
总长度字段的长度为16个比特,该字段的取值以字节为单位,用来表示IPv4数据报的长度,也就是IPv4数据报首部与其后的数据载荷的长度总和。该字段的最大取值为二进制的16个比特1,即十进制的65535。需要说明的是,在实际应用中很少传输这么长的IPv4数据报。
标识、标志和片偏移
标识、标志和片偏移这三个字段共同用于IPv4数据报分片。
IPv4数据报分片概念
如图所示,网际层封装了一个比较长的IPv4数据报,并将其向下交付给数据链路层封装成帧。每一种数据链路层协议都规定了帧的数据载荷的最大长度,即最大传送单元。例如,以太网的数据链路层规定MTU的值为1500字节。如果某个IPv4数据报的总长度超过MTU,将无法封装成帧。需要将原IPv4数据报分片为更小的IPv4数据报,再将各分片[Pv4数据报封装成帧。
标识字段的长度为16个比特。属于同一个IPv4数据报的各分片数据报应该具有相同的标识。IP软件会维持一个计数器,每产生一个IPv4数据报,计数器值就加1,并将此值赋给标识字段。
标志字段的长度为3个比特,各比特含义如下:
- 最低位(More Fragment,MF),表示本分片后面是否还有分片。MF=1表示本分片
后面还有分片,MF=0表示本分片后面没有分片。- 中间位(Don’t Fragment,DF),表示是否允许分片。DF=1表示不允许分片,
DF=0表示允许分片。- 最高位为保留位,必须设置为0。
片偏移字段的长度为13个比特,该字段的取值以8字节为单位,用来指出分片IPv4数据报的数据载荷部分偏移其在原IPv4数据报的位置有多远。
如图所示,假设需要分片的IPv4数据报总长度为3820字节,其中固定首部长20字节,数据载荷长3800字节。
根据数据链路层的要求,需要将该IPv4数据报分片为长度不超过1420字节的数据报片。每个数据报片的数据载荷长度不能超过1400字节。于是将原IPv4数据报分为3个数据报片,其数据载荷的长度分别为1400、1400和1000字节。
生存时间
生存时间字段的长度为8比特,最大取值为二进制的11111111,即十进制的255。该字段的取值最初以秒为单位。因此,IPv4数据报的最大生存时间最初为255秒。路由器转发IPv4数据报时,将其首部中该字段的值减去该数据报在本路由器上所耗费的时间,若不为0就转发,否则就丢弃。
生存时间字段后来改为以“跳数”为单位,路由器收到待转发的IPv4数据报时,将其首部中的该字段的值减1,若不为0就转发,否则就丢弃。
生存时间字段的英文缩写词为TTL (Time To Live),该字段的初始值由发送IPv4数据报的主机进行设置,其目的是防止被错误路由的IPv4数据报无限制地在因特网中兜圈。
协议
协议字段的长度为8个比特,用来指明IPv4数据报的数据载荷是何种协议数据单元
首部检验和
首部检验和字段的长度为16个比特,用于检测IPv4数据报在传输过程中其首部是否出现了差错。
IPv4数据报每经过一个路由器,其首部中的某些字段的值(例如生存时间、标志以及片偏移等)都可能发生变化,因此路由器都要重新计算一下首部检验和。
之所以不检验IPv4数据报的数据载荷,是为了减少计算的工作量。
为了进一步减小计算检验和的工作量,IPv4首部的检验和并不采用复杂的CRC检验码,而是采用了更简单的计算方法。
源IP地址和目的IP地址
源IP地址字段和目的IP地址字段的长度都是32个比特,用来填写发送IPv4数据报的源主机的IPv4地址和接收该IP数据报的目的主机的IPv4地址。
静态路由配置
静态路由配置是指用户或网络运维人员使用路由器的相关命令给路由器人工配置路由表。人工配置方式简单、开销小,但不能及时适应网络状态(流量、拓扑等)的变化,一般只在小规模网络中采用。
直连路由和非直连路由
当网络运维人员给路由器的各接口配置了IP地址和地址掩码后,路由器就可自行得出自己的各接口分别与哪些网络是直连的(即中间没有其他路由器)。
路由器将这些直连路由条目记录在自己的路由表中。
路由器到其他非直连网络的路由可由网络运维人员进行人工配置(即所谓的静态路由配置),也可通过路由选择协议由路由器自动获取。
直连路由和非直连路由的概念:
如图所示,路由器R1的路由表中有以下路由条目:
1)前两条路由条目,是R1根据自己的接口0和1各自所配置的IP地址和地址掩码,自行得出的直连路由。
2)第三条路由条目是由网络运维人员为其配置的非直连路由,属于静态路由配置。因为该路由条目并不是R1通过路由选择协议自动获取到的。
默认路由和特定主机路由
除了路由器自行得出的直连路由和网络运维人员配置的非直连路由,网络运维人员还可给路由器配置两种特殊的路由:默认路由和特定主机路由。
默认路由
当路由器正确接收某个IP数据报后,会基于其首部中的目的IP地址在自己的路由表中进行查询。若查询到匹配的路由条目,就按照该路由条目的指示进行转发,否则就丢弃该IP数据报,并向发送该IP数据报的源主机发送差错报告。
如果网络运维人员事先给路由器配置过默认路由条目,则当路由器查询不到匹配的路由条目时,就按默认路由条目中“下一跳”的指示进行转发。
路由器采用默认路由(default route)可以减少路由表所占用的存储空间以及拽索路由表所耗费的时间。
如图所示,路由器R2的接口1与因特网是直连的。路由器R1的路由表中有以下路由条目:
1)两条由R1自动得出的直连网络的路由条目。
2)一条由网络运维人员配置的默认路由条目。默认路由条目中的“目的网络”填写为0.0.0.0/0,其中0.0.0.0表示任意网络,而网络前缀“/0”(相应地址掩码为0.0.0.0)是最短的网络前缀。之前曾介绍过,路由器在查表转发IP数据报时,遵循“最长前缀”匹配的原则,因此默认路由条目的匹配优先级最低。
在本例中,路由器R1中凡是去往因特网中某个网络的IP数据报,都会按R1路由表中的这条默认路由条目中“下一跳”的指示,从R1的接口1转发给路由器R2的接口0,由R2再转发给因特网中的下一个路由器。
由此可见,在R1的路由表中用一条默认路由条目,替代了去往因特网中众多网络的海量路由条目,极大地减少了路由表所占用的存储空间和搜索路由表所耗费的时间。
特定主机路由
出于某种安全问题的考虑,同时为了使网络运维人员更方便地控制网络和测试网络,特别是在对网络的连接或路由表进行排错时,指明到某一台主机的特定主机路由是十分有用的。
如图所示,网络192.168.2.0/24中有一台IP地址为192.168.2.1的特定主机。可在路由器R1的路由表中针对该主机配置一条特定主机路由条目。
特定主机路由条目中的“目的网络”填写为192.168.2.1/32,其中192.168.2.1是特定主机的IP地址,而网络前缀“/32”(相应地址掩码为255.255.255.255)是最长的网络前缀。根据“最长前缀”匹配的原则,特定主机路由条目的匹配优先级最高。
在本例中,路由器R1中凡是去往该特定主机的IP数据报,都会按R1路由表中的这条特定主机路由条目中“下一跳”的指示,从R1的接口1转发给路由器R2的接口0,再由R2的接口1直接交付给该特定主机。
因特网的路由选择协议
路由选择分类
路由选择可分为以下两类:
- 静态路由选择:采用人工配置的方式给路由器添加网络路由、默认路由和特定主机路由等路由条目。
- 动态路由选择:路由器通过路由选择协议自动获取路由信息。
对于路由器而言,静态路由选择简单,开销小,但不能及时适应网络状态的变化;
动态路由选择比较复杂,开销比较大,但能较好地适应网络状态的变化。
因此,静态路由选择一般只在小规模网络中采用,而动态路由选择适用于大规模网络。
因特网采用分层次的路由选择协议
因特网是全球最大的互联网,它所采用的路由选择协议具有以下三个主要特点:
- 自适应:因特网采用动态路由选择,能较好地适应网络状态的变化。
- 分布式:因特网中的各路由器通过相互间的信息交互,共同完成路由信息的获取和更新。
- 分层次:将整个因特网划分为许多较小的自治系统(Autonomous System,AS)。例如,一个较大的因特网服务提供商(ISP)就可划分为一个自治系统。在自治系统内部和自治系统外部采用不同类别的路服务器托管网由选择协议,分别进行路由选择。
自治系统之间的路由选择简称为域间路由选择(Interdomain Routing)。域间路由选择使用外部网关协议(External Gateway Protocol,EGP)这个类别的路由选择协议。
自治系统内部的路由选择简称为域内路由选择(Intradomain Routing)。域内路由选择使用内部网关协议(Interior Gateway Protocol,IGP)这个类别的路由选择协议。
注意:
- 在一个自治系统内部使用的具体的内部网关协议,与因特网中其他自治系统中选用何种内部网关协议无关。
- 外部网关协议和内部网关协议只是路由选择协议的分类名称,而不是具体的路由选择协议。
路由信息协议(RIP)
路由信息协议(Routing Information Protocol,RIP)是内部网关协议中最先得到广泛使用的协议之一,其相关标准文档为[RFC1058]。
RIP要求自治系统内的每一个路由器,都要维护从它自己到AS内其他每一个网络的距离记录。这是一组距离,称为距离向量(Distance-Vector,D-V)。RIP使用跳数(HopCount)作为度量(Metric)来衡量到达目的网络的距离。
- RIP将路由器到直连网络的距离定义为1。
- RIP将路由器到非直连网络的距离定义为所经过的路由器数加1。
- RIP允许一条路径最多只能包含15个路由器。距离等于16时相当于不可达。因此RIP只适用于小型互联网。
RIP认为好的路由就是“距离短”的路由,也就是所通过路由器数量最少的路由。
当到达同一目的网络有多条“RIP距离相等”的路由时,可以进行等价负载均衡。也就是将通信量均衡地分布到多条等价的路径上。
RIP具有以下三个重要特点:
- 和谁交换信息:仅和相邻路由器交换信息。
- 交换什么信息:交换的信息是路由器自己的路由表。换句话说,交换的信息是“本路由器到所在自治系统中所有网络的最短RIP距离,以及到每个网络应经过的下一跳路由器”。
- 何时交换信息:周期性交换(例如,每隔约30秒)。路由器根据收到的路由信息更新自己的路由表。为了加快RIP的收敛速度,当网络拓扑发生变化时,路由器要及时向相邻路由器通告拓扑变化后的路由信息,这称为触发更新。
RIP的基本工作过程
RIP的基本工作过程如下:
1)路由器刚开始工作时,只知道自己到直连网络的距离为1。如图所示,路由器R1、R2、R3和R4刚开始工作时各自的路由表中只有自己到直连网络的路由条目。
2)每个路由器仅和相邻路由器周期性地交换并更新路由信息。R1和R2互为相邻路由器,R1和R3互为相邻路由器,R2和R3互为相邻路由器,R2和R4互为相邻路由器,R3和R4也互为相邻路由器。相邻路由器之间周期性地交换并更新路由信息。
3)若干次交换和更新后,每个路由器都知道到达本自治系统内各网络的最短距离和下一跳路由器,称为收敛。
RIP的距离向量算法
运行RIP的路由器周期性地向共所有相邻路由器发送RIP更新报文。路由器收到每一个相邻路由器发来的RIP更新报文后,都会根据RIP更新报文中的路由信息来更新自己的路由表。
如图所示,路由器C和D互为相邻路由器。图中给出了路由器C和D各自的路由表。在路由器C的路由表中,将到达各目的网络的下一跳都记为“?”号,可以理解为路由器D并不需要关心路由器C的这些内容。假设某个时刻,路由器C将自己的路由表封装在RIP更新报文中发送给路由器D。
路由器D收到路由器C发来的路由表后,对其进行修改。将到达各目的网络的下一跳都改为C并且将RIP距离都加1。修改的原因很容易理解,因为路由器C告诉D:“我可以到达这些网络,以及到达这些网络的RIP距离分别是……”,那么路由器D你为C的相邻路由器,当然也就可以通过C来到达这些网络,只是比C到达这些网络的RIP距离大1。
更新路由表的理由:
-
通过相同下一跳到达目的网络,无论RIP距离变大还是变小,都要进行更新,因为这是最新消息。
-
发现了新的网络,添加到达该网络的路由条目。
-
通过不同下一跳到达目的网络,新路由的RIP距离更小,新路由有优势,则更新原来的旧路由条目。
-
通过不同下一跳到达目的网络,新路由的RIP距离相同,则添加新路由条目到路由表中,可以进行等价负载均衡。
不更新路由表的理由:
- 通过不同下一跳到达目的网络,新路由的RIP距离增大,新路由处于劣势,不应该更新。
除了上述RIP路由条目更新规则,在RIP的距离向量算法中还包含以下一些时间参数:
1)路由器每隔大约30秒向其所有相邻路由器发送路由更新报文。
2)若180秒(默认)没有收到某条路由条目的更新报文,则把该路由条目标记为无效(即把RIP距离设置为16,表示不可达),若再过一段时间(如120秒),还没有收到该路由条目的更新报文,则将该路由条目从路由表中删除。
RIP存在的问题
RIP存在“坏消息传播得慢”的问题。
1)假设路由器R1到达其直连网络N1的链路出现了故障。当R1检测出故障后,会将到达N1的路由条目中的RIP距离修改为16,表示N1不可达。
2)假设R1的路由更新报文的发送周期还有将近30秒才到时,而此时R2的路由更新报文的发送周期到时了。于是R2给R1发送路由更新报文,其中到达N1的路由条目中的RIP距离为2,下一跳为R1,这是R2之前从R1获取到的。
3)当R1收到R2发来的路由更新报文后,就会被该谣言误导,误认为可以通过R2到达N1,RIP距离为3。当R1的路由更新报文的发送周期到时后,就将包含这条路由条目的路由更新报文发送给R2。
4)当R2收到R1发来的路由更新报文后就会被谣言误导,误认为可以通过R1到达N1,RIP距离为4。当R2的路由更新报文的发送周期到时后,就将包含这条路由条目的路由更新报文发送给R1。
5)上述更新会一直持续下去,直到R1和R2到N1的RIP距离都增大到16时,R1和R2才知道原来N1是不可达的,也就是才收敛。这就是RIP存在的“坏消息传播得慢”的问题。
在上述过程中,R1和R2之间会出现路由环路,时间长达数分钟。如果没有最大RIP离为15的限制,则上述过程将永久持续下去。
“坏消息传播得慢”的问题又称为路由环路或RIP距离无穷计数问题,这是距离向量算法的一个固有问题。可以采取以下多种措施减少出现该问题的概率或减小该问题带来的危害:
- 限制最大RIP距离为15(16表示不可达)。
- 当路由表发生变化时就立即发送路由更新报文(即“触发更新”),而不仅是周期性发送。
- 让路由器记录收到某特定路由信息的接口,而不让同一路由信息再通过此接口向反方向传送(即“水平分割”)。
注意:使用上述措施仍无法彻底解决问题。因为在距离向量算法中,每个路由器都缺少到目的网络整个路径的完整信息,无法判断所选的路由是否出现了环路。
RIP版本和相关报文
现在较新的RIP版本是1998年11月公布的RIP2[RFC2453],已经成为因特网标准协议。RIP2可以支持可变长子网掩码和CIDR。另外,RIP2还提供简单的鉴别过程并支持多播。
RIP相关报文使用运输层的用户数据报协议进行传送,使用的UDP端口号为520。从这个角度看,RIP属于TCPIIP体系结构的应用层。但RIP的核心功能是路由选择,这属于TCP/IP体系结构的网际层。
RIP的优缺点
RIP的优点有:
- 实现简单、路由器开销小。
- 如果一个路由器发现了RIP距离更短的路由,那么这种更新信息就传播得很快,即“好消息传播得快”。
RIP也有很多缺点:
- RIP限制了最大RIP距离为15,这就限制了使用RIP的自治系统的规模。
- 相邻路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也就增加。
- “坏消息传播得慢”,使更新过程的收敛时间过长。
因此,对于规模较大的自治系统(AS)就应当使用OSPF协议。然而目前在规模较小的AS中,使用RIP的仍占多数。
开放最短路径优先协议(OSPF)
开放最短路径优先协议是为了克服路由信息协议的缺点在1989年开发出来的。
“开放”表明OSPF协议不是受某一厂商控制,而是公开发表的。
“最短路径优先”是因为使用了Dijkstra提出的最短路径算法。
OSPF是基于链路状态(LinkState,LS)的,而不像RIP是基于距离向量的。OSPF基于链路状态并采用最短路径算法计算路由,从算法上保证了不会产生路由环路。OSPF不限制网络规模,更新效率高,收敛速度快。
相关概念
1)链路状态
链路状态是指本路由器都和哪些路由器相邻,以及相应链路的“代价(cost)”。
“代价”用来表示费用、距离、时延和带宽等,这些都由网络管理人员来决定。
例如在图中,路由器R1的邻居路由器有R2,相应的链路代价用100Mb/s除以链路带宽100Mb/s,结果是1。R1的邻居路由器还有R4,相应的链路代价用100Mb/s除以链路带宽1Gb/s,结果小于1但仍记为1。
2)邻居关系的建立和维护
OSPF相邻路由器之间通过交互问候(Hello)分组来建立和维护邻居关系。Hello分组封装在IP数据报中,发往组播地址224.0.0.5。IP数据报首部中的协议号字段的取值为89,表明IP数据报的数据载荷为OSPF分组。
Hello分组的发送周期为10秒。若40秒仍未收到来自邻居路由器的问候分组,则认为该邻居路由器不可达。因此,每个路由器都会建立一张邻居表。
其中的每一个条目对应记录其各邻居路由器的相关信息,包括邻居ID、接口以及“判活”倒计时。若在“判活”倒计时减少到0之前再次收到了来自该路由器发送来的分组,则重新启动针对该邻居条目的40秒“判活”倒计时。否则,当“判活”倒计时减少为0时,则判定该邻居路由器不可达。
3)链路状态通告
使用OSPF的每个路由器都会产生链路状态通告(Link State Advertisement,LSA)。
LSA中包含以下两类链路状态信息:
- 直连网络的链路状态信息。
- 邻居路由器的链路状态信息。
4)链路状态更新分组
LSA被封装在链路状态更新分组(Link State Update,LSU)中,采用洪泛法(Flooding)发送。
洪泛法是指路由器通过自己的所有接口向所有邻居路由器发送信息,而每一个邻居路由器又将此信息发往其所有的相邻路由器(但不再发送给刚刚发来信息的那个路由器)。这样,最终整个区域中所有的路由器都得到了这个信息。
5)链路状态数据库
使用OSPF的每个路由器都有一个链路状态数据库(Link State Database,LSDB),用于存储LSA。通过各路由器洪泛发送封装有各自LSA的LSU,各路由器的LSDB最终将达到一致。
6)基于LSDB进行最短路径优先计算
使用OSPF的各路由器,基于LSDB进行最短路径优先计算(一般使用Dijkstra算法),构建出各自到达其他各路由器的最短路径,即构建各自的路由表。
OSPF的五种分组类型
OSPF包含以下五种分组类型:
- 问候(Hello)分组:用来发现和维护邻居路由器的可达性。
- 数据库描述(Database Description)分组:用来向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息。
- 链路状态请求(Link State Request)分组:用来向邻居路由器请求发送某些链路状态项目的详细信息。
- 链路状态更新(Link State Update)分组:路由器使用链路状态更新分组将其链路状态进行洪泛发送,即用洪泛法对整个系统更新链路状态。
- 链路状态确认(Link State Acknowledgement)分组:是对链路状态更新分组的确认分组。
OSPF的基本工作过程
借助上图说明OSPF的基本工作工程:
1)相邻路由器R1与R2之间每隔10秒要交换一次问候分组,以便建立和维护邻居关系。
2)建立邻居关系后,给邻居路由器发送数据库描述分组。也就是将自己的链路状态数据库中的所有链路状态项目的摘要信息发送给邻居路由器。
3)假设路由器R1收到R2的数据库描述分组后,发现自己缺少其中的某些链路状态项目,于是就给R2发送链路状态请求分组。
4)R2收到R1发来的链路状态请求分组后,将R1所缺少的链路状态项目的详细信息,封装在链路状态更新分组中发送给R1。
5)R1收到R2发来的链路状态更新分组后,将这些所缺少的链路状态项目的详细信息,添加到自己的链路状态数据库中,并给R2发送链路状态确认分组。
6)R2也可以向R1请求自己所缺少的链路状态项目的详细信息。
7)R1和R2的链路状态数据库最终将达到一致,即同步。两个同步的路由器称作“完全邻接的”(fully adjacent)的路由器。
8)每30分钟或链路状态发生变化时,路由器都会洪泛发送链路状态更新分组。收到该分组的其他路由器会根据分组的内容更新自己的链路状态数据库,然后洪泛转发该分组,并给该路由器发回链路状态确认分组。这又称为新情况下的链路状态数据库同步。
多点接入网络中的OSPF路由器
在多点接入网络中,如果不采用其他机制,OSPF路由器将会产生大量的多播分组(即问候分组和链路状态更新分组)。
为了减少所发送分组的数量,OSPF采用选举指定路由器(Designated Router,DR)和备用的指定路由器(Backup Designated Router,BDR)的方法。所有的普通路由器只与DR或BDR建立邻居关系。
普通路由器之间不能直接交换信息,而必须通过DR或BDR进行交换。若DR出现问题,则由BDR顶替DR。
实现DR和BDR的选举并不复杂,无非就是各路由器之间交换一些选举参数(例如路由器优先级、路由器ID以及接口IP地址等),然后根据选举规则选出DR和BDR。
0SPF划分区域
为了使OSPF协议能够用于规模很大的网络,OSPF把一个自治系统再划分为若干个更小的范围,称为区域(area)。
在上图中,将一个规模很大的网络划分成一个AS。在该自治系统内,所有路由器都使用OSPF协议,并且被划分在了4个更小的区域。每个区域都有一个32比特的区域标识符,可以用点分十进制表示。主干区域的标识符必须为0,也可表示成点分十进制形式的0.0.0.0。主干区域用于连通其他区域。其他区域的标识符不能为0且互不相同。每个区域的规模不应太大,一般所包含的路由器不应超过200个。
划分区域的好处就是把利用洪泛法交换链路状态信息的范围局限于每一个区域,而不是整个AS,这样就减少了整个网络上的通信量。
如果路由器的所有接口都在同一个区域内,则该路由器称为区域内路由器(internal router)。
为了本区域可以和自治系统内的其他区域连通,每个区域都会有一个区域边界路由器(area border router)。区域边界路由器的一个接口用于连接自身所在区域,另一个接口用于连接主干区域。
主干区域内的路由器称为主干路由器(backbone router),如上图中的路由器R3R4、R5、R6和R7。也可以把区域边界路由器看作主干路由器。
在主干区域内还要有一个路由器专门和本自治系统外的其他自治系统交换路由信息,这样的路由器称为自治系统边界路由器,如上图中的路由器R6。
采用分层次划分区域的方法,虽然使交换信息的种类增多了,同时也使OSPF协议更加复杂了,但这样做能使每一个区域内部交换路由信息的通信量大大减小,因而使OSPF协议能够用于规模很大的自治系统中。
边界网关协议(BGP)
边界网关协议属于外部网关协议这个类别,用于自治系统之间的路由选择。由于在不同自治系统内度量路由的“代价”(距离、带宽、费用等)可能不同,因此对于自治系统之间的路由选择,使用统一的“代价”作为度量来寻找最佳路由是不行的。
自治系统之间的路由选择协议应当允许使用多种路由选择策略。这些策略包括政治、经济、安全等,它们都是由网络管理人员对每一个路由器进行设置的。
BGP只能是力求寻找一条能够到达目的网络且比较好的路由,而并非要寻找一条最佳路由。
BGP边界路由器
在配置BGP时,每个AS的管理员,要选择至少一个路由器作为该AS的“BGP发言人”。
一般来说,两个BGP发言人都是通过一个共享网络连接在一起的,而BGP发言人往往就是BGP边界路由器。
借助上图说明不同AS的BGP发言人交换路由信息的步骤:
1)建立TCP连接,TCP端口号为179。
2)在所建立的TCP连接上交换BGP报文以建立BGP会话。
3)利用BGP会话交换路由信息,例如增加新的路由或撤销过时的路由、报告出错的情况等。
使用TCP连接交换路由信息的两个BGP发言人,彼此称为对方的邻站(neighbor)或对等站(peer)。BGP发言人除了运行BGP协议,还必须运行自己所在AS所使用的内部网关协议,例如RIP或OSPF。
BGP发言人交换网络可达性的信息,也就是要到达某个网络所要经过的一系列自治系统。
当BGP发言人互相交换了网络可达性的信息后,各BGP发言人就根据所采用的策略,从收到的路由信息中找出到达各自治系统的较好的路由,也就是构造出树形结构且不存在环路的自治系统连通图。
BGP-4的四种报文
在BPG协议刚刚运行时,BGP的邻站交换整个BGP路由表。但以后只需要在发生变化时更新有变化的部分,这样做对节省网络带宽和减少路由器的处理开销都有好处。
BGP-4是目前使用得最多的版本,在[RFC4271]中规定了BGP-4的四种报文:
- OPEN(打开)报文:用来与相邻的另一个BGP发言人建立关系,使通信初始化。
- UPDATE(更新)报文:用来通告某一路由的信息,以及列出要撤销的多条路由。
- KEEPALIVE(保活)报文:用来周期性地证实邻站的连通性。
- NOTIFICATION(通知)报文:用来发送检测到的差错。
在[RFC2918]中增加了ROUTE-REFRESH(路由刷新)报文,用来请求对等方重新通告。
如果一个BGP发言人想与另一个AS的BGP发言人建立对等关系,就需要向对方发送OPEN报文,若对方接受这种对等关系,就用KEEPALIVE报文响应。这样,两个BGP发言人就建立起了对等关系。
一旦建立了对等关系,就要继续维持这种关系。双方中的每一方都需要确信对方是存在的,且一直在保持这种对等关系。为此,这两个BGP发言人彼此要周期性地交换KEEPALIVE报文(一般每隔30秒)。KEEPALIVE报文只有19字节长(只用BGP报文的通用首部),因此不会造成网络上太大的开销。
UPDATE报文是BGP的核心内容。BGP发言人可以用UPDATE报文撤销它曾经通知过的路由,也可以宣布增加新的路由。撤销路由可以一次撤销多条,但增加新路由时,每个UPDATE报文只能增加一条。
路由器的基本工作原理
路由器是一种具有多个输入端口和输出端口的专用计算机,其任务是转发分组。
整个路由器结构可划分为两大部分:
- 路由选择部分:核心构件是路由选择处理机,其任务是根据所使用的路由选择协议,周期性地与其他路由器进行路由信息的交换,以便构建和更新路由表。
- 分组转发部分:由一组输入端口、交换结构以及一组输出端口构成。
信号从路由器的某个输入端口进入路由器。物理层将信号转换成比特流后向上交付给数据链路层。数据链路层从比特流中识别出帧,去掉帧头和帧尾后向上交付给网络层处理,分以下两种情况:
-
如果交付给网络层处理的分组是普通待转发的数据分组,则根据分组首部中的目的地址进行查表转发。若找不到匹配的转发条目,就丢弃该分组,否则按照匹配条目中所指示的端口进行转发:
网络层更新数据分组首部中的某些字段的值(例如将数据分组的生存时间TTL减1),然后向下交付给数据链路层进行封装。数据链路层将数据分组封装成帧后向下交付给物理层处理。物理层将帧看作比特流,将其变换成相应的电信号进行发送。
-
如果交付给网络层处理的是携带有路由报文的路由分组,则把路由报文送交路由选择处理机。路由选择处理机根据路由报文的内容来更新自己的路由表。
路由表一般仅包含从目的网络到下一跳的映射。路由表需要对网络拓扑变化的计算最优化,而转发表是从路由表得出的,转发表的结构应当使查找过程最优化。
路由选择处理机除了处理收到的路由报文,还会周期性地给其他路由器发送自己所知道的路由信息。
路由器的各端口还应具有输入缓冲区和输出缓冲区。输入缓冲区用来暂存新进入路由器但还来不及处理的分组。输出缓冲区用来暂存已经处理完毕但还来不及发送的分组。需要说明的是,路由器的端口一般都同时具有输入和输出的功能。
路由器的交换结构是路由器的关键构件,它将某个输入端口进入的分组根据查表的结果从一个合适的输出端口转发出去。
网际控制报文协议
为了更有效地转发IP数据报以及提高IP数据报交付成功的机会,TCP/IP体系结构的网际层使用了网际控制报文协议(Internet Control Message Protocol, ICMP)[RFC 792]。主机或路由器使用ICMP来发送差错报告报文和询问报文。ICMP报文被封装在IP数据报中发送。
ICMP报文分为两大类:ICMP差错报告报文和ICMP询问报文。
ICMP差错报告报文
ICMP差错报告报文用来向主机或路由器报告差错情况,共有以下五种:
- 终点不可达
- 源点抑制
- 时间超过(超时)
- 参数问题
- 改变路由(重定向)
终点不可达
当路由器或主机不能交付IP数据报时,就向源点发送终点不可达报文。具体可再根据ICMP的代码字段细分为目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等13种错误。
假设主机H1给H2发送IP数据报。H1会将IP数据报发送给路由器R1,由R1帮其转发。若R1的路由表中没有与网络N3匹配的路由条目(例如H2的特定主机路由、N3的路由、默认路由),则R1就不知道如何转发该数据报,只能将其丢弃,并向发送该数据报的源主机H1发送ICMP差错报告报文,具体类型为终点不可达。
源点抑制
当路由器或主机由于拥塞而丢弃IP数据报时,就向源点发送源点抑制报文,使源主机知道应当把IP数据报的发送速率放慢。
假设主机H1给H2发送IP数据报。当该数据报传送到路由器R2时,由于R2拥塞(也就是R2比较繁忙),R2根据自己的丢包策略丢弃了该数据报,并向发送该数据报的源主机H1发送ICMP差错报告报文,具体类型为源点抑制。
时间超过(超时)
当路由器收到一个目的I地址不是自己的I数据报时,会将其首部中生存时间(TTL)字段的值减1。若结果不为0,则路由器将该数据报转发出去。若结果为0,路由器不但要丢弃该数据报,还要向源点发送时间超过(超时)报文。
假设主机H1发送了一个TTL为2的IP数据报。当该数据报传送到路由器R1后,R1将其TTL字段的值减1后结果是1,这表明该数据报的生存时间还没有结束,R1将其转发出去。当该数据报传送到路由器R2后,R2将其TTL字段的值减1后结果是0,这表明该数据报的生存时间结束了,R2丢弃该数据报,并向发送该数据报的源主机H1发送ICMP差错报告报文,具体类型为时间超过(超时)。
另外,当终点在预先规定的时间内未能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过(超时)报文。
参数问题
当路由器或目的主机收到IP数据报后,根据其首部中的检验和字段的值发现首部在传送过程中出现了误码,就丢弃该数据报,并向源点发送参数问题报文。
假设主机H1给H2发送了一个IP数据报,但该数据报在从H1到路由器R1的传送过程中受到了干扰,其首部出现了误码。当该数据报传送到R1后,R1检测到该数据报的首部出错,于是丢弃该数据报,并向发送该数据报的源主机H1发送ICMP差错报告报文,具体类型为参数问题。
改变路由(重定向)
路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器,这样可以通过更好的路由到达目的主机。
假设给主机H1指定的默认网关是路由器R1,则H1要发往网络N2的IP数据报都会传送给R1,由其帮忙转发。当R1发现H1发往N2的数据报的最佳路由不应当经过R1而应当经过R4时,就用改变路由报文把这个情况告诉H1。于是,H1就在自己的路由表中添加一个项目:到达N2应经过R4而不是默认网关R1。之后,H1要发往N2的IP数据报都会传送给R4,由其帮忙转发。
以下情况不应发送ICMP差错报告报文:
- 对ICMP差错报告报文不再发送ICMP差错报告报文。
- 对第一个分片的IP数据报片的所有后续数据报片都不发送ICMP差错报告报文。
- 对具有多播地址的IP数据报都不发送ICMP差错报告报文。
- 对具有特殊地址(例如127.0.0.0或0.0.0.0)的数据报不发送ICMP差错报告报文。
ICMP询问报文
常用的ICMP询问报文有回送请求和回答,以及时间戳请求和回答。
回送请求和回答
回送请求和回答报文由主机或路由器向一个特定的目的主机或路由器发出。收到此报文的主机或路由器必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。
时间戳请求和回答
时间戳请求和回答报文用来请求某个主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32比特的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。时间戳请求和回答报文被用来进行时钟同步和测量时间。
ICMP的典型应用
分组网间探测
分组网间探测(Packet InterNet Groper,PING)用来测试主机或路由器之间的连通性。PING是TCP/IP体系结构的应用层直接使用网际层ICMP的一个例子,它并不使用运输层的TCP或UDP。PING应用所使用的ICMP报文类型为回送请求和回答。
需要说明的是,有的主机(或服务器)为了防止恶意攻击,并不会理睬外界发来的这种报文。
跟踪路由
traceroute和tracert
跟踪路由traceroute应用,用于探测IP数据报从源主机到达目的主机要经过哪些路由器。在不同操作系统中,traceroute应用的命令和实现机制有所不同。
- 在UNIX版本中,具体命令为“traceroute”,其在运输层使用UDP协议,在网际层使用的ICMP报文类型只有差错报告报文。
- 在Windows版本中,具体命令为“tracert”,其应用层直接使用网际层的ICMP协议,所使用的ICMP报文类型有回送请求和回答报文以及差错报告报文。
tracert的基本实现原理
Windows版本中的tracert命令,使用了ICMP回送请求和回答报文以及差错报告报文,以便追踪源点与目的点之间要经过哪些路由器。
1)H1给H2发送ICMP回送请求报文,该报文被封装在IP数据报中发送。IP数据报首部中生存时间(TTL)字段的值被设置为1。
2)IP数据报到达路由器R1后,其TTL字段的值被减1,结果为0。因此R1丢弃该数据报,并向发送该数据报的源主机H1发送ICMP差错报告报文,其类型为时间超过。这样,H1就知道了到达H2的路径中的第一个路由器(的IP地址)。
3)H1继续发送下一个封装有ICMP回送请求报文的IP数据报,其首部中TTL字段的值被设置为2。经过R1的转发后,该数据报的TTL字段的值被减少为1。该数据报到达R2后,其TTL字段的值被减1,结果为0。因此R2丢弃该数据报,并向发送该数据报的源主机H1发送ICMP差错报告报文,其类型为时间超过。这样,H1就知道了到达H2的路径中的第二个路由器(的IP地址)。
4)H1继续发送下一个封装有ICMP回送请求报文的IP数据报,其首部中TTL字段的值被设置为3。经过R1和R2的转发后,该数据报到达H2,其首部中TTL字段的值被R1和R2减小到1。H2解析该数据报,发现其内部封装的是ICMP回送请求报文,于是就给H1发送封装有ICMP回送回答报文的IP数据报。这样,H1就知道已经跟踪到路径中的最后一站,也就是目的主机H2。
虚拟专用网和网络地址转换
虚拟专用网
如图所示,某大型机构的部门A位于北京,而部门B位于上海。每个部门都有自己的专用网。假定这些分布在不同地点的专用网需要经常通信,可以有以下两种方法:
- 租用电信公司的通信线路为本机构专用。这种方法简单方便、但租金太高。
- 利用公用的因特网作为本机构各专用网之间的通信载体,这样的专用网又称为虚拟专用网。
如果机构内部的专用网也使用TCP/IP协议栈,那么就需要给专用网中的各主机配置IP地址。出于安全考虑,专用网内的各计算机并不应该直接“暴露”于公用的因特网上。因此,给专用网内各主机配置的IP地址应使各主机在专用网内可以相互通信,而不能直接与公用的因特网通信。
换句话说,给专用网内各主机配置的IP地址应该是该专用网所在机构可以自行分配的IP地址,这类IP地址仅在机构内部有效,称为专用地址(Private Address),不需要向因特网的管理机构申请。
[RFC1918]规定以下三个CIDR地址块中的地址作为专用地址:
- 10.0.0.0~10.255.255.255 (CIDR地址块10/8)
- 172.16.0.0~ 172.31.255.255(CIDR地址块172.16/12)
- 192.168.0.0~192.168.255.255(CIDR地址块192.168/16)
很显然,全世界可能有很多不同机构的专用网具有相同的专用IP地址,但这并不会引起麻烦,因为这些专用地址仅在机构内部使用。
在因特网中的所有路由器,对目的地址是专用地址的IP数据报一律不进行转发,这需要由因特网服务提供者对其拥有的因特网路由器进行设置来实现。
如图所示,给部门A和部门B各自专用网中的主机都配置好了相应的专用地址。很显然,部门A和B各自的专用网中至少需要一个路由器具有合法的全球IP地址(例如路由器R1和R2),这样部门A和B各自的专用网才能利用公用的因特网进行通信。另外,在部门A的路由器R1与部门B的路由器R2上都进行了相应的VPN配置。
假设部门A中的主机H1要给部门B中的主机H2发送数据。
1)H1将待发送数据封装成内部IP数据报发送给路由器R1。内部IP数据报首部中源地址字段的值为H1的IP地址,目的地址字段的值为H2的IP地址。
2)R1收到该内部IP数据报后,发现其目的网络必须通过因特网才能到达,就将该内部IP数据报进行加密(这样就确保了内部IP数据报的安全),然后重新添加上一个首部,封装成为在因特网上发送的外部数据报。外部数据报首部中源地址字段的值为路由器R1的全球唯一的公有IP地址,目的地址字段的值为路由器R2的全球唯一的公有IP地址。R1将该外部数据报通过因特网发送给R2。
3)R2收到该外部数据报后,去掉其首部,将其数据载荷(即加密后的内部IP数据报)进行解密,恢复出原来的内部IP数据报。这样就可以从内部IP数据报首部提取出源地址和目的地址,并根据目的地址将该内部IP数据报发送给目的主机H2。
根据本例可以看出,虽然两个专用网内的主机间发送的数据报是通过公用的因特网传送的,但从效果上就好像是在本机构的专用网上传送一样,这也是虚拟专用网中“虚拟”的含义。数据报在因特网中可能要经过多个网络和路由器,但从逻辑上看,路由器R1和R2之间好像是一条直通的点对点链路,因此也被称为IP隧道技术。
本例是同一机构内不同部门(部门A和部门B)的内部网络所构成的VPN,又称为内联网(Intranet或Intranet VPN,即内联网VPN)。
有时,一个机构的虚拟专用网VPN需要某些外部机构(通常是合作伙伴)参加进来,这样的VPN就称为外联网(Extranet或Extranet VPN,即外联网VPN)。
在外地工作的员工需要访问公司内部的专用网时,只要在任何地点接入到因特网,运行驻留在员工PC中的VPN软件,在员工的PC和公司的主机之间建立VPN隧道,就可以访问专用网中的资源,这种虚拟专用网又称为远程接入VPN(Remote Access VPN)
网络地址转换
尽管因特网采用了无分类编址方法来减缓IPv4地址空间耗尽的速度,但由于因特网用户数量的急剧增长,IPv4地址空间即将耗尽的危险仍然没有被解除(实际上,因特网号码分配管理局(IANN))于2011年2月3日宣布,IPv4地址已经分配完毕)。
网络地址转换(Network Address Translation,NAT)于1994年被提出,用来缓解IPv4地址空间即将耗尽的问题。NAT能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源。
这种方法需要在专用网络连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器称为NAT路由器,它至少要有一个有效的外部全球地址IP。这样,所有使用内部专用地址的主机在和外部因特网通信时,都要在NAT路由器上将其内部专用地址转换成全球地址IP。
最基本的NAT方法
如图所示,专用网中的主机A与因特网中的主机B交互IP数据报。
1)主机A给主机B发送一个IP数据报,该数据报首部中的源地址为主机A的专用地址上目的地址为主机B的全球地址IP。该数据报必须经过NAT路由器的转发。
2)NAT路由器收到该数据报后,从自己的全球地址池中为主机A选择一个临时的全球地址IP,将数据报首部中的源地址修改为全球地址IP。并在自己的NAT转换表中记录专用IP与全球IP的对应关系,之后将修改过源地址的数据报转发到因特网。
3)主机B给主机A发回一个IP数据报,该数据报首部中的源地址为主机B的全球地址IP,目的地址为NAT路由器为主机A选择的临时全球地址IP。当NAT路由器从因特网上收到该数据报时,根据NAT转换表中的相关记录,NAT路由器会将该数据报转发给专用网中的主机A。因此,NAT路由器将数据报首部中的目的地址修改为主机A的专用地址IP后,转发给专用网中的主机A。
上述最基本的NAT方法有一个缺点:如果NAT路由器拥有n个全球IP地址,那么专用网内最多可以同时有n台主机接入因特网。若专用网内的主机数量大于n,则需要轮流使用NAT路由器中数量较少的全球IP地址。
网络地址与端口号转换
由于目前绝大多数基于TCP/IP协议栈的网络应用,都使用运输层的传输控制协议或用户数据报协议,为了更加有效地利用NAT路由器中的全球IP地址,现在常将NAT转换和运输层端口号结合使用。这样就可以使内部专用网中使用专用地址的大量主机,共用NAT路由器上的1个全球IP地址,因而可以同时与因特网中的不同主机进行通信。
使用端口号的NAT称为网络地址与端口号转换(Network Address and Port Translation,NAPT),但人们仍习惯将其称为NAT。现在很多家用路由器将家中各种智能设备(手机、平板、笔记本电脑、台式电脑、物联网设备等)接入因特网,这种路由器实际上就是一个NAPT路由器,但往往并不运行路由选择协议。
如图所示,专用网中的主机A和B各自给因特网中的主机C发送封装有运输层(PDU)的IP数据报。
1)NAPT路由器收到A发来的IP数据报后,将其源地址(内部专用网地址)修改为NAPT路由器的外部全球地址,将其封装的运输层PDU的源端口号改为一个新的运输层端口号(由NAPT路由器动态分配),并将相关修改记录到自己的NAPT转换表中,然后将修改后的IP数据报转发到因特网。
2)当NAPT路由器从因特网上收到主机C给A发回的数据报时,根据NAPT转换表中的相关记录,NAPT路由器就可知道该数据报要发送给专用网中的主机A。因此,NAPT路由器将数据报首部中的目的地址和所封装的运输层PDU的目的端口号,按NAPT转换表中的记录进行修改,然后将数据报发送给主机A。
尽管NAT的出现在很大程度上缓解了IPv4地址资源紧张的局面,但NAT对网络应用并不完全透明,会对某些网络应用产生影响。
NAT的一个重要特点就是通信必须由专用网内部发起,因此拥有内部专用地址的主机不能直接充当因特网中的服务器。对于目前P2P这类需要外网主机主动与内网主机进行通信的网络应用,在通过NAT时会遇到问题,需要网络应用自身使用一些特殊的NAT穿透技术来解决。
IP多播
多播(Multicast,也称为组播)是一种实现“一对多”通信的技术,与传统单播“一对一”通信相比,多播可以极大地节省网络资源。
在因特网上进行的多播,称为IP多播。
当多播组的成员数量很大时,采用多播方式可以显著地减少网络中各种资源的消耗。要在因特网上实现多播,则因特网中的路由器必须具备多播的功能。这涉及路由器如何寻址IP多播数据报以及多播路由选择协议。
IP多播地址和多播组
IP多播通信必须依赖于IP多播地址。在IPv4中,D类地址被作为多播地址。
D类IPv4地址的左起前4个比特固定为1110,剩余28个比特可以任意变化,因此IPv4多播地址共有22个,范围是224.0.0.0到239.255.255.255。
多播地址只能用作目的地址,而不能用作源地址。用每一个D类地址来标识一个多播组,使用同一个IP多播地址接收多播数据报的所有主机就构成了一个多播组。
每个多播组的成员是可以随时变动的,一台主机可以随时加入或离开多播组。多播组成员的数量和所在的地理位置也不受限制,一台主机可以属于几个多播组。另外,非多播组的成员也可以向多播组发送IP多播数据报。
IP多播数据报也是“尽最大努力交付”,不保证一定能够交付给多播组内的所有成员。
D类地址又可分为预留的多播地址(永久多播地址)、全球范围可用的多播地址以及本地管理的多播地址。
IP多播可以分为以下两种:
- 只在本局域网上进行的硬件多播。
- 在因特网上进行的多播。
目前大部分主机都是通过局域网接入因特网的。因此,在因特网上进行多播的最后阶段,还是要把多播数据报在局域网上用硬件多播交付给多播组的所有成员。
在局域网上进行硬件多播
由于局域网支持硬件多播(因为MAC地址有多播MAC地址这个类型),因此只要把IPv4多播地址映射成局域网的硬件多播地址(即多播MAC地址),即可将IP多播数据报封装在局域网的MAC帧中,而MAC帧首部中的目的MAC地址字段的值,就设置为由IPv4多播地址映射成的多播MAC地址。
这样,可以很方便地利用硬件多播来实现局域网内的IP多播。换句话说,当给某个多播组的成员主机配置其所属多播组的IP多播地址时,系统就会根据映射规则从该IP多播地址生成相应的局域网的多播MAC地址。
因特网号码指派管理局IANA,将自己从IEEE注册管理机构申请到的、以太网MAC地址块中从01-00-5E-00-00-00到01-00-5E-7F-FF-FF的多播MAC地址,用于映射IPv4多播地址。
可以看出:D类IP地址可供分配的28比特的前5个比特无法映射到多播MAC地址。这会造成多播IP地址与以太网多播MAC地址的映射关系并不是唯一的。
由于多播IP地址与以太网MAC地址的映射关系不是唯一的,因此收到多播数据报的主机还要在网际层利用软件进行过滤,把不是主机要接收的数据报丢弃。
网际组管理协议(IGMP)
如果要在因特网上进行IP多播,就必须要考虑IP多播数据报经过多个多播路由器进行转发的问题。多播路由器必须根据IP多播数据报首部中的IP多播地址,将其转发到有该多播组成员的局域网。
路由器通过TCP/IP体系结构网际层中的**网际组管理协议(Internet Group Management Protocol,IGMP)**来判断所连接的局域网内是否由多播组成员。
IGMP是让连接在本地局域网上的多播路由器,知道本局域网上是否有主机(实际上是主机中的某个进程)加入或退出了某个多播组。
IGMP报文
IGMP目前的最新版本是2002年10月公布的IGMPv3[RFC 3376]。IGMP有三种报文类型:
- 成员报告报文
- 成员查询报文
- 离开组报文
IGMP报文被封装在IP数据报中传送。
1)IP数据报首部中的协议字段的值为2,表示其数据载荷部分是IGMP报文。
2)IP数据报的目的地址根据其所封装IGMP报文类型各有不同,但都属于IP多播地址。换句话说,封装有IGMP报文的IP数据报都是IP多播数据报。
3)由于IGMP仅在本网络中有效,因此封装有IGMP报文的IP多播数据报,其首部中生存时间(TTL)字段的值被设置为1。这样就可避免封装有IGMP报文的IP多播数据报被路由器转发到其他网络。
IGMP的基本工作原理
1)加入多播组
当一个主机中的某个进程(为了简单起见,下面简称为主机)要加入某个多播组时,该主机会向其所在网络发送一个封装有IGMP成员报告报文的IP多播数据报。
- IGMP成员报告报文中包含要加入的IP多播组的地址。
- IP多播数据报的目的地址也为要加入的IP多播组的地址。
因此,该IP多播数据报实际上会被本网络中所有该多播组的成员以及多播路由器接收(因为多播路由器被设置为接收所有的IP多播数据报)。
如果本网络中还有同组其他成员要发送IGMP成员报告加入该多播组,则监听到该IP多播数据报后就取消发送,因为每个网络中的每个多播组仅需要一个成员发送IGMP成员报告报文即可。
多播路由器会维护一个多播组列表,在该表中记录有该路由器所知的与其直连的各网络中有多播组成员的多播组地址。
如果多播路由器收到一个未知多播组(即该路由器的多播组列表中没有该多播组的地址记录)的IGMP成员报告,就会将该多播组的地址添加到自已的多播组列表中。
多播路由器并不会记录发送该IGMP成员报告的主机的IP地址。这是因为多播路由器并不关心自己所在网络中每个多播组都有哪些成员,而只关心自己所在网下面络中都有哪些多播组。
2)监视多播组的成员变化
多播路由器默认每隔125秒就向其直连的网络发送一个封装有IGMP成员查询报文的IP多播数据报。
- IGMP成员查询报文中包含要查询的特定多播组的地址或表示全部多播组的地址(由32比特“全0”表示)。
- IP多播数据报的目的地址为224.0.0.1,这是一个特殊的IP多播地址,在本网络中的所有参加多播的主机和路由器都会收到该多播数据报。
收到该多播数据报的任意多播组的成员将会发送一个封装有IGMP成员报告报文的IP多播数据报作为应答。
为了减少不必要的重复应答,每个多播组只需要有一个成员应答就可以了,因此采用了一种延迟响应的策略:收到IGMP成员查询报文的主机,并不是立即响应,而是在1~10秒的范围内等待一段随机的时间后再进行响应。如果在这段随机的时间内收到了同组其他成员发送的IGMP成员报告报文,就取消响应。
多播路由器如果长时间没有收到某个多播组的成员报告,则将该多播组从自己的多播组列表中删除,即认为在本网络中没有该多播组的成员,那么该多播组也就不存在于本网络中。
3)退出多播组
IGMPv2在IGMPv1的基础上增加了一个可选项:当主机要退出某个多播组时,可主动发送一个离开组报文而不必等待多播路由器的查询。这样就可使多播路由器能够更快地发现某个组有成员离开。
IGMP离开组报文被封装在IP多播数据报中发送。
- 离开组报文的内容包含主机要退出的多播组的地址。
- IP多播数据报的目的地址为224.0.0.2,这是一个特殊的IP多播地址,在本网络中的所有多播路由器都会收到该多播数据报。
多播路由器在收到离开组报文时不能立即将多播组从自己的多播组列表中删除,因为在本网络中可能还有该多播组的其他成员。
因此,多播路由器在收到离开组报文后,会立即针对该多播组发送一个IGMP成员查询报文。若在预定时间内仍然没有收到该多播组的IGMP成员报告报文,才将该多播组从自己的多播组列表中删除。
多播路由选择协议
IGMP仅在本网络有效,使用IGMP并不能知道多播组所包含的成员数量,也不能知道多播组的成员都分布在哪些网络中。
因此,仅使用IGMP并不能在因特网上进行多播。连接在局域网上的多播路由器还必须和因特网上的其他多播路由器协同工作,以便把多播数据报用最小代价传送给所有的组成员,这就需要使用多播路由选择协议。
多播路由选择协议的主要任务是,在多播路由器之间为每个多播组建立一个多播转发树。多播转发树连接多播源和所有拥有该多播组成员的路由器。
IP多播数据报只要沿着多播转发树进行洪泛,就能被传送到所有拥有该多播组成员的多播路由器。之后,在多播路由器所直连的局域网内,多播路由器通过硬件多播,将IP多播数据报发送给所有该多播组的成员。
目前有以下两种方法来构建多播转发树:
- 基于源树(Source-Base Tree)多播路由选择。
- 组共享树(Group-Shared Tree)多播路由选择。
基于源树的多播路由选择
基于源树的多播路由选择的最典型算法是反向路径多播(Reverse Path Multicasting,RPM)算法。
反向路径多播算法包含以下两个步骤:
1)利用反向路径广播(Reverse Path Broadcasting,RPB)建立一个广播转发树。
2)利用剪枝(Pruning)算法,剪除广播转发树中的下游非成员路由器,获得一个多播转发树。
洪泛(Flooding)法
要建立广播转发树,可以使用洪泛(Flooding)法。
洪泛法是指源节点要向它的所有邻居节点发送广播分组的一个副本。在一个节点收到一个广播分组后,它复制该广播分组并向自己的所有邻居节点(除将该广播分组发送给自己的那个邻居节点)转发。
很显然,如果网络是连通的,这种方法最终可将广播分组的副本传送到网络中的所有节点。然而,如果网络中存在环路,使用洪泛法会产生严重的问题:广播分组的一个或多个副本将在环路中永久兜圈。这种无休止的广播分组的复制和转发,最终将导致该网络中产生大量的广播分组,使得网络带宽被完全占用。
反向路径广播(RPB)
RPB中“反向路径”的意思是,在计算最短路径时把源点当作终点。
RPB可以避免广播分组在环路中兜圈。
RPB的要点是,每一台路由器在收到一个广播分组时,先检查该广播分组是否是从源点经最短路径传送来的。
若是,本路由器就从自己除刚才接收该广播分组的接口的所有其他接口转发该广播分组,否则就丢弃而不转发。
如果本路由器有好几个邻居路由器都处在到源点的最短路径上,也就是存在几条同样长度的最短路径,那么只能选取一条最短路径。选取的规则是这几条最短路径中的邻居路由器的IP地址最小的那条最短路径。
RPB虽然很好地解决了转发环路的问题,但只是实现了广播,要实现真正的多播,还要将没有多播组成员的非成员节点从广播转发树上剪除。
组共享树多播路由选择
可以采用基于核心的分布式生成树算法来建立共享树。该方法在每个多播组中指定一个核心(core)路由器,以该核心路由器为根,建立一棵连接该多播组的所有成员路由器的生成树,作为多播转发树。
每个多播组中除了核心路由器,其他所有成员路由器都会向自己多播组中的核心路由器单播加入报文。
加入报文通过单播朝着核心路由器转发,直到它到达已经属于该多播生成树的某个节点或者直接到达该核心路由器。
在任何一种情况下,加入报文所经过的路径,就确定了一条从单播该报文的边缘节点到核心路由器之间的分支,而这个新分支就被嫁接到现有的多播转发树上。
假设路由器R2、R3、R4、R5和R7的直连网络中都有同一多播组的成员,而R1和R6没有任何多播组成员,R5被选择作为该多播转发树的核心路由器。
1)R4首先加入该多播转发树,R4向R5单播加入报文,链路R4-R5就成为该多播转发树的初始生成树。
2)R3通过R6(尽管R6并没有该多播组成员)向R5单播加入报文,以加入该生成树,单播路径从R3经过R6到达R5,这会使路径R3-R6-R5被嫁接到该生成树上。
3)R2通过向R5直接单播加入报文,以加入该生成树,使链路R2-R5被嫁接到该生成树上。
4)R7通过向R5单播加入报文来加入该生成树,由于R7到R5的单播路径要经过R6,而R6已经加入了该生成树,因此R7的加入报文到达R6,就会使链路R7-R6立即被嫁接到该生成树上。
经过上述过程,就形成了以R5为核心路由器的多播转发树
由于R1没有该多播组的成员,因此R1不会向R5单播加入报文,所以R1不在该生成树上。
当R1收到源主机(不属于该多播组)向该多播组发送的多播分组时,会将该多播分组封装到目的地址为核心路由器R5的单播分组中,将该多播分组发送到R5,然后再由R5将封装在单播分组中的多播分组解封出来,在多播转发树上洪泛多播。
移动IP技术
移动IP(Mobile IP)是因特工程任务组开发的一种技术[RFC3344],该技术使得移动主机在各网络之间漫游时,仍然能够保持其原来的IP地址不变。此外,移动IP技术还为因特网中的非移动主机提供了相应机制,使得它们能够将IP数据报正确发送到移动主机。
基本概念
归属网络、归属地址(永久地址)以及归属代理
在移动IP中,每个移动主机都有一个默认连接的网络或初始申请接入的网络,称为归属网络(Home Network)。
移动主机在归属网络中的IP地址在其整个移动通信过程中是始终不变的,因此称为永久地址(Permanent Address)或归属地址(Home Address)。
在归属网络中,代表移动主机执行移动管理功能的实体称为归属代理(Home Agent)。归属代理通常就是连接在归属网络上的路由器,然而它作为代理的特定功能则是在应用层完成的。
外地网络(被访网络)、外地代理以及转交地址
移动主机当前漫游所在的网络称为外地网络(Foreign Network)或被访网络(Visited Network)。
在外地网络中,帮助移动主机执行移动管理功能的实体称为外地代理(Foreign Agent),外地代理通常就是连接在外地网络上的路由器。
外地代理会为移动主机提供一个临时使用的属于外地网络的转交地址(Care-ofAddress)。
移动IP的工作过程
移动IP的工作过程并不复杂,当移动主机漫游到外地网络时:
1)归属代理会为该移动主机代收所有发送给该移动主机的数据报。
2)归属代理将这些代收的数据报,利用转交地址通过IP-in-IP隧道,转发给移动主机所在外地网络的外地代理。
3)外地代理将这些数据报转发给移动主机。
上述过程对于任何与移动主机进行通信的固定主机而言,都是完全透明的。也就是说,这些固定主机上不需要安装任何特殊的协议或软件来支持与移动主机的通信。
移动IP技术的基本工作原理
代理发现与注册
1)将归属代理和外地代理分别配置在了归属网络和外地网络各自的某个路由器上(它们也可以配置在其他主机或服务器上)。移动主机A的归属网络为218.75.230.0/24,永久地址为218.75.230.16/24。
2)移动主机A从它的归属网络漫游到一个外地网络175.1.0.0/16。移动主机A会通过自己的代理发现协议,与该外地网络中的外地代理建立联系,并从外地代理获得一个属于该外地网络的转交地址175.1.1.1/16,同时向外地代理注册自己的永久地址和归属代理地址。
3)外地代理会将移动主机的永久地址记录在自己的注册表中,并向移动主机的归属代理注册该移动主机的转交地址(也可由移动主机直接进行注册)。
4)归属代理会将移动主机的转交地址记录下来,此后归属代理会代替移动主机接收所有发送给该移动主机的IP数据报,并利用IP隧道技术将这些数据报转发给外地网络中的移动主机。
固定主机向移动主机发送IP数据报
假设固定主机B要给移动主机A发送一份IP数据报。该IP数据报的目的地址为移动主机A的永久地址218.75.230.16,源地址为固定主机B自己的IP地址。
1)该数据报会被路由到移动主机A的归属网络(图4-123中的①),归属代理会代替移动主机A接收该数据报,并将该数据报封装到一份新的IP数据报中转发出去。这份新的IP数据报的目的地址为移动主机A的转交地址175.1.1.1/16,这其实就是外地代理的IP地址。
2)外地代理收到这份新的IP数据报后,将其数据载荷(原IP数据报)解封出来。换句话说,固定主机B发送给移动主机A的IP数据报,被重新封装成一份新的IP数据报,通过从归属代理到外地代理的IP隧道,被传送到隧道的末端,并被外地代理解封出来。
3)外地代理将解封出的原IP数据报,直接转发给位于外地网络中的移动主机A。
移动主机向固定主机发送IP数据报
假设移动主机A要给固定主机B发送一份I数据报。该IP数据报的源地址为移动主机A的水久地址,而目的地址为固定主机B的IP地址。
该IP数据报被移动主机A按照正常的发送流程发送出去即可。由于IP路由器并不关心IP数据报的源地址,因此该IP数据报会被直接路由到固定主机B,而无须再通过归属代理进行转发。
为此,移动主机可以将外地代理作为自己的默认路由器,也可以通过代理发现协议从外地代理获取外地网络中路由器的地址,并将其设置为自己的默认路由器。
同址转交地址
外地代理除了可以配置在外地网络中的某个路由器上,也可以直接运行在移动主机上。当外地代理直接运行在移动主机上时,转交地址被称为同址转交地址(Co-Located Care-of Address)。
在这种情况下,转交地址既是外地代理的地址也是移动主机的地址,因为它们就是同一台设备。这样,移动主机自己将接收所有发往转交地址的IP数据报。
采用同址转交地址方式时,移动主机上要运行额外的外地代理软件。这时,外地网络需要提供相应机制,使移动主机能够自动获取一个外地网络中的地址作为自已的IP地址,这通常需要使用TCP/IP应用层中的动态主机配置协议(DHCP)。
三角形路由问题
上图所示的这种间接路由过程,可能会引起IP数据报转发的低效性,该问题常被称为三角形路由问题(Triangle Routing Problem)。也就是说,即使在固定主机与移动主机之间存在一条更有效的路径,发往移动主机的IP数据报也要先发送给归属代理。
解决三角形路由问题的一种方法是,要求固定主机也要配置一个通信代理,固定主机发送给移动主机的IP数据报,都要通过该通信代理转发。
该通信代理先从归属代理获取移动主机的转交地址,之后所有发送给移动主机的IP数据报,都利用转交地址直接通过IP隧道发送给移动主机的外地代理,而无须再通过移动主机的归属代理进行转发。
但是这种解决方法以增加复杂性为代价,并要求固定主机也要配置通信代理,也就是对固定主机不再透明。
下一代网际协议IPv6
位于TCP/IP体系结构网际层的网际协议(IP),是因特网的核心协议。目前广泛使用的IPv4是在20世纪70年代末期设计的,其IPv4地址的设计存在以下缺陷:
- 由于IPV4的设计者最初并没有想到该协议会在全球范围内广泛使用,因此将IPv4地址的长度规定为他们认为足够长的32比特。
- IPv4地址早期的编址方法(分类的IPv4地址和划分子网的IPv4地址)也不够合理,造成IPv4地址资源的浪费。
因此,现在有些ISP已经开始进行IPv6的过渡。
IPv6引进的主要变化
IPv6仍然支持无连接的、尽最大努力交付的不可靠传输服务,但将协议数据单元称为分组,而不是IPv4的IP数据报。
IPv6引进的主要变化如下:
-
更大的地址空间:IPv6将IPv4的32比特地址空间增大到了128比特,使地址空间增大了29倍。这样巨大的地址空间在采用合理编址方法的情况下,在可预见的未来是不会用完的。
-
扩展的地址层次结构:由于IPv6地址空间巨大,因此可以划分为更多的层次,这样可以更好地反映出因特网的拓扑结构,使得对寻址和路由层次的设计更具灵活性。
-
灵活的首部格式:IPv6数据报的首部与IPv4数据报的首部并不兼容。IPv6定义了许多可选的扩展首部,不仅可提供比IPv4更多的功能,而且还可以提高路由器的处理效率,这是因为路由器对逐跳扩展首部外的其他扩展首部都不进行处理。
-
改进的选项:IPv6允许数据报包含有选项的控制信息,因而可以包含一些新的选允许协议继续扩充:这一点很重要,因为技术总是在不断地发展(如网络硬件的更新),而新的应用也还会出现。然而IPv4的功能却是固定不变的。
-
支持即插即用(即自动配置):IPv6支持主机或路由器自动配置IPv6地址及其他网络配置参数。因此IPv6不需要使用DHCP。
-
支持资源的预分配:IPv6能为实时音视频等要求保证一定带宽和时延的应用,提供更好的服务质量保证。
IPv6数据报的基本首部
IPv6数据报由两部分组成:
- 长度为40字节的基本首部(Base Header)。
- 长度可变的有效载荷(payload,也称为净负荷)。
有效载荷由零个或多个扩展首部(Extension Header)及其后面的数据部分构成。
与IPv4数据报的首部相比,IPv6对首部中的某些字段进行了以下更改:
- 取消了首部长度字段,因为IPv6数据报的首部长度是固定的40字节。
- 取消了服务类型字段,因为IPv6数据报首部中的通信量类和流标号字段实现了服务类型字段的功能。
- 取消了总长度字段,改用有效载荷长度字段。这是因为IPv6数据报的首部长度是固定的40字节,只有其后面的有效载荷长度是可变的。
- 取消了标识、标志和片偏移字段,因为这些功能已包含在IPv6数据报的分片扩展首部中把生存时间(TTL)段改称为跳数限制字段,这样名称与作用更加一致。
- 取消了协议字段,改用下一个首部字段。
- 取消了检验和字段,这样可以加快路由器处理IPv6数据报的速度。
- 取消了选项字段,改用扩展首部来实现选项功能。
IPv6将IPv4数据报首部中不必要的功能取消了,这使得IPv6数据报基本首部中的字段数量减少到只有8个,但由于IPv6地址的长度扩展到了128比特,因此使得IPv6数据报基本首部的长度反而增大到了40字节,比IPv4数据报首部固定部分的长度(20字节)增大了20字节。
IPv6数据报基本首部中各字段的含义:
1)版本(Version)字段:长度为4比特,用来表示IP协议的版本。对于IPv6该字段的值是6。
2)通信量类(Traffic Class)字段:长度为8比特,该字段用来区分不同的IPv6数据报的类别或优先级。目前正在进行不同的通信量类性能的实验。
3)流标号(Flow Label)字段:流标号字段的长度为20比特。IPv6提出流(Flow)的抽象概念。“流”就是因特网上从特定源点到特定终点(单播或多播)的一系列IPv6数据报(如实时音视频数据的传送),而在这个“流”所经过的路径上的所有路由器都保证指明的服务质量。所有属于同一个流的IPv6数据报都具有同样的流标号。也就是说,流标号用于资源预分配。流标号对于实时音视频数据的传送特别有用,但对于传统的非实时数据,流标号则没有用处,把流标号字段的值置为0即可。
4)有效载荷长度(Payload Length)字段:长度为16比特,它指明IPv6数据报基本首部后面的有效载荷(包括扩展首部和数据部分)的字节数量。该字段以字节为单位,最大取值为65535,因此IPv6数据报基本首部后面的有效载荷的最大长度为65535字节,即64KB。
5)下一个首部(Next Header)字段:长度为8比特。该字段相当于IPv4数据报首部中的协议字段或可选字段。
- 当IPv6数据报没有扩展首部时,下一个首部字段的作用与IPv4的协议字段一样,它的值指出了IPv6数据报基本首部后面的数据是何种协议数据单元PDU(例如:6表示TCP报文段,17表示UDP用户数据报)。
- 当IPv6数据报基本首部后面带有扩展首部时,下一个首部字段的值就标识后面第一个扩展首部的类型。
6)跳数限制(Hop Limit):长度为8比特。该字段的作用与IPv4数据报首部中的TTL字段完全一样。IPv6将名称改为跳数限制后,可使名称与作用更加一致。跳数限制字段用来防止IPv6数据报在因特网中永久兜圈。源点在每个IPv6数据报发出时即设定某个跳数限制(最大为255跳)。每个路由器在转发IPv6数据报时,要先把跳数限制字段中的值减1。当跳数限制的值为0时,就把这个IPv6数据报丢弃。
7)源地址:源地址字段的长度为128比特。用来填写IPv6数据报的发送端的IPv6地址。
8)目的地址:目的地址字段的长度为128比特。用来填写IPv6数据报的接收端的IPv6地址。
IPv6数据报的扩展首部
IPv4数据报如果在其首部中使用了选项字段,则在数据报的整个传送路径中的全部路由器,都要对选项字段进行检查,这就降低了路由器处理数据报的速度。实际上,在路径中的路由器对很多选项是不需要检查的。
因此,为了提高路由器对数据报的处理效率,IPv6把原来IPv4首部中的选项字段都放在了扩展首部中,由路径两端的源点和终点的主机来处理,而数据报传送路径中的所有路由器都不处理这些扩展首部(除逐跳选项扩展首部)。
在[RFC2460]中定义了以下六种扩展首部:
- 逐跳选项
- 路由选择
- 分片
- 鉴别
- 封装安全有效载荷
- 目的站选项
每一个扩展首部都由若干字段组成,它们的长度也各不相同。但所有扩展首部中的第个字段都是8比特的“下一个首部”字段。该字段的值指出在该扩展首部后面的字段是什么。
当使用多个扩展首部时,应按以上的先后顺序出现,高层首部总是放在最后面。
IPv6地址
在IPv6中,主机和路由器均被称为节点。由于一个节点可能会有多个接口分别通过不同的链路与其他一些节点相连,因此IPv6给节点的每一个接口都指派一个IPv6地址。这样使得一个节点可以有多个单播地址,而其中任何一个单播地址都可以被当作到达该节点的目的地址。
IPv6地址空间大小
在IPv6中,每个地址占128比特,因此IPv6地址空间的大小为2128(大于3.4×1038)。显然,这样巨大的地址空间在采用合理编址方法的情况下,在可预见的未来是不会用完的。
IPv6地址的表示方法
由128比特构成的IPv6地址,如果再使用由32比特构成的IPv4地址的点分十进制记法来表示,就非常不方便了。
为了使IPv6地址的表示再简洁一些,IPv6采用冒号十六进制记法(colon hexadecimal notation):
1)将128比特的IPv6地址以每16比特分为1组(共8组),每组之间使用冒号“:”分隔。
2)将每组中的每4比特转换为1个十六进制数。
在IPv6地址的冒号十六进制记法的基础上,再使用**“左侧零”省略和“连续零”压缩**,可使IPv6地址的表示更加简洁。
- “左侧零”省略是指两个冒号间的十六进制数中最前面的一串0可以省略不写,例如000F可缩写为F。
- “连续零”压缩是指一连串连续的0可以用一对冒号取代,例如2001:0:0:0:0:0:0:ffd可缩写为2001::ffd。
注意:在一个IPv6地址中只能使用一次“连续零”压缩,否则会导致歧义。
另外,冒号十六进制记法还可结合点分十进制的后缀。这在IPv4向IPv6的过渡阶段非常有用。例如,下面是某个冒号十六进制记法结合点分十进制后缀的IPv6地址:0:0:0:0:0:ffff:192.168.1.1
在这种记法中,被冒号“:”分隔的每个值,是16比特的十六进制形式;被每个点“.”分隔的每个值,是8比特的十进制形式。再使用“连续零”压缩即可得出:::ffff:192.168.1.1
CIDR的斜线表示法在IPv6中仍然可用。例如,下面是一个指明了60比特前缀的IPv6地址:2001:0db8:0000:cd30:0000:0000:0000:0000/60
还可记为:2001:db8::cd30:0:0:0:0/60
或:2001:db8:0:cd30::/60
IPv6地址分类
1)IPv6数据报的目的地址有三种基本类型:
- 单播(unicast):传统的点对点通信。
- 多播(multicast):一点对多点的通信。数据报发送到一组计算机中的每一个。IPv6没有采用广播的术语,而将广播看作多播的一个特例。
- 任播(anycast):这是IPv6新增的一种类型。任播的终点是一组计算机,但数据报只交付其中的一个,通常是距离最近的一个。
2)IPv6五类地址:
- 未指明地址:这是128比特为“全0”的地址,可缩写为两个冒号“::”。该地址不能用作目的地址,只能用于还没有配置到一个标准IPv6地址的主机用作源地址。未指明地址仅此一个。
- 环回地址:IPv6的环回地址是0:0:0:0:0:0:0:1,可缩写为::1。该地址的作用与IPv4的环回地址相同,但IPv6的环回地址仅此一个。
- 多播地址:最高8比特为“全1”的IPv6地址,可记为FF00::/8。功能和IPv4一样。这类地址占IPv6地址空间的1/256。
- 本地链路单播地址:最高10比特为1111111010的IPv6地址,可记为FE80::/10。即使用户网络没有连接到因特网,但仍然可以使用TCP/IP协议。连接在这种网络上的主机都可以使用本地链路单播地址进行通信,但不能和因特网上的其他主机通信。这类地址占IPv6地址空间的1/1024。
- 全球单播地址:IPv6的全球单播地址是使用得最多的一类。IPv6全球单播地址采用三级结构,这是为了使路由器可以更快地查找路由。
IPv6全球单播地址的三级结构:
- 全球路由选择前缀(Global Routing Prefix)为第一级地址,占48个比特,分配给公司和机构,用于因特网中路由器的路由选择,相当于IPv4分类地址中的网络号。
- 子网标识符(Subnet ID)为第二级地址,占16个比特,用于各公司和机构构建自己的子网。
- 接口标识符(Interface ID)为第三级地址,占64个比特,用于指明主机或路由器的单个网络接口,相当于IPv4分类地址中的主机号。与IPv4不同,IPv6地址的接口标识符有64个比特之多,足以将各种接口的硬件地址直接进行编码。这样,IPv6可直接从128比特地址的最后64比特中直接提取出相应的硬件地址,而不需要使用地址解析协议(ARP)进行地址解析了。
从IPv4向IPv6过渡
因特网上使用IPv4的路由器的数量太大,要让所有路由器都改用IPv6并不能一蹴而就。因此,从IPv4转变到IPv6只能采用逐步演进的办法。另外,新部署的IPv6系统必须能够向后兼容,也就是IPv6系统必须能够接收和转发IPv4数据报,并且能够为IPv4数据报选择路由。
使用双协议栈
双协议栈(Dual Stack)是指在完全过渡到IPv6之前,使一部分主机或路由器装有IPv4和IPv6两套协议栈。因此双协议栈主机或路由器既可以和IPv6系统通信,又可以和IPv4系统通信。双协议栈的主机或路由器记为IPv6/IPv4,表明它具有一个IPv6地址和一个IPv4地址。
双协议栈主机在与IPv6主机通信时采用IPv6地址,而与IPv4主机通信时采用IPv4地址。
那么双协议栈主机是怎样知道目的主机采用的是哪一种地址呢?
实际上,双协议栈主机使用应用层的域名系统(DNS)进行查询。若DNS返回的是IPv4地址,双协议的源主机就使用IPv4地址。若DNS返回的是IPv6地址,双协议栈的源主机就使用IPv6地址。
在上图中,主机A和B都使用IPv6,路由器R1和R4是IPv6/IPv4路由器,路由器R2和R3是IPv4路由器。假设主机A给B发送一个IPv6数据报,路径是A→R1→R2→R3→R4→B。R1到R4这段路径是IPv4网络。
1)路由器R1不能向R2转发IPv6数据报,因为R2只使用IPv4协议。由于R1是IPv6/IPv4路由器,因此R1可把IPv6数据报首部转换为IPv4数据报首部(使IPv6数据报转换成IPv4数据报)后发送给R2。
2)R2将收到的IPv4数据报转发给R3。
3)R3将收到的IPv4数据报转发给R4。
4)R4是IPv6/IPv4路由器,因此R4把IPv4数据报恢复成原来的IPv6数据报发送给主机B。
注意:IPv6首部中的某些字段无法恢复。例如,原来IPv6首部中的流标号X在最后恢复出的IPv6数据报中只能变为空缺。这种信息的损失是使用首部转换方法所不能避免的。
使用隧道技术
从IPv4向IPv6过渡的另一种方法是隧道技术(Tunneling)。
这种方法的核心思想是在IPv6数据报要进入IPv4网络时,将IPv6数据报重新封装成为IPv4数据报,即整个IPv6数据报成为IPv4数据报的数据部分。然后IPv4数据报就在IPv4网络中传输。当IPv4数据报要离开IPv4网络时,再将其数据部分(即原来的IPv6数据报)取出并转发到IPv6网络。
网际控制报文协议ICMPv6
由于IPv6与IPv4一样,都不确保数据报的可靠交付,因此IPv6也需要使用网际控制报文协议来反馈一些差错信息,相应的ICMP版本为ICMPv6。
ICMPv6比ICMPv4要复杂得多,它合并了原来地址解析协议和网际组管理协议的功能。因此与IPv6配套使用的网际层协议就只有ICMPv6这一个协议。
ICMPv6报文需要封装成IPv6数据报进行发送。ICMPv6报文的前面是IPv6基本首部和零个或多个IPv6扩展首部。
在ICMPv6前面的一个首部(也可能是扩展首部)中的“下一个首部”字段的值应当置为58。这和IPv4数据报首部中协议字段用来标志ICMP的值不同,在IPv4中标志ICMP的值是1。
ICMPv6报文可被用来报告差错、获取信息、探测邻站或管理多播通信。
在对ICMPv6报文进行归类时,不同的RFC文档使用了不同的策略。
例如,在[RFC 2463]中定义了六种类型的ICMPv6报文,在[RFC 2461]中定义了五种类型的ICMPv6报文,而在[RFC 2710]中定义了三种类型的ICMPv6报文。下表给出的是比较常用的几种ICMPv6报文。
从表中可以看出:ICMPv6合并了原来ARP和IGMP的功能。ICMPv6邻站询问和邻站通告报文替代了原来的ARP协议,而ICMPv6多播听众发现报文替代了原来的IGMP协议。
软件定义网络
软件定义网络(Software Defined Network,SDN)的概念最早由斯坦福大学的Nick McKeown教授于2009年提出。相比传统广域网,基于SDN的专用广域网B4确实可以在很大程度上提高网络带宽利用率,使得网络运行更加稳定,网络管理更加简化和高效,运行费用显著降低。
网络层的数据层面和控制层面
路由器的功能是分组转发和路由选择。因此,路由器之间传送的信息可以分为以下两大类:
- 源主机和目的主机之间所传送的信息。路由器为源主机和目的主机提供转发服务,采用“接力赛”方式把源主机所发送的分组从一个路由器转发到下一个路由器,最终把分组传送到目的主机。
- 路由信息。网络中各路由器根据路由选择协议所使用的路由算法,彼此周期性地交换路由信息分组,目的是建立各自的路由表,并由路由表得出转发表,为分组转发所用。
可以把路由器的网络层抽象地划分为两个层面(plane):数据层面(或称转发层面)和控制层面。
- 在数据层面中,每一个路由器基于自己生成的转发表来转发分组。为了提高转发速率,现在的路由器一般都基于硬件进行转发,单个分组的转发时间为纳秒(10-秒)数量级。
- 在控制层面中,每一个路由器无法独自创建出自己的路由表。路由器必须和相邻的路由器周期性地交换路由信息,然后才能创建出自己的路由表。根据路由选择协议所使用的路由算法计算路由,需要由软件来完成,这需要花费较多的时间,一般是秒的数量级。
在传统因特网中的每一个路由器中,既有数据层面也有控制层面。但在SDN结构中,路由器中的路由选择软件都不存在了,因此路由器之间不再相互交换路由信息。
在网络的控制层面有一个在逻辑上集中的远程控制器。逻辑上的远程控制器在物理上可由不同地点的多个服务器组成。远程控制器掌握各主机和整个网络的状态,能够为每一个分组计算出最佳的路由,然后在每一个路由器中生成其正确的转发表。这样,路由器的工作就变得非常单纯,也就是对接收到的分组进行查表转发即可。
OpenFlow 协议
OpenFlow协议是一个得到高度认可的标准,在讨论SDN时往往与OpenFlow一起讨论。SDN是一种新型网络体系结构,是一种设计、构建和管理网络的新方法和新概念,其核心思想就是把网络的控制层面和数据层面分离,而让控制层面利用软件来控制数据层面中的许多设备。
OpenFlow协议可被看作在SDN体系结构中控制层面与数据层面之间的通信接口。
OpenFlow协议使得控制层面的控制器可以对数据层面中的物理设备或虚拟设备进行直接访间和控制。这种控制在逻辑上是集中式的、基于流的控制。
传统意义上的数据层面的任务
传统意义上的数据层面的任务就是根据转发表转发分组。可将转发分组分为以下两个步骤:
1)进行“匹配”:查找转发表中的网络前缀,进行最长前缀匹配。
2)执行“动作”:把分组从匹配结果指明的接口转发出去。
这种“匹配+动作”的转发方式在SDN中得到了扩充,增加了新的内容,变成了广义的转发。
SDN中的广义转发
SDN的广义转发包含两部分:
-
“匹配”:能够对网络体系结构中各层(数据链路层、网络层、运输层)的首部中的字段进行匹配。
-
“动作”:不仅是转发分组,而且可以进行负载均衡,也就是可以把具有同样目的地址的分组从不同的接口转发出去。还可以重写IP首部(如同在NAT路由器中的地址转换),或者可以人为地阻挡或丢弃一些分组(如同在防火墙中一样)。
OpenFlow交换机和流表
OpenFlow交换机、流表、SDN远程控制器三者之间的关系
在SDN的广义转发中,完成“匹配+动作”的设备并不局限在网络层工作,因此不再称为路由器,而称为“OpenFlow交换机”或“分组交换机”,或更简单地称为“交换机”。相应地,在SDN中取代传统路由器中转发表的是“流表(Flow Table)”。
从OpenFlow交换机的角度来看,一个流就是穿过网络的一种分组序列,而在此序列中的每个分组都共享分组首部某些字段的值。例如,某个流可以是具有相同源IP地址和目的IP地址的一连串分组。
OpenFlow交换机中的流表是由SDN远程控制器来管理的。
SDN远程控制器通过一个安全信道,使用OpenFlow协议来管理OpenFlow交换机中的流表。
这样OpenFlow就有了双重意义:
- OpenFlow是SDN远程控制器与网络设备之间的通信协议。
- OpenFlow又是网络交换功能的逻辑结构的规约。
流表中的各字段
每个OpenFlow交换机必须有一个或多个流表。每一个流表可以包含多个流表项(Flow Entry)。
流表项包含三个字段:首部字段值(或称匹配字段)、计数器和动作。
- 首部字段值字段:含有一组字段,用来使入分组(Incoming Packet)的对应首部与之匹配,因此又称为匹配字段。匹配不上的分组就被丢弃,或被发送到SDN远程控制器做更多的处理。首部字段值字段(匹配字段)包含11个项目,涉及数据链路层、网际层和运输层三个层次的首部。在OpenFlow交换机中,既可以处理数据链路层的帧,也可以处理网际层的IP数据报,还可以处理运输层的TCP或UDP报文。
- 计数器字段:是一组计数器,包括已经与该流表项匹配的分组数量,以及从该流表项上次更新到现在经历的时间。
- 动作字段:是一组动作,例如,当分组匹配某个流表项时把分组转发到指明的端口,或丢弃该分组,或把分组进行复制后再从多个端口转发出去,或重写分组的首部字段(包括数据链路层、网际层和运输层的首部)。
SDN体系结构
SDN体系结构的四个关键特征
基于流的转发
由SDN控制器控制的分组交换机分布在数据层面中,而分组的转发可以基于数据链路层、网络层和运输层协议数据单元中的首部字段的值进行。这与传统路由器仅根据IP数据报的目的IP地址进行转发有着明显的区别。
各分组交换机的流表中的流表项,都是由SDN控制器进行计算、管理和安装的。这样,SDN的转发规则都详细规定在各分组交换机的流表中。
数据层面与控制层面分离
在传统的转发设备路由器中,数据层面与控制层面都位于同一个设备中。但在SDN中,数据层面与控制层面是分离的,也就是二者不在同一个设备中。
数据层面有许多相对简单而快速的分组交换机,这些分组交换机基于各自的流表执行“匹配+动作”的规则。
控制层面则由若干服务器和相应的软件组成,这些服务器和软件计算并管理这些分组交换机中的流表。
位于数据层面分组交换机之外的网络控制功能
SDN中的控制层面是用各类软件实现的,而且这些软件还可以处于不同的机器上,并且还可能远离位于数据层面的分组交换机。
SDN控制层面的软件实现包含两个构件:
SDN控制器,也就是网络操作系统。
若干个网络控制应用程序。
SDN控制器维护准确的网络状态信息(例如,远程链路、分组交换机和主机的状态),并把这些信息提供给运行在控制层面的各种控制应用程序,以及提供一些方法使得这些控制层面的应用程序,能够对数据层面中的分组交换机进行监视、编程和控制。
可编程的网络
通过在SDN控制层面中的一些网络控制应用程序,使得整个SDN网络成为可编程的网络。
SDN控制器使用服务器托管网这些网络控制应用程序,来控制数据层面中的各分组交换机。例如,路由选择网络控制应用程序能够确定源点和终点之间的端到端路径。
网络控制应用程序还可以决定哪些分组在进入某个分组交换机时必须被阻挡,也就是进行接入控制。
另外,网络控制应用程序还可以配置分组交换机在转发分组时执行负载均衡的措施。
从SDN体系结构的四个关键特征可以看出:SDN把网络的许多功能都分离开了。数据层面的交换机、控制层面的SDN控制器和许多网络控制应用程序,这些都是可以分开的实体,并且可由不同厂商和机构来提供。这与传统网络截然不同。在传统网络中,路由器或交换机是由单独的厂商提供的,其控制层面和数据层面以及协议的实现,都是集成在一个设备里面的。
SDN控制器
在SDN体系结构中,SDN控制器是最复杂的,它还可以划分成如图4-142所示的三个层次。
通信层
通信层是SDN控制器中的底层,其任务是完成SDN控制器与位于数据层面中的受控的网络设备之间的通信。
除了SDN控制器向受控的网络设备发送控制信息,这些设备还必须能够向SDN控制器传送在本地观察到的事件。例如,用一个报文指示某条链路正常工作或出故障而断开了,或指示某个设备刚刚接入到网络中,或者某种信号突然出现可以表示某个设备已加电并可以工作了。
这样就可确保SDN控制器掌握了网络状态的最新视图。
要完成SDN控制器与受控的网络设备之间的通信,则通信双方必须使用相同的通信协议。OpenFlow协议就是目前被广泛采用的SDN控制器通信层的协议。
网络范围的状态管理层
网络范围的状态管理层是SDN控制器的中间层。
SDN控制层面若要做出任何最终的控制决定(例如,在所有的分组交换机中配置流表以便进行端到端的转发,或实现负载均衡,或实现某种特殊的防火墙能力),就需要让控制器掌握全网的主机信息、链路信息、分组交换机信息,以及其他受SDN控制器控制的设备的信息。
分组交换机的流表中包含计数器,这些计数器的值对网络应用程序来说必须是可用的。由于控制层面的最终目的是确定各种被控设备的流表,因此SDN控制器还需要维护这些流表的副本。
所有上述这些信息构成由SDN控制器维护的网络范围状态。
到网络控制应用程序层的接口
到网络控制应用程序层的接口是SDN控制器的顶层。
SDN控制器与网络控制应用程序的交互都要通过北向API接口。该API接口允许网络控制应用程序对网络范围的状态管理层中的网络状态和流表进行读写操作。
网络控制应用程序事先已进行了注册。当状态变化的事件出现时,网络控制应用程序把得到的网络事件进行通告,并采取相应的动作,例如计算新的最低开销的路径。
该层可提供不同类型的API。例如,REST风格的API目前使用得较多,即表述性状态传递(Representational State Transfer,REST),是一种针对网络应用的设计和开发方法。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net