1.网络层概述
网络层存在于网络中所有主机和路由器中(路由器具有截断的协议栈,没有网络层以上的部分),由数据平面和控制平面两部分组成。
数据平面:是网络层中属于每台路由器自身的功能,决定到达路由器输入链路的数据报(网络层分组)如何转发到该路由器某一个具体的输出链路。
控制平面:是网络范围内的逻辑,控制数据报沿着从源主机到目的主机的端到端路径中路由器的路由方式。
如图所示:
- 过程实例:
- H1中的网络层取得来自于H1运输层的报文段,并将其封装成数据报,向相邻路由器发送该数据报;
- 在接收方路由器H2,网络层接收来自相邻路由器R2的数据报,提取出相应报文段并上传给H2运输层;
- 每台路由器数据平面作用是从其输入链路向其输出链路转发数据报,控制平面作用是协调本地的每台路由器转发动作,使数据报沿着源到目的主机之间的路由器路径进行端到端传输;
1.1 转发和路由选择:数据平面和控制平面
转发:当一个分组到达路由器的一条输入链路时,该路由器必须将该分组移动到合适的输出链路,这是一个路由器本地动作,发生时间很短,通常用硬件实现。转发是数据平面实现的唯一功能。分组有可能被现有的路由器阻拦(例如该分组来源于一个已知的恶意主机或者该分组发向一个被禁止的目的主机),或者可能是冗余的并经过多条出链路发送出去。
路由选择:当分组从发送方流向接收方时,网络层必须决定这些分组所采用的路由或路径,计算这些路径的算法被称作路由选择算法,这是一个端到端路径的网络范围处理过程,但路由选择发生时间相对很长,通常用软件实现。
每台网络路由器本地存有有一个关键元素转发表,路由器检查到达的分组首部中一个或多个字段,进而使用这些首部值在其转发表中索引,转发分组至相应的输出链路。转发表配置方式有两种:
- 传统方式:在一台路由器中的路由选择算法与在其它路由器中的路由选择算法通信,以计算它的转发表的值;
![image-20201110170746223](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/080.png)
- SDN方式:远程控制器计算和分发转发表供每台路由器使用,其中控制平面路由选择功能与物理路由器相分离,路由选择仅执行转发,远程控制器结算并分发转发表。路由器和远程控制器通过交换包含转发表和其它路由选择信息的报文而通信;
![image-20201110171252006](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/081.png)
1.2 网络服务模型
- 确保交付;
- 具有时延上界的确保交付;
- 有序分组交付;
- 确保最小带宽;
- 安全性;
- ……
但因特网的网络层只提供了尽力而为服务,即不保证任何服务,ATM网络体系结构提供了确保按序时延、有界时延和确保最小带宽。
分组交换机:指一台通用分组交换设备,根据分组首部字段中的值,从输入链路接口到输出链路接口转移分组
- 链路层交换机:基于链路层帧中的字段值做出转发决定,也被称为链路层设备;
- 路由器(router):基于网络层数据报中的首部字段值做出转发决定,是网络层设备;
2.路由器工作原理
路由器体系结构:
- 输入端口:
- 输入端口最左侧方框(及输出最右侧),执行终结入物理链路的物理层功能;
- 输入端口中间方框(及输出中间框),与位于入链路远端的数据链路层交互来执行数据链路层功能;
- 输入端口最右侧,执行查找功能,通过查询转发表决定路由器的输出端口,到达的分组通过路由器的交换结构转发到输出端口;
- 交换结构:将路由器的输入端口连接到输出端口;
- 输出端口:存储从交换结构接收的分组,并通过执行必要的链路层和物理层功能在输出链路上传输这些分组。当一条链路是双向时,输出端口通常与该链路的输入端口成对出现在同一条线路卡上;
- 路由选择处理器:执行控制平面功能
- 在传统路由器中,执行路由选择协议,维护路由选择表与关联链路状态信息,并计算转发表;
- 在SDN路由器中,负责与远程控制器通信,目的是接收由远程控制器计算的转发表项,并在该路由器的输入端口安装这些表项;
- 还执行网络管理功能;
![image-20201111122551951](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/082.png)
路由器的输入端口、输出端口、交换结构几乎总使用硬件实现。
两种转发:
- 基于目的地转发;
- 通用转发;
2.1 输入端口处理和基于目的地转发
详细输入处理视图:
- 转发表从路由选择处理器经过独立总线复制到线路卡,总线在图4-4中以虚线表示,因而转发决策能够在每个输入端口本地做出,无需基于每个分组调用集中式路由选择处理器,避免了集中式处理的瓶颈;
![image-20201111134112128](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/083.png)
假设一个入分组基于目的地址交换到输出端口,又假设路由器具有四条链路0-3如图:
![image-20201111134527504](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/084.png)
对于该链路,转发表如图:
- 路由器使用分组目的地址的前缀与该表中表项进行匹配;
- 当有多个匹配时,该路由器使用最长前缀匹配规则;
![image-20201111134611536](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/085.png)
查找方法:
- 快速查找算法;
- 三态内容可寻址存储器(TCAM);
通过查找确定某分组的输出端口后,该分组就进入交换结构,如果来自其它输入端口的分组当前正在使用该交换结构,则该分组可能会在输入端口处阻塞排队,并等待稍后被及时调度以通过交换结构。
输入端口除执行查找动作外,还必须执行以下三项动作:
- 必须出现物理层和链路层处理;
- 必须检查分组的版本号、检验和以及寿命字段,并重写后两个字段;
- 必须更新用于网络管理的计数器;
2.2 交换
交换结构位于一台路由器的核心位置,常用三种方式如图:
- 经内存交换:一个分组到达一个输入端口时,该端口会通过中断方式向路由器处理器发出信号。该分组从输入端口处被复制到处理器内存中,处理器转发操作也是将该分组复制到输出端口的缓存中。而且每次只能转发一个分组;
- 经总线交换:直接通过一根共享主线将分组从输入端口传输到输出端口,不经过处理器的干预;
- 经互联网络交换:又称纵横式交换,由2N条总线组成,连接N个输入端口和N个输出端口。纵横式交换机是非阻塞的,只要没有其它分组被转发到该输出端口,转发到该输出端口的分组就不会阻塞。但相对应的,如果同时有来自两个不同输入端口的两个分组目的地相同,则有一个分组会在输入端排队等待;
- 除此之外,更复杂的互联网络使用多级交换元素,使得来自不同输入端口的分组通过交换结构同时朝着相同的输出端口前行如三级非阻塞交换策略:
- 输入端口和输出端口被连接到并行的N个交换结构;
- 一个输入端口将一个分组分成K个较小的块,并通过N个交换结构中的K个发送这些块到所选择的输出端口;
- 输出端口再将K个块装配还原成初始的分组;
![image-20201111135534529](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/086.png)
2.3 输出端口处理
输出端口处理取出已存放在输出端口内存中的分组并将其发送到输出链路上:
![image-20201111140111303](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/087.png)
2.4 何处出现排队
假定输入线路速度和输出线路速度(传输速率)是相同的,均为**Rline每秒分组数,并且有N个输入端口和N个输出端口。还假设所有分组具有相同的固定长度,分组以同步的方式到达输入端口。定义交换结构传输速率Rswitch**为从输入端口移动到输出端口移动分组的速率。
如果Rswitch=N×Rline,这时输入端口的排队时延微不足道。
2.41 输入排队
考虑纵横式交换结构:
-
假定①所有链路速率相同;②Rswitch=Rline;③ 分组以FCFS先到先服务的方式从输入队列移动到输出队列;
-
线路前部阻塞(HOL):如果一个输入队列中前一个分组被阻塞,则后面的分组要去往的输出端口即使空闲也会被阻塞。
![image-20201115110812624](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/088.png)
2.42 输出排队
依然考虑纵横式结构,且Rswitch=N×Rline,到达N个输入端口的每个分组的目的地是相同的输出端口,但由于输出端口每次只能传输一个分组,所以这N个分组必须排队等待,而每次传输一个分组的时间中每个输入队列又会新增一个分组到达,这时排队的数量足够大,就会耗尽输入队列的可用内存。
当没有足够的内存来存储一个分组时(有时候在缓存填满之前就会丢弃一个分组或者在其首部加上标记,这会向发送方提供拥塞信号),有两种方式解决:
- 弃尾:丢弃到达的分组;
- 删除一个或多个正在排队的分组;
所有处理分组丢弃和标记的策略被称作主动队列管理(AQM)算法,其中随机早期检测(RED)算法是最广泛研究和实现的AQM算法之一。
对于整个路由器而言,用来缓存所有的排队分组的大小该是多少呢?
- 相对少量的TCP流经过链路排队,缓存数量(B)应当等于平均往返时延(RTT)乘以链路的容量(C);
- 当有大量的TCP流(N条)流过一条链路时,缓存所需要的数量B=RTT×C/ N \sqrt{N} N;
2.5 分组调度
仅考虑分组到达输出链路的排队问题,不考虑分组丢弃问题。
2.51 先进先出(FIFO、FCFS)
![image-20201116165410909](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/090.png)
![image-20201116165223119](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/089.png)
2.52 优先权排队
在非抢占式优先权排队规则下进行,一旦分组进行传输,不能被打断。
每个优先权类通常拥有自己的队列,当选择一个分组传输时,优先权排队规则将从队列非空的最高优先权类中按照FIFO规则传输分组。实践中,携带网络管理信息的分组能获得超过用户流量的优先权,基于IP的实时语音分组也可能获得超过非实时流量的优先权。
![image-20201116165759364](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/091.png)
例如,分组1,3,4属于高优先权类,2,5属于低优先权类:
![image-20201116170223606](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/092.png)
2.53 循环和加权公平排队
在循环排队规则下,分组像使用优先权排队那样被分类,但是类与类之间不存在严格的服务优先权,循环调度器在这些类之间轮流提供服务。一个保持工作排队规则不允许链路保持空闲。
例如,分组1,2,4属于第一类,3,5属于第二类:
![image-20201116170529171](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/093.png)
加权公平排队规则(WFQ):
- 到达的分组被加权分类在每个类的等待区域排队,WFQ会循环调度每一个类,而不必等待高优先权类为空再去调度下一级优先权类;
- 对于每个类
i
被分配权 w i w_i wi ,在类i
有分组要发送的任何时间间隔内,第 i 类将确保接收到的服务部分等于 w i / ( ∑ w j ) w_i/(\sum w_j) wi/(∑wj) ,其中分母中的和是计算所有有分组排队等待传输的类别得到的; - 在最坏的情况下,即使所有的类都有分组排队,第 i 类仍然保证分配到带宽的 w i / ( ∑ w j ) w_i/(\sum w_j) wi/(∑wj) 部分;
- 对于一条传输速率为
R
的链路,第 i 类总能获得至少为 R ∗ w i / ( ∑ w j ) R*w_i/(\sum w_j) R∗wi/(∑wj) 的吞吐量;
![image-20201116170459971](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/094.png)
3.IPV4、寻址、IPV6及其它
3.1 IPV4数据报格式
关键字段:
- 版本:4比特,说明IPV4/IPV6版本;
- 首部长度:4比特,选项字段为0时首部长度为20字节;
- 服务类型(TOS):区分不同类型的数据报,如将实时流量数据报和非实时流量数据报区分;
- 数据报长度:16比特,所以IP数据报的理论最大长度为65535字节,一般以太网帧载荷字段为1500字节;
- 标识、标志、片偏移:与IP分片相关;
- 寿命(TTL):每一台路由器处理数据报时,该字段值减1,若TTL值为0,则该数据报被丢弃;
- 协议:仅当IP数据报到达目的地时使用,指示IP数据报的数据部分交付给哪个特定的运输层协议,值为6交给TCP,值为17交给UDP;
- 首部检验和:将首部中每2个字节当做一个数,用反码算术求和;
- 源和目的IP地址;
- 选项:可扩展项,很少使用;
- 数据(有效载荷);
一个IP数据报首部总长为20字节(无选项时),如果承载一个TCP报文段,则每个数据报总共承载40字节首部以及应用层报文;
![image-20201117165648343](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/095.png)
3.2 IPV4数据报分片
不是所有链路层协议都能承载相同长度的网络层分组,因此有时需要对数据报进行分片处理
最大传送单元(MTU):一个链路层帧能承载的最大数据量。
当某条链路接收到一个IP数据报,通过检查转发表确定出链路,并且该出链路的MTU比该IP数据报的长度要小,这时如何将这个过大的IP数据报挤进链路层帧的有效载荷字段呢?
解决方法是将IP数据报中的数据分片成两个或更多个较小的IP数据报,再通过出链路发送这些数据报,每个这种较小的数据报都被称作片(fragment)。片在其到达目的地运输层以前需要进行重组。
分片格式:
- 每个片都具有其源数据报的源地址、目的地址与标识号;
- 最后一个片的标志比特被设置为0,其余片标志设置为1;
- 偏移字段指定该片应放在初始IP数据报的哪个位置,注意,由于分片,多个数据报会多出多个首部20字节,且偏移量只计算数据内容,一般使用数据长度(字节)/8表示;
3.3 IPV4编址
主机和路由器通过链路连接到网络中,而这个主机与物理链路之间的边界又叫做接口,一台主机通常只有一个接口,但是一台路由器往往有多个接口。从技术上讲,一个IP地址与一个接口相关联,而不是与包括该接口的主机或路由器关联!
IPV4中每个IP地址长度为32字节,采用点分十进制记法每8个比特的十进制等价数使用句点.
符号分割,如193.32.216.9
的二进制记法就是11000001 00100000 11011000 00001001
。
子网:如图所示一台路由器具有三个接口,互联七台主机
- 子网掩码:以该中心路由器为核心的三条链路接口共同组成一个大子网网络(包含三个小子网网络),对于最左侧链路IP地址
223.1.1.0/24
而言,其中的/24
记法就被称作子网掩码,指示了比特中最左侧24定义了子网地址;对于路由器而言,它只需要匹配IP地址前24位即可分发分组至相应链路,而后32-24
位地址则由链路分发给它所连接的其它主机;
![image-20201118135734964](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/097.png)
![image-20201118135551134](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/096.png)
除此之外,再来看一个路由器互联的案例:
- 该图中就包含六个子网;
![image-20201118140308954](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/098.png)
无类别域间路由选择(CIDR):32比特的IP地址按照a.b.c.d/x
格式被划分成两部分,其中x位最高比特构成了IP地址的网络部分,该部分又被称为**(网络)前缀(prefix)**,当该组织外部的一台路由器转发一个数据报,且该数据报的目的地址位于该组织的内部时,仅需要考虑该地址前x位比特,这能够大大减少这些路由器中转发表的长度。
对于使用CIDR协议的ISP组织而言,外界的其它部分不需要关注该ISP内部是否再次进行划分地址或者划分了多少主机,这种使用单个网络前缀通告多个网络的能力又被称为地址聚合、路由聚合或路由摘要。
3.31 获取一块地址
因特网名字和编号分配机构(ICANN):非盈利,功能主要包括:
- 分配IP地址;
- 管理DNS根服务器;
- 分配域名;
- 解决域名纷争;
- ……
ISP通过与ICANN联系并获得一块IP地址(通过x确定),ISP再将自己的大块地址分配给向它发起请求的组织,如图所示:
![image-20201118141630351](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/099.png)
3.32 获取主机地址:动态主机配置协议
当某组织获得一块地址之后,它如何为本组织内的主机与路由器分配IP地址呢?系统管理员一般手动配置路由器中的IP地址,并使用DHCP自动为主机配置地址
动态主机配置协议(DHCP):DHCP允许主机自动获取一个IP地址,而DHCP又可以被网络管理员手动配置,使得每次分配给一台主机相同IP或者分配临时IP。DHCP也可以获得主机信息,如:
- 子网掩码;
- 第一条路由器地址(默认网关);
- 本地DNS服务器地址;
DHCP又被称为即插即用协议或零配置协议。
DHCP又是一个客户-服务器协议,客户通常是新到达的主机,它要获得包括自身使用的IP地址在内的网络配置信息。在最简单场景中,而每个子网都要拥有一台DHCP服务器,如果某子网中没有服务器,则需要一个DHCP中继代理(通常是一台路由器),这个代理知道用于该网络的DHCP服务器的地址。
DHCP分配新地址步骤:
- DHCP服务器发现:新主机通过使用DHCP发现报文
- 在UDP分组中向端口67发送该报文,DHCP发现报文中使用广播地址
255.255.255.255
和本机源地址0.0.0.0
- DHCP客户将该IP数据报发送给链路层;
- 链路层将该帧广播到所有与该子网连接的节点;
- 在UDP分组中向端口67发送该报文,DHCP发现报文中使用广播地址
- DHCP服务器提供:DHCP服务器收到一个DHCP发现报文,用DHCP提供报文向客户做出响应
- 该报文向该子网的所有节点广播,仍然使用广播地址
255.255.255.255
(使用广播的原因是可能有多个服务器共客户选择最优); - 报文包含:
- 收到的发现报文的事务ID;
- 向客户推荐的IP地址;
- 网络掩码;
- IP地址租用期,即IP地址有效的时间量;
- 该报文向该子网的所有节点广播,仍然使用广播地址
- DHCP请求:客户主机选择一个服务器,并使用DHCP请求报文进行响应,回显配置参数;
- DHCP ACK:服务器使用DHCP ACK报文对请求报文进行响应,证实参数;
一旦客户接收到 DHCP ACK 后,交互分配即成功,该客户能在租用期内使用该DHCP分配的IP地址。由于可能过期,DHCP还提供了一种机制允许客户更新它对一个IP地址的租用。
DHCP缺陷:每当节点连接到一个新子网,要从DHCP重新获取IP,当移动节点在子网与子网之间移动时,就不能维持IP与远程应用之间的TCP连接。
3.4 网络地址转换
考虑家庭路由器以及小型办公室路由器的情形,在这些情形中,ISP显然是不会为每个路由器分配一块区域,太过浪费。这时就有一种广泛使用的**网络地址转换(NAT)**路由器出现了
地址空间10.0.0.0/8
是保留的专用网络/具有专用地址的地域,专门配置给家庭网络:
- 对内而言,网络内部的各主机进行分组通信时自然是可以通过诸如
10.0.0.1
这种IP地址进行的; - 但对外而言,如果一台路由器中的主机要访问外部网络,那么不可能所有的家庭主机还使用
10.0.0.1
这个公共内部地址,这时就需要NAT使能路由器发挥作用了;
NAT使能路由器(如图所示):
-
具有一个接口,被DHCP分配IP地址为
138.76.29.7
,这个IP地址仅在对外访问连接时使用,并且连接在这一台路由器上的所有主机设备都使用这一台链路传输数据; -
NAT转换表:将接收到的来自内部主机的源IP统一替换为路由器IP地址,并为该数据报生成一个新的尚未使用的端口号,旧端口号为具体主机使用的源端口号,这样一来,当接收到外部传入的数据包时,再次进行匹配转换最后再传给具体主机;
-
NAT缺点:
- 端口号是用来进程寻址的,而不是用来主机寻址的;
- 解决方法:NAT穿越和通用即插即用(UPnP);
- 路由器时网络层设备,不应该处理IP地址和源端口号这种上层分组;
- 端口号是用来进程寻址的,而不是用来主机寻址的;
-
又被称作中间盒,功能如下:
- NAT;
- 流量流的负载均衡;
- 流量防火墙;
![image-20201118145401770](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/100.png)
拓展:检查数据报:防火墙和入侵检测系统(IDS)
对抗恶意分组攻击的两种方式:
- 防火墙:即一般路由器都具有防火墙功能,能够检查数据报和数据报首部字段,拒绝可疑的数据报进入网络内部;
- 入侵检测系统(IDS):通常位于网络的边界,执行深度分组检查,不仅检查数据报(包括应用层数据)中的首部字段,而且检查其有效载荷;
3.5 IPV6
3.51 IPV6数据报格式
与IPV4相较的变化:
- 地址容量扩大:地址长度从32比特扩大到128比特;
- 简化高效的40字节首部;
- 流标签:
- 流(flow):用于给属于特殊流的分组加上标签,这种特殊流是发送方要求进行特殊处理的流,如一种非默认服务质量或需要实时服务的流;
- 高优先权用户承载的流量也可能被当做一个流;
IPV6字段:
- 版本:4比特,IPV6将该字段值设置为6(但并不能简单的设置为4以创建IPV4数据报);
- 流量类型:8比特,与IPV4 TOS字段含义类似,用来区分不同类型的数据报;
- 流标签:20比特,用于标识一条数据报的流,给出更高优先权;
- 有效载荷长度:16比特,无符号整数,给出了数据部分字节数量;
- 下一个首部:等同于IPV4协议字段,标识需要交付给哪一个运输层协议;
- 跳限制:转发数据报的每台路由器对该值减1,计数达到0则该数据报被舍弃;
- 源地址和目的地址;
- 数据;
不再存在于IPV6上的几个字段:
- 分片/重新组装:由于该操作耗时,因此只能在源和目的地执行,不允许中间路由器执行该操作,如果路由器收到的IPV6数据报太大,则向发送方发回一个“分组太大”的ICMP差错报文,发送方重新发送较小长度的IP数据报;
- 首部检验和:因为因特网运输层和数据链路层协议执行了检验操作,且耗时,故舍弃;
- 选项:不再是标准首部的一部分,而是可能出现在IPV6首部中“下一个首部”字段位置;
![image-20201118155410687](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/101.png)
3.52 从IPV4到IPV6的迁移
IPV6使能系统能向后兼容,即能发送、路由和接收IPV4数据报,但已经部署的具有IPV4数据报能力的系统却不能处理IPV6数据报
实践可行的解决方案是建隧道,其基本思想是:假定两个IPV6节点要使用中间IPV4节点进行互联,则将该中间IPV4路由器称为一个隧道。在隧道发送端,IPV6节点将整个IPV6数据报放到一个IPV4数据报的数据字段中,在隧道接收端,IPV6节点最终接收到该IPV4数据报,并通过确认其首部协议号字段值为41,从中取出IPV6数据报并为该数据报提供路由。
4.通用转发和SDN
通用转发用来提供多种网络层功能以及某些链路层功能,进而解决多种第三层中间盒独立发展配置的问题
先将第三层基于目的地转发的特征总结为两个步骤:
- 查找IP地址(匹配);
- 将分组发送到有特定输出端口的交换结构(动作);
通用转发就整合这两个步骤,形成新的“匹配加动作”范式,该设备又被称为分组交换机:
- 能够对多个首部字段进行“匹配”;
- “动作”包括:
- 将分组转发到一个或多个输出端口(就像基于目的地转发一样);
- 跨越多个通向服务的离开接口进行负载均衡分组(就像负载均衡一样);
- 重写首部值(就像NAT一样);
- 有意识地阻挡/丢弃某个分组(就像防火墙一样);
- 为进一步处理和动作而像某个特定的服务器发送一个分组(就像DPI一样);
如图显示了位于每台分组交换机中的一张匹配加动作表,该表由远程控制器计算、安装和更新:
![image-20201118204009875](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/102.png)
OpenFlow是一个得到高度认可和成功的通用转发的标准,已经成为匹配加动作转发抽象、控制器以及更为一般的SDN革命等概念的先驱,后续对通用转发的讨论也将基于OpenFlow。
匹配加动作转发表在OpenFlow中被称作流表,它的每个表项包括:
- 首部字段值的集合:入分组与之匹配;
- 计数器集合:当分组与流表匹配时更新计数器,这些计数器可以包括已经与该流表项匹配的分组数量,以及自从该表项上次更新以来的时间等;
- 当分组匹配流表项时所采取的的动作集合;
4.1 匹配
OpenFlow的匹配抽象允许对来自三个层次的协议首部所选择的字段进行匹配,但基于功能复杂性,并非一个IP首部所有的字段都能被匹配,如OpenFlow并不允许基于TTL字段或数据长度字段的匹配。
入端口是指分组交换机上接收分组的输入端口,运输层源和目的端口号字段也能匹配。
流表项也可有通配符,如128.119.*.*
格式,每个流表项也具有相应的优先权。如果一个分组匹配多个流表项,选定的匹配和对应的动作将是其中优先权最高的那个。
![image-20201118205852856](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/103.png)
4.2 动作
每个流表项都拥有零个或多个动作,如果有多个动作,它们以在表中规定的次序执行,其中最重要的动作是:
- 转发:
- 一个入分组可以转发到一个特定的物理输出端口,或者广播到除入端口外的所有端口,或者通过所选的端口集合进行多播;
- 该分组可能被封装并发送到用于该设备的远程控制器,该控制器可能对该分组采取某些动作并安装或更新新的流表项重新转发;
- 丢弃:没有动作的流表项表明某个匹配的分组应该被丢弃;
- 修改字段:在分组被转发到相应的输出端口前,分组首部的10个字段(图4-29中显示的除IP协议字段外的所有第二、三、四层的字段)中的值可以重写;
4.3 匹配加动作操作中的OpenFlow例子
例:该网络具有六台主机(h系列)以及三台分组交换机(s系列),每台交换机具有四个本地接口(1-4)
![image-20201118211728849](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/104.png)
第一个例子:简单转发
假定希望的转发行为是:来自h5/h6的发往h3/h4的分组从s3转发到s1,再从s1转发到s2
- s1中的流表项:
![image-20201118212140005](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/105.png)
- s3中的流表项:从h5/h6经过接口s3转发到s1
![image-20201118212215390](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/106.png)
- s2中的流表项:s1转发到目的主机h3/h4
![image-20201118212245271](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/107.png)
第二个例子:负载均衡
来自h3发往10.1.*.*
的数据报经过s1和s2之间的直接链路转发,同时来自于h4发往10.1.*.*
的数据报经过s2和s3之间的链路转发
- s2中的流表项:
![image-20201118212619944](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/108.png)
第三个例子:充当防火墙
s2仅希望接收到来自与s3相连的主机所发送的流量
- s2中的流表项:
![image-20201118212747781](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/109.png)
AN/CDNBlog/Img/ComputerNetWorking/107.png" alt=“image-20201118212245271” style=“zoom:80%;” />
第二个例子:负载均衡
来自h3发往10.1.*.*
的数据报经过s1和s2之间的直接链路转发,同时来自于h4发往10.1.*.*
的数据报经过s2和s3之间的链路转发
- s2中的流表项:
![image-20201118212619944](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/108.png)
第三个例子:充当防火墙
s2仅希望接收到来自与s3相连的主机所发送的流量
- s2中的流表项:
![image-20201118212747781](https://cdn.jsdelivr.net/gh/ZHAOXIAOAN/CDNBlog/Img/ComputerNetWorking/109.png)