流分类指的是网卡依据数据包的特性将其分类的技术。分类的信息可以以不同不方式呈现给数据包的处理者,比如将分类信息记录于描述符中,将数据包丢弃或者将流导入某个或某些队列中。
包的分类传统包的分类:IP、TCP、UDP甚至VXLAN、NVGRE等tunnel报文,该信息可以体现在数据包的接收描述符中。
DPDK:Mbuf结构中含有相应的字段来表示网卡分析出的包的类型。
网卡设备同时可以根据包的类型确定其关键字,从而根据关键字确定其收包队列。
其中RSS和Flow Director技术都是依据包的类型匹配相应的关键字,从而决定其DMA的收包队列。
RSS负载均衡是多队列网卡最常见的应用,其含义就是将负载分摊到多个执行单元上执行。对应Packet IO而言,就是将数据包收发处理分摊到多个核上。
RSS(接收方扩展):网卡上用于将流量分散到不同队列中的技术。和硬件相关联,必须要有网卡的相关硬件支持,RSS把数据包分配到不同的队列中,其中哈希值的计算公式在硬件中完成的,也可以定制修改。
DPDK的轮询模式的驱动也提供了配置RSS的接口。
RSS就是根据关键字通过哈希函数计算出哈希值,再有哈希值确定队列。以下是各种数据包的RSS关键字:
| 数据包类型 | 哈希计算输入 |
|---|---|
| IPV4 UDP | S-IP、D-IP、S-Port、D-Port |
| IPV4 TCP | S-IP、D-IP、S-Port、D-Port |
| IPV4 SCTP | S-IP、D-IP、S-Port、D-Port、Verfication-Tag |
| IPV4 OTHER | S-IP、D-IP |
| IPV6 UDP | S-IP、D-IP、S-Port、D-Port |
| IPV6 TCP | S-IP、D-IP、S-Port、D-Port |
| IPV6 SCTP | S-IP、D-IP、S-Port、D-Port、Verfication-Tag |
| IPV6 OTHER | S-IP、D-IP |
由哈希值得到分配的队列索引,是由硬件中一个哈希值与队列对应的表来决定的。如下图很好描述了这个关系
Flow DirectorFlow Director技术是Intel公司提出的根据包的字段精确匹配,将其分配到某个特定队列的技术。
工作流程为:网卡上存储了一个Flow Director的表,表的大小受硬件资源限制,他记录了需要匹配字段的关键字及匹配后的动作。
驱动负责操作这张表,包括初始化、增加表项、删除表项;网卡从网线上收到数据包根据关键字查Flow Director的这张表,匹配后按照表象中的动作处理,可以是分配队列、丢弃等。关键字的选取和RSS的一样。下图表示Flow Director与队列选择
相比于RSS的负载分担功能,它更具有强调特性。
比如,用户可以为某几个特定的TCP对话(S-IP+D-IP+S-Port+D-Port)预留某个队列,那么处理这些TCP对话的应用就可以只关心这个特定的队列,从而省去了CPU过滤数据包的开销,并且可以提高cache的命中率。
服务质量多队列应用于服务质量(QoS)流量类别:把发送队列分配给不同的流量类别,可以让网卡在发送侧做调度;把收包队列分配给不同的流量类别,可以做到基于流的限速。
根据流中优先级或业务类型字段,可以分为不同的流指定调度优先级和分配相应的带宽,一般网卡依据VLAN标签的UP(用户优先级)字段。网卡依据UP字段,将流划分到某个业务类型(TC),网卡设备根据TC业务做相应的处理,比如确定相对应的队列,根据优先级调度等。
发包方向
DCB模型可以在网卡上实现QoS的功能。
DCB disable和DCB enable状态下的描述符、报文及发送队列之间的关系。
对于没用使能QoS功能的情况下,对于描述符而言,网卡是按照轮询的方式来调度;对于数据包而言,,网卡从buffer0种获取数据包。
在使能QoS情况下,先根据UP来确定其属于哪个TC。TC内部的不同队列之间,网卡通过轮询的方式获取其描述符。不同的TC之间则是依据加权严格优先级来调度,同时不同的TC有不同的数据包buffer。
对描述符而言,网卡是依据加权严格优先级调度;
对数据包而言,网卡从对应的buffer中获取数据包。
加权严格优先级是常用的调度算法,其基于优先级来调度,优先级高的描述符或者数据包优先被获取,同时会考虑到权重,权重与为TC分配的带宽有关。
收包方向
在使能QoS的场景下,与发包方向类似,先根据UP来决策其属于哪个TC。一个TC会对应一组队列,然后再使用RSS或其他分类规则将其分配给不同队列。TC之间的调度同样采用加权严格优先级的调度算法。不同的网卡所采用的调度方法可能不尽相同。
虚拟化流分类方不论是RSS、Flow Director、QoS等方式还是虚拟化场景下的多队列方式。都会有一组队列与虚拟化的实体相对应。
流过滤流的合法性验证的主要任务是决定哪些数据包是合法的、可被接受的。合法性检查主要包括对外部来的流和内部流的验证。
来自外部数据包哪些是本地的、可以被接收的,哪些是不可以被接收的?
可以被接收的数据包会被网卡送到主机或者网卡内置的管理控制器,其过滤主要集中在以太网的二层功能,包括VLAN及MAC过滤。
流的过滤可以分为以下步骤:
-
MAC地址的过滤
-
VLAN标签的过滤
-
管理数据包的过滤
不同的网卡由于设计上的不一样,为了满足流分类的需求,也提供了很多分类规则技术的应用;
-
N tuple filter :根据N元组指定队列。
-
EtherType Filter:根据以太网报文的EtherType指定队列。
-
Cloud Filter:针对云应用中的VXLAN等隧道报文指定队列等。



