网络层表面上看的功能极为简单即将分组从一台发送主机移动到一台接收主机,其两种重要功能:
转发指将分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作,转发发生的时间尺度很短通常为几纳秒,因此通常用硬件来实现。
路由选择是指确定分组从源到目的地所采取的端到端路径的网络范围处理过程,这个时间尺度要长的多通常为几秒,因此通产用软件实现。
每台路由器有一个关键元素是它的转发表,路由器检查到达分组的首部值,并根据这些值在其转发表中索引,通过这种方法来转发分组,在转发表中对应的值指出了该分组将被转发的路由器的输出链路接口,转发是由网络层的数据平面执行的主要功能。
路由选择算法决定了插入该路由器转发表的内容,在一台路由器中的路由选择算法与在其他路由器中的路由选择算法通信,以计算出他转发表的值,这种通信的执行通过路由选择协议交换包含路由选择信息的路由选择报文。
把路由器从物理上分离,远程控制器计算和分发转发表以供每台路由器所使用,这种方法与传统方法在数据平面上组件是一样的,但是这种方法控制平面路由选择功能与物理的路由器是分离的,即路由选择设备仅执行转发,而远程控制器计算并分发转发表。远程控制器可能实现在具有高可靠性和冗余的远程数据中心中,并可能由ISP或者某些第三方管理。路由器和远程控制器通过交换包含转发表和其他路由选择信息的报文。这种控制平面的方法称为软件定义网络(SDN),因为计算转发表并与路由器交互的控制器是用软件实现的。
网络服务模型定义了分组在发送与接收端系统之间的端到端运输特性。
我们现在考虑网络层能提供的某些可能的服务,这些服务可能包括:
等等。。。。
因特网的网络层提供了单一的服务,称为尽力而为服务,他啥也不保证,甚至一个什么活儿也不干网络也属于是“尽力而为”,尽管听起来很扯,但是因特网的基本尽力而为服务与适当带宽供给相结合已经被证明超过“足够好”并应用于大量的应用。
我们约定分组交换机是指一台通用分组交换设备,它根据分组首部字段中的值,从输入链路接口到输出链路接口转移分组。某些分组交换机称为链路层交换机,基于链路层帧中的字段值做出转发决定,这些交换机因此被称为链路层设备。其他分组交换机称为路由器,基于网络层数据报中的首部字段值做出转发决定,路由器因此是网络层设备,在本章中我们主要使用路由器来代替交换机。
当数据平面以纳秒尺度运行时,路由器的控制功能以毫秒或者秒的尺度运行,这些控制功能包括执行路由选择协议、对上线或者下线的连接链路进行响应、与远程控制器通信(在SDN场合)和执行管理功能。因而这些控制平面的功能通常用软件实现并在路由选择处理器(通常是一种传统的CPU)上执行。
在输入端口路由器使用转发表来查找输出端口,使得分组能经过交换结构转发到该输出端口。转发表是由路由选择处理器计算和更新的(使用路由选择协议与其他网络路由器中的路由选择处理器进行交互),或者转发表接收来自远程SDN控制器的内容使用在每个输入端口的影子副本,转发决策能在每个输入端口本地做出,无须基于每个分组调用集中式路由选择处理器,因此避免了集中式处理的瓶颈。
->线路端接->数据链路处理(协议,拆装)->查找,转发,排队->交换结构
路由器用分组目的地址的前缀与转发表中的表项进行匹配,存在匹配项则向与该匹配项相关联的链路转发分组。当有多个匹配时该路由器使用最长前缀匹配规则。
一旦找到某分组的输出端口就会进入交换结构,在某些设计中如果交换结构有来自其他输入端口的分组正在使用该交换结构那它就得排队等着。“查找”的过程是在输入端口中被认为最重要的动作,但也不是全部:①必须出现物理层和链路层处理②必须检查分组的版本号、检验和以及寿命字段,并且重写后两者③必须更新用于网络管理的计数器(如接收到的IP数据报数目)
交换结构位于一台路由器的核心部位。
更复杂的比如并行N个交换结构,一个输入端口将一个分组分成K个较小的“块”,并且通过N个交换结构中的K个发送“喷射”这些块到所选择的输出端口,输出端口再将K个块装配还原成初始的分组。
交换结构->排队(缓存管理)->数据链路处理(协议、封装)->线路端接
在输入端口和输出端口都会出现排队,并且随着队列增长缓存会耗尽,当没有内存储存到达的分组时就会丢包。
假定输入线路速度和输出线路速度是相同的,均为Rline(单位为每秒分组数)并且有N个输入端口和N个输出端口。为了简化讨论,假定所有的分组具有相同的固定长度,分组以同步的方式到达输入端口。这就是说,在任何链路发送分组的时间等于在任何链路接收分组的时间,在这样的时间间隔内,在任何一个输入链路上能够到达0或1个分组。定义交换结构传输速率Rswitch为从输入端口到输出端口能够移动分组的速率。如果Rswitch比Rline快N倍,则在输入端口处仅会出现微不足道的排队。这是因为即使在最坏情况下,所有N条输入线路都在接收分组,并且所有的分组将被转发到相同的输出端口,每批N个分组(每个输入端口一个分组)也能够在下一批到达前通过交换结构处理完毕。
如果交换结构不能快的使所有到达分组无时延的通过它发送,输入端口也将出现排队。考虑纵横式交换结构,并假定所有链路速度相同、一个分组能够以一条输入链路接收一个分组所用的相同的时间量,从任意一个输入端口传送到给定的输出端口、分组按FCFS方式(先来先服务算法。虽然这种算法比较公平,但是它通常并不提供最快的服务。)从一指定输入队列移动到其要求的输出队列中。只要其输出端口不同,多个分组可以被并行传送,然而如果位于两个输出队列前端的两个分组目的地是相同的输出队列,那其中一个就得排队等着。
考虑一种情况,你是一个分组,你在输入端口排队,你为什么排队呢?因为你前面的分组在排队。你前面的分组为什么要排队呢?因为他要去的那个输出端口,别的输入端口的分组正在去,所以它在排队。但是问题来了,即使你不跟它们(另一个输入端口的分组和你前面的分组)去同一个输出端口,你也得排队,没辙。这种现象叫输入排队交换机中的线路前部(HOL)阻塞。正因如此,只要输入链路上的分组到达速率达到其容量的58%,在某些假设的前提下,输入队列的长度就将无限制的增大(事实上是大量的丢包)。
Rswitch比Rline依然快N倍,并且到达N个输入端口的每个端口的分组目的地都是相同的输出端口。在此情况下,每向输出链路(注意不是输出端口)发送一个分组都将由N个新分组到达该输出端口(N个输入端口每个到达一个),然后发送一个,又到达N个。。。。看吧,即使Rswitch比Rline快N倍,输出端口依然会形成分组队列,然后越来越大。。。
当缓存不够,而且又有入分组来的时候就要做出决定了,我和你妈一起掉水。。。不是,要么丢弃这个到达的分组(弃尾),要么把已经到达的一个或者多个分组删掉来给新分组腾地。某些情况下,在缓存填满之前丢弃一个分组(或在其首部加上标记)是有利的,这可以向发送方提供一个拥塞信号。已经提出和分析了许多分组丢弃和标记策略,这些策略统称为**主动队列管理(AQM)**算法。**随机早期检测(RED)**算法是得到最广泛研究和实现的AQM算法之一。
假设这个时间n个分组到达了n个输入端口,并且都要传送到同一个输出端口。一个时间单位后,这n个分组都传送到了该输出端口并且排着队等着传输(假设依然快n倍嘛),下一个时间单位中输出端口要挑一个分组传输出去,而且在这个时间单位中又来了m个分组,并且其中1个要传送到刚才的那个输出端口(m
假定需要路由器缓存来吸收流量负载的波动,一个自然而然的问题就是需要多少缓存。多年来的经验是[RDC 3439]缓存数量(B)应当等于平均往返时延(RTT)乘以链路的容量(C)。这个结果是基于相对少量的TCP流的排队动态性分析得到的。因此,一条具有250msRTT的10Gbps链路需要的缓存量等于B = RTT x C = 2.5Gb。然鹅最近研究表明当有大量的TCP流(N条)流过一条链路时,缓存需要的数量是B = RTT x C/根号N。
没啥好说的0.0
比如分成普通用户和vip两个队,普通用户来了进普通用户队列,vip来了进vip队列,每种队列内通常是FIFO。
实践中网络操作员可以配置一个队列,这样携带网络管理信息的分组(比如通过源或目的TCP/UDP端口号所标识)能够比用户流量更有优先权。或者比如实时语音比电子邮件更具有优先权。要传输一个分组时从队列为非空的最高优先级中传输。分组传输时也不能被别的分组打断。
循环公平排队跟上一个相似,不同之处就是大家都是平等的,没有我是vip你不是这一说,循环着来,你这个队列没人了就找下一个。
**加权公平排队(WFQ)**给每个类分配权重,即使是最坏情况下也就是每个队都有人,某个队依然能获得权重x总带宽
如果无选项那么IP数据报首部有20字节。如果数据报承载一个TCP报文段,则每个(无分片的)数据报共承载了总长40字节的首部(IP20+TCP20)以及应用层报文。
一个链路层帧能承载的最大数据量叫做最大传送单元(MTU),因为每个IP数据报封装在链路层帧中从一台路由器传输到下一台路由器,故链路层协议的MTU严格的限制着IP数据报的长度。对IP数据报长度的限制并不是主要问题,问题在于发送方与目的地路径上的每段链路可能使用不同的链路层协议,且每种协议可能有不同的MTU。
问题来了,你是一个路由器,收到了一个大帧,想传输出去的时候发现帧太大了输出链路不允许,那怎么办?把它切成几个小的IP数据报,再用单独的链路层帧封装它们发出去不就行了。每个小数据报称为片。
运输层协议都希望得到完整的数据报而不是一片一片的,这个组装的任务被设计到了端系统完成而不是路由器。这就用到了标识、标志和片偏移字段。生成一个数据报时发送主机在设置源和目的地址的同时贴上标识号,发送主机将它发送的每个数据报的标识号加1.某个路由器需要对某个数据报分片时,形成的每个数据报(即片)具有初始数据报的源地址、目的地址和标识号。当目的主机从同一源主机收到一系列数据报时,它能检查标识号以确定哪些小数据报是原始一个大数据报的片。由于IP提供不可靠服务,最后一个片的标志比特被设为0,其他全为1。另外为了让目的主机确定是否丢了一个片也为了让它按正确顺序组装片,使用偏移字段指定了该片应该被放在哪个位置。
主机与物理链路之间的边界叫做接口。路由器与它的任意一条链路之间的边界也叫做接口。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的数据报时,该报文会交付给同一个网络中的所有主机。路由器也会有选择的向临近的子网转发该报文(虽然它们通常不这样做)。
为了获取一块IP地址用于一个组织的子网内,某网络管理员也许会首先与他的ISP联系,该ISP可能会从已分给它的更大地址块中提供一些地址。IP地址由因特网名字和编号分配机构(ICANN)管理,它还管理DNS根服务器并且分配域名和解决域名纷争。
系统管理员通常远程通过网络管理工具手工配置路由器中的IP地址。主机地址也能手动配置,但是这项任务目前更多的是使用动态主机配置协议(DHCP)。DHCP允许主机自动获取(被分配)一个IP地址,可以每次网络连接时都相同,也可以分配一个临时的。除此以外DHCP还允许一台主机得知其他信息,例如他的子网掩码、它的第一跳路由器(常称为默认网关)与它本地DNS服务器的地址。
DHCP也常被称为即插即用协议或零配置协议。有许多用户来来往往并在有限的时间内需要地址,这种情形就非常适合DHCP。
DHCP是一个客户-服务器协议,每个子网都要有一台DHCP服务器,没有的话则需要一台DHCP中继代理(通常是一台路由器),这个代理知道用于该网络的DHCP服务器地址。
针对一个新到达的主机而言,DHCP是一个4步骤的过程,yiddr表示分配给新到达客户的地址。
因为客户可能在该租用期超时后还希望使用这个IP地址,所以DHCP还提供了一种机制以允许客户更新它对一个IP地址的租用。
地址空间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、流量流的负载均衡、流量防火墙等功能。
新的子网和IP节点以惊人的增长率连接到因特网并被分配唯一的IP地址,32bit的IP地址空间即将用尽,为了应对这种情况开发了IPv6并且加强了IPv4。
IPv6中没有的:
那么如果两个IPv6节点之间存在有IPv4节点那么怎么传输数据呢?我们把两个IPv6节点之间的IPv4节点集合称为隧道,当IPv6数据报到达IPv4节点后,只需要把IPv6数据报塞到IPv4数据报的有效载荷字段即可,然后正常传输。这些IPv4节点也不知道自己传的IPv4数据报中的数据字段包含有完整的IPv6数据报。穿过隧道后第一个IPv6节点通过查看IPv4数据报的协议号字段是41,指示该IPv4的有效载荷是IPv6数据报并把其取出,就好像是从一个直接相连的IPv6邻居那里接收到该IPv6数据报那样。
我们现在考虑一种更有意义的通用“匹配加动作”范式,其中能对协议栈多个首部字段进行匹配,这些首部字段是与不同层次的不同协议相关联的。“动作”能够包括:将分组转发到一个或多个输出端口(就像在基于目的地转发中一样),跨越多个通向服务的离开接口进行负载均衡分组(就像在负载均衡中一样),重写首部值(就像在NAT中一样),有意识阻挡/丢弃某个分组(就像在防火墙中一样),为进一步处理和动作而向某个特定的服务器发送一个分组(就像在DPI一样)等等。
因为能够使用网络层和/或链路层源和目的地址做出转发决定,所以这种转发设备更为准确的描述为“分组交换机”而不是第三层“路由器”或是第二层“交换机”
每台分组交换机又一张匹配加动作表,通过远程控制计算、安装和更新。在各台分组交换机中的控制组件可以相互作用,但是实践中通用匹配加动作能力是通过计算、安装和更新这些表的远程控制器实现的。
我们主要考虑OpenFlow1.0,该标准以特别清晰和简明的方式引入了关键的SDN抽象和功能。
匹配加动作转发表在OpenFlow中称为流表,它的每个表项包括:
流表本质上是一个API,通过这种抽象每台分组交换机的行为能够被编程。
OpenFlow的匹配抽象允许对来自三个层次的协议首部所选择的字段进行匹配。
流表项可以有通配符。每个流表项也有相应的优先权,如果一个分组匹配多个流表项,选定的匹配和对应的动作将是其中有最高优先权的那个。
并不是一个IP首部中的所有字段都能被匹配,如果匹配所有就会显得过于臃肿,这种抽象化的处理也就没有什么意义了。
每个流表项都有零个或多个动作列表,这些动作决定了应用于与流表项匹配的分组的处理。如果有多个动作,它们以在表中规定的次序执行。
其中最为重要的动作可能是: