QoS,英文全称Quality of Service(服务质量),在思考如何实现QoS的时候,可以把QoS模型主要分为两个部分:
- 抓取流量:对流量进行优先级的分类,打好标签以及存储
- 设置策略:按照不同的传输规则对不同类型的流量进行传输调度。
起初802.11并没有流量的优先级之分,所有的流量都被视为best-effort(尽最大努力交付的)流量。现在为了提供优先级,我们要对数据流量进行分类。
当数据包到达MAC层时,根据802.1d的映射关系(目前看到的官方指南都是这种写法,实际上是802.1p的映射),将原始数据包中的优先级映射到802.1e的不同优先级队列中。
802.11e一共可以提供4个不同的优先级,也可以称为接入类别(Access categories),从高到低排序分别是:
语音服务(Voice,AC_VO):一般为VoIP流量类型,对延迟最为敏感,同时也是优先级最高的流量。
视频服务(Video,AC_VI):视频流量的优先级低于语音服务,高于其他两项。视频服务也是延迟敏感类型的服务,所以具有一定的优先级。(视频优先级低于语音,怪不得有时候用微信打视频电话,画面都已经卡的都不了却还能听到声音)
尽力传输(Best-effort,AC_BE):默认的无线流量类型就是best-effort类型,比如网页访问的数据流量类型。对于延迟有一定需求,但是没有那么敏感。
背景流量(Background,AC_BK):对于延迟要求最不敏感的流量,比如文件传输,打印作业的流量。
802.11e的优先级实际通过802.1p的优先级映射的,802.1p的优先级实际上是放在802.1q定义的Q-Tag中的。802.1q是关于VLAN的协议,其定义了VLAN的Q-TAG格式。802.3 with Q-Tag(即802.1q)是在传统的802.3数据帧结构的Length/Type字段前面增加了一个Q-Tag字段,二者对比图如下,上面为传统802.3,下面是with Q-Tag:
该字段初始是为了VLAN的功能设计的。Q-Tag的具体结构如下(下图中是VLAN TAG):
TPID(Tag Protocol Identifier):TPID是为了协议的兼容性设计的,支持Q-Tag的节点可以解析,不支持的节点会将其当做Length/Type字段进行解析。在Ethernet中,如果Length/Type小于0x0600的时候,会被当做Length字段解析,如果Length/Type大于0x0600的时候,会被当做type字段解析。由于TPID的固定值为0x8100,所以不支持Q-Tag的节点会无法识别该type,从而不接收,不会导致误识别的问题发生。
TCI(Tag Control Information)包含了3个部分,分别是PCP,CFI/DEI,VID。
PCP(Priority Code Point):该字段就是优先级字段,通常我们也将该字段描述为cos(code of service)字段,cos这种说法更常见一点,同时cos的说法也是对应tos的说法(type of service)。PCP一共是占据3个bit,能够表示2^3=8个优先级,802.1d也就是基于这三个bit定义优先级的。
CFI(Canonical Format Indicator)/ DEI(Drop Eligible Indicator):CFI字段是由于演进过程中,指示Ethernet和Token Ring的兼容。到了QinQ(802.1ad)中,CFI字段演进为了DEI字段。QinQ也可以说是一种二层VPN的技术,既然是二层VPN,那么就会存在公网穿越的问题,从而在传输数据帧的过程中,就需要考虑丢弃优先级了,从而DEI字段就是为了这个目的。
VID(VLAN Identifier,VID):该字段标识了VLAN ID,一共是12位。由于我们关注的是优先级问题,所以关于VLAN的具体内容,我们不进行扩展。
802.1q中规定了cos字段,这个cos字段具体如何使用的,如何标识优先级的,就是在802.1p协议中进行固定的,如下图:
在上图中,实际描述的是在区分服务场景下,不同cos对应的服务类型。
802.1d与802.11e之间的优先级传递
802.1d中,优先级是标识在cos位中的,并且和tos(dscp)互相映射的。在802.11e中,也是会存在的这样的映射关系,也就是cos映射到802.11e到优先级,其映射关系如下图:
图中,802.1d user priority就相当于cos,也就是有线数据帧中的优先级标识。在一个802.11终端中,其会将有线端的优先级首先转义到本地到发送队列,这里也就是不同的AC所表示的发送队列,从而对流量进行分类。