p4 QoS 实现

P4官方教程(九)

Posted by BY beta on November 8, 2020

## 1.实验QoS目的

实现服务质量保证功能。先简单的介绍QoS相关背景,在IP网络中,对于不同的用户、流量类型应当给与不同的对待,从而实现为不同的需求提供更高的性能。

对于QoS技术而言,需提供以下的基础功能:

  • 流量分类和标识:依据一定的规则识别对象,并标识服务级别。实现区别服务的前提
  • 拥塞管理
  • 拥塞避免
  • 流量整形

对于流量而言,在接入口分配了标识标记了相应的服务级别。那么在骨干路由器,存在一套相应的流量拥塞管理算法么?对于P4交换机,内置了这样的算法,还是说也需要后期的实现?

image-20201109082435341

具体的排队、调度、整形 如下图所示

image-20201109083138422

2.实验思路

教程中提到了diffserv,第一直觉是要为不同类型的流量设置不同的diffserv值。

但对于不同的diffserv值,又如何影响到其转发优先级呢?优先级的体现是在交换机排队中吗?

  • 通过搜索differentiated services等关键词,对于区分服务有了更深的理解。具体流程如下

当数据流进入diffServ网络时,边缘路由器通过识别字段,将IP包分为不同的服务类别,而网络中的其他路由器在收到该IP包时,则根据该字段所标识的服务类别将其放入到不同的队列,并由流量管理机制管理,包括预先设定的带宽、缓冲处理等

  • 搜索QoS优先级字段。根据RFC2474,将IPv4报文ToS域中的比特0~5定义为DSC,并将ToS域改名为DS(区分服务)字节

AFxy中,x代表不同的类别,根据不同的分类后续可以定义进入相对应的队列,y代表当队列被装满的时候丢包的概率,例如AF1类中的报文,其中丢包概率由小到大排序为AF11<AF12<AF13。

不同关键字常用于标识不同报文(可自行定义):

  • CS6和CS7默认用于协议报文,而且是大多数厂商设备的硬件队列里最高优先级的报文,因为如果这些报文无法接收的话会引起协议中断。
  • EF常用于承载语音的流量,因为语音要求低延迟,低抖动,低丢包率,是仅次于协议报文的最重要的报文。
  • AF4用来承载语音的信令流量.
  • AF3可以用来承载IPTV的直播流量,直播的实时性很强,需要连续性和大吞吐量的保证。
  • AF2可以用来承载VOD(Videoon Demand:视频点播)的流量,相对于直播流量来说,VOD对实时性要求没那么强烈,允许有时延或者缓冲。
  • AF1可以用来承载普通上网业务。

image-20201108162918180

3.代码修改

区分服务,数值与服务对应关系如下。可以看到,默认转发为0x0,加速转发(低时延)为46.所以在P4的代码修改内容中,需要按照现有协议确定数值。

image-20201109084638453

4.实验结果

如何用实验验证已经实现了QoS呢?貌似我并没有写基于服务级别的流量调度算法。

  • h1发送udp数据包,h2接收到的数据包如下,tos字段显示为0xb9

image-20201109091302189

  • h1发送tcp数据包,h2接收到的数据包如下,tos字段显示为0xb1

image-20201109091702678

通过两个不同数据包tos字段对比,可以表明实现了流量分类和服务标识

总结

本教程中的QoS实验本身并不是完整的实现,对于完整的QoS服务而言,至少包括流量分类和标识、流量调度两个方面。在这个实验中,我们只实现了基于IP协议的流量分类和标识。

对于初学者理解QoS有很大的帮助,尽管我学习计算机网络已经很长时间,流量调度也专门的学习过。当时今天回想,觉得那时候对流量调度完全停留在了理论的阶段,知道可以通过令牌、优先级等方式进行调度,但不知道流量调度究竟是在哪一块实现,直到今天的实验才明白tos字段就是为QoS服务所保存的字段,流量调度的流量标识就体现在tos字段中。