每台路由器的数据平面的主要作用是从其输入链路向其输出链路转发数据报;控制平面的主要作用是协调这些本地路由器转发动作,使得数据报沿着源和目的地主机之间的路由器路径进行端到端传送
路由器具有截断的协议栈,即没有网络层之上的部分,因为路由器不运行应用层和运输层协议
网络层的主要功能就是将分组从一台发送主机移动到一台接收主机
转发 当一个分组到达某路由器的一条输入链路时,该路由器必须将分组一定到适当的输出链路。转发是在数据平面中实现的唯一功能。
路由选择 当分组从发送方流向接收方时,网络层必须决定这些分组所采用的路由或路径。计算这些路径的算法称为路由选择算法(routing algorithm)
转发:是指将分组从一个输入链路接口转移到释放的输出链路接口的路由器本地动作。转发发生的时间长度很短,一般为几纳秒,因此一般采用硬件来实现
路由选择:至确定分组从源到目的地所采取的端到端路径的网络范围处理过程
每台网络路由器中有一个关键元素是它的转发表(forwarding table)。路由器检查到达分组首部的一个或者多个字段值,进而通过这些首部值在转发表中索引,选择输出链路接口转发
路由选择算法决定了插入该路由器转发表的内容。路由选择算法运行在每个路由器中,并且在每台路由器中都包含转发和路由选择两种功能。理论上,路由器中物理上存在的所有转发表内容时由人类网络操作员直接配置的,在这种情况下无需要任何路由选择协议。
但是人工配置更容易出错,并且对于网络拓扑变化的响应比路由选择协议更慢。
使用这种方法,每台路由器都有一个与其他路由器的路由选择组件通信的路由选择组件,通过交换包含路由选择信息的路由选择报文,来计算出它转发表的值
SDN方法将路由选择方法从路由器硬件分离,采用远程控制器计算和分发转发表
控制平面的路由选择功能与物理路由器是分离的,即路由器选择设备仅执行转发,由远程控制及计算并分发转发表。路由器通过与远程控制器交换包含路由选择信息的报文进行通信
这种控制平面方法叫做软件定义网络(Sort-ware-Define Networking,SDN),因为计算转发表并与路由器交互的控制器是用软件实现的
网络服务模型(network service model)定义了分组在发送与接收端系统之间端到端的运输特性
因特网的网络层提供了单一的服务,称为尽力而为的服务。实际上就是无服务的一种委婉说法
上图为一个通用路由器体系机构的总体试图,包括一台路由器的四个组件
输入端口(input port):①在路由器中执行终结入物理链路的物理层功能②位于入链路远端的数据链路层,进行数据链路处理③在输入端口执行查找功能
交换结构:将路由器的输入端口连接至输出端口。交换结构完全包含在路由器中,属于网络路由器中的网络
输出端口:存储从交换结构接收到的分组,并执行必要的链路层和物理层功能,从而在输出链路上传输这些分组
路由选择处理器:执行控制平面功能①在传统的路由器中,执行路由选择协议,维护路由选择表与关联链路状态信息,并未路由器计算转发表②在SDN路由器中,路由选择处理器负责与远程控制器通信,接收转发表,并将转发表安装至输入端口③执行网络管理功能
绝大多数情况下,路由器的输入端口、输出端口和交换结构都用硬件实现。
当数据平面以纳秒时间尺度运行时,路由器的控制功能以毫秒或秒时间尺度运算。这些控制功能包括:路由选择协议,对上线或下线的连接链路进行响应、与远程控制器通信和执行管理功能。因此这些控制平面(control plane)的功能通常使用软件实现,并且在路由选择处理器上执行
线路端接和数据链路处理:实现了用于各个输入链路的物理层和链路层。
查找:在查找部分,路由器通过转发表来查找输出端口,使得到达分组能经过交换结构转发到该输出端口。转发决策能在每个输入端口本地做出,无需对每个分组调用集中式路由选择处理器,从而避免集中式处理的瓶颈。
在32位系统下,如果采用简单的穷举对比方法,将会有超过42亿个可能的地址,这种查找方法是不可行的
假设路由器有四条链路,编号0到3,分组以如下方式转发到链路接口
可以将上面的目的地址范围概括为
使用这种风格的转发表,路由器用分组目的地址的前缀与该表的选型进行匹配。如果一个地址的前缀不匹配其中的任何一项,则路由器向链路接口3转发该分组。
对于同一个地址可能同时符合多个前缀表项,当有多个匹配时,路由器使用最长前缀匹配规则(longest prefix matching rule):即在该转发表中寻找最长的匹配项,并向相应的接口转发分组
由于在Gbps速率下,查找必须在纳秒级内执行,所以除了用硬件执行查找,还需要对大型转发表使用超出简单线性搜索的技术,也需要关注内存访问时间。实际上使用三态内容可寻址存储器(Tenary Content Address Memory,TCAM)来查找,对于一个32比特的IP地址,TCAM能够在常数时间内返回该地址的转发表项内容。
输入端口必须执行的操作:
①必须出现物理层和链路层处理
②必须检查分组的版本号、检验和以及寿命字段,并重写检验和与寿命字段
③必须更新用于网络管理的计数器
交换结构位于一台路由器的核心部位,通过交换结构分组从一个输入端口交换至一个输出端口
交换有如下几种方式
在输入端口和输出端口之间的交换是在路由选择器的直接控制线完成的。
交换过程:①一个分组到达一个输入端口是,该端口会先通过中断方式向路由选择器发出信号。②然后该分组从输入端口处被复制到处理器内存中。③路由选择处理器从首部中提取目的地址,在转发表中找出适当的输出端口,并将该分组复制到输出端口的缓存中。
在如果内存带宽为每秒可写入内存或从内存中读出最多B个分组,那么总的转发吞吐量(输入端口传送到输出端口的总速率)必然小于B/2
并且不能同时转发两个分组,即使分组的目的端口不同,因为经过共享系统总线一次仅能执行一个内存读/写
输入端口经过一根共享总线将分组直接传送到输出端口,不需要路由选择处理器的干预。
交换过程:①输入端口为分组预先准备一个交换机内部标签,用于指示本地输出端口②该分组可以被所有输出端口收到,但只能被标签匹配的输出端口保存,保存该分组的输出端口随后删除该标签
如果有多个分组同时到达路由器,并且每个分组属于不同的输出端口。那么除了一个分组之外,其他分组都会在接收端口中排队,因为一次只有一个分组可以跨越总线。路由器的交换带宽也会受总线速率的限制
纵横式交换机就是一种有2N条总线组成的互联网络,它连接N个输入端口与N个输出端口,每条垂直的总线在交叉点与每条水平的总线交叉,交叉点通过交换结构控制器能够在任何时候开启或关闭。
纵横式网络能够并行转发多个分组。纵横式交换机式是非阻塞的(nonblocking),即只要没有其他分组当前被转发到该输出端口,转发到输出端口的分组不会被其他不同端口的分组阻塞
然而,如果来自两个不同输入端口的两个分组其目的地为相同的输出端口,则一个分组必须在输入端等待,因为在某个时刻总线仅能够发送一个分组
输出端口处理存放在输出端口内容中的分组,并将其发送到输出链路上。包括选择和取出排队的分组进行传输,执行所需的链路层和物理层传输功能
在输入端口和输出端口都可以形成分组队列。排队的位置和程度将取决于流量负载、交换结构的相对速率和线路速率。
随着队列的增长,路由器的缓存空间最终会被耗尽,并且当无内存可用于存储到达分组时将会出现丢包(packet loss)
前提假设:
假定输入线路的速度与输出线路的速度是相同的,均为Rline(单位为每秒分组数),并且有N个输入端口和N个输出端口。
假设所有分组具有相同的固定长度,分组以同步的方式到达输入端口。
也就是说在任何链路发送分组的实践等于在任何链路接收分组的实践,在这样的时间间隔内,在一个输入链路上能够到达0个或者1个分组
定义交换结构传输速率Rswitch为从输入端口到输出端口能够移动分组的速率
结果预测:
如果Rswith比Rline快N倍,则在输入端口只会出现极少的排队。这是因为即使在最坏的情况下,所有N条输入线路都在接收分组,并且所有的分组都被转发到相同的输出端口,每批N个分组都能在下一批到达之前通过交换结构处理完毕
如果交换结构不能快到让所有到达分组无时延的通过它的传送,在输入端口将会出现分组排队。因为到达的分组必须加入输入端口队列中,以等待通过交换结构传送到输出端口
前提假设
所有链路速度相同
一个分组能够以一条输入链路接收一个分组所用的相同的时间量,从任意一个输入端口传送到给定的输出端口
分组按照FIFO的方式从以指定输入队列移动到要求的输出队列中
只要输出端口不同,多个分组可以被并行发送。然而如果位于两个输入队列前端的两个分组时发往同一输出队列的,则其中的一个分组将被阻塞,且必须在输入队列中等待
以上图为例,假设左上角的两个深色分组都要发往同一个右上角输出端口。如果交换结构决定发送左上角队列前端的分组,那么左下角队列中深色阴影必须等待。不仅该深色分组需要等待,其后的浅色分组也会等待(即使该浅色分组的输出端口目的地并无竞争)。这种现象叫做输入排队交换机中的线路前部(Head-Of-the-Line,HOL)阻塞
即在一个输入队列中排队的分组必须等待通过交换结构发送(即使输出端口是空闲的)因为它被位于线路前部的另一个分组阻塞
假定Rswitch比Rline快N倍,并且到达N个输入端口的每个端口的分组,其目的地是相同的输出端口。在先输出链路发送一个分组的时间内,将有N个新分组到达该输出端口(N个输入端口,每个端口到达一个)由于输出端口在每个单位时间内只能传输一个分组,这N个到达分组必须排队等待经输出链路传输 。对于输出端口来说,单位时间内进N个新分组,出一个分组,所以即使交换结构比端口线路快N倍,输出端口还是会耗尽可用内存
当没有足够多的内存用于缓存一个入分组时,输出端口需要决定:①丢弃到达分组(弃尾)②删除一个或多个已经排队的分组来为新的分组腾出空间
主动队列管理(Active Queue Management,AQM):在缓存填满之前就丢弃一个分组(或在其首部加上标记),向发送方提供一个拥塞信号。最广泛使用的AQM算法是随即早期检测算法(Random Early Detection,RED)
在时刻t,每个输入端口都到达了一个分组,每个分组都是发往右上角的输出端口。假定线路速度相同,交换机以三倍于线路速度的速度运行,在一个时间单位内后(即收或发一个分组的实践),将三个初始分组都传送到输出端口,并排队等待传输。在下一个时间单位中,这三个分组中的一个将通过输出链路发送出去
如果又有两个分组到达交换机入端,其中一个要发往右上角的输出端口。此时输出端口的分组调度(packet scheduler)将会在这些排队分组中选择一个分组来传输
FIFO调度规则按照分组到达输出链路队列的相同次序来选择分组在链路上传输
如果链路当前正忙于传输另一个分组,到达链路输出队列的分组要排队等待传输。如果没有足够的缓存空间来容纳到达的分组,队列的分组丢弃策略则确定该分组是否被丢弃或从队列中移除
在优先权队列规则下,到达输出链路的分组被分类放入输出队列中的优先权类。
在实践中,网络操作员可以配置一个队列,这样携带网络管理信息的分组就会获得超过用户流量的优先权
每个优先权类通常有自己的队列,当选择一个分组传输时,优先权排队规则将从队列为非空的最高优先权类中传输一个分组。在同一优先权类的分组之间选择通常以FIFO方式完成
假设分组1、3、4属于高优先权类,分组2、5属于低优先权类。分组1到达并发现链路是空闲的,就开始传输。在分组1传输的过程中,分组2和3到达,并分别在低优先权和高优先权队列中排队。传完分组1后,将会传输分组3(即使分组2比分组3较早到达)。分组3传输结束后,开始传输分组2。分组2传输的过程中分组4到达,但是此时分组2已经开始传输,不能被打断,分组4在高优先权队列中排队等待
这种一旦分组开始传输就不能打断的规则,被称为非抢占式优先权排队(non-preemptive priority queuing)规则
在循环排队规则下,分组像优先权队列那样被分类,但是各个类之间不存在严格的服务优先关系,循环调度器在这些类之间轮流提供服务。保持工作排队(work-conserving queuing)规则在有分组排队等待传输时,不允许链路保持空闲。当寻找给定类的分组但是没有找到时,保持工作的循环规则将立即检查循环序列中的下一个
以上图为例,分组1、2、4属于第一类,分组3、5属于第二类。分组1一到达输出队列就立即开始传输。分组2和3在分组1的传输过程中到达,因此排队等待传输。在分组1传输完毕后,链路调度器查找第二类分组,因此传输分组3。在分组3传输完毕后,调度器查找第一类分组,因此传输分组2。在分组2传输完成后,分组4是唯一排队的分组,因此在分组2后立刻传输分组4
加权公平排队(Weighted Fair Queuing,WFQ)规则:到达的分组被分类在合适的每个类的等待区域排队,与循环调度一样,WFQ也采用循环的方式对各个类进行服务
IPv4数据报中的关键字端
·版本号:这4比特规定了数据包的IP协议版本。通过查看版本号,路由器能够确定如何解释IP数据报的剩余部分
·首部长度:IPv4数据报包含一些可变数量的选项,需要用这4比特来确定IP数据报中的载荷。大多数IP数据报不包含选项,所以一般的IP数据报具有20字节的首部
·服务类型(TOS):服务类型比特包含在IPv4首部中,以便使不同类型的IP数据报能相互区分。比如将实时数据报与非实时流量区分
·数据报长度:IP数据报的总长度(首部加上数据),以字节计。因为该字段长16比特,所以IP数据报的理论最大长度为65535字节,但实际上很少有超过1500字节的
·标识、标志、片偏移:与IP分片有关,用于告知主机该数据报是否是片,是否是最后一片以及如何将片整合成初始完整的数据报。新版本的IPv6不允许在路由器上进行分片
·寿命(TTL):用于确保数据报不会永远在网络中循环。每当一台路由器处理数据报时,该字段的值减1.若TTL字段减为0,则该数据报必须丢弃
·协议:该字段通常仅当一个IP数据报到达其最终目的地时才会有用。该字段值只是了IP数据报的数据部分应交给哪个特定的运输层协议。例如,值为6表明数据部分交给TCP,值为17表明数据部分交给UDP。协议号用于减网络层与运输层绑定,端口号减运输层与应用层绑定
·首部检验和:用于帮助路由器检测收到的IP数据包中的比特错误
·源和目的IP地址:当源生成一个数据报时,将在源IP字段中插入他的IP地址,在目的IP地址字段中插入其最终目的地的地址
·选项:选项字段允许IP首部被扩展。但是由于扩展问题,导致数据报首部长度可变,难以处理。在IPv6中被删除
·数据(有效载荷):包含要交付给目的地的运输层报文段
一个IP数据报有总长为20字节的首部,如果承载一个TCP报文段,则每个(无分片的)数据报共承载了总长40字节的首部(20字节IP首部+20字节TCP首部)以及应用层报文
并不是所有链路层协议都能承载相同长度的网络层分组 ,一个链路层帧能承载的最大数据量叫做最大传送单元(Maximum Transmission Uint,MTU)
以太网帧能够承载不超过1500字节的数据,部分局域网链路的帧可承载不超过576字节的数据
每个IP数据数据报封装在链路层帧中从一台路由器传输到下一台路由器,所以链路层协议的MTU严格限IP数据报长度。然而问题并不是对IP数据报长度的限制,而是从发送方到接收方的链路并一定都遵循同一个链路层协议
如何将过大的IP分组放入较小的链路层帧的有效载荷字段
将IP数据报中的数据分片成两个或多个较小的IP数据报,用单独的链路层帧封装这些较小的IP数据报,然后通过输出链路发送这些帧。每个较小的数据报都被称为片(frangment)
片在其到达目的地运输层之前需要重新组装。TCP和UDP都希望从网络层收到完整的、未分片的报文。由于将重新组装整合数据报的功能放在路由器中实现会给协议带来相当大的复杂性,并且会影响路由器的性能,所以IPv4中将数据报的重新组装工作放在端系统中,而不是网络路由器中
IPv4将标识、标志、片偏移字段放在IP数据报的首部中,用于告知主机该数据报是否是片,是否是最后一片以及如何将片整合成初始完整的数据报
标识:
①当生成一个数据报时,发送主机在为该数据报设置源和目的地址的同时贴上标识号,发送主机通常将它发送的每个数据报的标识号加1
②当路由器要对一个数据报分片时,形成的每个数据报(片)都具有初始数据报的源地址、目的地址与标识号
③当目的地主机收到一系列数据报时,可以通过标识号确定该数据报属于那一片
标志:
由于IP是一种不可靠的服务,片可能永远也到达不了目的主机。因此将最后一个片的标志比特设置为0,其他所有片的标志比特被设置为1
片偏移:
为了让目的主机确定是否丢失一个片,使用偏移字段指定该片应该存放在初始IP数据报的位置。
如上图,一个4000字节的数据报(20字节IP首部+3980字节IP有效载荷)到达路由器,路由器输出链路MTU为1500字节,这就意味着3980字节的有效载荷需要分为3个独立的片(其中每个片都是一个IP数据报,都包含数据报首部)
一台主机通常只有一条链路连接到网络;当主机中的IP想发送一个数据报时,它就在该链路上发送。主机与物理链路之间的边界叫做接口(interface)
一台路由器需要收发多台主机的数据报,因此具有多条链路,也就具有多个接口。由于每台主机和路由器都可以收发IP数据报,IP要求每台主机和路由器接口拥有自己的IP地址。
一个IP地址与一个接口相互关联,而不是与包括该接口的主机或路由器相关联
每台主机和路由器的每个接口,都必须有一个唯一的IP地址(除了NAT后面的接口),这些地址不能随意选择
每个IP地址长度为32比特(四字节),因此总共有2^32个(越40亿个)IP地址。这些地址通常按照点分十进制记法(dotted-decimal notation)书写,即地址中的每个字节用十进制形式书写,字节间以句号隔开
以193.32.216.9为例
193是该地址第一个八比特的十进制等价数字,32是第二个,……
将其转化为二进制为:11000001 00100000 11011000 00001001
上图是一个具有3个接口的路由器用于互联7台主机,可以看出左上角的四个IP地址,都是以223.1.1开头的,也就是IP地址32个比特位中的前24个比特位都相同,同时这四个接口并不通过包含路由器的网络互联。互联3个主机接口和一个路由器接口的网络形成一个子网(subnet)
IP编制为这个子网分配一个地址223.1.1.0/24,其中/24记法有时称为子网掩码(network mask),指示32比特中最左侧的24比特定义子网地址
实际上子网并不仅仅只是上述例子的一种,以下图为例
除了223.1.1.0/24、223.1.2.0/24、223.1.3.0/24三个与之前相似的子网,还有223.1.7.0/24、223.1.8.0/24、223.1.9.0/24三个子网,它们分别用于连接路由器的不同接口
为了确定网络区域,分开主机和路由器的每个接口,从而产生了若干个分离的网络岛,接口端连接了这些独立网络的端点。这些独立的网络岛叫做子网(subnet)
子网的主要作用是::IP数据报从网际上的一个网络到达另一个网络时,选择路径可以基于网络而不是主机
因特网的地址分配策略被称为无类别域间路由选择(Classless Interdomain Routing,CIDR)CIDR将子网寻址的概念一般化了,当使用子网寻址时,32比特的IP地址被划分为两部分,并且也具有点分十进制数形式a.b.c.d/x,其中x指示了地址的第一部分中的比特数
形式为a.b.c.d/x的地址的x最高比特构成了IP地址的网络部分,并且经常被称为该地址的前缀。一个组织通常被分配一块连续的地址,即具有相同前缀的一段地址。该组织内部的设备的IP地址见共享共同的前缀
一个地址的剩余32-x比特可以认为是用于区分该组织内部设备的,其中的所有设备具有相同的网络前缀。只有组织内部的路由器转发分组时才会考虑这些比特
在CIDR之前用的IP编址策略是分类编制,将IP地址的网络部分限制长度为8、16、24比特。拥有8、16、24比特子网地址的子网被分别称为A、B、C类网络
网络部分比特长度 | IP地址第一段取值范围 | 最多容纳主机数 | |
A类IP地址 | 8 | 1~126 | 16777214 |
B类IP地址 | 16 | 128~191 | 65534 |
C类IP地址 | 24 | 192~223 | 254 |
其中网络号不能以数字127开头,数字127是专门保留给诊断使用,如127.0.0.1是回送地址,用于回路测试
也可以看出容纳的主机数并不完全等于主机部分的数量,比如254=2^8-2,其中预留了两个地址用于特殊用途
之所以采用CIDR替代分类编址,是由于C类地址容纳的主机数量太少,而B类地址容纳的主机数量太多,容易造成浪费
IP广播地址255.255.255.255。当一台主机发出一个目的地址为255.255.255.255的数据报时,该报文将会交付给同一个网络中的所有主机。路由器也会有选择的向临近的子网转发该报文
①获取一个IP地址用于一个组织的子网内,可以从更大的地址块中提供一些地址。比如,该ISP也许自己已经被分配了地址块200.23.16。0/20。该ISP可以依次将该地址块分成8个长度相等的连续地址块,为本ISP支持的最多达8个的组织中的一个分配这些地址块中的一块
IP地址由因特网名字和编号分配机构(Internet Corporation for Assigned Names and Numbers。ICANN)管理。它的作用不仅指分配IP地址,还管理DNS根服务器,以及分配域名与解决域名纷争
某组织一旦获得了一块地址,他就可以为本组织内的主机与路由器接口逐个分配IP地址。主机地址可以手动由系统管理员配置,但更加常用的是使用动态主机配置协议(Dynamic Host Configuration,DHCP)来完成
DHCP
DHCP允许主机自动获取一个IP地址
网络管理员能够配置DHCP,以使某主机每次与网络连接时可以得到一个相同的IP地址,或者某主机将会被分配一个临时的IP地址,每次与网络连接时该地址也许是不同的
DHCP具有将主机连接及拿着一个网络的网络相关方面的自动能力,因此也常称为即插即用协议(plug-and-play protocol)或零配置协议(zeroconf)
DHCP是一个客户-服务器协议。客户通常是新到达的主机,他要获得包括自身使用的IP地址在内的网络配置信息。在最一般的情况下,每个子网将具有一台DHCP服务器。如果在某个子网中没有服务器,则需要一个DHCP中继代理,这个代理知道用于该网络的DHCP服务器的地址
DHCP协议包括四个步骤
①DHCP服务器发现:一台新到达的主机,首要任务是找到一个与其交互的DHCP服务器。这可以通过使用DHCP发现报文老完成,客户在UDP分组中线端口67发送该发现报文。该UDP分组封装在一个IP数据报中。此时会出现一个问题,用户并不知道目标的IP地址,因此采用广播目的地址255.255.255.255与源IP地址0.0.0.0。DHCP客户将该IP数据报传递给链路层,链路层将该帧广播到所有与该子网连接的节点
②DHCP服务器提供:DHCP服务器收到一个DHCP发现报文时,用DHCP提供报文向客户做出响应,该报文向子网的所有节点广播,仍然使用IP广播地址255.255.255.255。之所以采用IP广播地址,是因为子网中可能存在多个DHCP服务器。每台服务器提供的报文包含收到的发现报文的事务ID、向客户推荐的IP地址、网络掩码以及IP地址租用期(即IP地址有效的时间量)
③DHCP请求:新到达的客户从一个或多个服务器提供中选择一个,并向选中的服务器提供DHCP请求报文进行响应,回显配置的参数
④DHCP ACK:服务器采用DHCP ACK报文对DHCP请求报文进行响应,证实所要求的参数
当用户收到DHCP ACK报文时,交互便完成了,并且该客户能在租用期内使用DHCP内配的IP地址,同时DHCP提供了一种机制以允许用户更新对IP地址的租用
从移动性来看,DHCP存在严重的缺陷。因为每当节点连接到一个新的子网,就要从DHCP中得到一个新的IP地址,当一个移动节点在子网将移动时,就不能维持与远程应用之间的TCP连接
每个IP使能的设备都需要一个IP地址,随着所谓小型办公室、家庭办公室(Small Office , Home Office , SOHO)子网的大量出现,每当一个SOHO想安装一个 LAN 以互联多台机器时,需要ISP 分配一组地址以供该SOHO的所有 IP 设备使用。如果该子网变大了,则需要分配一块较大的地址 但如果 ISP 巳经为 SOHO 网络的当前地址范围分配过一块连续地址该怎么办呢?户主该如何管理IP地址呢?为了解决上述问题,出现了网络地址转换(Network Address Translation,NAT)
如图所示,位于家中的NAT使能的路由器具有一个接口,这个接口也是家庭网络中的一部分。家庭网络中所有的四个接口都具有相同的网络地址10.0.0/24。地址空间10.0.0.0/8是保留的三部分IP地址空间之一,这些地址御用家庭网络等专用网络或具有专用地址的地域。具有专用地址的地域是指其地址仅对该网络中的设备有意义的网络。
在一个家庭网络中的设备能够使用类似10.0.0.0/24编址彼此发送分组,而不能在全球因特网中使用这些地址。因为在别的家庭网络中可能也使用该编址。也就是只有在给定网络中才有意义。当向或从全球因特网发送或接收分组时如何处理编址问题呢?地址在何处才必须是唯一的呢?这就是NAT的作用
NAT使能路由器对于外部世界甚至不像是一台路由器。NAT对外界的行为就如同一个具有单一IP地址的单一设备。从本质上讲,NAT使能路由器对外接隐藏了家庭网络的细节。路由器从ISP的DHCP服务器获取它的地址,并且路由器运行一个DHCP服务器,为位于NAT-DHCP服务器控制的家庭网络地址空间中的设备提供地址
如何实现从广域网到家庭网络中特定设备的转换?
由于NAT的存在,全球互联网会把家庭网络概括为一个单一IP地址节点,那么如果从广域网到达NAT路由器的所有数据报都具有相同的目的IP地址,路由器该如何知道分组应该转发给那个内部主机呢?NAT路由器上的一张NAT转换表(NAT translation table)实现了该功能,并且在表项中包含了端口号及其内部IP地址
以上图为例,假设用户处于10.0.0.1的家庭网络主机处,请求IP地址为128.119.40.186的某台Web服务器上的一个Web页面。主机10.0.0.1为其指派了任意源端口号3345并将该数据报发送到LAN中。NAT路由器接收到该数据报,为该数据报生成一个新的源端口号5001,将源IP替代为广域网接口一侧的IP地址138.76.29.7,并且将源端口号3345转换成新源端口号5001,转换表中也增加一个表项(生成一个新的源端口号时,NAT可以任意选择一个当前在转换表中未使用的端口,由于端口号字段有16比特长,因此NAT协议可以支持超过60000个并行使用路由器广域网一侧单个IP地址的连接) 同理当服务器接收到报文后,会向路由器发送该报文,由路由器进行匹配转发给家庭网络主机
因此,NAT的主要作用就是实现家庭网络的封装,实现内外网之间网络地址的转换。成为所谓的中间盒,它运行在网络层并具有与路由器十分不同的功能。中间盒并不执行传统的数据包转发,而是执行诸如NAT、流量流的负载均衡、流量防火墙等功能。
IPv6产生的原因:子网和IP节点数量剧增,32比特的IP地址空间即将用尽
为什么没有IPv5:实际上最初预先ST-2协议称为IPv5,但后来ST-2被舍弃了。互联网流协议(Internet Stream Protocol,ST)。IPv5已经被嵌入IPv6协议中,用于提供更加优秀的流式传输支持,但对解决IP地址枯竭并没有帮助
·版本:该4比特字段用于标识IP版本号。IPv6将该字段值设为6,需要注意的是将该字段值改为4并不能将其转换成一个IPv4数据报
·流量类型:该8比特字段与IPv4中的TOS字段含义类似。以便使不同类型的IP数据报能相互区分。比如将实时数据报与非实时流量区分
·流标签:该20比特的字段用于标识一条数据报的流,能够对一条流中的某些数据报给出优先权,或者对于来自某些引用的数据报给出更高的优先权
·有效载荷长度:该16比特值作为一个无符号整数,给出了跟在定长40字节数据报首部后面的字节数量
·下一个首部:标识该数据报中的内容交付给那个协议(UDP或TCP)
·跳限制:转发数据报的每台路由器将对该字段的内容减1。但跳限制计数为0时,该数据报将会被丢弃
·源地址和目的地址:IPv6中128比特地址的各种格式在RFC 4291中进行了描述
·数据:这是IPv6数据报中的有效载荷部分。当数据报到达目的地时,该有效载荷就从IP数据报中移出,并交给下一个首部字段中指定的协议处理
IPv6相较于IPv4的不同
①扩大的地址容量。IPv6减IP地址长度从32比特增加到128比特,保证IP地址不会用尽。除了单播与多播地址之外,还引入了任播地址,这种地址可以将数据报交付给一组主机中的任意一个
②简化高效的40字节首部。运行路由器更快的处理IP数据报
③流标签。流的定义还未完全确定。RFC 2460中规定“给属于特殊流的分组加上标签,这些特殊流是发送方要求进行特殊处理的流,如一种非默认服务质量或需要实时服务的流”
④分片/重新组装。IPv6不允许再中间路由器上进行分片与重新组装。这种操作只能在源和目的地执行。如果路由器收到IPv6数据报因为太多而不能转发到出链路上,则路由器丢掉该数据报,并向发送方发回一个分组太大的ICMP差错报文即可。在路由器中进行分片/重新组装是一个耗时的工作,将其放入到端系统中实现会增加网络中的IP转发速度
⑤首部检验和。运输层(TCP和UDP)和数据链路层(以太网)协议都执行了检验操作。在网络层中再次实现该功能较多余,并且在每台路由器上都需要重新计算IPv4首部检验和较耗时
⑥选项。选项字段不再是标准IP首部的一部分,但是并不意味着它消失了,可能出现在IPv6的“下一个首部”指出的位置
IPv6可以向下兼容IPv4,IPv4如何兼容IPv6呢?
实际中采用的方法是建隧道(tunneling)。建隧道的基本思想如下:假定两个IPv6节点要使用IPv6数据报进行交互,但是他们中间是通过IPv4路由器互联的。我们将两台IPv6路由器之间的IPv4路由器的集合称为一个隧道
如图,处于隧道发送端的IPv6节点可以将整个IPv6数据报放入一个IPv4数据报的有效载荷中,再将该IPv4数据报发送目标IPv6路由器,途中的IPv4路由器并不关系有效载荷中的内容,与正常转发IPv4数据报一样将其转发至目的地。目的IPv6路由器接收到该IPv4数据报后,将会确定该IPv4数据报中包含一个IPv6数据报,从中提取出IPv6数据报后再为该IPv6数据报提供路由
基于目的地转发的特征总结为两个步骤:①查找目的IP地址②将分组发送到有特定输出端口的交换结构。这种模式可以建议理解为匹配+转发
现在考虑一种更加通用的“匹配+动作“范式,其中能够对协议栈的多个首部字段进行匹配,这些首部字段是与不同层次的不同协议相关联的。”动作“包括:将分组转发到一个或多个输出端口(如同基于目的地转发),跨越多个通向服务的离开接口进行负载均衡分组(如同负载均衡),重写首部值(如同NAT),有意识地阻挡/丢弃某个分组(如同防火墙),每进一步处理和动作二线某个特定的服务器发送一个分组(如同DPI)
在通用转发中,一张匹配加动作表将基于目的地的转发表一般化了。因为能够使用网络层或链路层源和目的地址做出转发决定,所以这种转发设备被称为分组交换机,而不是第三层的路由器或第二层的交换机
匹配加动作转发表在OpenFlow中称为流表(flow table),表项包括:
·首部字段值的集合:入分组时将于之匹配。与基于目的地转发的情况一样,基于硬件匹配在TCAM内存中执行的最迅速。不匹配的分组将会被丢弃或发送到远程控制器做更多处理
·计数器集合(当分组与流表项匹配时更新计数器):计数器包括已经与该表项匹配的分组数量,以及自从该表项上次更新以来的时间
·当分组匹配流表项时所采取的动作集合:这些动作可能将分组转发给给定的输出端口、丢弃该分组、复制该分组、将他们发送到多个和输出端口、重写所选的首部字段
到达一台分组交换机的一个链路层帧将包含一个网络层数据报作为其有效载荷,该有效载荷通常将包含一个运输层报文段
OpenFlow的匹配抽象允许对来自三个层次的协议首部所选择的字段进行匹配。下图中的源和目的MAC地址时与帧的发送和接收接口相关联的链路层地址;通过基于以太网地址而不是IP地址进行转发,可以看出OpenFlow使能的设备能够等价于网络层路由器转发数据包以及链路层交换机转发帧
流表项也可以具有通配符。比如,一个流表中IP地址128.119.*.*将匹配其地址的前16比特为128.119的任何数据报所对应的地址字段。每个流表项也具有相应的优先权。如果一个分组匹配多个流表项,那么它选定的匹配和对应的动作将是优先权最高的那个
每个流表项都有零个或多个动作列表,这些动作决定了应用于流表项匹配的分组的处理方式。如果有多个动作,将会按照表中规定的次序执行
主要的动作包括:①转发。将一个入分组转发到一个特定的物理输出端口、广播到所有端口、通过所选的端口集合进行多播。该分组可能被封装并发送到用于该设备的远程控制器②丢弃。分组匹配到没有动作的流表项将会被丢弃③修改字段。分组被转发到所选的输出端口之前,分组首部字段中(除了IP协议字段外的所有第二、三、四层字段)的值可以重写
上图所示的网络包括六台主机、三台分组交换机。每台交换机有四个本地接口
将来自h5或h6发往h3或h4的分组从s3转发到s1,然后从s1转发到s2
则s3 s1 s2的流表项分别是
来自h3发往10.1.*.*的数据报经过s1和s2之间的直接链路转发,与此同时来自h4发往10.1.*.*的数据报经过s2和s3之间的链路转发。这种行为不能通过基于IP目的地转发实现
s2的表项为
在s1需要流表项将从s2接受的数据报转发到h1或h2。在s3中需要流表项将接口4上从s2收到的数据报通过接口3转发给s1
s2的任何接口都只希望接收到来自与s3相连的主机所发送的流量
如果s2流表中没有其他的表项,则只有来自10.3.*.*的流量将被转发到与s2相连的主机