一个老问题:明明链路带宽调到200M、500M,视频会议还是卡,语音还是断断续续,Web页面打开像蜗牛。加带宽当然有用,但带宽永远不可能无限叠加,而且瓶颈往往不在某一台设备的出接口上,而在整条路径里某个你不注意的节点。这时候你最可能听到的一个词就是QoS,再往下拆,就是DiffServ,再往下,就是今天想聊透的PHB(Per-Hop Behavior,每跳行为)。
PHB这三个字母,我当年也是背出来的:每跳行为,就是指路由器对属于某个行为聚合的报文,逐跳执行统一的转发处理方式。背下来容易,但真遇到问题,比如配置了DSCP标记、配置了优先级队列,业务还是没改善,往往就是没理解PHB到底发生在哪一步。这篇文章想把DiffServ和PHB从头到尾拆开:它解决什么问题、标准定义了哪几类PHB、真实设备上如何把PHB落到实处,以及从考试和实验角度最容易踩的坑。无论你是准备计算机网络期末、408统考,还是正在折腾网络实训、课程设计的模拟器实验,这篇都能直接用上。
1. 先搞清楚一个问题:网络明明很宽,为什么还需要PHB
理解PHB之前,必须先理解DiffServ为什么会出现。不然你只会配置命令,不知道配置的是什么东西,出了问题也无从下手。
1.1 尽力而为的缺陷与IntServ的弯路
传统IP网络的核心信条是“尽力而为”(Best-Effort)。路由器收到一个包,查路由表,能从哪个接口出去就转发出去,所有报文一视同仁,没有高低贵贱之分。拥塞发生时,路由器做的事情很粗暴——直接丢包,丢谁的包取决于队列写满的顺序,和业务重要性毫无关系。
这种模型的好处是简单、健壮、可扩展,它能支撑起整个互联网,靠的正是这种极简设计。但坏处也很明显:语音、视频、在线交易这类业务,对延迟、抖动、丢包非常敏感。拥塞时一样被丢,体验就很糟糕。网页多刷几秒还能忍,语音断断续续、视频频繁卡顿,这个业务基本就废了。
为了解决这个问题,IETF最早提出的思路是IntServ(综合服务),配合RSVP做资源预留。那个模型听起来很美好:在数据传输之前,先沿着路径用RSVP发送一个信令报文,沿途每个路由器都为这条流预留带宽,并记录这条流的状态,然后应用程序再开始发送数据。相当于你在高速上开车前,先打电话给沿途每个收费站,让它们给你保留一条专用通道。
但问题恰恰出在“沿途每个路由器都要记录流状态”上。边缘节点还好,流量少;核心节点的流量是海量的,如果每个应用流都要建一条预留记录,转发这些设备的压力会迅速爆炸,状态表大得没法维护。加上RSVP信令对网络故障的处理复杂,实际部署很难铺开。
所以大家都明白了一个道理:想在核心网络里为每一路业务维护服务质量状态,无论技术上还是成本上都是不现实的。那个老思路太富态,设备背不动。
1.2 DiffServ的取舍:把复杂度推到网络边缘
IntServ这条路走不通,IETF随后制定了DiffServ(Differentiated Services,区分服务),思路完全反过来了:不在全网所有节点维护逐流状态,只在网络边缘做细致的分类和标记,核心节点只认标记,用最简单的方式提供不同的转发待遇。
打个不严谨的比方,IntServ是“每条流提前预订VIP通道”,DiffServ则是“把所有乘客在安检口分成头等舱、经济舱,到了登机口再按舱位安排不同优先级的登机顺序”。后者不需要机场每个登机口都认识你这个人,只需要认识你的登机牌种类。
DiffServ引入了一个关键概念:DS域(DiffServ Domain)。一个DS域由一组连续的网络节点组成,在这些节点内部,报文的QoS标记始终被理解和尊重。域内有边界节点和内部节点:
- 边界路由器:负责对进入DS域的流量做分类、整形、标记、重标记。它要根据源地址、目的地址、应用端口、甚至应用层的特征,判断报文属于哪个业务类型,并把对应的DSCP值写入IP头。
- 内部节点(核心路由器):只需要看报文里的DSCP值,然后用事先配置好的PHB来决定怎么转发这个报文。
这样一拆分,核心节点不再关心“这是不是张三的语音流”,它关心的只有一个问题:这种DSCP值对应什么行为?该进哪个队列?该给多高的丢弃优先级?所有业务在核心眼里都成了“行为聚合”(Behavior Aggregate, BA),也就是说,很多条特征完全不同的微流,只要DSCP值一样,在核心节点看来就是同一类东西,处理方式完全一致。
这就是DiffServ能够大规模部署的根本原因:有状态的服务模型在核心被彻底拿掉了,换来的是极高的可扩展性。
1.3 PHB才是DiffServ安身立命的“行为引擎”
那DSCP标记本身能保证服务质量吗?不能。
DSCP(DiffServ Code Point,区分服务码点)只是IP头部里那6个bit,它本质是一个“标签”,只代表一种约定的意图,不代表实际动作。真正让“标签”变成“待遇”的,是PHB。PHB描述的是:当报文进入一台路由器后,这台路由器应当对这个报文实施怎样的调度、排队、丢弃处理。
必须强调一个容易误解的地方:PHB是逐跳(per-hop)的,不是端到端的。它只规定“我在这一跳上怎么做”,并不保证整条端到端路径的服务质量。一条流从源到宿要经过很多跳,每一跳都按同样的PHB映射配置处理,最终才叠加成用户感受到的端到端体验。只要中间某一跳没有正确配置或者配置得不一致,前面所有跳的努力都可能白费。
这也是为什么常见故障总是“配置了好像没配一样”——不一定是命令错了,而是某一跳的PHB映射没对齐,DSCP标签在某个节点被重写成了默认值,或者入方向信任边界没设置对。后面第5节我会把这几个典型问题展开说。
2. 标准PHB全景解读:EF、AF、CS和默认转发
RFC 2474定义了DS字段和PHB的框架,后续RFC 2597定义了AF PHB,RFC 3246定义了EF PHB,RFC 2474中还保留了Class Selector PHB。很多教材把这几个概念列为必考重点,因为它们就是DiffServ体系的三大支柱。
2.1 EF:用“确保速率”换低延迟低抖动
EF的全称是Expedited Forwarding,加速转发。它的设计目标是给语音、视频会议这类业务提供低延迟、低抖动、低丢包的服务,让流量看起来像走过一条“虚电路”一样顺畅。
RFC 3246里对EF PHB的定义很拗口:EF PHB应当保证报文的离开速率不低于某个配置速率R,这里的R是指节点为这个EF聚合配置的速率。说人话就是:只要流量速率没有超过配置的门槛,路由器就得按配置速率尽快转发它,不让它排队等太久,更不让它被随机丢弃。
EF通常对应的DSCP十进制值是46,二进制是101110。配置EF时,你给这个队列配置多少带宽,就约等于你承诺了多少条“绿色通道”。所以EF的配置尺度非常敏感:配置太小,语音视频还是卡顿;配置太大,一旦某路恶意流量或异常流量全都挤进EF,其他业务可能被挤到几乎得不到服务。
这里有个经常被误解的点:EF不是“永远最高优先、别人都得让路”。它在队列调度上往往表现为严格优先队列(PQ),但这和实际可用带宽是两码事。如果EF流量突发超出了承诺速率,超出部分一样会被丢弃,而不是无限制插队。保护EF流本身,也保护其他正常业务,这是配置时必须控制的地方。
2.2 AF:给“可降级应用”留出的四档保险箱
AF(Assured Forwarding,确保转发)PHB定义在RFC 2597中,它比EF复杂一点,也更贴近真实业务场景。
AF的设计理念是:不是所有业务都需要低延迟,但很多业务希望“尽量别被丢”。比如网页浏览、文件传输、软件更新,延迟大一点可以接受,但丢包会导致重传,体验反而更差。AF要解决的是“如何在不同类别的业务之间按重要性分配丢弃概率”。
AF定义了4个独立的转发类(AF1x到AF4x),每个类内部又分3个丢弃优先级,所以一共是4×3=12个DSCP值,命名成AF11、AF12、AF13这种格式。其中第一个数字代表类别,第二个数字代表丢弃优先级。比如AF32,就是第3类、丢弃优先级中等的报文。
AF的核心机制是:当拥塞发生时,路由器优先丢弃丢弃优先级高的报文(比如AF13),其次丢弃AF12,最后才考虑AF11。也就是说,同类业务内部也要分出“重要的先保、不重要的先丢”的三六九等。这个机制通常配合WRED(加权随机早期丢弃)来实现:队列深度越高,随机丢弃概率越大,且AF13的丢弃概率曲线远高于AF11。
AF的典型适用场景是“可降级”的数据业务,比如存储复制、备份、大数据同步。你可以让备份流量走AF11,普通文件往AF13放,真出拥塞时先牺牲备份,业务流量仍然保得住。
2.3 CS PHB与默认转发:从IPv4优先级“继承”来的兼容方案
在DSCP出现之前,IPv4的头字段里有一个3比特的IP优先级(IP Precedence),可以提供0到7八种优先级。为了兼容老设备和老配置,RFC 2474保留了“Class Selector”(类别选择器,CS)这个PHB,其实就是把这3比特对应成DSCP的高3位,后3位补零。
于是就有了:CS0到CS7,对应DSCP值0、8、16、24、32、40、48、56。CS1对应用户优先级1,CS7是最高级7。CS PHB要求至少按类别提供不同的排队转发待遇,说白了就是“老优先级行为的一种延续”。
默认转发PHB(Default PHB, BE)对应DSCP值为0,就是普通的尽力而为转发。所有没有被标记成任何特别PHB的报文,默认都走这个行为。它没有任何承诺,拥塞时正常参与丢弃。
理解CS和默认转发,对排查问题特别重要。很多老旧系统、某些打印机、IoT设备发的报文DSCP值是0,如果你在设备上只制订了“DSCP 46入队列”“DSCP 34入队列”,这些值为0的流量就会落入默认的普通队列。这不是故障,反而是符合规范的预期行为。
2.4 常用DSCP-PHB映射速查表
| PHB类型 | DSCP名称 | DSCP十进制值 | 二进制(高6位) | 典型用途 |
|---|---|---|---|---|
| EF | EF | 46 | 101110 | 语音、视频会议、低延迟业务 |
| AF11 | 10 | 001010 | 第1类低丢弃 | 普通文件传输 |
| AF12 | 12 | 001100 | 第1类中丢弃 | 批量复制 |
| AF13 | 14 | 001110 | 第1类高丢弃 | 备份、清理任务 |
| AF21 | 18 | 010010 | 第2类低丢弃 | 交互式业务 |
| AF22 | 20 | 010100 | 第2类中丢弃 | 事务型数据 |
| AF23 | 22 | 010110 | 第2类高丢弃 | 低优先级数据 |
| AF31 | 26 | 011010 | 第3类低丢弃 | 信令、关键业务 |
| AF32 | 28 | 011100 | 第3类中丢弃 | 业务关键数据 |
| AF33 | 30 | 011110 | 第3类高丢弃 | 业务监控数据 |
| AF41 | 34 | 100010 | 第4类低丢弃 | 网络管理、高价值业务 |
| AF42 | 36 | 100100 | 第4类中丢弃 | 高价值业务 |
| AF43 | 38 | 100110 | 第4类高丢弃 | 可牺牲的高价值业务 |
| CS1 | CS1 | 8 | 001000 | 低优先级、 scavenger流量 |
| CS3 | CS3 | 24 | 011000 | 信令类(传统用法) |
| CS5 | CS5 | 40 | 101000 | 语音(传统IP优先级5) |
| CS6 | CS6 | 48 | 110000 | 网络控制、路由协议 |
| CS7 | CS7 | 56 | 111000 | 网络控制(最高) |
| BE | 默认 | 0 | 000000 | 普通尽力而为 |
表里这些数值,考试会考,实验报告里也会用到,建议直接保存。尤其是“EF是46”这个数字,几乎每个实验题目都会涉及。
3. 把PHB落到路由器和交换机上:从标记到排队的完整链路
PHB听起来是个抽象概念,但它最终必须落在三个动作上:分类(Classification)、跟踪/调整(Metering/Policing/Shaping)、排队调度(Queuing/Scheduling)和丢弃(Dropping)。这一节用“数据包在一台设备里走一遍”的方式,把PHB的落地过程讲清楚。
3.1 一台设备里发生什么:入口分类、入口重标记、出口队列
假设网络里有一台汇聚交换机,连接着两块业务区:一块是视频会议终端,它发出的报文在应用层已经被标记成了DSCP 46;另一块是普通办公区,发出的报文都是DSCP 0。在汇聚交换机上,数据包的旅程可以分为两条链路。
入方向(Ingress)要做的事:
- 分类:不能只依赖报文的DSCP值,因为来源不可信,外部设备有可能把自己标成最高优先级。合格的防守做法是先按ACL分类——根据源IP、目的IP、端口、应用特征去识别,识别完再决定怎么做。
- 重标记/信任:这就是信任边界(trust boundary)的问题。如果端口连接的是IP电话或会议室终端,这个设备的标记通常可以信任;如果端口连接的是普通PC、打印机、外来访客网络,就应当重新标记。最稳妥的做法是:私接的设备一律设成不信任,把进入的报文DSCP重写为0或指定值,然后按你自己的分类规则决定它的最终DSCP。
出方向(Egress)才是PHB真正发力的地方:
报文查路由表后,从某个接口出去。如果出接口上没有拥塞,所有报文都能发送,PHB几乎是“无感”的。真正起作用的是当出接口拥塞时,那些报文要排队等待发送,此时:
- 报文先按DSCP值被映射到某个“队列”(通常就是配置里的x类),
- 调度器按队列的调度策略(严格优先、加权公平等)从队列里取报文发送,
- 丢弃管理(WRED、尾部丢弃)决定拥塞加深时优先丢哪些包。
所以PHB的实际发力点,几乎都在设备出口:入方向决定身份,出方向决定待遇。
这个“入向分类重标记 + 出向排队调度”的模型,是几乎所有主流厂商QoS配置的共同框架。你把概念理清之后,看任何设备的手册都会特别快。
3.2 把PHB兑现成队列与调度器:基于类的加权公平队列
PHB是逻辑行为,现实里要兑现它,必须把它映射成具体的队列和调度算法。最典型、考试也最常考的是CBWFQ(基于类的加权公平队列)和LLQ(低延迟队列)。
可以把队列理解成停车场出口的不同通道:
- 普通队列(CBWFQ里的每个class):各占一个通道,每个通道按配置的带宽权重轮询放行。带宽权重越高,单位时间内放行的车辆越多,这就是“weighted”的含义。
- 严格优先队列(LLQ里的PQ):相当于一条应急通道,只要这条通道里有车,优先全放完,再放普通通道。
典型映射方案是:
| 业务类型 | DSCP/PHB | 队列策略 | 说明 |
|---|---|---|---|
| 语音/视频会议 | EF(46) | 严格优先队列 + 带宽上限 | 保证低延迟,但要限制最大带宽 |
| 关键业务信令 | CS6(48)/ AF31(26) | 高权重队列 | 网络控制/信令不能让位 |
| 业务关键数据 | AF31-AF33 | 中高权重队列 + WRED | 按丢弃优先级降级 |
| 普通上网 | AF21/AF22/BE | 普通权重 | 尽力而为 |
| 背景任务/备份 | AF13/CS1 | 低权重、高丢弃 | 拥塞时先牺牲 |
有一点必须强调,EF配置“严格优先”时必须同时设置带宽上限。没有上限的严格优先队列,相当于允许一条语音流无限制占用全部链路,一旦语音设备异常突发,其他队列可能完全饿死。很多实验里“配了QoS整个网更卡”的怪事,常常就是这个问题。
3.3 信任边界:谁有权利打DSCP标签
“信任边界”这个知识点,教材里着墨不多,但实操里非常致命。它指的是:网络里从哪个节点开始,你才愿意相信报文自带的DSCP标记是真实的。
最常见的错误配置就是把所有接口都配成“信任DSCP”。这带来的后果是:用户可以在自己电脑上把网卡流量标记成DSCP 46,然后所有业务都变成“语音优先”,真正的语音反而被挤掉。换个角度说,信任边界设置不当,等于把进入网络的优先级话语权,交给了任何一台不可信的终端。
正确的设计应当遵循这样的原则:
- 终端接入交换机:一般配成不信任,统一重标记。
- 汇聚层靠近受信终端(IP电话、视频终端、AP上联):可以信任DSCP,但最好同时用端口识别、源IP校验做强校验。
- 域间边界:重标记所有进来的DSCP,私自定义的标记必须被清洗。
考试如果问“为什么边界路由器要做重标记”,标准答法是:为了维护统一的服务等级约定,防止非信任域流量携带任意DSCP值进入DS域,从而破坏全网的PHB行为一致性。记住这句话,简答题稳拿分。
3.4 一个最小可复现的实验思路(可用模拟器)
如果你正在做课程设计或者自学实验,我强烈建议亲手把这个实验跑一遍。不要直接抄现成的配置,要理解现象。
拓扑:三台路由器串成一条线,R1是左端“源”,R2是“中间节点”,R3是“右端目的地”。R1和R2之间作为瓶颈链路,故意把接口速率改低,比如改成2Mbps,制造拥塞。
实验步骤:
- 从R1后的测试主机打两条TCP流:一条模拟视频流量(标记为EF/DSCP 46),一条模拟普通文件下载(标记为BE/DSCP 0),同时拥塞瓶颈。
- 先观察“不配置任何PHB映射”时的正常表现:两条流几乎均分带宽,同时丢包。
- 在R2出口配置EF优先队列,同时限制最大带宽:观察视频流的延迟和抖动明显下降,但文件流的吞吐量会被压制。
- 在R2出口配置AF队列 + WRED:观察两条AF类流量拥塞时的丢包比例,AF13的丢包远高于AF11,但总吞吐比单队列时更平滑。
做这个实验时,记得在终端上用ping的间隔和DSCP值配合观察延迟差异,比如ping -d 46这种打上DSCP标记的探针包。模拟器里虽然网络时延不准,但队列调度和丢包顺序是准的,足够验证PHB机制。
4. 期末/408/作业视角:哪些最容易丢分
写到这里,得照顾一下正在准备考试、做课后题的读者。DiffServ和PHB是各类计算机网络课程的高频考点,谢希仁版《计算机网络》里也专门有这一章。我把历年学生最容易丢分的点集中整理一下,考前拿着当提纲过一遍。
4.1 高频考点与典型问法
- 概念对比类:IntServ和DiffServ的区别?标准答法要落在“状态维护”上:IntServ每个节点维护每流状态,DiffServ只在边界维护每流状态、核心维护每类状态。
- PHB与DSCP的关系:常问“PHB与DSCP是一回事吗?”不是。DSCP是报文里的标记,PHB是标记对应的处理行为。同一种PHB可以用多个DSCP值表示,一个DSCP值通常只对应一种标准PHB。
- EF与AF的区别:EF针对低延迟低抖动业务,典型应用是语音;AF针对可降级的数据业务,用丢弃优先级区分保护等级。
- AF类之间的关系:不同AF类之间没有严格优先级,它们各自是独立的调度类;同一类内部三个丢弃优先级才有严格的高中低之分。这句话判断题非常容易出一个迷惑选项。
- DSCP字段位置:IPv4中DSCP占用原ToS字段的高6位,低2位被重新定义为ECN。老教材只讲ToS字段,新题喜欢考这2比特的演变关系。
4.2 简答题怎么答才不丢分:理论框架
问“简述DiffServ中的PHB”时,只写“每跳行为”4个字,只能得一点分。一个高分回答应该包含三层结构:
- 概念定义:PHB是DiffServ节点对属于同一行为聚合的报文所施加的转发处理方式,是在每一跳节点上的具体表现。
- 标准化类型:标准PHB包括EF(RFC 3246)、AF(RFC 2597)和CS(RFC 2474)三种,其中EF保证低延迟低抖动,AF通过多个丢弃优先级提供差异化丢弃保障,CS兼容老IP优先级。
- 与DSCP的关系:PHB由包头中的DSCP值唯一标识或对应,报文进入节点后按DSCP分类映射到对应的PHB执行。DSCP是识别依据,PHB是实际动作。
这套回答逻辑,无论是期末答卷还是考研复试问专业问题,都够用了。
4.3 实验报告里必须体现的验证思路
很多同学的实验报告写到“配置完成、成功了”就结束,这完全没有说服力。一个好的DiffServ实验报告,至少得包含三个维度的证据:
- 瓶颈识别:说明你选择在哪一跳模拟拥塞、为什么选这一跳。
- 现象对比:不配置PHB时的时延/丢包/吞吐基线,配置EF/PHB后的改善数据,最好有图表。
- 机制验证:证明“确实是PHB在工作”,而不只是“链路变快了”。方法是在不同类流量间制造拥塞,观察EF类低丢包、AF类同类别不同丢弃级别的差异。
如果你还不知道怎么分析这些现象,建议去看一下公开课里讲DiffServ的那几节视频,很多讲得很好。边看边动手跑模拟器,绝对比死记配置命令有效得多。
5. 实战排查:配置了PHB却没效果怎么办
这部分是真正的经验区。我说的很多情况,配置层面全对,业务表现却没变化。出现这种情况,排查顺序非常重要。
5.1 按入向、出向分段排查
遇到“QoS没效果”,我的习惯是从数据包进入第一台设备开始,逐跳沿着转发路径排查。
第一步,检查入口方向是否“信任”或“重标记”了DSCP。
那种“打上DSCP 46却不被处理”的现象,90%是因为入口把报文重写成了0,或者分类规则没匹配到目标流量。验证方法很简单:在入接口做一条统计,看匹配到指定DSCP的计数有没有增长。计数不动,就是入口分类或标记的问题。
第二步,检查每台中间设备的PHB映射。
核心节点如果不认识某个DSCP值,它会怎么处理?规范说法是:按默认PHB(BE)转发。很多低端设备、默认配置,并没有内置“DSCP 46走优先队列”的映射,必须在每台设备上显式配置映射。所以“第一跳配了、后面几跳没配”,效果自然消失。
第三步,检查出接口的队列配置。
即使映射正确,如果出接口没有对应class匹配到这条DSCP,报文照样进默认队列。常见的表现是:统计数据显示DSCP匹配正常,但队列统计里这个class的报文数始终是0。那是分类规则和队列class的匹配条件没对齐。
第四步,检查EF带宽上限和链路瓶颈。
有些配置把EF队列带宽设成了链路带宽的100%,看起来“VIP通道最宽”,实际效果却让所有流量一起崩。EF队列必须设置上限,建议初值取链路带宽的30%到50%,边测边调。
5.2 常见误配置速查表
| 现象 | 可能的根因 | 排查/修正方向 |
|---|---|---|
| 视频仍卡,看队列统计EF报文才几十包 | DSCP值没被识别/被重写 | 检查入向重标记、信任边界、ACL匹配 |
| 映射正确但队列不增长 | 入向分类匹配的流量类型与出向队列class不一致 | 对齐两方向上的匹配规则、检查interface in/out方向 |
| EF流量过高,其他业务几乎断流 | EF没有配带宽上限 | 给PQ队列设置最大带宽限制 |
| 拥塞时所有流量都丢,无差异 | 只配置了分类,没配置丢弃策略 | 在AF类上启用WRED/按丢弃优先级丢 |
| 在不同厂商设备间互通后PHB失效 | DSCP重标记/默认映射不一致 | 统一DS域内的PHB策略,边界设备显式重写DSCP |
| 模拟器里延迟数据完全没变化 | 模拟器对单纯队列延迟模拟不足 | 重点观察丢包序列、吞吐差异,不依赖具体时延数值 |
我真是踩过几次坑之后,才真正体会到一句话:PHB不是配置出来的,是每一跳设备的调度行为加在一起的累计结果。你只盯着某几台设备调优没有意义,整条路径上只要有一跳不认识这个标记,前面全部白干。
6. 最后分享一个我自己的心得
别再把这章当成“背诵型知识点”了。DSCP值、PHB类型这些数字,看着像记忆题,实际上它们是一条链:应用标记 → 边界重标记 → 核心按DSCP分类 → 队列调度 → 丢弃管理。每一环都有真实业务层面的陷阱。复习的时候,如果能把“EF为什么必须限制带宽”“AF为什么设计成4类×3级”“边界为什么不能盲目信任DSCP”这几个为什么想明白,比死记一百个命令都管用。也希望这篇东西,能在你被DiffServ绕晕的时候,真帮你理清楚“每跳行为”到底是什么、到底该怎么用。