网络中传送的业务数据对服务质量(QualityofService,QoS)有不同的要求,例如语音业务需要实时被传送,它对时延的大小很敏感。当W-Fi MAC层在同时传输语音业务和普通业务的数据时,语音业务就需要被高优先级发送。
MAC数据帧定义传输类别(Traffc Identifer,TID)字段,用于指示业务优先级。包含TID的MAC数据帧被称为QoS数据帧(QoS data)。不包含TID的MAC数据帧,则称为非OoS数据帧(Non-OoS data)。如下图所示:
MAC层把数据业务分为8个类型,用TID0~7来表示不同业务类型的优先等级。MAC层按照优先级由高到低的次序传输不同的数据业务。
同时,从无线信道接入的角度,802.11定义了4种无线接入类别(AccessCategory,AC),包括背景流业务(AC Background,AC_BK)、尽量传输业务(AC Best Effort,AC_BE)、视频业务(AC Video,AC_VI)和语音业务(AC Voice,AC_VO),其中AC_VO优先级最高,其次是AC_VI,然后是AC_BE和AC_BK,MAC层标准规定了高优先级数据优先访问无线信道资源。业务数据的优先级与无线接入类型的映射关系如下表所示。
上层用户数据优先级 | Wi-Fi PHY层优先级 | 说明 |
1(背景流,background,BK) | 1(AC_BK) | 背景流级别 |
1(默认等级) | 1(AC_BK) | 上层用户数据没有指示优先级时,采用该默认级别 |
0(尽量传输,Bestefort,BE) | 2(AC_BE) | 尽量传输级别 |
3(普通,Excellent Effort) | 2(AC_BE) | 尽量传输级别 |
4(负载控制,Controlled Load) | 3(AC_VI) | 视频流级别 |
5(视频流,video,VI) | 3(AC_VI) | 视频流级别 |
6(语音业务,voice,VO) | 4(AC_VO) | 语音业务级别 |
7(网络控制,network control) | 4(AC_VO) | 语音业务级别 |
注:数字越大代表优先级越高。 |
根据MAC数据帧包含TID的情况,下表列出了相应的数据帧分类。
帧类型 | 用途 |
Data | 不包含TID信息的数据帧。如果收发双方有一方不支持优先级,例如,旧的 802.11b/g设备,则需要使用该类型收发数据 |
Null | 不包含数据部分的Data帧,它一般作为查询使用,例如,AP发送Null查询每个STA的缓存状态。STA也可以主动向AP发送Null来获取AP上的缓存数据 |
QoS Data | 包含TID信息的数据帧。收发双方都需要支持优先级数据报文。例如,802.11n及以后定义的设备需要使用QoS Data收发数据 |
QoS Null | 不包含数据部分的QoS Data帧。功能等同于上面Null类型的数据帧 |
FAQ
问题一:应用层如何改变Wi-Fi QoS的优先级?
在应用层改变Wi-Fi的QoS(服务质量)优先级,可以通过操作数据包的DSCP(Differentiated Services Code Point)或者802.11e/WMM(Wi-Fi Multimedia)标记来实现。这些机制允许应用根据数据流的重要性为其分配不同的传输优先级,确保实时性需求高的流量(如语音、视频)得到优先传输。
1. 通过DSCP改变QoS优先级
DSCP是网络层的QoS标记机制,通过在IP包头的TOS(Type of Service)字段设置不同的DSCP值,路由器和交换机可以根据该值为不同的数据流提供差异化的服务。
修改DSCP值的步骤:
应用层可以在发送数据时为其分配特定的DSCP值。例如,在Linux上使用setsockopt可以修改socket的DSCP值。
int dscp_value = 46; // 例如 EF(Expedited Forwarding)优先级,用于实时应用
setsockopt(socket_fd, IPPROTO_IP, IP_TOS, &dscp_value, sizeof(dscp_value));
这样设置后,所有通过这个socket发送的IP数据包的TOS字段将包含所设置的DSCP值,网络设备会根据DSCP值优先处理这些数据包。
常见DSCP类别:
- 46 (EF): Expedited Forwarding,通常用于语音应用
- 34 (AF41): Assured Forwarding,通常用于视频流
- 0 (BE): Best Effort,默认优先级,适用于大多数普通数据
2. 通过WMM改变Wi-Fi层QoS
WMM是802.11e标准的子集,允许通过无线网络上的数据包排队机制为不同的数据流分配不同的优先级。WMM定义了四个访问类别(Access Categories, AC),每个类别都有不同的优先级:
- AC_VO (Voice): 语音,高优先级
- AC_VI (Video): 视频,次高优先级
- AC_BE (Best Effort): 普通数据,默认优先级
- AC_BK (Background): 背景数据,最低优先级
修改 WMM 优先级:
应用层可以通过设置802.1p或TID(Traffic Identifier)值来控制WMM的优先级。不同的应用可以通过设置socket选项或使用特定库来改变数据包的优先级。
例如,使用setsockopt设置WMM参数:
int tos_value = 0xD0; // 对应 WMM AC_VO(语音优先)
setsockopt(socket_fd, SOL_SOCKET, SO_PRIORITY, &tos_value, sizeof(tos_value));
3. 应用层工具操作 QoS
一些应用层工具也可以用于修改QoS设置,控制数据包的优先级。例如:
tc工具(Linux 下的流量控制工具):
通过tc可以为特定的数据流(如IP地址、端口)分配QoS优先级。你可以定义过滤器,限制不同流量的带宽或优先级。
# 设置带有高优先级(如 EF 类别)的流量
sudo tc qdisc add dev wlan0 root handle 1: htb default 12
sudo tc class add dev wlan0 parent 1: classid 1:1 htb rate 1gbit
sudo tc filter add dev wlan0 protocol ip parent 1:0 prio 1 u32 match ip tos 0x2c 0xff flowid 1:1
问题二:iperf的数据如何设置QoS类别?
在iperf中,数据流的DSCP(Differentiated Services Code Point)值可以通过修改IP标头中的TOS(Type of Service)字段来设置。这样可以将流量打上不同的QoS标记,让路由器或交换机对数据包进行差异化处理。iperf3设置DSCP(TOS):
在iperf3中,你可以使用--tos参数设置DSCP值。例如:
iperf3 -c --tos 0xB8
DSCP与WMM AC的典型映射关系:
不同的网络设备、无线设备可能会略有不同的映射规则,但通常可以通过DSCP的值将流量映射到WMM的4类访问类别。以下是典型的DSCP和WMM AC的对应关系:
WMM Access Category (AC) | DSCP 代码点范围 | 常用 DSCP | 说明 |
AC_VO (语音) | DSCP 48 - 63 | 46 (EF) | 用于语音流量(低延迟、实时性需求) |
AC_VI (视频) | DSCP 32 - 47 | 34 (AF41), 40 | 用于视频流量(次于语音的实时性需求) |
AC_BE (最佳努力) | DSCP 0 - 31 | 0 (BE), 10 | 默认的流量类别,通常是一般数据传输 |
AC_BK (后台) | DSCP 1 - 7 | 8 (AF11) | 后台数据(对延迟不敏感) |
具体DSCP值的解释:
- EF (Expedited Forwarding, DSCP 46): 主要用于语音和实时流量,低延迟、高优先级,通常映射到 AC_VO。
- AF (Assured Forwarding): 根据优先级被划分为不同的子类,典型的是:
- AF41 (DSCP 34): 高优先级视频流量,通常映射到AC_VI。
- AF31 (DSCP 26): 中等优先级流量,通常映射到AC_BE。
- AF11 (DSCP 10): 低优先级流量,可能映射到AC_BK。
- BE (Best Effort, DSCP 0): 通常用于没有明确 QoS 要求的流量,默认映射到 AC_BE。