ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

QoS详解:从度量标准到服务模型,搞懂网络服务质量优化

QoS详解:从度量标准到服务模型,搞懂网络服务质量优化 1. 从一次会议卡顿说起QoS到底在解决什么问题上个月公司内部视频会议又翻车了。高管在会议室讲方案线上一百多号人听着画面突然糊成一团声音断断续续有人刷屏问是不是网络断了。我看了一眼监控平台带宽占用率其实还不到40%但后台刚好有人在跑全量数据库备份把交换机出口队列塞得满满当当。那一刻我意识到很多网络问题根本不是带宽不够而是该优先的流量没有被优先对待。这个问题的解决方案就是QoS。QoSQuality of Service服务质量这个词在圈子里提了很多年但真正能把度量标准和服务模型这两条主线理清楚的人说实话不多。大部分人所做过的QoS不过是在路由器上敲几条priority命令、把视频会议源地址塞进高优先级队列至于为什么这样有效、按什么指标去评估效果、底层有哪几种服务模型可以选择完全没概念。这篇文章是一个系列的开篇核心就两件事一是搞懂哪些指标能真实反映网络服务质量二是把三类主流服务模型——尽力而为、集成服务、区分服务——的原理、适用场景和天花板讲透。适合刚接手网络优化、被各种业务方投诉网络卡的同学也适合想系统补齐QoS知识框架的运维老兵。为什么QoS到现在依然是老大难因为现代网络的流量构成早就不像十年前那样简单。语音要低延迟视频会议既要带宽又要低抖动ERP和数据库要求可靠不丢失普通网页浏览反而可以忍受几秒延迟。与此同时云备份、大模型API调用、AI推理流量也在源源不断地涌入同一个网络出口。不同业务对网络的要求天差地别网络设备的处理能力却始终有限。QoS的核心就是在资源有限的前提下通过识别流量、度量状态、差异控制这三个动作让关键业务在网络拥堵时依然获得应有的服务质量。它没有能力把1Gbps变成10Gbps但它能做到让视频会议的1Mbps永远优先于下载任务的1Mbps。顺带一提最近网络圈都在聊模型发布即服务这类概念AI大模型推理接口的实际体验同样高度依赖底层网络时延和丢包。哪怕机房再快用户到边缘节点的链路一拥堵API调用照样超时。所以QoS这件事在新一轮的服务化浪潮里不仅没过时反而成了基础设施的必修课。2. 度量标准把网络好坏翻译成可以测试的数字要做QoS第一步不是配置设备而是先回答一个问题网络现在的服务质量到底怎么样如果连现状都没有量化后面做任何策略优化都等于蒙眼开车。这一节我们把网络质量拆成几个可测量的维度逐个搞明白每个指标的定义、算法、对业务的实际影响以及实测时该用什么工具。2.1 带宽与吞吐量链路速率不等于用户速率带宽这个词被用得太滥了运营商说100M宽带很多人就以为每秒能传100MB数据。实际上100Mbps是链路的名义速率真实能跑到的吞吐量受MTU、协议开销、TCP窗口、对端性能等多重因素影响。一个100Mbps的以太网链路刨去帧头、前导码、IP头部和TCP头部实测吞吐通常只有94Mbps左右加上TCP慢启动和往返时延的限制单线程下载可能连这个数都跑不到。吞吐量才是我们做QoS设计时真正要关心的数字。测试方法很简单用iperf3就能完成。在服务器端跑iperf3 -s在客户端跑iperf3 -c server_ip先测TCP模式看最大吞吐再用-u参数单独测UDP模式直接观察带宽、抖动和丢包率。我第一次给客户做网络评估时客户坚持说我们是千兆专线不可能不够结果一测真实吞吐只有300Mbps原因是一条路上挂了十几台三层交换机每台的QoS队列配置都互相冲突转发性能被策略路由拖垮了。所以度量标准第一条不要看链路标称值只看实测吞吐量。2.2 时延一段数据要走的路比想象中更长时延指数据从源端到目的端所花的总时间官方叫法是单向时延但实际运维中大家更习惯用RTT往返时延。一次数据包传输的时间由四段组成传播时延、传输时延、处理时延、排队时延。传播时延由物理距离决定光在光纤中的传播速度约为真空中速度的三分之二也就是每毫秒约200公里。北京到上海直线约1200公里光是传播时延就要6毫秒左右RTT就是12毫秒打底。传输时延跟链路速率和包大小有关处理时延取决于设备CPU和转发引擎的能力而排队时延是QoS最关注的部分——当多个数据流同时涌向同一出口设备只能按队列顺序出包排队的长度直接决定了排队时延。不同业务对时延的敏感度差别很大。人的语音对话端到端时延超过150毫秒就会明显感觉不自然视频会议稍微宽容一点但超过300毫秒配合丢包画面会直接卡顿。数据库主从同步、分布式存储这类应用要求更苛刻几十毫秒的波动都可能影响事务提交效率。测时延最朴素的方法是ping但ping只能反映ICMP的RTT不能反映UDP语音流的真实路径。更专业的做法是用iperf3的UDP模式配合Wireshark抓包统计每个数据包的到达时刻分布这才是QoS优化前后对比的可靠依据。2.3 抖动实时业务的隐形杀手抖动Jitter指的是相邻数据包到达时间间隔的差异。打个比方一个语音流每秒发送50个包每个包间隔20毫秒这是正常节奏。但如果网络有瞬时拥塞第10个包排了50毫秒的队第11个包又立即到达接收端看到的节奏就是20、20、50、5、20乱七八糟。接收端抖动缓冲Jitter Buffer会吸收一部分波动但缓冲设置得越大时延越大缓冲设置得越小超出缓冲范围的包就会被丢弃。这就形成了一个两难抖动越大要么听感断续要么延迟高得离谱。语音业务一般建议抖动控制在30毫秒以内超过50毫秒基本不可用除非终端抖动缓冲足够深。视频通话对抖动的敏感程度略低但持续性高抖动同样会导致画面撕裂和花屏。抖动的主要来源是突发流量和队列调度策略比如办公室里有人突然开始上传大文件瞬时流量抢占全部可用带宽其他业务的包就会被随机延迟。这也是为什么QoS的队列调度机制比单纯加带宽更能解决抖动问题。2.4 丢包率链路质量的数字读心术丢包率指一段时间内丢失的数据包占发送总数的比例。造成丢包的原因很多链路误码、缓存溢出、策略丢弃、设备故障。在QoS语境下丢包不完全是坏事——有时候它是流量监管故意丢弃超出带宽限制的包让发送端感知拥塞并降速这叫显式拥塞通知。但正常情况下1%的丢包对语音就是明显可感知的损伤5%的丢包足以让一场视频会议崩溃。对TCP业务来说丢包会触发超时重传和拥塞窗口缩小表面看只是慢一点实际吞吐可能直接腰斩。测丢包率最简单的办法是iperf3 -u模式发送端按固定速率打流量接收端统计实际收到的包数。也可以在源端持续ping对端统计丢包比例。但要特别注意ping丢包率低不代表业务丢包率低。ICMP包优先级和处理路径与普通业务流量不一定相同有些设备对ICMP单独限速。更可靠的做法是在业务高峰期抓包用Wireshark的统计功能计算TCP乱序、重传率和实际丢包这样才贴近真实业务体验。2.5 可用性、可靠性与SLA可用性通常用百分比表示比如年可用性99.9%翻译成人话就是一年累计停机时间不超过8.76小时。很多网络团队把可用性当成唯一指标认为链路不宕机就是服务好这种观点在QoS体系里是片面的。可用性只回答了网络通不通回答不了通得好不好。可靠性的含义更广包括误码率、设备故障恢复时间、路由收敛速度、链路切换对现有连接的影响等等。做SLA设计时建议把前面四个指标量化进去比如月度丢包率不超过0.1%、跨市RTT不超过30毫秒、抖动不超过20毫秒、可用性不低于99.95%。有量化指标后才能和上游运营商或内部业务方对齐预期。以下这个表是这几年我比较常用的参考区间各位可以根据自身业务调整指标典型良好值可接受上限不可用阈值测试方法吞吐量达到链路速率90%以上链路速率70%以上低于50%iperf3 / 网管平台RTT同城10ms跨省30ms同城30ms跨省100ms超过200msping / mtr抖动10ms以内30ms以内超过50msiperf3 -u / RTP探针丢包率00.1%以内超过1%ping / iperf3 -u3. 尽力而为模型互联网默认的平等对待把度量指标理清楚之后再看服务模型就清晰多了。所谓服务模型本质上是网络设备对不同的流量采取什么样的差异化处理策略。主流的模型一共有三种先从最老也最普及的尽力而为Best-Effort说起。3.1 尽力而为的哲学不分类也不承诺尽力而为模型是互联网从ARPANET时代继承下来的设计哲学网络只负责把数据包尽量送到目的地不承诺带宽、不保证时延、不区别对待任何流量。所有数据包站在同一条起跑线上路由器按先来后到的顺序尽量转发链路拥塞时直接丢弃新到的包剩下的交给TCP的拥塞控制去处理。这个模型最大的优点是极致的简单和鲁棒。路由器不需要维护任何流状态不需要查什么优先级表来了包就查路由、转发、走人。正是这种简单支撑了互联网规模从几百台设备扩张到几十亿节点因为网络内部不需要为差异化付出额外成本。但平等不等于公平。TCP流量之间有拥塞控制机制互相礼让大体上还算公平UDP流量没有拥塞控制一旦突发就会毫无收敛地占满链路缓存挤压TCP流的带宽网络上部分流量被活活饿死的情况时有发生。我做过的不少客户网络就是这样有人开着P2P下载工具把出口带宽全部打满其他人的OA系统、网页访问全部卡死。从尽力而为的角度看每个包都得到了同样的待遇但用户体验却是灾难性的。3.2 为什么很多场景至今仍然选择尽力而为既然尽力而为有这么多问题为什么还大量存在核心原因是成本和收益的权衡。在企业内网流量不大、业务种类单一的场景做流量分类和策略维护的开销可能比网络拥堵本身造成的损失还大。举个例子一个只有二十来号人的销售团队平时用用邮件和浏览器偶尔跑一次异地视频会专门为此上全套QoS策略并不划算。另一个原因是很多业务本身对网络质量不敏感网页加载多了500毫秒用户只是皱皱眉邮件延迟几秒也没人在意。所以我把尽力而为模型称为网络里的默认选项不是因为它最好而是因为它在大部分场景已经足够。但正因为默认行为是一视同仁当关键业务遇到拥塞时任何人都会切身体会到网络没有优先级的代价。这也正是很多网络工程师第一次认真做QoS项目的起因——不是想主动优化而是被投诉逼出来的。4. 集成服务模型先预约后使用如果说尽力而为是散客随到随办那集成服务模型IntServIntegrated Services就是高端餐厅的预订制。它最早由IETF在RFC 1633提出目标是为单个应用流提供端到端的服务质量保证主要配套协议是RSVP资源预留协议。4.1 IntServ的基本逻辑先预约后使用IntServ的核心思想是应用在发送数据之前先沿着网络路径向沿途所有路由器发起资源预留请求每个设备评估自身剩余资源后决定是否答应。一旦整条路径上的设备都预留成功这条流就获得了明确的带宽和延迟保证相当于在链路上画了一条专属通道。请求通过RSVP协议完成具体过程分两步发送端先发Path消息沿线收集路径信息和链路可用资源接收端收到Path后根据自己的需求发回Resv消息沿线设备逐个确认预留资源并记录状态。预留的状态是软状态需要周期性刷新否则30秒内没有续约相关设备的预留条目自动老化删除。这个设计在理论上非常优雅。只要预约成功网络就能对这条流提供明确的服务质量承诺比如保证带宽、限定排队延迟上限。RFC 2212定义了Guaranteed Service保证型服务用网络演算模型推算出严格的端到端延迟上界RFC 2211定义了Controlled Load受控负载服务目标是让流量即使在拥塞情况下也能获得接近未拥塞网络的服务体验。4.2 RSVP的完整工作流程和质量承诺我们用一次具体的VoIP通话来走一遍流程。打电话前发送端会发出PATH消息沿路经过接入交换机、核心路由器、对端接入设备每台设备把自身的下一跳地址和可用带宽信息附加到消息里。接收端拿到PATH消息后知道了整条路径情况回复RESV消息沿途每台设备检查是否有足够资源。所有设备都预留成功后两条方向上的资源才算都建立完毕。此时语音流开始在预留通道内传输路由器对这条流采用专门的队列调度策略保证带宽、限制时延理论上语音包一路绿灯。这套流程的优势是颗粒度极细——它可以做到按单个流比如某个IP到某个IP的特定端口来提供保证这是DiffServ按聚合类处理所做不到的。而且RSVP是双向协商资源拒绝时接收端可以反馈给应用层应用可以提前降码率或换路径而不是等网络卡到不可用再事后补救。在一些对质量要求苛刻的场景里这种事前协商比事后补救更有价值。4.3 IntServ的致命伤状态爆炸与扩展性危机理想很丰满现实很骨感。IntServ最大的问题出在可扩展性上。每一个RSVP预留流都要求路径上所有核心路由器维护一条状态记录也就是说如果路由器上有一万条在线视频流就要维护一万条会话状态。每个状态不仅有带宽参数还要配套独立的队列挂载和处理逻辑。核心路由器的查表、调度、内存开销都跟着上涨转发性能严重受拖累这在流量规模以百万计的核心网段根本无法承受。此外RSVP的软状态刷新机制本身也消耗资源。每个预约流每30秒要刷新一次大流量场景下光刷新消息就能占满不少控制平面资源。再加上RSVP的跨域协作需要所有中间设备都支持同样的协议和策略运营商之间根本没法协调一致端到端的资源预留就无从谈起。因为这个缘故IntServ至今没有成为互联网的主流QoS方案真正落地较多的是小规模园区网的语音保障以及MPLS流量工程里的RSVP-TE这类面向隧道而不是单流的变体。它的思想是对的只是用在了少数高质量流的场景无法推广到海量在线流的场景。5. 区分服务模型分类汇聚逐跳处理由于IntServ扩展性太差IETF后来提出了另一套思路就是区分服务模型DiffServDifferentiated Services定义在RFC 2474和RFC 2475里。DiffServ不再为每个流预约资源而是把流量分类汇聚成有限的几个类针对不同的类分配不同的转发优先级。网络设备从为每条流维护状态变成为每个类配置规则转发状态和流量数量解耦扩展性一下就解决了。5.1 DiffServ的整体架构边界分类核心执行DiffServ把网络设备明确分成两类角色边界节点Edge Router和核心节点Core Router。边界节点负责做进站处理识别流量类型、执行分类、打上标记、做限速和监管。比如一台交换机接到办公室它会根据IP、端口、协议、甚至应用层的特征把视频会议流量标记为EF加速转发、把语音标记为EF、把普通网页流量标记为BE尽力而为、把关键业务数据标记为AF确保转发。做完标记之后数据包进入网络内部。核心节点则不需要重新识别流量它只做转站处理读取数据包上的DSCP标记把不同标记的包丢进不同的队列然后用对应的调度算法转发。核心设备不关心这个包是来自视频会议还是数据库备份它只关心标记位因此处理效率非常高。这种边界复杂、核心简单的设计正是DiffServ能扩展到大型网络的关键。5.2 DSCP字段与PHB行为组DSCP字段是IP头中TOS字节的前六位一共可以编码64个码点。为了把这些码点映射成可执行的转发行为IETF定义了PHBPer-Hop Behavior逐跳行为通俗说就是每个路由器看到这个标记之后该怎么处理。常用的PHB有以下几组EFExpedited Forwarding加速转发DSCP固定为46二进制101110。要求低时延、低抖动、低丢包网络对这类流量提供相当于专线的服务通常用于语音和视频会议。EF流量在平时配置中普遍限定不超过链路带宽的30%防止它反过来挤占其他业务。AFAssured Forwarding确保转发分为AF11到AF43共12个码点对应四个转发类数字1到4和三个丢弃优先级数字1到3。比如AF41比AF31重要AF41比AF42重要。这组PHB适合企业ERP、数据库同步、关键交易系统它们不需要像语音一样极致的低时延但要求拥塞时丢包概率显著低于普通流量。BEBest-EffortDSCP为0就是尽力而为模型的延续适用于网页浏览、文件下载等不依赖实时性的业务。CSClass Selector保留了旧IP Precedence的兼容码点从CS1到CS7。实际部署中最常见的映射方案是语音CS5或EF视频会议CS4或AF41关键业务数据AF31或AF21普通数据BE。具体用什么值得看整条链路所有设备是否共同遵守同一套映射表不然一边标记AF41、另一边不识别策略等于没做。5.3 令牌桶流量监管的基础机制DiffServ的边界节点除了分类打标还有一个重要动作叫流量监管Policing。监管的标准做法是令牌桶算法。一个令牌桶维护两个参数承诺信息速率CIR和突发长度Bc。令牌以CIR的速度持续进入桶中桶最多存Bc个令牌。数据包转发时必须先从桶中拿走相应数量的令牌拿不到令牌的包就视为超出承诺速率。常见的处理有两种直接丢弃或者重标记为低优先级。比如一个视频会议流承诺2Mbps突然飙到5Mbps边界路由器可以把超出的3Mbps重标记成BE让它们挤拥塞时先被丢。这套机制在运营商接入和企业出口限速里用得极为普遍。双速率三色标记srTCM/trTCM比单桶更精细维护承诺突发和超出突发两个桶分别标记为绿色、黄色、红色不同颜色的包在后端队列里享有不同的丢包优先级。在做大型出口限速时我一般建议至少采用双速率双桶否则多余的突发流量全部一刀切丢弃业务抖动会更大。5.4 DiffServ与队列调度的配合DiffServ真正发挥作用还离不开核心节点上的队列调度机制。常见的队列算法有FIFO、PQ、CQ、WFQ、CBWFQ、LLQ等各有分工。PQ严格优先高优先级队列永远先转但可能饿死低优先级CQ把带宽按比例分成多个队列各队列公平轮转WFQ根据流数量和权重自动调度实现基于流的公平性CBWFQ则允许管理员手动定义流量类并分配最小带宽保证LLQ是优先队列带宽约束的组合最适合语音和视频——它既保证这类流量绝对优先转发又不让它们无限制占用带宽避免低优先级业务全部饿死。在实际配置中LLQ几乎成了语音视频场景的标准答案。给语音流分配一个严格优先队列同时用CIR约束最大占用带宽给关键业务数据分配CBWFQ队列保证它在拥塞时至少获得一部分带宽普通流量走默认队列剩下的带宽大家抢。6. 三种模型横向对比与落地避坑6.1 一张表看懂三类模型的取舍维度尽力而为Best-Effort集成服务IntServ/RSVP区分服务DiffServ资源保证粒度无单流级别聚合类级别信令协议无RSVP无需信令标记传随核心设备是否维护流状态否是否可扩展性极好很差好服务质量承诺无承诺强承诺带宽延迟上界相对承诺概率性典型应用场景普通互联网访问小规模关键流、MPLS TE企业园区、运营商骨干、数据中心从这张表能看出来三种模型没有绝对的好坏只有适不适应场景。日常企业网络最推荐的是DiffServ需要给极少数关键流提供强保证时IntServ或RSVP-TE值得考虑流量简单、预算有限的小型网络做好基本带宽规划、维持尽力而为也完全可行。6.2 从零开始落地一套DiffServ QoS的通用路径拿最常见的园区网改造举例一个基本完整的QoS落地流程可以拆成五步。第一步摸清业务和流量。把网络里的应用按重要性排个序哪些是语音、哪些是视频、哪些是数据库每类业务大概占多少带宽。这块可以用NetFlow、sFlow或者厂商的网络分析平台跑一到两周拿到真实数据再动工。第二步统一设计标记映射表。确认所有接入交换机、核心交换机、路由器、无线控制器都采用同一张DSCP映射表保证语音、视频、数据从接入到核心走同一套规则。第三步配置边界设备。在接入交换机或路由器的入方向做分类标记和监管。这里要重点注意信任边界。如果接入端口是电脑终端默认不能信任终端自带的DSCP标记因为普通PC可以随便改必须在接入层重新标记。正确的做法是有线接入端口关掉QoS信任按ACL或应用识别结果打标无线SSID根据业务给不同VLANVLAN入方向统一打标。第四步配置核心设备调度。所有业务打标完成后在核心出口路由器上启用LLQ队列把EF流量放严格优先队列AF31放进保证带宽队列普通流量放默认队列。再配合WRED加权随机早期丢弃在队列开始拥塞时就提前丢弃部分低优先级的包避免队列直接打满造成所有业务的雪崩式丢包。第五步持续验证。部署完成后再用iperf3、语音质量探针、网管平台的实时监控对比改造前后的指标。我通常会在改造前测一周基线数据改造后再测一周对比数据用抖动和丢包率下降幅度来衡量项目价值而不是凭主观感觉说好像顺畅了。6.3 我在实际配置里踩过的几个坑做QoS这些年有几个坑几乎每个项目都会碰到写出来给大家当提醒。第一个坑是不设置信任边界。有一次客户说语音通话反而变差了排查半天发现是员工电脑上装了个软件把系统里所有UDP流量都打成了EF标记。路由器一看是EF就全放优先队列导致真正的语音流和这些伪造高优先级的流量抢带宽结果全乱了。从那以后我在任何边界端口都强制关闭终端信任一律按ACL重新分类。第二个坑是语音队列上限设置不当。LLQ里的严格优先级队列如果不加带宽限制语音流和其他恶意高优先级流量可能无限抢占链路低优先级业务直接饿死但如果限制得太低突发语音又会频繁触顶造成丢包和抖动。我的经验是把EF上限设置在链路带宽的20%到30%之间并定期观察峰值使用率动态调整。第三个坑是只做分类不做调度。很多运维在交换机上配了复杂的ACL分类规则标记也打上了但下游路由器队列调度却没有对应更新。数据包带着EF标记穿过网络结果所有设备还是按FIFO一起排队忙活半天毫无效果。QoS是一个端到端的系统工程分类、标记、调度、丢弃策略必须全链路同步任何一环缺失都会让前面的工作白费。第四个坑是忽略监控和告警。QoS不是配完就一劳永逸。网络流量随时间不断变化今天跑得流畅不代表下周依然如此。建议把QoS相关指标——各队列占用率、EF流量比例、丢包分布、时延抖动趋势——全部接入监控平台设好阈值告警。一旦哪个业务的队列长期打满立刻定位是正常增长还是异常流量及时调整带宽分配。回到开头那次会议卡顿的事故。排查到根因之后我给公司网络做了一套基于DiffServ的改造视频会议和语音走LLQ优先队列数据库备份流量重标记为低优先级下载和更新走默认队列同时在边界交换机把终端信任关掉。后来再遇到有人跑全量备份视频会议再没卡过。网络资源就那么多关键不在够不够用而在给谁用。QoS度量标准和服务模型这些基础内容看起来是纸面理论一旦真正吃透处理起实际问题来就是降维打击。一个受过良好训练的网络工程师应该在自己的工具包里永远放着一套清晰的服务模型和度量方法论而不是等业务方来投诉时才手忙脚乱地加一条priority命令。
返回列表