网络层-数据平面
众所周知, 网络的五个模型都是上层封装下层提供的能力, 然后提供一些供上层调用的接口. 运输层依赖的就是网络层提供的从主机到主机通信的接口.
在书里网络层被分为数据平面和控制平面. 数据平面主要讲网络层中每台路由器的作用, 控制平面主要讲路由器与路由器之间的交互.
网络层概述
控制平面的主要作用是协调本地的路由器转发操作, 使得数据报沿着源和目的地主机之间的路由器路径, 最终进行端到端传送.
路由器一般被认为没有传输层和应用层协议栈, 只有网络层及以下的协议栈.
转发和路由选择: 数据平面和控制平面
网络层提供的是主机到主机的通信服务. 就跟我们人要走到某个地方一样, 我们要能走, 还要知道怎么走. 因此, 网络层需要有转发和路由选择的能力.
转发
当一个分组到达某个路由器的一条输入链路时, 这个路由器必须将该分组移动到适合的输出链路. 这就是转发. 转发是在数据平面中实现的唯一功能.
有的时候分组会被现有的路由器阻拦(比如这个分组来自一个已知的恶意主机, 或者目的主机不被允许), 也可能会从多个输出链路发出.
路由选择
当分组从发送方流向接收方时, 网络层必须决定这些分组所采用的路由或路径. 计算这些路径的算法叫做 路由选择算法 .
转发 是指将一个分组从一个输入链路接口转移到适当的输出链路接口的路由器本地操作. 转发在很短的时间内发生, 通常由硬件实现.
路由选择 是指确定分组从源到目的地所采取的端到端路径的网络范围处理 过程 . 路由选择通常会使用较长的时间, 通常使用软件实现.
转发表
每一个网络路由器都有一个非常重要的东西, 叫 转发表 . 转发表可以当作是一个路标, 你知道自己要往哪里走, 路标也告诉了你哪个分岔口对应哪个目的地. 路由器会检查到达分组的首部的一个或者多个字段, 通过这些字段来判断它的目的地, 也就是转发表的索引, 然后根据索引找转发口, 并进行转发.
转发是由网络层的数据平面执行的主要功能.
转发表的配置
控制平面: 传统方法
很普普通通, 由网络操作员配置路由器.
这个太传统了, 有一个没那么传统的传统方法: 每台路由器都弄一个与其他路由器的路由选择组件通信的路由选择组件. 大概就是大家互通有无, 知道发给谁能到哪.
控制平面: SDN 方法
SDN, Software Define Network, 软件定义网络. 所有路由器都由一个或者一些远程控制器来配置转发表, 转发表的计算由远程控制器完成.
网络服务模型
网络服务模型(network service model)定义了分组在发送与接收主机之间的端到端传输特性.
网络层可能提供的服务应该有这些:
确保交付 该服务确保分组最终到达目的地
具有时延上界的确保交付 该服务不仅确保分组的交付, 而且在特定的主机到主机时延上界内交付
有序分组交付 该服务确保分组以发送的顺序到达目的地
确保最小宽带 这种网络层服务模仿在发送和接收主机之间的一条特定比特率的传输链路的行为. 只要发送主机以低于特定比特率的速率传输比特, 则所有分组最终都会交付给目的主机.
安全性 网络层能够在源加密所有数据报并在目的地解密它们, 从而对所有运输层报文段提供机密性
这是网络层能提供的服务的部分列表.
不过实际上因特网的网络层提供了单一的服务, 尽力而为服务(best-effect service). 大概就是上面的网络层基本都做不到, 只能尽力地帮你做.
路由器工作原理
是时候开始数据平面的学习了. 第一个当然是 转发 . 简单了解一下路由器吧.
路由器应该要有输入端口, 输出端口, 还需要一个将数据从输入端口移动到输出端口的交换结构. 此外, 还需要一个路由选择处理器, 来执行控制平面的功能.
输入端口
它在路由器中执行终结入物理链路的物理层功能
与位于入链路远端的数据链路层交互操作来执行数据链路层功能
更重要的是, 在输入端口还要执行查找功能, 在这里通过查询转发表决定路由器的输出端口, 然后到达的分组通过交换结构转发到输出端口.
输出端口 它存储从交换结构过来的分组, 并通过执行必要的链路层, 物理层功能在输出链路上传输这些分组. 当一条链路是双向的时候, 输出端口通常跟该链路的输入端口成对出现在同一路线卡上.
交换结构 交换结构将路由器的输入端口连接到它的输出端口. 这个交换结构完全在路由器内部, 是网络路由器中的网络.
路由选择处理器 执行控制平面功能,
在传统的路由器中, 它执行路由选择协议, 维护路由选择表与关联链路状态信息, 并为该路由器计算转发表.
在 SDN 路由器中, 路由选择处理器负责与远程控制器通信, 目的是接收远程控制器计算的转发表项, 并在路由器的输入端口安装这些表项.
路由选择处理器还执行网络管理功能.
路由器的输入端口, 输出端口和交换结构几乎完全使用硬件实现. 数据平面做的事情实在太快了, 基本都是以纳秒为单位, 使用软件会大大拖延时间. 并且事情简单, 只需要将一份数据按照一定规则放到另一个地方.
对于控制平面就友好很多了, 以毫秒为单位. 因此控制平面可以使用软件实现. 路由器的控制功能包括执行路由选择协议, 对上行或者下行的连接链路进行响应, 与远程控制器通信和执行管理功能, 很复杂, 用硬件更复杂, 因此这些功能通常用软件实现, 并在路由选择处理器(可以当作是 CPU)上执行.
分组转发有两种转发方式, 一种是基于目的地的转发, 另一种是泛化转发.
- 基于目的地转发
很简单, 就跟有路标又知道目的地一样, 我们只需要根据目标选择合适的分岔路就可以了. 转发也一样, 有转发表又有目的地, 根据转发表转发就可以了.
- 泛化转发
有的时候不知道目的地也知道该怎么做. 比如说一个看上去就已经报废的车当然是不允许走啦, 或者京 A 车, 路标有北京的话那这辆车去北京的概率回稍微大一点. 泛化转发的因素很复杂, 很多因素都会产生影响.
输入端口处理与基于目的地转发
路由器在输入端口做了一些处理. 为了让交换结构知道这个数据包应该放到哪里, 输入端口这里需要查找转发表并确定输出端口.
路径的匹配通常是根据 ip 进行匹配的, ip 在网络层的头部, 因此路由器在输入端口需要进行一个解包, 取出 ip, 然后查找转发表, 交给交换结构进行转发.
这个转发表由路由选择处理器通过路由选择协议与其它路由器交互, 计算和更新的; 或者接收来自远程 SDN 控制器的内容. 转发表从路由选择控制器经过独立总线, 复制到线路卡. 这样转发策略就可以在输入端口这里处理, 而不需要交给路由选择处理器处理了.
众所周知, ipv4 的 ip 有 32 位, 如果一个目的地址有一个表项的话, 那就需要
查找看上去很简单, 但是对时间复杂度的要求非常高, 如果只使用线性查找可能不太够, 因此还需要使用更复杂的技术. 实践中经常使用 三态内容可寻址存储器(TCAM) 来查找, 使用 TCAM, 一个 32 位的 IP 地址被放进内存, TCAM 在基本常数时间内返回对该地址的转发表项的内容.
一旦通过查找确定了某分组的输出端口, 那该分组就可以进入交换结构了. 不过在某些设计中, 如果有其它输入端口在使用交换结构, 那这个分组需要进行排队而被阻塞.
在输入端口除了查找其实还做了很多事情
必须出现物理层和链路层处理
必须检查分组的版本号, 检验和寿命字段, 并重写后面两个字段
必须更新用于网络管理的计数器
交换
交换结构位于一台路由器的核心部位.
交换有很多种方式
经内存交换
在比较早的时候, 路由器相当于一个传统的计算机, 输入端口与输出端口之间的交换是在路由选择处理器(CPU)完成的. 当一个分组到达输入端口时, 会触发中断. 于是, 该分组从输入端口被复制到处理器内存中. 路由选择处理器会提取分组首部的目的地址, 在转发表查找合适的输出端口, 然后将该分组复制到输出端口的缓存中.
在这种情况下, 假设内存带宽为每秒可写进内存或者可读出内存的最多 B 个分组, 那总的吞吐量一定小于 B/2. 因为这里有两次内存拷贝. 同时这里不能同时转发两个分组, 因为经过共享的系统总线仅能进行一次内存读/写.
现代路由器也有很多经内存交换的, 不过目的地址的查找和将分组存储(交换)到适当的内存位置是由输入线路卡完成的. 这有点像共享内存的多处理器, 线路卡上的处理将分组交换进适当的输出端口的内存中.
经总线交换
在这种方法中, 输入端口通过一根共享总线直接传送到输出端口, 不需要经过路由选择处理器处理了.
输入端口会给分组预先写一个交换机内部标签(在首部), 指示输出端口, 然后把这个分组放到总线上. 所有的输出端口都会接收到这个分组, 但是只有对应的输出端口才会保存这个分组, 然后将标签去除. 因此, 经总线交换一次也只能处理一个分组, 不过如果是在小型局域网是足够的.
经互联网络交换
要克服简单的共享式总线限制的一种办法是, 用一个更复杂的互联网络.
纵横式交换机就是一种由 2N 条总线组成的互联网络, 它连接 N 个输入端口和 N 个输出端口, 每条垂直的总线在交叉点与每条水平的总线交叉, 交叉点通过交换结构控制器, 能够在任何时候开启和闭合. 当一个分组到达端口 A, 需要转发到 Y 时, 交换机控制器闭合 A 和 Y 的交叉部位的交叉点, 然后端口 A 在它的总线上发送这个分组, 这个分组仅由总线 Y 接收. 与此同时, 假如有个分组来到了端口 B, 需要转发到 X, 也可以进行转发. 因为 A 到 Y, B 到 X 用的是不同的输入, 输出总线.
纵横式网络能够并行转发多个分组, 是 非阻塞的 , 也就是说当前没有其它分组转发到该输出端口, 那分组就不会被阻塞. 不过如果有两个输出端口相同的分组到了不同的输入端口, 其中一个分组需要在输入端等待. 给定总线依旧一次只能发送一个分组.
还有更加复杂的互联网络, 使用多级交换元素, 可以让不同输入端口的分组同时朝向相同的输出端口前行.
有一种三级非阻塞交换策略是这样的, 输入端口和输出端口被连接到并行运行的 N 个交换结构. 一个输入端口将一个分组分成 K 个小块, 然后通过 N 个交换结构中的 K 个发送这些块. 输出端口接收到这 K 个块再组装起来, 还原成之前的分组.
输出端口处理
输出端口处理还算是比较简单. 首先有一个缓存队列, 因为不太可能只处理一个, 处理一个的时候其它全丢掉. 其次还需要再次封装, 因为在输入端口的时候就行了解包. 最后当然是发送了, 这需要处理链路层和物理层相关的事情.
何处出现排队
之前应该提过输出端口有缓存队列, 其实输入端口也会有队列. 既然有队列, 那么就肯定会有排队.
当队列满的时候, 如果有新的分组来的话就会出现 丢包 .
假定输入线路速率和输出线路速率相同(传输速率), 都是
定义交换结构传送速率为
输入排队
如果交换结构没有那么快的话, 输入端口就会出现排队了. 因为到达的分组需要加到输入端口队列中, 等待交换结构传送到输出端口.
举一个例子, 假设现在每隔 T 时间就会来 N 个分组到达输入端口, 同时交换结构将一个分组传送到另一个分组也需要 T 时间. 此时
这种现象叫做输入排队交换机中的 队列首部(Head-Of-The-Line, HOL)阻塞 , 即在一个输入队列中排队的分组必须等待通过交换结构发送(即使它所在队列是空的), 因为它被位于队列首部的另一个分组阻塞了.
输出排队
继续考虑
现在经过时间 T, N 个分组同时到达. 则传输速率是
那么过去了一个 T 的时间后, 全部分组恰好到了输出端口, 只剩下刚到达的分组没有发送出去, 但是此时又来了 N 个分组.
在
这样下去的话, 排队的分组数量会越来越大, 耗尽输出端口的内存.
当没有足够的内存来存放分组时, 就必须做出决定了. 要么丢弃到达的分组( 弃尾 策略), 要么删除一个或者多个正在排队的分组.
在某些情况下, 在输出端口队列快满的时候就丢弃一个分组是有利的. 这可以向发送方提供一个拥塞信号. 使用明确拥塞通告比特的方法可以对分组进行标记. 这些分组丢弃和标记策略统称为 主动队列管理(Active Queue Management, AQM). 其中 随机早期预测 算法是得到最广泛研究和实现的 AQM 算法之一.
当输出端口队列有分组并且现在没有在发送分组时, 输出端口的 分组调度器 会在这些排队的分组中选择一个来传输.
多少缓存才够用?
这是一个非常复杂的问题, 缓存太大会导致相当大的时延, 缓存太少会造成大量丢包.
有一个用于缓存大小的经验方法是缓存数量(B)应当等于平均往返时延(RTT)乘以链路容量 C.
更新的提出, 大量的 TCP 流经过一条链路(假设为 N 条)时, 所需要的缓存数量是
假如说现在有无限的缓存空间, 假设传输一个 TCP 分组需要 20ms, RTT 是 200ms, 并假设从路由器到双方的时间忽略不计.
现在 t=0, 有 25 个分组到达队列, 然后每 20ms 发送一个分组. 那么第 200ms 时, 第一个 ACK 就到了发送方, 此时第 21 个分组还在传输. 这个 ACK 让发送方继续发送分组, 然后这个分组在 20ms 后到达路由器, 并放在输出端口队列排队. t=220ms 时, 第二个 ACK 到了. 发送方再发一个分组, 此时正在传输第 22 个分组. 之后不管怎么样, 这个队列长度都是 5, 同时排队时延固定.
这种因持续缓冲而导致长时延的场景被称为 缓存膨胀 .
分组调度
先进先出 FIFO
顾名思义
优先权排队
在优先权排队规则下, 到达输出链路的分组被分类放入输出队列中的优先权类. 这个是由网络操作员配置的, 一般有高优先权队列和低优先权队列, 当路由器准备好发送下一个分组时, 优先从高优先级队列中选择分组并发送.
优先权排队还分为非抢占式和抢占式, 非抢占式中, 假如现在有一个低优先级分组正在发送, 即使高优先级分组到了, 也不会停止低优先级分组的发送, 而是等它发完再发送高优先级分组.
显而易见的, 跟操作系统的线程调度一样, 这里存在饥饿的问题. 如果高优先级一直有分组, 那么低优先级就不可能发出去了.
循环和加权公平排队
在 循环排队规则 下, 分组像优先权排队一样被分类. 但是在类之间不存在严格的服务优先权, 循环调度器在这些类之间轮流提供服务. 比如说这次发送了类 1 的分组, 那下次就发送类 2 的. 一个所谓的 保持工作排队 规则中只要有分组在排队, 就不准链路保持空闲. 当给定类没有找到分组时, 就去下一个类了. 比如该发送类 3 的分组了, 但是类 3 没有分组, 直接发类 4 的.
一种通用形式的循环排队已经在路由器广泛实现了, 叫 加权公平排队(Weighed Fair Queuing, WFQ) 规则. 到达的分组被分类并在合适的类里面排队.
跟循环排队规则不同的是, 每个类在任何时间间隔内可能收到不同数量的服务. 每一个类 i 都有一个权
可以当作操作系统的时间片, 虽然每个线程分到的时间片不同, 但是总是有时间可以运行的.
网络协议
IP 就是在网络层里的. 现在有两个版本的 IP 正在使用, 一个是 IPv4, 一个是 IPv6.
IPv4 数据报格式
网络层分组被称为数据报. IPv4 数据报的关键字段如下
版本号 4bit, 通过查看版本号, 路由器知道 IP 数据报剩余部分是什么意思. IPv4 和 IPv6 是不一样的
首部长度 4bit, 一个 IPv4 的数据报有一些可选项, 因此需要确定哪一部分是 IPv4 头部, 哪一部分是上一层的数据. 一般情况下不会用到可选项, 因此 IPv4 数据报的首部长度 20 字节
服务类型
数据报长度 16bit, 这是 IP 数据报的总长度(首部+数据), 单位是字节. 由于长度限制, 一个 IP 数据报理论最大长度是 65535 字节. 不过其实很少超过 1500 字节的, 这个长度使得 IP 数据报能容纳最大长度以太网帧的载荷字段.
标识, 标志, 片偏移 一个大的 IP 数据报被分解成几个小的 IP 数据报, 然后这些小的 IP 数据报被独立地转发到目的地, 在目的地重新组装. IPv6 不允许在路由器上对分组进行分片
寿命 TTL
协议 表示上层用的是什么协议. 值为 6 说明是 TCP, 值为 17 说明是 UDP.
首部校验和
首部校验大概是这样的: 将首部中的每两个字节当作一个数, 用反码算术对这些数求和. 如果计算出来的结果跟首部校验和不一样, 那么就是个差错. 路由器会丢弃这个数据报. 每个路由器都必须重新计算校验和, 再放回原处. 因为路由器需要改变 TTL, 改了 TTL 就会导致首部校验和改变.
源和目的 IP 地址
选项 IPv6 已经去除掉了 IP 选项
数据(有效载荷)
IPv4 编址
一般情况下, 主机与路由器想要接入网络需要一条链路连接到网络, 主机通常只有一条. 当主机中的 IP 像发送一个数据报时, 就通过这条链路发送.
主机与物理链路之间的边界叫做 接口 , 路由器与物理链路之间的边界也叫接口.
IP 要求每一个接口都有自己的 IP 地址.
每一个 IP 地址都有 32 位, 4 字节. 总共有
理论上每台主机和路由器上的每个接口都必须有一个全球唯一的 IP 地址(NAT 后面的接口除外), 不过这些地址不能自由的选择, 其中一部分由其连接的子网决定.
一般情况下我们的主机会有一个子网掩码, 比如 255.255.255.0, 处于同一个子网的 ip 都是类似的, 可能都是 192.168.1.x, 这里可以记成 192.168.1.0/24, 表示左边 24 位是固定的.
子网通常是一个路由器接口和若干主机接口或者路由器接口组成. 分开主机和路由器的接口, 产生几个隔离的网络岛, 使用接口端接这些隔离的网络的端点. 这些隔离的网络中的每一个都叫做子网.
这里就是 6 个子网.
理论上不同的子网可以有完全不一样的子网地址, 但实际上, 子网地址通常有共同之处.
因特网的地址分配策略被称为 无类别域间路由选择(Classless Interdomain Routing, CIDR) , CIDR 将子网寻址的概念一般化了, 当使用子网寻址时, 32bit 的 IP 地址被分成了两部分, 记作 a.b.c.d/x, 其中 x 指示了第一部分的位数.
a.b.c.d/x 的前 x 位构成了 IP 地址的网络部分, 并被称为地址的 前缀 . 一个组织通常被分配一块连续的地址, 也就是说拥有相同的前缀. 剩下的 32-x 位可以被认为是用来区分组织内部设备的. 所有的设备都具有相同的前缀, 只有组织内部的路由器才会考虑不同的后缀.
在 CIDR 被采用前, IP 地址的网络部分被限制为长度为 8, 16, 24bit. 这是一种 分类编址 的编址方案. 但是这样会产生一些问题, IP 地址会产生不必要的浪费.
还有一种类型的 IP 地址, 255.255.255.255, 这是 IP 广播地址. 当一台主机发出一个目的地址为 255.255.255.255 的数据报时, 路由器会发给同一网络中的所有主机. 路由器可以向临近的子网也转发这个报文, 不过通常不会这么做.
获取一块地址
网络管理员需要跟自己的 ISP 联系来获取一块地址.
同时, ISP 也需要一个办法来给自己一块地址. 有一个全球性的权威机构可以分配 IP 地址, 叫因特网名字和编号分配机构(ICANN). 它还负责分配域名和解决域名冲突.
获取主机地址
某组织获取一块地址后, 就可以考虑怎么给自己的主机和路由器分配地址了.
当然可以使用工人智能的力量, 一个一个分配, 不过现在更多的是使用 动态主机配置协议(Dynamic Host Configuration Protocol, DHCP) 来完成. DHCP 允许主机自动获取一个 IP 地址, 网络管理员只要配置好 DHCP 就可以了.
通过配置 DHCP, 网络管理员可以让某主机每次接入都得到相同的 IP 地址, 或者某主机被分配到一个临时的 IP 地址. 除了主机 IP 地址外, DHCP 还可以配置默认网关, 本地 DNS 服务器地址等.
DHCP 由于它的自动化能力, 也被称为 即插即用协议 或者 零配置 协议.
一般情况下, 一个组织需要有一个 DHCP 服务器, 如果没有的话用一个路由器做 DHCP 中继代理也行.
DHCP 服务器发现
当一个主机接入到子网时, 会发送一个 DHCP 发现报文 (如果使用 DHCP 的话), 客户会使用 UDP 向端口 67 发送报文. 目的地址是 255.255.255.255, 因为客户不知道 DHCP 服务器地址. 源 IP 是 0.0.0.0, 因为客户也不知道自己的 IP 地址. 这个请求会广播出去.
DHCP 服务器提供
DHCP 服务器收到一个 DHCP 发现报文后, 用 DHCP 提供报文 向客户做出响应. 目的地址依旧是 255.255.255.255, 因为此时即使 DHCP 准备好了分配给客户的地址, 客户也不知道这是发给自己的.
一个子网里也可能有很多个 DHCP 服务器, 这些服务器会告诉客户自己的相关信息, 比如推荐的 IP 地址, IP 租用期等.
DHCP 请求
客户从一个或者多个服务器中选择一个, 并向选择的服务器用 DHCP 请求报文 进行响应, 回显配置的参数.
DHCP ACK
服务器用 DHCP ACK 报文 对 DHCP 请求报文进行响应, 证实所要求的参数.
这之后就完成了 DHCP 的配置. 如果客户在租用期之后还想要使用这个地址, DHCP 提供了一种机制来允许客户更新它对一个 IP 地址的租用.
DHCP 存在一个非常严重的缺陷, 当节点连接到新子网时, 就需要更换 IP 地址了. 也就是说, 之前的 TCP 连接就中断了. 这也是我们为什么流量跟 wifi 切换时, http 请求中断. 据说 http3 解决了这个问题, 不过看上去没有完全解决的样子.
HTTP3 所使用的 QUIC 为每个连接准备了一个标识符, 客户切换网络后, 需要将标识符发到服务器, 服务器就知道客户的新 IP 了.
网络地址转换
不知道大家用的是不是公网 IP, 反正用校园网的话基本都是内网 IP, 外网是访问不到的. 既然如此, 那么我们是怎么使用校园网连接外网的? 这就需要一个叫 网络地址转换(NAT) 的东西了.
在我们向外界发送一个请求时, NAT 使能的路由器会将我们的 IP 和端口进行一个映射, 使用路由器的公网 IP 和端口, 然后修改 TCP 首部和 IP 首部相关字段再发出去. 服务器收到后, 会使用这份 IP:PORT 来响应. 路由器收到后, 就去查 NAT 转换表, 进行转换后发给我们.
比如说我们是 192.168.1.3, 向外界的一个网站发起 HTTP 请求, 使用端口 4952, 就比如 1.1.1.1:80 吧. 当我们的请求到达 NAT 使能路由器时, 路由器会进行一个转换, 将我们的 192.168.1.3 换成 10.1.2.3, 端口换成 5126. 同时会在 NAT 转换表写下相关内容, WAN 端 1.1.1.1, 80; LAN 端写 192.168.1.3, 4952
当服务器响应到达我们的 NAT 使能路由器后, 路由器根据服务器信息查询 WAN 端对应的 LAN 端, 就可以找到我们了. 然后再转换 IP 和端口, 发给我们.
IPv6
IPv6 的数据报格式
IPv6 与 IPv4 的一些区别
扩大的地址容量 从 32bit 增加到 128bit, 还引入了任播地址, 这种地址可以使数据报交付给一组主机的任意一个
简化高效的 40 字节首部 首部定长, 允许路由器更快处理 IP 数据报
流标签 IPv6 有一个流(flow)的定义
IPv6 的字段
版本 4bit
流量类型 8bit
流标签 20bit
有效载荷长度 16bit
下一个首部 标识需要交付给哪个协议
跳限制 TTL
源地址和目的地址
数据
从 IPv4 到 IPv6 的迁移
事已至此, 全球一下子全都用 IPv6 是很困难的. 因此有一种 建隧道 的方法.
大概就是把 IPv6 数据报放在 IPv4 里面, IPv4 的首部会指示上层协议. 这样即使路由器只能处理 IPv4 数据报也可以进行 IPv6 数据报的发送了.
泛化转发和 SDN
之前的基于目的地转发有两个操作, 首先是查找 IP 地址(匹配), 然后将分组发送到特定输出端口(操作). 也就是匹配+操作.
在泛化转发中扩展了这两个东西, 匹配可以是对多个首部字段进行匹配, 操作可以是将分组转发到一个或多个输出端口, 跨越多个通向服务的离开接口进行负载均衡分组, 重写首部值, 阻拦/丢弃某分组等.
并且泛化转发中, 转发表也改了个名, 叫匹配加操作表, 也叫 流表 . 想要使用流表, 就需要使用 SDN, 由远程控制器来计算出这份流表. 这样的路由器叫做分组交换机.
这里的标准基于 OpenFlow.
每台分组交换机都包含一张匹配加操作表, 由远程控制器计算和分发.
流表的每一个表项包括:
首部字段值的集合 入分组将进行匹配, 基于硬件匹配非常快. 如果没能匹配上将被丢弃或者发到远程控制器做更多处理. 一个流表可以由多个流表实现.
计数器集合 当分组与流表项匹配时更新计数器, 这些计数器可以包括已经与该表项匹配的分组数量, 以及上一次该表项更新到现在的时间
当分组匹配流表项时所采取的操作集合 这些操作有很多, 可能包括转发, 丢弃, 修改
匹配
流表的匹配不仅可以使用网络层首部字段, 链路层, 传输层的字段都可以. 因此一个分组交换机既可以等价于第三层的路由器, 也可以等价于第二层的交换机.
入端口是指输入端口.
流表项也可以有通配符, 每个流表项也有相应的优先权.
不是所有的字段都可以进行匹配, 比如 TTL 就不能匹配.
操作
如果有多个操作被选中, 那么会以表中规定的次序执行.
最为重要的操作主要是这些:
转发 一个分组可以转发到一个特定的输出端口, 也可以广播到所有输出端口(分组到达的分组外), 或通过所选的端口进行多播. 该分组也可能被封装并发送到远程控制器, 远程控制器可能也可能不会对某些操作, 比如安装新的流表项
丢弃 没有操作的流表项表示某个匹配的分组应当被丢弃
修改字段
运行中的匹配加操作的 OpenFlow 例子
简单转发
负载均衡
防火墙
中间盒
中间盒是在源主机和目的主机之间的数据路径上, 执行 IP 路由器的正常标准功能之外的功能的任何中间的盒子.
NAT 转换
安全服务
性能增强
随着中间盒的增多, 单独的中间盒管理困难, 技术人员探索使用商用硬件, 并试图在通用软件上构建专门的软件来实现这些服务. 这是 SDN 采用的方法, 叫做 网络功能虚拟化(NFV) . 另一种方法是将中间盒功能外包给云.
一直以来运输层和网络层有一条明确的分界线, 中间盒打破了这种分界线.