iPhone 上的 TOS 到 802.11 QOS 控制

TOS to 802.11 QOS Control on iPhone

我们有一个基于 iPhone 的 IP 音频应用程序,我们目前正在尝试设置 TOS 级别并查看它如何反映在 802.11 Qos 控制字段中。

我们只是简单地调用 setsockopt:

    int tos = 0xB8; // VOICE
    status = setsockopt(socketFD, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));

    if (status == -1)
    {
        if (errPtr)
            *errPtr = [self errnoErrorWithReason:@"Error setting TOS (setsockopt)"];
    }

理论上这会在 WLAN 上将所有数据包标记为 VOICE link,但我们最终得到的 TID 为 5,这表示 VIDEO(至少根据 Wireshark)。

这是从 iPhone 到无线 AP 的流量,因此我们无法进行 in-WAP 映射。

我们已经能够将 TOS 设置为 0xC8,这确实会导致 VOICE 分类,但是当 C8 的 TOS 值最终出现在 IP [=28 中时,网络的其余部分似乎会感到困惑=].

任何人都知道我们应该使用什么值来通过 802.11 在来自 iPhone 的数据包上获得语音?

您正在查看两个不同的值 - 一个是第 1 层值,另一个是第 2 层值。两者之间没有直接对应关系——需要提供一些映射。

在您的情况下,此映射必须由接入点(如果使用轻型接入点,则由无线局域网控制器执行)和原始设备上的网络堆栈执行,因此您无法直接控制这个映射。

您在 IP 层操作,而不是网络 link 层,因此您所能做的就是设置适当的 DSCP(通过 TOS 值)并相信较低层做正确的事情。

DSCP 46 (EF)(TOS 值 0xB8)最适合语音流量。 iOS 堆栈似乎将其放入 802.11e UP 5。虽然您可能更喜欢 6,但您无法控制它。其他设备会以不同的方式映射事物。例如,Cisco AP 会将 EF 映射到 UP 6

最主要的是,通过指定 DSCP EF,您可以向所有端到端网络元素提供关于应如何处理此流量的最佳指示。

来自原始无线设备的 QoS 无论如何都相当无用 - 通常设备 内的 WiFi 不会拥塞,因此 QoS 不是必需的,您无法控制其他在网络上发送的设备 - WiFi 是一种共享访问介质。

接入点中的 QoS 可能是一个好处,因为整个无线网络 link 可能会拥塞,并且 AP 可以使用 QoS 来决定接下来应该发送其输入队列中的哪个数据包。