## 1.实验QoS目的
实现服务质量保证功能。先简单的介绍QoS相关背景,在IP网络中,对于不同的用户、流量类型应当给与不同的对待,从而实现为不同的需求提供更高的性能。
对于QoS技术而言,需提供以下的基础功能:
- 流量分类和标识:依据一定的规则识别对象,并标识服务级别。实现区别服务的前提
- 拥塞管理
- 拥塞避免
- 流量整形
对于流量而言,在接入口分配了标识标记了相应的服务级别。那么在骨干路由器,存在一套相应的流量拥塞管理算法么?对于P4交换机,内置了这样的算法,还是说也需要后期的实现?

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

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可以用来承载普通上网业务。

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

4.实验结果
如何用实验验证已经实现了QoS呢?貌似我并没有写基于服务级别的流量调度算法。
- h1发送udp数据包,h2接收到的数据包如下,tos字段显示为0xb9

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

通过两个不同数据包tos字段对比,可以表明实现了流量分类和服务标识
总结
本教程中的QoS实验本身并不是完整的实现,对于完整的QoS服务而言,至少包括流量分类和标识、流量调度两个方面。在这个实验中,我们只实现了基于IP协议的流量分类和标识。
对于初学者理解QoS有很大的帮助,尽管我学习计算机网络已经很长时间,流量调度也专门的学习过。当时今天回想,觉得那时候对流量调度完全停留在了理论的阶段,知道可以通过令牌、优先级等方式进行调度,但不知道流量调度究竟是在哪一块实现,直到今天的实验才明白tos字段就是为QoS服务所保存的字段,流量调度的流量标识就体现在tos字段中。