目录
2. Integrated service(综合服务模型,Int-Serv)
3. Differentiated service(区分服务模型,Diff-Serv)
一、QoS 是什么
在网络的世界里,QoS(Quality of Service,服务质量)是一个相当关键的概念。简单来说,它是一套用于管理和提高网络性能的工具和技术集合 ,旨在解决网络延迟、阻塞以及带宽分配不均等问题,确保关键应用和服务在有限的网络资源下,也能获得所需的网络性能保障。
想象一下,网络如同一条高速公路,数据则是在这条公路上行驶的车辆。在交通顺畅的时候,所有车辆都能顺利通行,数据也能快速准确地传输。但一旦网络出现拥塞,就好比高速公路上车辆过多,交通堵塞,各种数据在传输过程中就会出现延迟、丢包甚至传输失败的情况。比如,当我们在进行视频会议、玩在线游戏或者观看高清视频直播时,这些应用对网络的实时性和稳定性要求极高,如果此时网络带宽不足,或者出现拥堵,视频就会卡顿,游戏也会出现延迟、掉线等情况,极大地影响我们的使用体验。
而 QoS 的作用,就像是一位智能交通管理员,它可以根据不同数据的重要性和实时性要求,对网络流量进行优先级划分和资源分配 。例如,将视频会议、VoIP 通话这类对实时性要求高的数据,标记为高优先级,优先分配带宽,确保它们能够快速、稳定地传输;对于像文件下载这类实时性要求不那么高的数据,则分配较低的优先级,在网络资源充足时再进行传输,从而有效避免重要数据因网络拥塞而受到影响,保证各类应用和服务的正常运行,提升用户的网络体验。
二、Linux 内核 QoS 功能揭秘
(一)Linux 内核 QoS 功能基础
Linux 内核从 2.2.x 版本开始,就踏上了支持 QoS 功能的征程 ,这一举措使得 Linux 在网络管理领域迈出了重要一步。其核心实现是通过 Traffic Control(TC)模块,该模块如同一位精明的管家,全面负责网络流量的管理和控制。
在网络协议栈发送数据包的流程中,TC 模块占据着举足轻重的位置。当上层协议产生数据包后,在没有 TC 模块的情况下,数据包会直接调用 dev_queue_xmit 函数,接着判断是否需要向 AF_PACKET 协议支持体传递数据包内容,最后直接调用网卡驱动注册的发送函数把数据包发送出去,采用的是简单的 FIFO(先进先出)机制。但这种传统方式一旦遭遇网络拥塞,就如同缺乏指挥的交通一样,只能任由数据包堆积,处理效率极低。
为了有效解决这些问题,Linux 的设计者巧妙地在发送数据包的代码中加入了 TC 模块。它就像是一个智能的交通调度中心,精确地对数据包进行分类、管理,实时检测拥塞情况并及时处理。当数据包到达时,TC 模块会根据预先设定的规则,将数据包准确地放入相应的队列中,并依据队列的优先级和调度算法,有序地从队列中取出数据包,再将其发送给网卡驱动进行传输。如此一来,不仅能够确保高优先级的数据包优先传输,还能对不同类型的流量进行精细的控制和管理,从而极大地提升了网络的性能和稳定性。 例如,在一个繁忙的企业网络中,通过 TC 模块可以将关键业务的数据包(如视频会议、VoIP 通话等)标记为高优先级,优先进行传输,确保这些业务的实时性和稳定性;而对于一些非关键的业务(如文件下载、邮件收发等),则可以设置为较低的优先级,在网络资源充足时再进行传输,避免它们占用过多的网络带宽,影响关键业务的正常运行。
(二)QoS 的服务模型
1. Best-Effort 服务模型
Best-Effort 服务模型是网络世界中最为基础和常见的服务模型,也是网络的缺省服务模型 。在这个模型下,网络就像一位尽力奔跑的运动员,尽自己最大的可能性来发送报文。但它对时延、可靠性等性能不提供任何保证,就如同在一条没有交通管制的道路上,车辆自由行驶,没有优先顺序,也无法保证每辆车都能快速、顺利地到达目的地。
它的实现方式非常简单,主要通过 FIFO 队列来完成。所有的数据包按照到达的先后顺序依次进入队列,然后再按照同样的顺序从队列中取出进行发送。这种方式就像是我们日常生活中排队买票,先到的人先办理业务。在网络数据量较小、业务对实时性和可靠性要求不高的情况下,Best-Effort 服务模型能够很好地工作,因为它简单高效,不需要复杂的配置和管理。比如,对于 FTP(文件传输协议)应用,它主要用于在网络上传输文件,虽然传输速度可能会受到网络状况的影响,但即使出现一定的延迟或丢包,只要最终文件能够完整传输,用户通常也能接受;E-Mail(电子邮件)的发送和接收也是如此,邮件的送达时间可能会有所不同,但一般不会对用户造成太大的困扰。 所以,Best-Effort 服务模型适用于绝大多数对网络性能要求不苛刻的网络应用。
2. Integrated service(综合服务模型,Int-Serv)
Integrated service,也就是我们常说的综合服务模型(Int-Serv),与 Best-Effort 服务模型有着显著的区别 。在 Int-Serv 模型中,应用程序就像是一位严谨的旅行者,在发送报文前,需要先通过信令向网络详细描述自己的流量参数,如带宽需求、时延要求、允许的丢包率等,然后向网络申请特定的 QoS 服务。这个过程就好比我们预订机票时,需要明确告知航空公司我们的出行时间、座位偏好等具体需求。
该模型使用资源预留协议 RSVP(Resource Reservation Protocol)作为信令,RSVP 如同一位忙碌的协调员,运行在从源端到目的端的每个设备上。它会认真监视每个流,确保每个流不会过度消耗资源,从而保证网络能够满足应用程序的 QoS 请求。例如,当一个视频会议应用启动时,它会通过 RSVP 向网络申请一定的带宽和低时延的服务。网络中的各个设备收到这个请求后,会根据自身的资源情况进行判断,如果有足够的资源,就会为这个视频会议流预留相应的带宽和其他资源,并向应用程序返回确认信息。只有在收到确认信息,确定网络已经为这个应用程序的报文预留了资源后,应用程序才会开始发送报文。
这种体系的优点是能够明确区分并保证每一个业务流的服务质量,为网络提供最细粒度化的服务质量区分 ,就像为每个用户量身定制服务一样。然而,它也存在着明显的局限性。一方面,Int-Serv 模型对设备的要求极高,当网络中的数据流数量很大时,设备需要为每条数据流维护一个状态,并基于这个状态执行相应的 QoS 动作,这对设备的存储和处理能力是巨大的挑战,设备的负担会非常重;另一方面,它的可扩展性很差,难以在大规模的 Internet 核心网络中广泛实施。因为在实际的网络环境中,网络设备来自不同的厂商,功能参差不齐,要让所有的设备都支持 Int-Serv 模型,并且保证它们之间的协同工作,是一件非常困难的事情。 所以,尽管 Int-Serv 模型在理论上能够提供非常优质的服务,但在实际应用中,受到了诸多限制。
3. Differentiated service(区分服务模型,Diff-Serv)
Differentiated service,即区分服务模型(Diff-Serv),是为了更好地适应现代网络的需求而诞生的 。它的核心概念是提供有差别的服务,就像一家提供多种会员等级的俱乐部,为不同等级的会员提供不同的服务待遇。在 Diff-Serv 模型中,网络中的流量可以根据多种条件,如 IP 地址、端口号、协议类型、应用类型等,被准确地分成多个类,或者标记不同的优先级。
这个过程主要通过对报文进行分类和标记来实现。在网络的边缘节点,会有专门的分类器对进入网络的报文进行仔细分析,根据预先设定的规则,将报文划分到不同的类别中。然后,标记器会为每个类别或优先级的报文添加特定的标记,