网络层:数据平面
网络中每一台主机和路由器都有一个网络层部分。
网络层能够被分解为两个相互作用的部,即数据平面和控制平面。
-
网络层数据平面: 网络层中每台路由器的功能,该数据平面能决定到达路由器输入链路之一的数据报(网络层分组)如何转发到该路由器输出链路之一。 传统IP转发: 转发基于数据报的目的地址。 通用转发: 可使用数据报首部中几个不同域的值执行转发和其他功能。 -
网络层控制平面: 即网络范围的逻辑,该控制平面功能控制数据报沿着从源主机到目的主机的端到端路径中路由器之间的路由方式。 路由选择算法。 OSPF/BGP等路由选择协议。
软件定义网络(Software-Defined Networking, SDN)通过将这些控制平面功能作为一种单独服务,明确地分离数据平面和控制平面,控制平面功能通常置于一台远程“控制器”中。
网络层概述
下图显示了一个简单的网络。
其中有H1,H2两台主机,在两台主机之间的路径上有几台路由器。 假设H1向H2发送消息,H1中的网络层取得来自H1运输层的报文段,将每个报文段封装成一个数据报,然后向相邻路由器R1发送该数据报。
在接收方主机H2,网络层收到来自相邻路由器R2的数据报,提取出运输层报文段,并将其向上交付给H2的运输层。
每台路由器的数据平面的主要作用是从其输入链路向其输出链路转发数据报; 控制码的主要作用是协调这些本地的没路由器转发动作,使得数据报沿着源目的地主机之间的路由器路径最终进行端到端传送。
路由器只包含网络层/数据链路层/物理层协议部分。具有截断的协议栈,即没有网络层以上的部分。
转发和路由选择:数据平面和控制平面
网络层的作用表面看极简单,即将分组从一台发送主机移动到一台接收主机。
需要使用两种重要的网络层功能:
- 转发
当一个分组到达某路由器的一条输入链路时,该路由器必须将该分组移动到适当的输出链路。 - 路由选择
当分组从发送方流向接收方时,网络层须决定这些分组所采用的路由或路径。 计算路径的算法称为路由选择算法(routing algorithm)。
转发(forwarding)指将分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作。 转发发生的时间尺度很短(通常为几纳秒),因此通常用硬件实现。
路由选择(routing)指确定分组从源到目的地所采取的端到端路径的网络范围处理过程。 路由选择发生的时间尺度长得多(通常为几秒),因此通常用软件实现。
每台网络路由器中有一个关键元素是它的转发表(forwarding table)。 路由器检查到达分组首部的一个或多个字段值,进而使用这些首部值在其转发表中索引,通过这种方法来转发分组。 这些值对应存储在转发表项中的值,指出了该分组将被转发的路由器的输出链路接口。
1. 控制平面:传统的方法
如图4-2所示,路由选择算法决定插入该路由器转发表的内容。 路由选择算法运行在每台路由器中,并且在每台路由器中都包含了转发和路由选择两种功能。
在一台路由器中的路由选择算法与在其他路由器中的路由选择算法通信,以计算出它的转发表的值。
通过根据路由选择协议交换包含路由 选择信息的路由选择报文!
2. 控制平面:SDN方法
图4-2中显示的实现路由选择功能的方法,是路由选择厂商在其产品中采用传统方法。
每台路由器有一个与其他路由器的路由选择组件通信的路由选择组件。
图4-3显示从路由器物理上分离的另一方法,远程控制器计算和分发转发表以供每台路由器使用。
图4-3中,控制平面路由选择功能与物理的路由器是分离的,即路由选择设备仅执行转发,而远程控制器计算并分发转发表。 远程控制器可能实现在具有高可靠性和冗余的远程数据中心中,并可能有ISP或某些第三方管理。
路由器和远程控制器,通过交换包含转发表和其他路由选择信息的报文进行通信。 图4-3中的控制平面方法是软件定义网络(Software-Defined Networking, SDN)的本质,因为计算转发表并与路由器交互的控制器用软件实现,故网络是“软件定义”的。
网络服务模型
网络服务模型(network service model)定义了分组在发送与接收端系统间的端到端运输特性。
考虑网络层能提供的某些可能服务。这些服务可能包括:
- 确保交付
该服务确保分组将最终到达目的地。 - 具有时延界限的确保交付
该服务不仅确保分组的交付,而且在特定的主机到主机时延上界内交付。 - 有序分组交付
该服务确保分组以它们发送的顺序到达目的地。 - 确保最小带宽
这种网络层服务模仿在发送和接收主机之间一条特定比特率的传输链路的行为。 - 安全性
网络层能够在源加密所有数据报并在目的地界面这些分组,从而对所有运输层报文段提供机密性。
因特网的网络层提供单一服务,称为尽力而为服务(best-effort service)。
使用尽力而为服务,传送的分组既不能保证以它们发送的顺序被接收,也不能保证它们最终交付;既不能保证端到端时延,也不能保证有最小的带宽。
尽力而为服务看起来是根本无服务的一种委婉说法,即一个没有向目的地交付分组的网络也符合尽力而为交付服务的定义!
约定术语分组交换机是指一台通用分组交换设备,它根据分组首部字段中的值,从输入链路接口到输出链路接口转移分组。
某些分组交换机称为链路层交换机(link-layer switch),基于链路层帧中的字段值做出转发决定,这些交换机因此被称为链路层设备。
其他分组交换机称为路由器(router),基于网络层数据报中的首部字段值做出转发决定。路由器因此是网络层设备。
路由器工作原理
网络层的转发功能,即时间将分组从一台路由器的入链路传送到适当的出链路。
图中显示了一个通用路由器体系结构的总体视图,其中标识了一台路由器的4个组件。
-
输入端口(input port) 在路由器中执行终结入物理链路的物理层功能(显示在图中输入端口部分最左侧的防控与输出端口部分最右侧的方框中)。 还要与位于链路远端的数据链路层交互来执行数据链路层功能(显示在输入与输出端口部分中间的方框中)。 在输入端口还要执行查找功能(显示在输入端口最右侧的方框中)。 通过查询转发表决定路由器的输出端口,到达的分组通过路由器的交换结构转发到输出端口。 控制分组(如携带路由选择协议信息的分组)从输入端口转发到路由选择处理器。 -
交换结构 将路由器的输入端口连接到它的输出端口。 这种交换结构完全包含在路由器中,是一个网络路由器中的网络! -
输出端口 存储从交换结构接收的分组,并通过执行必要的链路层和物理层功能在输出链路上传输这些分组。 当一条链路是双向的时(即承载两个方向的流量),输出端口通常与该链路的输入端口成对出现在同一线路卡上。 -
路由选择处理器 路由选择处理器执行控制平面功能。 在传统路由器中,它执行路由选择协议,维护路由选择表 关联链路状态信息,并为该路由器计算转发表。 SDN路由器中,路由选择处理器负责与远程控制器通信,目的是接收由远程控制器计算的转发表项,并在该路由器的输入端口安装这些表项。 路由选择处理器还执行网络管理功能。
路由器的输入端口,输出端口,交换结构总是用硬件实现。 当数据平面以纳秒时间尺度运行时,路由器的控制功能以毫秒或秒时间尺度运行,这些控制功能包括执行路由选择协议、对上线或下线的连接链路进行响应、与远程控制器通信(在SDN场合)和执行管理功能。
控制平面(control plane)的功能通常用软件实现,并在路由选择处理器(通常是一种传统的CPU)上执行。
假定该立交桥是环状交叉路,在汽车进入该环状交叉路前,需要做一点处理,如下:
输入端口处理和基于目的地转发
输入端口的线路端接功能与链路层处理实现了用于各个输入链路的物理层和链路层。 在这个地方,路由器使用转发表来查找输出端口,使到达的分组能经过交换结构转发到该输出端口。
转发表是由路由选择处理计算和更新的,或者转发表接收来自远程SDN控制器的内容。
转发表从路由选择处理器经过独立总线复制到线路卡。
使用在每个输入端口的影子副本,转发决策能在每个输入端口本地做出,无须基于每个分组调用集中式路由选择处理器,因此避免了集中处理的瓶颈。
考虑最简单情况,一个入分组基于该分组的目的地址交换到输出端口。 作为一个说明处理规模问题例子,假设路由器有4条链路,编号0到3,分组按地址范围,分别转发到对应链路接口
能够有一个如下仅包括4个表项的转发表:
使用这种风格的转发表,路由器用分组目的地址的前缀(prefix)与该表表项匹配;如果存在一个匹配项,则路由器向该匹配项相关联的链路转发分组。
当有多个匹配时,该路由器使用最长前缀匹配规则(longest prefix matching rule);即在该表中寻找最长的匹配项,并向与最长前缀匹配相关联的链路接口转发分组。
一旦通过查找确定了某分组的输出端口,则该分组就能发送进入交换结构。
查找在输入端口处理中可认为是最重要动作,其他动作是:
- 必须出现物理层和链路层处理
- 必须检查分组版本号,检验,寿命,重写后两个字段
- 必须更新用于网络管理的计数器
交换
交换结构位于一台路由器的核心部分,因为 正是通过这种交换结构,分组才能实际地从一个输入端口交换(即转发)到一个输出端口。
交换的完成方式:
-
经内存交换 最简单、最早的路由器是传统计算机,在输入与输出端口之间的交换是在CPU(路由选择处理器)的直接控制下完成。 输入和输出端口功能像传统操作系统中的I/O设备一样。 一个分组到达一个输入端口时,该端口会先通过中断方式向路由选择处理器发出信号。 分组从输入端口处被复制到处理器内存。 路由选择处理器则从其首部中提取目的地址,在转发表找输出端口,并将分组复制到输出端口缓存。 这时,如内存带宽为每秒可写进内存或从内存读出最多B个分组,则总的转发吞吐量(分组从输入端口被传送到输出端口的总速率)必小于B/2。 许多现代路由器通过内存进行交换。 差别是:目的地址的查找,将分组存储进适当的内存存储位置由输入线路卡完成 -
经总线交换 输入端口经一根共享总线,将分组直接传送到输出端口,不需路由器选择处理器的干预。 让输入端口为分组预先计划一个交换机内部标签(首部),指示本地输出端口,使分组在总线上传送和传输到输出端口。 分组能由所有输出端口收到,但只有与该标签匹配的端口才能保存该分组。 然后标签在输出端口被去除。 如多个分组同时到达路由器,每个位于不同输出端口 一次只能一个分组跨越单一总线。 -
经互联网络交换 多个总线组成互联网络。 如图4-6。 每条垂直的总线在交叉点与每条水平的总线交叉 交叉点通过交换结构控制器能在任何时候开启和闭合。 当某分组到达端口A,需转发到端口Y时,交换机控制器闭合总线A和Y交叉部分的交叉点,然后端口A在其总线上发送该分组,该分组由总线Y接收。 来自端口B的一个分组在同一时间能转发到端口X, 因为A到Y和B到X的分组使用不同的输入和输出总线。 纵横式网络可并行转发多个分组。 纵横式交换机是非阻塞的,即只要没其他分组当前被转发到该输出端口,转发到输出端口的分组将不会被达到输出端口的分组阻塞
输出端口处理
输出端口取出已经存放在输出端口内存的分组,将其发送到输出链路。
包括选择,取出,链路层和物理层传输。
何处出现排队
在输入端口和输出端口处,可形成分组队列。
排队的位置和程度(或者在输入端口排队,或者在输出端口排队)将取决于流量负载,交换结构的相对速率和线路速率。 随着这些队列的增长,路由器的缓存空间将耗尽,无内存可用时,存储到达分组时将出现丢包。
假设:输入线路速度和输出线路速度(传输速率)相同,均为
R
l
i
n
e
R_{line}
Rline?(单位为每秒分组数),并且有N个输入端口,N个输出端口。 进一步简化,假设所有分组有相同固定长度,分组以同步方式到达输入端口。 即,在任何链路发送分组的时间等于任何链路接收分组的时间。
在这样时间间隔内,在一个输入链路能到达0或1个分组 定义交换结构传送速率
R
s
w
i
t
c
h
R_{switch}
Rswitch?为从输入端口到输出端口能移动分组的速率。 如果
R
s
w
i
t
c
h
R_{switch}
Rswitch?比
R
l
i
n
e
R_{line}
Rline?快N倍,则在输入端口处仅会出现微小的排队。
1. 输入排队
如果交换结构不能快的使所有分组无时延通过,会发生什么? 这种情况,在输入端口将出现分组排队。
假定,基于纵横式交换:
- 所有链路速度相同。
- 一个分组能以一条输入链路接收一个分组所用的相同的时间量,从任意一个输入端口传到给定输出端口。
- 分组按FCFS方式,从一指定输入队列移动到其要求的输出队列中。
只要输出端口不同,多个分组可并行传送。 如果位于两输入队列前端的两个分组是发往同一输出队列的,则其中一个分组被阻塞,且需在输入队列等待。交换结构一次只能传送一个分组到指定端口。
因为队列前分组本次由于和其他队列前某分组导向同一目的端口,而未被选中,本次阻塞,导致其后一分组,也等待,称为线路前部阻塞。
2. 输出排队
假设
R
s
w
i
t
c
h
R_{switch}
Rswitch?比
R
l
i
n
e
R_{line}
Rline?快N倍,并且到达N个输入端口的每个端口的分组,其目的地是相同的输出端口。 这时,在向输出链路发送一个分组的时间内,将有N个新分组到达该输出端口。
因为输出端口在一个单位时间(该分组的传输时间)内仅能传输一个分组,这N个到达分组必须排队经输出链路传输。
当没有足够内存来缓存一个入分组时,就必须决定: 要么丢弃到达的分组(采用一种称为弃尾(drop-tail)的策略),要么删除一个或多个已排队的分组为新浪的分组腾出空间。
某些情况下,缓存填满前便丢弃一个分组,称为主动队列管理算法。
分组调度
1. 先进先出
如果链路当前正忙于传输另一个分组,到达链路输出队列的分组要排队等待传输。 如果没有足够的缓存空间来容纳到达的分组,队列的分组丢弃策略则确定该分组是否将被丢弃(丢失)或者从队列中去除其他分组以便为到达的分组腾出空间。
FIFO(也称为先来先服务, FCFS)调度规则按照分组到达输出链路队列的相同次序来选择分组在链路上的传输。
分组的到达由上班时间线上带编号的箭头来指示,用编号指示了分组到达的次序。 各个分组的离开表示钻下部时间线的下面。 分组在服务中(被传输)花费的时间是通过这两个时间线之间的阴影矩形来指示的。
2.优先权排队
到达输入链路的分组被分类放入输出队列中的优先权类。
每个优先权类通常有自己的队列。
在同一优先权类的分组之间的选择通常以FIFO方式完成。
在非抢占式优先排队(non-preemptive priority queuing)规则下,一旦分组开始传输,就不能打断。
3. 循环和加权公平排队
循环排队规则(round robin queuing discipline)下,分组像使用有限权排队那样被分类。
但在类之间不存在严格的服务优先权,循环调度器在这些类之间轮流提供服务。
最简单形式循环调度中,类1的分组被传输,接着是类2的分组,接着又是类1的分组,如此往复。
一个所谓的保持工作排队(work-conserving queuing)规则,在有(任何类的)分组排队等待传输时,不允许链路保持空闲。 当寻找给定类的分组但没找到时,保持工作的循环规则将立即检查循环序列的下一个类。
一种通用形式的循环排队已经广泛实现在路由器中,即所谓的加权公平排队(Weighted Fair Queuing, WFQ)规则。 到达的分组被分类并在合适的每个类的等待区域排队。 与循环调度一样,WFQ调度器也以循环方式为各个类提供服务。 WFQ(加权公平排队)和循环排队的不同在于: 每个类在任何时间间隔内可能收到不同数量的服务。 具体而言,每个类i被分配一个权
w
i
w_{i}
wi?。 使用WFQ方式,在类i有分组要发送的任何时间间隔, 第i类将确保接收到的服务部分等于
w
i
/
(
∑
w
j
)
w_{i}/(∑w_{j})
wi?/(∑wj?),式中分母中的和是计算所有有分组排队等待传输的类别得到的。 对一条传输速率为R的链路,第i类总能获得至少为
R
?
w
i
/
(
∑
w
j
)
R*w_{i}/(∑w_{j})
R?wi?/(∑wj?)的吞吐量。
网际协议:IPv4、寻址、IPv6及其他
IPv4 数据报格式
IPv4数据报中的关键字段:
-
版本(号) 这4比特规定了数据报的IP协议版本。 通过版本号,路由器能确定如何解释IP数据报的剩余部分。 不同的IP版本使用不同的数据报格式。 -
首部长度 一个IPv4数据报可包含一些可变数量的选项(这些选项包括在IPv4数据报首部中),故需用这4比特来确定IP数据报中载荷实际开始地方。 一般的IP数据报有20字节的首部。 -
服务类型 服务类型(TOS)比特包含在IPv4首部中,以便使不同类型的IP数据报能相互区别开来。 例如,实时数据报(如用于IP电话应用)与非实时流量(如FTP)。 提供特定等级的服务是一个由网络管理员对路由器确定和配置的策略问题。 -
数据报长度 IP数据报的总长度(首部加上数据),以字节计。 该字段长为16比特,所以IP数据报的理论最大长度为 65535字节。 然而,数据报很少有超过1500字节的,该长度使得IP数据报能容纳最大长度以太网帧的载荷字段。 -
标识,标志,片偏移 与IP分片有关。 -
寿命 寿命(Time-To-Live, TTL)字段用来确保数据报不会永远(由于长时间的路由选择环路)在网络中循环。 每当一条路由器处理数据报时,该字段的值减1。 若变为0,则该数据报被丢弃。 -
协议 通常仅当一个IP数据报到达其最终目的地时才会有用。 该字段值指示了IP数据报的数据部分应交给哪个特定的运输层协议。 例:值为6表明数据部分交给TCP,而值为17表明数据要交给UDP。 IP数据报中的协议号所起的作用,类似于运输层报文端中端口号字段所起的作用。 协议号是将网络层与运输层绑定到一起的黏合剂。 端口号是将运输层和应用层绑定到一起的黏合剂。 链路层帧也有一个特殊字段用于将链路层与网络层绑定到一起。 -
首部检验和 首部检验和用于帮助路由器检测收到的IP数据报中的比特错误。 首部检验和的计算: 将首部中的每2个字节当作一个数,用反码算术对这些数求和。 该和的反码(称为因特网检验和)存放在检验和字段中。 路由器要对每个收到的IP数据报计算其首部检验和,如果数据报首部中携带的检验和与计算得到的检验和不一致,则检测出差错。 路由器一般会丢弃检测出错误的数据报。 每台路由器上必须重新计算检验和并再次存放到原处,因为TTL及可能的选项字段会改变。 在TCP/IP的运输层和网络层都执行差错检测,原因: 在IP层只对IP首部计算了检验和,TCP/UDP检验和是对整个TCP/UDP报文段进行的。 TCP/UDP与IP不一定都必须属于同一个协议栈。 原则上,TCP能运行在一个不同的协议上,而IP能携带不一定要传递给TCP/UDP的数据。 -
源和目的IP地址 某源生成一个数据报时,在源IP字段插入它的IP地址,在目的IP地址字段插入其最终目的地地址。 源主机通过DNS查找来决定目的地址。 -
选项 允许IP首部被扩展。 -
数据(有效载荷) 大多情况下,IP数据报中的数据字段包含要交付给目的地的运输层报文段(TCP或UDP)。 该字段也可承载其他类型的数据,如ICMP报文。
IPv4 数据报分片
有的链路层协议能承载大数据报,有的只能承载小分组。
一个链路层帧能承载的最大数据量叫作最大传送单元(Maximum Trannsmission Unit, MTU)。
每个IP数据报封装在链路层帧中从一台路由器传输到下一台路由器,故链路层协议的MTU严格限制着IP数据报的长度。 发送方与目的路径上的每段链路可能使用不同的链路层协议,且每种协议可能具有不同的MTU。
想象你是一台互联几条链路的路由器,且每条链路运行具有不同MTU的链路层协议。 假设你从某条链路收到一个IP数据报,通过检查转发表确定出链路,并且该条出链路的MTU比该IP数据报的长度要小。 解决方法是: 将IP数据报中的数据分片成两个或更多个较小的IP数据报,用单独的链路层帧封装这些较小的IP数据报,通过输出链路发送这些帧。 每个这些较小的数据报称为片(fragment)。
片在其到达目的地运输层以前需要重新组装。
为坚持网络内核保持简单的原则,IPv4的设计者决定将数据报的重新组装工作放到端系统,而非网络路由器中。
当一台目的主机从相同源收到一系列数据报时,它需确定这些数据报中的某些是否是一些原来较大的数据报的片。 如某些数据报是这些片的话,则它须进一步确定何时收到最后一片,并且如何将这些接收到的片拼接到一起以形成初始的数据报。
为让目的主机执行这些重新组装任务,IPv4的设计者将标识,标志,和片偏移字段放在IP数据报首部中。
当生成一个数据报时,发送主机在为该数据报设置源和目的地址的同时贴上标识号。 发送主机通常将它发送的每个数据报的标识号加1。
当某路由器需要对一个数据报分片时,形成的每个数据报(即片)具有初始数据报的源地址,目的地址与标识号。
当目的地从同一发送主机收到一系列数据报时,它能检查数据报的标识号以确定哪些数据报实际上是同一较大数据报的片。
为了让目的主机绝对地相信它已收到了初始数据报的最后一个片,最后一个片的标志比特被设为0,而所有其他片的标志比特被设为1。 为了让目的主机确定是否丢失了一个片(且能按正确顺序重新组装),使用偏移字段指定该片应放在初始IP数据报的哪个位置。
IPv4编址
一台主机通常只有一条链路连接到网络;当主机中的IP想发送一个数据报时,它就在该链路上发送。
主机与物理链路间的边界叫接口(interface)。
现考虑一台路由器及其接口。 路由器的任务是从链路上接收数据报并从某些其他链路转发出去,路由器必须拥有两条或更多链路与它连接。 路由器与它的任意一条链路之间的边界也叫接口。 一台路由器有多个接口,每个接口有其链路。
每台主机和路由器都能发送和接收IP数据报,IP要求每台主机和路由器接口拥有自己的IP地址。 从技术上讲,一个IP地址与一个接口相关联,而不是与包括该接口的主机或路由器相关联。
每个IP地址长度为32比特(等价为4字节),因此共
2
32
2^{32}
232个(或大约40亿个)可能的IP地址。
这些地址通常按所谓点分十进制记法(dotted-decimal notation)书写,即地址中的每个字节用它的十进制形式书写,各字节间以句点隔开。
在全球因特网中的每台主机和路由器上的每个接口,都必须有一个全球唯一的IP地址。
一个接口的IP地址的一部分需要由其连接的子网来决定。
该图中,一台路由器(有3个接口),用于互联7台主机。
左上侧3台主机及它们连接的路由器接口,都有一个形如223.1.1.xxx的IP地址。
即,在它们的IP地址中,最左侧的24比特是相同的。
这4个接口也通过一个**并不包含路由器**的网络互联起来。
该网络可能由一个以太网LAN互联。
在此情况下,这些接口将通过一台以太网交换机互联,或通过一个无线接入点互联。
用IP的术语说,互联这3个主机接口与一个路由器接口的网络形成一个子网(subnet)。 IP编址为这个子网分配一个地址223.1.1.0/24,其中的/24记法,有时称为子网掩码(network mask),指示32比特中的最左侧24比特定义了子网地址。 子网223.1.1.0/24由3个主机接口223.1.1.1/2/3和一个路由器接口223.1.1.4组成 任何其他要连到223.1.1.0/24网络的主机都要求其地址具有223.1.1.xxx的形式。
一个子网的IP定义并不局限于连接多台主机到一个路由器接口的以太网段。
上图显示了3台通过点对点链路彼此互联的路由器。
每台路由器有3个接口,每条点对点链路使用一个,
一个用于直接将路由器连接到一对主机的广播链路。
上图中有6个子网:223.1.1/2/3/7/8/9
对于一个路由器和主机的通用互联系统,按如下定义系统中的子网: 为了确定子网,分开主机和路由器的每个接口,产生几个隔离的网络岛,使用接口端接这些隔离的网络的端点。 这些隔离的网络中的每一个都叫作一个子网。
一个具有多个以太网段和点对点链路的组织(如一个公司或学术机构)将具有多个子网,在给定子网上的所有设备有相同的子网地址。
全球因特网的编址: 因特网的地址分配策略称为无类别域间路由选择(Classless Interdomain Routing, CIDR)。
CIDR将子网寻址的概念一般化了。 使用子网寻址时,32比特的IP地址被划为两部分,并且也具有点分十进制数形式a.b.c.d/x,其中x指示了地址的第一部分中的比特数。
形如 a.b.c.d/x 的地址的 x 最高比特构成了IP地址的网络部分,并且经常被称为该地址的前缀(prefix)(或网络前缀)。 一个组织常被分配一块连续的地址,即具有相同前缀的一段地址。
这时,组织内部的设备的IP地址将共享共同的前缀。
组织网络外部的路由器仅考虑前面的前缀比特x。 也即,当该组织外部的一台路由器转发一个数据报,且该数据报的目的地址位于该组织的内部时,仅需考虑该地址的前面x比特。 这相当大地减少了在这些路由器中转发表的长度,因为a.b.c.d/x的单一表项足以将数据报转发到该组织内的任何目的地。
这种使用单个网络前缀通告多个网络的能力通常称为地址聚合,也称为路由聚合或路由摘要。 当地址按块分给ISP,又由ISP分给客户组织时,地址聚合工作极为有效。
上图是,一个路由器包含了两类性质不同子网情况,
此时更大的因特网上的其他路由器看见地址块200.23.16.0/20和200.23.18.0/23时,使用最长前缀匹配。
一个地址的剩余32-x比特,可认为是用于区分该组织内部设备的。 该组织内部的路由器转发分组时,才考虑这些比特。
在CIDR被采用前,IP地址的网络部分被限制为长度为8、16、24比特,这是一种称为分类编址的编址方案。 具有8、16、24比特子网地址的子网称为A,B,C类网络。
一个C类(/24)子网,仅能容纳
2
8
?
2
=
254
2^8 - 2 = 254
28?2=254台主机。
有两个地址用作特定用途。
在分类编址下,如一个有2000台主机的组织常被分给一个B类(/16)地址。 这导致了B类地址空间的迅速损耗,及所分配空间的利用率低下。 当一台主机发出一个目的地址为255.255.255.255的数据报时,该报文会交付给同一个网络中的所有主机。
一个组织如何为其设备得到一个地址块,再看,一个设备如何从某组织的地址块中分配到一个地址的。
获取一块地址
网络管理员也许首先与他的ISP联系,该ISP可能从已分给它的更大地址块中提供一些地址。
从一个ISP获取一组地址,不是得到一块地址唯一方法。
IP地址由因特网名字和编号机构管理,管理规则基于[ RFC7020] ICANN的作用:分配IP地址,管理DNS根服务器,分配域名,解决域名纷争。 ICANN向区域性因特网注册机构(如 ARIN、RIPE、APNIC 和 LACNIC)分配地址,这些几个一起形成了ICANN的地址支持组织[ASO-ICANN 2016] ,处理本区域内的地址分配/管理。
获取主机地址:动态主机配置协议
某组织一旦获得了一块地址,它就可为本组织内的主机与路由器接口逐个分配IP地址。
系统管理员,常手工配置路由器中的IP地址。 主机地址也能手动配置,但目前更多使用动态主机配置协议。
DHCP允许主机自动获取一个IP地址。
网络管理员能配置DHCP,以使某给定主机每次与网络连接时能得到一个相同的IP地址,或某主机将被分配一个临时的IP地址,每次与网络连接时该地址也许是不同的。 除主机IP地址分配外,DHCP还允许一台主机得知其他信息。 例如子网掩码,它的第一跳路由器地址(默认网关)与它的本地DNS服务器地址。
DHCP有将主机连接进一个网络的网络相关方面的自动能力,常称为即插即用协议或零配置协议。
DHCP是一个客户-服务器协议。 客户通常为新到达的主机,它要获得含自身使用的IP地址在内的网络配置信息。
简单场合下,每个子网有一台DHCP服务器。 如果某子网没服务器,则需一个DHCP中继代理(常为一台路由器),这个代理知道用于该网络的DHCP服务器地址。
对一台新到达的主机,针对上图的网络设置,DHCP协议是一个4个步骤的过程。
下图 yiaddr 指示分配给该新到达客户的地址。
这4个步骤是:
-
DHCP服务器发现 一台新到达主机的首要任务是发现一个要与其交互的DHCP服务器。 可通过使用DHCP发现报文完成,客户在UDP分组向端口67发该发现报文。 该UDP分组封装在一个IP数据报中。 DHCP客户生成包含DHCP发现报文的IP数据报,其中使用广播目的地址255.255.255.255,并且使用"本主机"源IP地址0.0.0.0。 DHCP客户将该IP数据报传递给链路层,链路层然后将该帧广播到所有与该子网连接的节点。 -
DHCP服务器提供 DHCP服务器收到一个DHCP发现报文时,用DHCP提供报文向客户做出响应,该报文向该子网的所有节点广播,仍使用IP广播地址255.255.255.255。 在子网中可能存在几个DHCP服务器,该客户也许会发现它处于能在几个提供者之间进行选择的优越位置。 每台服务器提供的报文包含有收到的发现报文的事务ID,向客户推荐的IP地址,网络掩码及IP地址租用期(IP地址有效的时间量)。 -
DHCP请求 新到达的客户从一个或多个服务器提供中选择一个,并向选中的服务器提供DHCP请求报文进行响应,回显配置的参数。 -
DHCP ACK 服务器用DHCP ACK报文对DHCP请求报文进行响应,证实所要求的参数。
一旦客户收到DHCP ACK后,交互便完成了,且客户能在租用期使用DHCP分配的IP地址。 客户可能在该租用期超时后还使用这地址,DHCP还提供了一种机制以允许客户更新它对一个IP地址的租用。
从移动性看,DHCP确实有非常严重的缺陷。 每当节点连到一个新子网,要从DHCP得到一个新IP地址,当一个移动节点在子网间移动时,就不能维持与远程应用间的TCP连接。
网络地址转换
每当一个SOHO想安装一个LAN以互联多台机器时, 需ISP分配一组地址以供该SOHO的所有IP设备(电话,平板电脑,打印机…)使用。
子网变大时,则需分配一块较大地址。 如ISP已为SOHO网络的当前地址范围分配过一块连续地址该如何? 家庭主人要首先知道的管理IP地址的典型方法?
网络地址转换
图中显示了一台NAT使能路由器的运行情况。
位于家中的NAT使能的路由器有一个接口,该接口是上图右侧家庭网络一部分。 家庭网络内的编址像上面所看。 其中的所有4个接口有相同的网络地址10.0.0/24。 地址空间10.0.0.0/8是在 [RFC 1918] 保留的三部分IP地址空间之一,这些地址用于上图的家庭网络等专用网络,或具有专用地址的地域。
具有专用地址的地域指其地址仅对该网络中的设备有意义的网络。
许多家庭网络,使用了相同的地址空间10.0.0.0/24。 在一个给定家庭网中的设备能使用10.0.0.0/24编址彼此发送分组。
转发到家庭网络之外进入更大的全球因特网的分组显然不能使用这些地址(或作为源地址,或作为目的地址),因为有很多网络使用这块地址。
即10.0.0.0/24地址仅在给定的网络中才有意义。 如果专用地址仅在给定网络中才有意义,当向或从全球因特网发送或接收分组时如何处理编址问题。
地址在何处需要唯一? 答案在于理解NAT。
NAT使能路由器对于外部世界甚至不像一台路由器。
NAT路由器对外界的行为如同一个具有单一IP地址的单一设备。
所有离开家庭路由器流向更大因特网的报文都拥有一个源IP地址138.76.29.7,且所有进入家庭的报文都拥有同一个目的IP地址138.76.29.7。
本质上讲,NAT使能路由器对外界隐藏了家庭网络的细节 (家庭网络计算机从哪个得到其地址,路由器从哪儿得到它的单一IP地址。通常为DHCP。)
路由器从ISP的DHCP服务器得到它的地址,且路由器运行一个DHCP服务器,为位于NAT-DHCP路由器控制的家庭网络地址空间中的计算机提供地址
如从广域网到达NAT路由器的所有数据报都有相同的目的IP地址(特别对NAT路由器广域网一侧的接口),那么路由器怎样知道它应将某个分组转发给哪个内部主机。
NAT路由器上一张NAT转换表,表项包含了端口号及其IP地址。
NAT的争议:
- 端口号传统下用于进程寻址,NAT下参与主机寻址。
家庭网络中的服务器需在周知端口号上等待接入请求 解决方案: NAT穿越,通用即插即用。 - 路由器指第三层设备,且应处理只能达到网络层的分组。
NAT违反主机应直接彼此对话原则,修改了数据报IP地址及端口。
NAT已成为因特网的一个重要组件,称为所谓中间盒,它运行在网络层,不执行传统的数据报转发,而执行诸如NAT,流量流的负载均衡,流量防火墙等。
IPv6
Ipv6数据报格式
IPv6中引入的最重要的变化显示在其数据报格式中:
-
扩大的地址容量 IPv6将IP地址长度从32比特增加到128比特。 这确保全世界不会用尽IP地址。 除了单播与多播外,IPv6还引入了一任播地址。 使数据报交付给一组主机中的任意一个。 -
简化高效的40字节首部 40字节定长首部允许路由器更快地处理IP数据报。 一种新的选项编码允许更灵活的选项处理。 -
流标签 IPv6有一个难捉摸的流定义。 该字段可用于"给属于特殊流的分组加上标签,特殊流是发送方要求进行特殊处理的流"。 -
版本 该4比特字段用于标识IP版本号。 IPv6该字段值设为6。 -
流量类型 该8比特字段与我们在IPv4中看到的TOS字段的含义相似。 -
流标签 该20比特的字段用于标识一条数据报的流,能对一条流中的某些数据报给出优先权,或它能用来对来自某些应用的数据报给出更高优先权。 -
有效载荷长度 该16比特值作为一个无符号整数,给出了IPv6数据报中跟在定长的40字节数据报首部后面的字节数量。 -
下一个首部 该字段标识数据报中的内容[数据字段]需交付给哪个协议(如TCP或UDP)。 该字段使用与IPv4首部中协议字段相同的值。 -
跳限制 转发数据报的每台路由器对该字段内容减1 如跳限制到0,数据报被丢弃 -
源地址和目的地址 IPv6 128比特地址的各种格式描述见RFC 4291 -
数据 IPv6数据报的有效载荷部分。 当数据报达到目的地时,有效载荷就从IP数据报移出,交给在下一个首部字段中指定的协议处理。 IPv4中存在,IPv6中不存在的几个字段 -
分片/重新组装 IPv6不允许在中间路由器上进行分片和重新组装。 如路由器收到的IPv6数据报太大,而不能转发到出链路 路由器丢弃该数据报,向发送方发回一个分组太大的ICMP差错报文即可。 于是,发送方能使用较小长度的IP数据报重发数据。 -
首部检验和 因特网中的运输层和数据链路层协议执行了检验操作 网络层移除,以便加快处理速度 -
选项 可能出现在IPv6首部中由"下一个首部"指出的位置上。 就如TCP/UDP协议首部可为下一个首部一样,选项字段也可为下一个首部。
从IPv4到IPv6的迁移
新型IPv6使能系统可发送、路由和接收IPv4数据报,但已部署的具有IPv4能力的系统却不能处理IPv6数据报
在实践中广泛采用的IPv4到IPv6迁移的方法包括建隧道。 除IPv4到IPv6迁移外的许多其他场合的应用都具有建隧道的关键概念。
建隧道依据的基本思想如下: 假定两个IPv6节点,要使用IPv6数据报进行交互,但它们经中间IPv4路由器互联。 将两条IPv6路由器中间IPv4路由器的集合称为一个隧道。 借助于隧道,在隧道发送端的IPv6节点可将整个IPv6数据报放到一个IPv4数据报的数据(有效载荷)字段中。
该IPv4数据报的地址设为指向隧道接收端的IPv6节点,再发给隧道中的第一个节点。 隧道中间的IPv4路由器在它们之间为该数据报提供路由,像对待其他数据报一样。 隧道接收端的IPv6节点收到该IPv4数据报,并确定该IPv4数据报含有一个IPv6数据报,从中取出IPv6数据报,然后再为该IPv6数据报提供路由。
通用转发和SDN
因特网路由器的转发传统上仅基于分组的目的地址。
许多执行第三层功能的中间盒有了大量发展。
NAT盒重写首部IP地址和端口号;防火墙基于首部字段值阻拦流量或重定向分组以进行其他处理,如深度分组检查(DPI)。
负载均衡将请求某种给定服务的分组转发到提供该服务的服务器集合中一个。
第二层交换机和第三层路由器等中间盒的剧增,而且每种都有自己特殊的硬件、软件和管理界面,无疑给网络操作员带来了麻烦。 近期软件定义网络的进展预示且正提出一种统一的方法,以一种现代,简洁和综合方式,提供多种网络层功能及某些链路层功能。
基于目的地转发的特征总结为两个步骤: 查找目的IP地址,然后将分组发送到有特定输出端口的交换结构(“动作”)。
现考虑一种更有意义的通用"匹配加动作"范式,其中能对协议栈的多个首部字段进行"匹配",这些首部字段与不同层次的不同协议相关联。
“动作”包括:将分组转发到一个或多个输出端口,跨越多个通向服务的离开接口进行负载均衡分组,重写首部值,有意识地阻挡/丢弃某个分组,为进一步处理和动作向某个特定的服务器发送一个分组,等等。
通用转发中,一张匹配加动作表将在4.2.1看到的基于目的地的转发表一般化了。 能使用网络层和/或链路层源和目的地址做出转发决定,转发设备描述为分组交换机。
下图显示位于每台分组交换机中的一张匹配加动作表,该表由远程控制器计算,安装和更新。
虽然在各台分组交换机中的控制组件可相互作用,但实践中通用匹配加动作能力是通过计算,安装,更新这些表的远程控制器实现的。
后续对通用转发的讨论将基于OpenFlow,OpenFlow是一个高度认可和成功的标准,它已成为匹配加动作转发抽象,控制器,及更为一般的SDN革命等概念的先驱。
主要考虑OpenFlow1.0,该标准引入了SDN抽象和功能。
匹配加动作转发表在OpenFlow中称为流表,它的每个表项包括:
- 首部字段值的集合
入分组将与之匹配。 与基于目的地转发一样,基于硬件匹配在TCAM内存中执行得最为迅速。 匹配不上流表项的分组将被丢弃或发送到远程控制器做更多处理。 - 计数器集合
计数器可包括已经与该表项匹配的分组数量,及自从该表项上次更新以来的时间。 - 当分组匹配流表项时所采取的动作集合
动作可能将分组转发到给定的输出端口,丢弃该分组,复制该分组,将它们发送到多个输出端口,和/或重写所选的首部字段。
将学习每台分组交换机网络范围的匹配规则集合如何来实现多种多样功能的,如 路由选择、第二层交换路由、防火墙、负载均衡、虚拟网络等等。
通过在网络分组交换机的集合中适当地编程/配置这些表,网络范围的行为能被类似地编程。
匹配
下图显示了11个分组首部字段和入端口ID,该ID能被OpenFlow1.0中的匹配加动作规则所匹配。
到达一台分组交换机的一个链路层(第二层)帧将包含一个网络层(第三层)数据报作为其有效载荷,该载荷通常依次将包含一个运输层(第四层)报文段。
第一个观察是,OpenFlow的匹配抽象允许对来自三个层次的协议首部所选择的字段进行匹配。
显示在下图的源和目的MAC地址是与帧的发送和接收接口相关联的链路层地址; 通过基于以太网地址而不是IP地址进行转发,看到OpenFlow使能的设备能等价于路由器转发数据报以及交换机转发帧。 以太网类型字段对应于较高层协议,利用该字段分解该帧的载荷,并且VLAN字段与所谓虚拟局域网相关联。
入端口是指分组交换机上接收分组的输入端口。
流表项也可有通配符。
例如: 一个流表中IP地址128.119.*.*将匹配其地址的前16比特为128.119的任何数据报所对应的地址字段。 每个流表项也具有相应的优先权。
如果一个分组匹配多个流表项,选定的匹配和对应的动作,将是其中有最高有限权的那个。
最后,我们观察到并非一个IP首部中的所有字段都能被匹配。 例如OpenFlow不允许基于TTL字段或数据报长度的匹配。
动作
每个流表项有0个或多个动作列表,这些动作决定了应用于与流表项匹配的分组的处理。 如有多个动作,它们以在表中规定的次序执行。
其中最重要的动作可能是:
- 转发
一个入分组可转发到一个特定的物理输出端口,广播到所有端口(分组到达的端口除外),或通过所选的端口集合进行多播。 该分组可能被封装并发送到用于该设备的远程控制器。 该控制器可能(或可能不)对该分组采取某些动作,包括安装新的流表项,及可能将该分组返回给设备以在更新的流表规则集合下进行转发。 - 丢弃
没有动作的流表项表明某个匹配的分组应当被丢弃。 - 修改字段
在分组被转发到所选的输出端口前,分组首部的10个字段中的值可以重写。
匹配加动作操作中的 OpenFlow 例子
假定希望的转发行为是: 来自h5或h6发往h3或h4的分组从s3转发到s1,然后从s1转发到s2。 在s1中的流表项将是: 在s3中的流表项,使得该数据报从h5/h6经过出接口3转发到s1:
最后,也需要在s2中有一个流表项来完成第一个例子,使得从s1到达的数据报转发到它们的目的主机h3或h4。
考虑一个负载均衡场景,其中来自h3发往10.1.*.的数据报经过s1和s2之间的直接链路转发,与此同时,来自h4发往10.1..*的数据报经过s2和s3,s3到s1之间的链路转发。 这种行为不能通过基于IP的目的地址转发取得,这种情况下,在s2中的流表项将是:
在s1中需要流表项将从s2收到的数据报转发到h1或h2;在s3中需要流表项将接口4上从s2收到的数据报经过接口3转发到s1。
- 第三个例子:充当防火墙
考虑一个防火墙场景,其中s2仅希望(在它的任何接口上)接收来自与s3相连的主机所发送的流量。 如果在s2的流表中没有其他表项,则仅有来自10.3.*.*的流量将被转发到与s2相连的主机。
学习SDN控制器时,将再次考察流表,其中SDN控制器计算和分发流表,协议用于在分组交换机和它的控制器之间通信。
学习参考资料:
《计算机网络——自顶向下方法》 第7版
|