第四章 网络层:数据平面
4.1 网络层概述
4.1.1 转发和路由选择:数据平面和控制平面
网络层表面上看的功能极为简单即将分组从一台发送主机移动到一台接收主机,其两种重要功能:
- 转发:当一个分组到达某路由器的一个输入链路时,该路由器必须将该分组移动到适当的输出链路。转发是在数据平面实现的唯一功能,分组也有可能被现有的路由器阻挡,比如该分组来源于一个已知的恶意主机,或者该分组被发向一个被禁止的目的主机,或者可能是冗余的并经过多条出链路发送。
- 路由选择:当分组从发送方流向接收方时,网络层必须决定这些分组所采用的路由或者路径,计算这些路径的算法被称为路由选择算法。其在网络层的控制平面中实现。
转发指将分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作,转发发生的时间尺度很短通常为几纳秒,因此通常用硬件来实现。
路由选择是指确定分组从源到目的地所采取的端到端路径的网络范围处理过程,这个时间尺度要长的多通常为几秒,因此通产用软件实现。
每台路由器有一个关键元素是它的转发表,路由器检查到达分组的首部值,并根据这些值在其转发表中索引,通过这种方法来转发分组,在转发表中对应的值指出了该分组将被转发的路由器的输出链路接口,转发是由网络层的数据平面执行的主要功能。
1.控制平面:传统的方法
路由选择算法决定了插入该路由器转发表的内容,在一台路由器中的路由选择算法与在其他路由器中的路由选择算法通信,以计算出他转发表的值,这种通信的执行通过路由选择协议交换包含路由选择信息的路由选择报文。
2.控制平面:SDN方法
把路由器从物理上分离,远程控制器计算和分发转发表以供每台路由器所使用,这种方法与传统方法在数据平面上组件是一样的,但是这种方法控制平面路由选择功能与物理的路由器是分离的,即路由选择设备仅执行转发,而远程控制器计算并分发转发表。远程控制器可能实现在具有高可靠性和冗余的远程数据中心中,并可能由ISP或者某些第三方管理。路由器和远程控制器通过交换包含转发表和其他路由选择信息的报文。这种控制平面的方法称为软件定义网络(SDN),因为计算转发表并与路由器交互的控制器是用软件实现的。
4.1.2网络服务模型
网络服务模型定义了分组在发送与接收端系统之间的端到端运输特性。
我们现在考虑网络层能提供的某些可能的服务,这些服务可能包括:
- 确保交付。该服务确保分组将最终到达目的地。
- 具有时延上界的确保交付。该服务不仅确保分组的交付,而且在特定的主机到主机时延上界内交付。
- 有序分组交付。该服务确保分组以它们发送的顺序到达目的地。
- 确保最小带宽。这种网络层服务模仿在发送和接收主机之间一条特定比特率的传输链路的行为,只要发送主机以低于特定比特率的速率传输比特(作为分组的组成部分),则所有分组最终会交付到目的主机。
- 安全性。网络层能够在源加密所有数据报并在目的地解密这些分组,从而对所有运输层报文段提供机密性。‘
等等。。。。
因特网的网络层提供了单一的服务,称为尽力而为服务,他啥也不保证,甚至一个什么活儿也不干网络也属于是“尽力而为”,尽管听起来很扯,但是因特网的基本尽力而为服务与适当带宽供给相结合已经被证明超过“足够好”并应用于大量的应用。
第四章概述
我们约定分组交换机是指一台通用分组交换设备,它根据分组首部字段中的值,从输入链路接口到输出链路接口转移分组。某些分组交换机称为链路层交换机,基于链路层帧中的字段值做出转发决定,这些交换机因此被称为链路层设备。其他分组交换机称为路由器,基于网络层数据报中的首部字段值做出转发决定,路由器因此是网络层设备,在本章中我们主要使用路由器来代替交换机。
4.2路由器工作原理
- 输入端口:输入端口执行几项重要功能,它在路由器中执行终结入物理链路的物理层功能,这显示在输入端口部分的最左侧方框和输出端口部分最右侧的方框。它还要与位于入链路远端的数据链路层交互来执行数据链路层功能,这显示在输入与输出端口部分中间的方框中。在输入端口还要执行查找功能,这显示在输入端口最右侧的方框中。正是在这里,通过查询转发表决定路由器的输出端口,到达的分组通过路由器的交换结构转发到输出端口。控制分组(如携带路由选择协议信息的分组)从输入端口转发到路由选择选择处理器。
- 交换结构:交换结构将路由器的输入端口连接到它的输出端口,这种交换结构完全包含在路由器之中,即它是一个网络路由器中的网络。
- 输出端口:输出端口储存从交换结构接收的分组,并通过执行必要的链路层和物理层功能在输出链路上传输这些分组。当一条链路是双向的时(即承载两个方向的流量),输出端口通常与该链路的输入端口成对出现在同一线路卡上。
- 路由选择处理器:路由选择处理器执行控制平面功能。在传统路由器中它执行路由选择协议,维护路由选择表与关联链路状态的信息,并为该路由器计算转发表。在SDN路由器中,路由选择处理器负责与远程控制器通信,目的是接收由远程控制器计算的转发表项,并在路由器的输入端口安装这些表项。路由选择处理器还执行网络管理功能,这将在5.7中学习。
路由器的输入、输出端口几乎总是用硬件实现的,为了理解,考虑具有10Gbps输入链路和64字节的IP数据报,其输入端口在另一个数据报到达前仅仅只有51.2ns来处理数据报,如果N个端口结合在一块线路卡上(实践中也常常如此),数据报处理流水线必须以N倍速率运行,这远快过软件实现的速率。转发硬件既能够使用路由器厂商自己的硬件设计来实现,也能够使用购买的商用硅片的硬件设计来实现。
当数据平面以纳秒尺度运行时,路由器的控制功能以毫秒或者秒的尺度运行,这些控制功能包括执行路由选择协议、对上线或者下线的连接链路进行响应、与远程控制器通信(在SDN场合)和执行管理功能。因而这些控制平面的功能通常用软件实现并在路由选择处理器(通常是一种传统的CPU)上执行。
4.2.1 输入端口处理和基于目的地转发
在输入端口路由器使用转发表来查找输出端口,使得分组能经过交换结构转发到该输出端口。转发表是由路由选择处理器计算和更新的(使用路由选择协议与其他网络路由器中的路由选择处理器进行交互),或者转发表接收来自远程SDN控制器的内容使用在每个输入端口的影子副本,转发决策能在每个输入端口本地做出,无须基于每个分组调用集中式路由选择处理器,因此避免了集中式处理的瓶颈。
->线路端接->数据链路处理(协议,拆装)->查找,转发,排队->交换结构
路由器用分组目的地址的前缀与转发表中的表项进行匹配,存在匹配项则向与该匹配项相关联的链路转发分组。当有多个匹配时该路由器使用最长前缀匹配规则。
一旦找到某分组的输出端口就会进入交换结构,在某些设计中如果交换结构有来自其他输入端口的分组正在使用该交换结构那它就得排队等着。“查找”的过程是在输入端口中被认为最重要的动作,但也不是全部:①必须出现物理层和链路层处理②必须检查分组的版本号、检验和以及寿命字段,并且重写后两者③必须更新用于网络管理的计数器(如接收到的IP数据报数目)
4.2.2 交换
交换结构位于一台路由器的核心部位。
- 经内存交换:最早输入、输出端口之间的交换是由CPU(路由选择处理器)直接控制下完成的。输入端口通过中断方式向处理器发送信号,然后分组被复制到处理器内存中,提取目的地址通过转发表找到合适的输出端口,并将该分组复制到输出端口的缓存中。总的转发吞吐量必定小于内存带宽的一半,而且不能同时转发两个分组,即使有不同的目的端口,因为经过共享系统总线一次仅能执行一个内存读/写。
- 经总线交换:输入端口经一根共享总线将分组直接传送到输出端口,不需要路由选择处理器的干预。让输入端口为分组预先计划一个交换机内部标签(首部),指示本地输出端口,使分组在总线上传送和传输到输出端口。每个输出端口都会收到这个分组,但是只有标签匹配的才会保留,并且标签会在输出端口被去除(因为其只用于交换机内部来跨越总线),如果多个分组同时到达路由器,一个过,其他的等着,因为一次只有一个分组跨越总线。因为每个分组必须跨过单一总线,故交换机的交换带宽受总线速率的限制。
- 经互联网络交换:纵横式交换机就是由2N条总线组成的互联网络,它连接N个输入端口与N个输出端口。(井 式交叉)交叉点通过交换交换结构控制器(其逻辑是自交换结构自身的一部分)能够在任何时候开启或闭合。当某分组到达端口A需要转发到端口Y时,控制对应的交叉点闭合就可以了,并且同时其他交换动作也能进行!(闭合别的点就行了,互不影响)。这种纵横式交换机是非阻塞的,即只要没有其他分组当前被转发到该输出端口,转发到输出端口的分组就不会阻塞。但是如果来自不同输入端口的两个分组被转发到同一个输出端口,那么其中一个就要在输入端等待,因为在某个时刻经给定总线仅能够发送一个分组。
更复杂的比如并行N个交换结构,一个输入端口将一个分组分成K个较小的“块”,并且通过N个交换结构中的K个发送“喷射”这些块到所选择的输出端口,输出端口再将K个块装配还原成初始的分组。
4.2.3输出端口处理
交换结构->排队(缓存管理)->数据链路处理(协议、封装)->线路端接
4.2.4何处出现排队
在输入端口和输出端口都会出现排队,并且随着队列增长缓存会耗尽,当没有内存储存到达的分组时就会丢包。
假定输入线路速度和输出线路速度是相同的,均为Rline(单位为每秒分组数)并且有N个输入端口和N个输出端口。为了简化讨论,假定所有的分组具有相同的固定长度,分组以同步的方式到达输入端口。这就是说,在任何链路发送分组的时间等于在任何链路接收分组的时间,在这样的时间间隔内,在任何一个输入链路上能够到达0或1个分组。定义交换结构传输速率Rswitch为从输入端口到输出端口能够移动分组的速率。如果Rswitch比Rline快N倍,则在输入端口处仅会出现微不足道的排队。这是因为即使在最坏情况下,所有N条输入线路都在接收分组,并且所有的分组将被转发到相同的输出端口,每批N个分组(每个输入端口一个分组)也能够在下一批到达前通过交换结构处理完毕。
1.输入排队
如果交换结构不能快的使所有到达分组无时延的通过它发送,输入端口也将出现排队。考虑纵横式交换结构,并假定所有链路速度相同、一个分组能够以一条输入链路接收一个分组所用的相同的时间量,从任意一个输入端口传送到给定的输出端口、分组按FCFS方式(先来先服务算法。虽然这种算法比较公平,但是它通常并不提供最快的服务。)从一指定输入队列移动到其要求的输出队列中。只要其输出端口不同,多个分组可以被并行传送,然而如果位于两个输出队列前端的两个分组目的地是相同的输出队列,那其中一个就得排队等着。
考虑一种情况,你是一个分组,你在输入端口排队,你为什么排队呢?因为你前面的分组在排队。你前面的分组为什么要排队呢?因为他要去的那个输出端口,别的输入端口的分组正在去,所以它在排队。但是问题来了,即使你不跟它们(另一个输入端口的分组和你前面的分组)去同一个输出端口,你也得排队,没辙。这种现象叫输入排队交换机中的线路前部(HOL)阻塞。正因如此,只要输入链路上的分组到达速率达到其容量的58%,在某些假设的前提下,输入队列的长度就将无限制的增大(事实上是大量的丢包)。
2.输出排队
Rswitch比Rline依然快N倍,并且到达N个输入端口的每个端口的分组目的地都是相同的输出端口。在此情况下,每向输出链路(注意不是输出端口)发送一个分组都将由N个新分组到达该输出端口(N个输入端口每个到达一个),然后发送一个,又到达N个。。。。看吧,即使Rswitch比Rline快N倍,输出端口依然会形成分组队列,然后越来越大。。。
当缓存不够,而且又有入分组来的时候就要做出决定了,我和你妈一起掉水。。。不是,要么丢弃这个到达的分组(弃尾),要么把已经到达的一个或者多个分组删掉来给新分组腾地。某些情况下,在缓存填满之前丢弃一个分组(或在其首部加上标记)是有利的,这可以向发送方提供一个拥塞信号。已经提出和分析了许多分组丢弃和标记策略,这些策略统称为**主动队列管理(AQM)**算法。**随机早期检测(RED)**算法是得到最广泛研究和实现的AQM算法之一。
假设这个时间n个分组到达了n个输入端口,并且都要传送到同一个输出端口。一个时间单位后,这n个分组都传送到了该输出端口并且排着队等着传输(假设依然快n倍嘛),下一个时间单位中输出端口要挑一个分组传输出去,而且在这个时间单位中又来了m个分组,并且其中1个要传送到刚才的那个输出端口(m<n),这样做的后果就是输出端口的分组调度在这些排队分组中选择一个分组来传输,怎么选在下节讨论。
假定需要路由器缓存来吸收流量负载的波动,一个自然而然的问题就是需要多少缓存。多年来的经验是[RDC 3439]缓存数量(B)应当等于平均往返时延(RTT)乘以链路的容量(C)。这个结果是基于相对少量的TCP流的排队动态性分析得到的。因此,一条具有250msRTT的10Gbps链路需要的缓存量等于B = RTT x C = 2.5Gb。然鹅最近研究表明当有大量的TCP流(N条)流过一条链路时,缓存需要的数量是B = RTT x C/根号N。
4.2.5 分组调度
1.先进先出(FIFO)
没啥好说的0.0
2.优先权排队
比如分成普通用户和vip两个队,普通用户来了进普通用户队列,vip来了进vip队列,每种队列内通常是FIFO。
实践中网络操作员可以配置一个队列,这样携带网络管理信息的分组(比如通过源或目的TCP/UDP端口号所标识)能够比用户流量更有优先权。或者比如实时语音比电子邮件更具有优先权。要传输一个分组时从队列为非空的最高优先级中传输。分组传输时也不能被别的分组打断。
3.循环和加权公平排队
循环公平排队跟上一个相似,不同之处就是大家都是平等的,没有我是vip你不是这一说,循环着来,你这个队列没人了就找下一个。
**加权公平排队(WFQ)**给每个类分配权重,即使是最坏情况下也就是每个队都有人,某个队依然能获得权重x总带宽
4.3网际协议:IPv4、寻址、IPv6和其他
4.3.1 IPv4数据报格式
- 版本(号)。这4比特规定了数据报的IP协议版本。通过查看版本号,路由器能够确定如何解释IP数据报的剩余部分。不同IP版本使用不同的数据报格式。
- 首部长度。因为一个IPv4数据报可包含一些可变数量的选项(在首部中),故需要用这4比特来确定IP数据报中载荷(例如被封装的运输层报文段)实际开始的地方。大多数IP数据报不包含选项,所以一般的IP数据报具有20字节的首部。
- 服务类型。服务类型(TOS)比特包含在IPv4的首部中,以便不同类型的IP数据报(例如一些特别要求低时延、高吞吐量或可靠性的数据报)能相互区别开来。
- 数据报长度。首部加上数据,总长度为16比特,所以IP数据报的理论最大长度为65535字节。然鹅数据报很少有超过1500字节的,该长度使得IP数据报能容纳最大长度以太网帧的载荷字段。
- 标识、标志、位偏移。这仨与所谓的IP分片有关。IPv6不允许在路由器上对分组分片。
- 寿命。TTL保证数据报不会永远在网络中循环,每当一个路由器处理数据报时,该字段值减一。若TTL字段减到0则必须丢弃。
- 协议。用于指示当一个到达最终目的地的数据报应该被交给哪个运输层协议,例如为6表示交给TCP,17则表明数据要交给UDP。
- 首部检验和。用于帮助路由器检测收到的IP数据报中的比特错误:将首部中的每两个字节当作一个数,用反码算数将这些求和,该和的反码(被称为因特网检验和)存放在检验和字段中。路由器要对每个收到的IP数据报计算这个东西,如果计算结果与携带的检验和不一致,那么说明有差错,路由器一般会丢弃。注意,每台路由器必须重新计算检验和并放回原处,因为TTL字段或者可能的选项字段可能会发生改变。那么为什么TCP/IP在网络层和运输层都执行差错检测呢?IP层其实只在首部计算了检验和,而TCP/UDP检验和是对整个TCP/UDP报文段进行的,其次TCP/UDP与IP不一定都属于同一个协议栈,原则上TCP能够运行在一个不同的协议上,而IP能够携带不一定要传给TCP/UDP的数据。
- 源和目的IP地址。当某源生成一个数据报时,它在源IP字段中插入它的IP地址,在目的IP地址字段插入其最终目的地地址。通常是源主机通过DNS查找来决定目的地址。
- 选项。选项字段允许IP首部被扩展。有些数据报有选项有的则没有,所以一台路由器处理一个IP数据报所需的时间变化可能很大,在IPv6首部已经去掉了IP选项。
- 数据(有效载荷)。包含着交付给目的地的运输层报文段(UDP或TCP),也可以是其他类型比如ICMP报文
如果无选项那么IP数据报首部有20字节。如果数据报承载一个TCP报文段,则每个(无分片的)数据报共承载了总长40字节的首部(IP20+TCP20)以及应用层报文。
4.3.2 IPv4数据报分片
一个链路层帧能承载的最大数据量叫做最大传送单元(MTU),因为每个IP数据报封装在链路层帧中从一台路由器传输到下一台路由器,故链路层协议的MTU严格的限制着IP数据报的长度。对IP数据报长度的限制并不是主要问题,问题在于发送方与目的地路径上的每段链路可能使用不同的链路层协议,且每种协议可能有不同的MTU。
问题来了,你是一个路由器,收到了一个大帧,想传输出去的时候发现帧太大了输出链路不允许,那怎么办?把它切成几个小的IP数据报,再用单独的链路层帧封装它们发出去不就行了。每个小数据报称为片。
运输层协议都希望得到完整的数据报而不是一片一片的,这个组装的任务被设计到了端系统完成而不是路由器。这就用到了标识、标志和片偏移字段。生成一个数据报时发送主机在设置源和目的地址的同时贴上标识号,发送主机将它发送的每个数据报的标识号加1.某个路由器需要对某个数据报分片时,形成的每个数据报(即片)具有初始数据报的源地址、目的地址和标识号。当目的主机从同一源主机收到一系列数据报时,它能检查标识号以确定哪些小数据报是原始一个大数据报的片。由于IP提供不可靠服务,最后一个片的标志比特被设为0,其他全为1。另外为了让目的主机确定是否丢了一个片也为了让它按正确顺序组装片,使用偏移字段指定了该片应该被放在哪个位置。
4.3.3 IPv4编址
主机与物理链路之间的边界叫做接口。路由器与它的任意一条链路之间的边界也叫做接口。IP要求每台主机和路由器接口拥有自己的IP地址,因此从技术上讲,一个IP地址与一个接口相关联,而不是与包括该接口的主机或路由器相关联。
每个IP地址长度为32bit,也就是4字节,因此总共有2的32次方(约40亿)个可能的IP地址,通常按照点分十进制记法书写。
每个接口都必须有一个全球唯一的IP地址(NAT后面的除外),这些地址不能随意的自由选择,一个接口的IP地址的一部分需要其连接的子网来决定。
如图,左侧4个接口通过一个并不包含路由器的网络互联起来。该网络可能是一个以太网LAN互联,在此情况下这些接口讲通过一台以太网交换机互联,或者通过一个无线接入点互联。
这三个主机接口和一个路由器接口形成一个子网。IP编址为这个子网分配一个地址223.1.1.0/24,其中的/24记法有时称为子网掩码,指示32比特中最左侧24比特定义了子网地址,因此子网由3个主机接口(223.1.1.1 223.1.1.2 223.1.1.3)和一个路由接口(223.1.1.4)组成。
任何其他要连到223.1.1.0/24网络的主机都要求其地址具有223.1.1.xxx的形式。图中显示了另外两个网络:223.1.2.0/24和223.1.3.0/24子网。
一个子网的IP定义并不局限于连接多台主机到一个路由器接口的以太网段。为了确定子网,分开主机和路由器的每个接口,产生的几个隔离的网络岛,使用接口端接这些隔离的网络的端点。这些隔离的网络中的每一个都叫一个子网。
因特网的地址分配策略被称为无类别域间路由选择(CIDR)。当使用子网寻址时,32比特的IP地址被划分为两部分,并且也具有点分十进制数的形式a.b.c.d/x,其中x指示了地址的第一部分的比特数。形式为a.b.c.d/x的地址的x最高比特构成了IP地址的网络部分,并且经常被称为该地址的前缀。一块组织通常被分配一块连续的地址,即具有相同前缀的一段地址,该组织内部的设备的IP地址将共享共同的前缀。这就是说当该组织外部的一台路由器转发一个数据报并且数据报的目的地址位于该组织的内部时仅需要考虑该地址前面的x比特,这大大减少了路由器转发表的长度。
一个地址的剩余32-x比特可认为是用于区分该组织内部设备的,其中的所有设备具有相同的网络前缀。当该组织内部的路由器转发分组时才会考虑这些比特。这些较低阶的比特可能(或可能不)具有另外的子网结构。
在CIDR被采用之前,IP地址的网络部分被限制长度为8、16或24比特,这是一种被称为分类编址的编址方案,这是因为具有8、16和24比特子网地址的子网分别被称为A、B和C类网络,一个IP地址的网络部分正好为1、2或3字节的要求已经在支持数量迅速增加的具有小规模或中等规模的子网的组织方面出现了问题。一个C类子网(/24)仅能容纳2的8次幂-2=254(其中两个地址预留作特殊用途)。这对许多组织来说太小了。一个B类呢(/16)容纳65534台,又太大了。
当一台主机发出一个目的地址为255.255.255.255的数据报时,该报文会交付给同一个网络中的所有主机。路由器也会有选择的向临近的子网转发该报文(虽然它们通常不这样做)。
1.获取一块地址
为了获取一块IP地址用于一个组织的子网内,某网络管理员也许会首先与他的ISP联系,该ISP可能会从已分给它的更大地址块中提供一些地址。IP地址由因特网名字和编号分配机构(ICANN)管理,它还管理DNS根服务器并且分配域名和解决域名纷争。
2.获取主机地址:动态主机配置协议
系统管理员通常远程通过网络管理工具手工配置路由器中的IP地址。主机地址也能手动配置,但是这项任务目前更多的是使用动态主机配置协议(DHCP)。DHCP允许主机自动获取(被分配)一个IP地址,可以每次网络连接时都相同,也可以分配一个临时的。除此以外DHCP还允许一台主机得知其他信息,例如他的子网掩码、它的第一跳路由器(常称为默认网关)与它本地DNS服务器的地址。
DHCP也常被称为即插即用协议或零配置协议。有许多用户来来往往并在有限的时间内需要地址,这种情形就非常适合DHCP。
DHCP是一个客户-服务器协议,每个子网都要有一台DHCP服务器,没有的话则需要一台DHCP中继代理(通常是一台路由器),这个代理知道用于该网络的DHCP服务器地址。
针对一个新到达的主机而言,DHCP是一个4步骤的过程,yiddr表示分配给新到达客户的地址。
- DHCP服务器发现。一个新到达的主机在UDP分组中向端口67发送DHCP发现报文。嘶。。。等会,发给谁呢?DHCP服务器还没照着呢。在这种情况下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请求报文进行响应,证实所要求的参数。
因为客户可能在该租用期超时后还希望使用这个IP地址,所以DHCP还提供了一种机制以允许客户更新它对一个IP地址的租用。
4.3.4 网络地址转换
地址空间10.0.0.0/8是在[RFC 1918]中保留的三部分IP地址空间之一,这些地址用于家庭网络等专用网络或具有专用地址的地域。在一个给定家庭网络中的设备能够使用10.0.0.0/24编址彼此发送分组,但是发送或从全球因特网的分组就不能使用这些地址了,因为全球有n个专用网络在使用这组地址,那么当连接入全球因特网时怎样寻址呢,怎样才是编址唯一呢?
NAT使能路由器对外界因特网而言像一个具有单一IP地址的IP设备,对外界隐藏了家用网络的细节,那么NAT使能路由器怎么得到它的IP地址呢?也是DHCP,路由器从ISP的DHCP服务器得到它的地址,并且路由器运行一个DHCP服务器,为位于NAT-DHCP路由器控制的家庭网络地址空间中的计算器提供一个地址。
NAT路由器维护一个NAT转换表并在其中包含了端口号及其IP地址。
NAT的贬低者认为端口号是用于进程寻址的而不是主机寻址的,解决方案包括NAT穿越工具和通用即插即用(UPnP)。UPnP是一种允许主机发现和配置邻近NAT的协议。
NAT已经称为因特网的一个重要组件,称为所谓的中间盒,它运行在网络层并且具有和路由器十分不同的功能。它不执行传统的数据报转发,而是执行诸如NAT、流量流的负载均衡、流量防火墙等功能。
4.3 IPv6
新的子网和IP节点以惊人的增长率连接到因特网并被分配唯一的IP地址,32bit的IP地址空间即将用尽,为了应对这种情况开发了IPv6并且加强了IPv4。
1.IPv6数据报格式
- 扩大的地址容量。除了单播和多播地址以外,它还引入了一种称为任播地址的新型地址,这种地址可以使数据报交付给一组主机中的任意一个(例如可用于向一组包含给定文档的镜像站点的最近一个发送HTTP GET请求)
- 简化高效的40字节首部。许多IPv4字段已被舍弃或或作为选项。因而形成的40字节定长首部允许路由器更快的处理IP数据报。一种新的选项编码允许进行更灵活的选项处理。
- 流标签。IPv6有一个难以捉摸的流定义。该字段可用于“给特属于特殊流的分组加上标签,这些特殊流是发送方要求进行特殊处理的流,如一种非默认服务质量或需要实时服务的流”,比如音频和视频传输可能被认为是流,电子邮件传输就不会。高优先权用户(比如为使其流量得到更好的服务而付费的用户)承载的流量也有可能被当作一个流,可以看出即使没有一个十分精确的定义,但是设计者仍然考虑到了为了可能会出现的某种状况。
- 版本。该4bit字段用于标识IP版本号,IPv6将该字段设为6(但是IPv4不是4 。。。。)
- 流量类型。该8bit字段与IPv4的TOS(服务类型)字段相似。
- 流标签。该20bit的字段用于标识一条数据报的流,能够对一些流中的某些数据报给出优先权,或者对某些来自某些应用的数据报给出更高的优先权。
- 有效载荷长度。这16bit是一个无符号整数,给出了IPv6数据报中跟在定长40字节首部后面的字节数量。
- 下一个首部。标识数据字段需要交付给哪个协议(比如TCP啥的),这个字段使用与IPv4首部中协议字段相同的值。
- 跳限制。类似于IPv4的寿命字段。
- 源和目的地址。
- 数据。这是IPv6数据报的有效载荷部分。
IPv6中没有的:
- 分片和重新组装:IPv6不允许数据报在路由器中进行分片和组装,这个过程只能被源和目的地执行,如果一个路由器因为一个IPv6数据报太大而无法转发到链路上的话,路由器只需要扔掉它就好了并向发送方发送一个“你这个报太大了,拆小点再发给我”的ICMP差错报文即可。分组和重新组装非常耗时,这个系统从路由器中移到端系统中将会大大提高转发效率。
- 首部检验和。设计者可能认为在链路层和运输层都会检验那么在网络层又检验一遍多少有点多余于是就把它删掉了。如图分片和重组、计算跳限制(或者寿命字段)一样,路由器中执行计算首部检验和也很耗时。
- 选项。没有了这个字段,但是不一定消失,也可能会出现在下一个首部字段。删除选项字段使得IP首部称为定长的40字节。
2.IPv4到IPv6的迁移
那么如果两个IPv6节点之间存在有IPv4节点那么怎么传输数据呢?我们把两个IPv6节点之间的IPv4节点集合称为隧道,当IPv6数据报到达IPv4节点后,只需要把IPv6数据报塞到IPv4数据报的有效载荷字段即可,然后正常传输。这些IPv4节点也不知道自己传的IPv4数据报中的数据字段包含有完整的IPv6数据报。穿过隧道后第一个IPv6节点通过查看IPv4数据报的协议号字段是41,指示该IPv4的有效载荷是IPv6数据报并把其取出,就好像是从一个直接相连的IPv6邻居那里接收到该IPv6数据报那样。
4.4 通用转发和SDN
我们现在考虑一种更有意义的通用“匹配加动作”范式,其中能对协议栈多个首部字段进行匹配,这些首部字段是与不同层次的不同协议相关联的。“动作”能够包括:将分组转发到一个或多个输出端口(就像在基于目的地转发中一样),跨越多个通向服务的离开接口进行负载均衡分组(就像在负载均衡中一样),重写首部值(就像在NAT中一样),有意识阻挡/丢弃某个分组(就像在防火墙中一样),为进一步处理和动作而向某个特定的服务器发送一个分组(就像在DPI一样)等等。
因为能够使用网络层和/或链路层源和目的地址做出转发决定,所以这种转发设备更为准确的描述为“分组交换机”而不是第三层“路由器”或是第二层“交换机”
每台分组交换机又一张匹配加动作表,通过远程控制计算、安装和更新。在各台分组交换机中的控制组件可以相互作用,但是实践中通用匹配加动作能力是通过计算、安装和更新这些表的远程控制器实现的。
我们主要考虑OpenFlow1.0,该标准以特别清晰和简明的方式引入了关键的SDN抽象和功能。
匹配加动作转发表在OpenFlow中称为流表,它的每个表项包括:
- 首部字段值的集合,如分组将与之匹配。基于硬件匹配在TCAM内存中执行的最为迅速(TCAM内存中可能有上百万条地址表项)。匹配不上流表项的分组将被丢弃或者发送到远程控制器做更多处理。
- 计数器集合(当分组与流表项匹配时更新计数器)。这些计数器可以包括已经与该表项匹配的分组数量以及自从该表项上次更新以来的时间。
- 当分组匹配流表项时所采取的动作集合。这些动作可能将分组转发到给定的输出端口,丢弃该分组、复制该分组和将它们发送到多个输出端口,和/或重写所选的首部字段。
流表本质上是一个API,通过这种抽象每台分组交换机的行为能够被编程。
4.4.1 匹配
OpenFlow的匹配抽象允许对来自三个层次的协议首部所选择的字段进行匹配。
流表项可以有通配符。每个流表项也有相应的优先权,如果一个分组匹配多个流表项,选定的匹配和对应的动作将是其中有最高优先权的那个。
并不是一个IP首部中的所有字段都能被匹配,如果匹配所有就会显得过于臃肿,这种抽象化的处理也就没有什么意义了。
4.4.2动作
每个流表项都有零个或多个动作列表,这些动作决定了应用于与流表项匹配的分组的处理。如果有多个动作,它们以在表中规定的次序执行。
其中最为重要的动作可能是:
- 转发。一个入分组可以转发到一个特定的物理输出端口,广播到所有端口(除了该分组的到达端口),或通过所选的端口集合进行多播。该分组可能被封装并发送到用于该设备的远程控制器。该控制器可能(或可能不)对该分组采取某些动作,包括安装新的流表项,以及可能将该分组返回给该设备以在更新的流表桂萼集合下进行转发。
- 丢弃。没有动作的流表项表明某个匹配的分组应该被丢弃。
- 修改字段。在分组被转发到所选输出端口之前,分组首部十个字段(除IP协议字段外的所有第二、三、四层的字段)中的值可以重写。