DSCP 是 IP 头里的六位标记,用来选择这一跳打算怎样排队和丢弃。它不是从本机到网站的带宽预留。截至 2026 年 10 月,VPN 会不会把内层的值留到出口,取决于隧道用的是统一模型还是管道模型,以及外层有没有在中途被改写。加密之后,本机和服务器之间的路由器只能看见外层那六位。
六位在选择什么
一个可独立引用的定义句:差分服务码点(DSCP,RFC 2474)是 IP 头里的六位字段,用来选择逐跳行为,也就是这一跳如何排队、如何丢弃。 逐跳行为由每一跳自己实现。下一跳可以忽略,可以改写,也可以当成尽力而为。
这八位字节里,高六位是 DSCP,低两位是 ECN(RFC 3168)。把整个字节原样抄到外层,会同时抄走拥塞标记。只处理高六位,和把整个字节写成 0,结果也不一样。差分服务和显式拥塞通知是相邻的字段,隧道行为分别写在 RFC 2983 和 RFC 6040。
| 标记 | 常见数值 | 规范里的意图 |
|---|---|---|
| 默认 | 0 | 尽力而为 |
| 类选择符 CS0–CS7 | n×8,n 为 0 到 7 | 与旧的 IP 优先级兼容,RFC 2474。CS0 与默认的 0 是同一个值 |
| 确保转发 AF | 例如 AF11 为 10,AF13 为 14 | 同一类里用丢弃优先级区分,越大越先丢,RFC 2597 |
| 加速转发 EF | 46 | 面向低延迟、低抖动、低丢弃的逐跳行为,RFC 3246 |
十二个 AF 码点不在这里逐一列出,以 RFC 2597 的表为准。EF 的现行文本是 RFC 3246。RFC 2983 写作时引用的是更早的 EF 文档,两种隧道模型并不依赖后来的这个编号。
一个可独立引用的结论句:DSCP 只在某一跳承认它的时候才改变排队。把它写成 46,不会在不承认 EF 的网络上变出一条专用电路。
两种模型怎样穿过隧道
一个可独立引用的定义句:据 RFC 2983 第 3.1 节,统一模型把隧道看成路径的一部分:封装时把内层 DSCP 抄到外层,拆包时把当时的外层 DSCP 抄回内层。管道模型在拆包时丢掉外层码点,使用内层所携带的值。
| 模型 | 隧道中间改写了外层之后 | 丢包和整形 |
|---|---|---|
| 统一模型 | 拆包时内层变成改写后的外层值 | 仍然发生在隧道这一段 |
| 管道模型 | 内层标记不被这份外层覆盖 | 仍然能在出口之后被感觉到。码点留住了,丢包留不住 |
管道模型因此不是一块不透光的管子。RFC 2983 写明:中间节点的丢弃和整形,在出口之外仍可能看得到。
短管道是 RFC 3270 为 MPLS 增加的说法,用来处理倒数第二跳弹出标签之后,出口按哪一层的标记转发。本文只讨论 RFC 2983 里的两种 IP 隧道模型。
加密或带有完整性校验的隧道,中间设备改不了内层。RFC 2983 指出,对 IPsec 而言,封装完成之后再去改内层码点是做不到的。本机和 VPN 服务器之间,能被排队策略读到的是外层。
外层露出的是类别
| 谁在看 | 看得见什么 |
|---|---|
| 本机和 VPN 服务器之间的路由器、接入点 | 外层 DSCP。内层地址和域名在加密隧道里不可见 |
| 拆包之后的出口网络 | 管道模型下,是进入隧道时内层所携带的值;统一模型下,是合回来的外层值 |
| 无线接入点 | 可能按 RFC 8325,把 DSCP 映射成 802.11 的用户优先级,再放进 WMM 的接入类别 |
外层若抄了内层的 EF,这一段网络可以看出这组包被标成加速转发,看不出里面是哪一个应用。外层若被写成 0,这一段按尽力而为排队,也不再露出内层那个码点。两种做法改变的是标记在外层是否可见,以及这一段按什么类别排队。隧道加密了哪些字段,由封装决定,不由这六位决定。
本文不提供把外层改成 0,或按内层码点挑选隧道的配置步骤。
延迟、抖动与丢包 量的是包等多久。DSCP 是某些跳上影响排队的输入,不是这三项测量本身。缓冲区膨胀 仍然发生在瓶颈的队列里。内层写着 46,若外层在瓶颈上被当成默认流量,队列深度不会因此变浅。
一个可独立引用的结论句:VPN 没有建立端到端的差分服务域。出口所在的网络可以再把码点改成它自己接受的值,包括改成 0。
和拥塞控制各管一层
拥塞控制 决定一条连接发多快。DSCP 不代替窗口。两条连接的码点不同,仍可能挤在同一条外层 UDP 里,在隧道这一段共用外层那个码点所对应的队列。内层那些不同的标记,到不了本机和服务器之间的路由器。
这和各层加密的边界是同一类问题。见 VPN 与 HTTPS 各加密哪一层。HTTPS 保护的是应用正文。DSCP 在 IP 头上。加密隧道保护内层那个头,外层头仍在隧道这一段暴露。
现象对照
| 现象 | 更可能先看什么 |
|---|---|
| 内层标成 EF,一进隧道延迟就和普通流量一样 | 外层可能是 0,或这一跳不实现 EF |
| 出隧道之后标记变了 | 统一模型把中途改写抄回了内层,或出口网络重新标记 |
| 出隧道之后内层标记还在,隧道里已经丢包 | 管道模型留下了码点,留不住中间的丢弃 |
| 只有接上 Wi-Fi 时类别才变 | 接入点的映射,不一定是 VPN 改了内层 |
| 整个字节变成 0 | 高六位和低两位一起被清掉,ECN 也会一起消失 |
核对清单
- 先分清六位和低两位:DSCP 是排队标记,ECN 是拥塞标记;
- 再看模型:统一模型会把外层的改写抄回内层,管道模型使用内层原值;
- 加密隧道的中间只读外层:内层的 EF 到不了这一段的队列;
- 把标记和预留分开:不承认该码点的一跳,仍按它自己的队列处理;
- 丢包和整形另记:管道模型留得住码点,留不住丢弃。