P4总结(自己写的思考。基于P4标签中的其它资料写的总结报告。)
P4语言提供的核心抽象
1、Header types(协议头类型):描述数据包中每个协议头的格式。
2、Parser(解析器):从接收数据包中识别协议头等其他元数据。
3、table(表):将用户定义的键与action相关联。 P4表概括了传统的交换表;它们可用于实现路由表,flow查找表,访问控制列表等,以及用户根据自己需求定义的表类型。
4、Action: 是描述如何操作包头文件和元数据的代码片段。Actions可以包括在运行时由控制平面提供的数据。
5、Match-action(匹配操作单元)执行以下操作序列:
从包或元数据中查找key,再使用key执行表查找,选择要执行的操作(包括关联的数据),以及最后执行选定的操作。
6、Control flow(控制流)表示一个描述目标数据包处理的命令性程序,包括匹配action单元调用的数据相关序列。也可以使用控制流来执行Deparsing(分组重组)。
7、Extern objects(外部对象)是体系结构特定的构造,可以利用P4程序通过定义好的API进行操作,但其内部行为是硬连线的(例如校验和单元),因此不能用P4编程。
8、User-defned metadata(用户定义的元数据):与每个数据包关联的用户定义的数据结构。
9、Intrinsic metadata(内部元数据):由交换机提供的与每个数据包相关联的元数据,例如已接收数据包的输入端口。
- 控制平面不光下发流表(Table),还会和数据平面进行其它交互(extern objects和control signals)
关于openflow和p4的思考。
如果把协议看成积木的话,openflow交换机在出场的那一刻,它所拥有的积木形状大小和数量就已经固定了。控制器只能针对现有的协议定制流表。(OpenFlow交换机在出场的时候,就已经把能匹配的字段(支持的协议)定义到每个流表中了。控制平面通过组合这些字段,定义感兴趣的流。)
可编程交换机在出场的时候,流表中什么也没有(没有定义它支持哪里协议)。这个时候,用p4程序去完成流表的定义。如:匹配转发,等各种功能,(功能,协议,匹配字段可以理解为一种东西。协议体现在匹配字段上。功能由协议定义)这个过程类似于构建积木。
关于控制平面的理解。
之前一直理解的是控制平面用于注入流表项。现在看来,控制平面对底层积木的运用远不止这些。应该还有其他的操作。至于怎么操作,还未可知。现在可以明确的是,控制平面不光注入流表项。还会有更多复杂的控制。比如流量监控,比如检测大流。控制平面完成的任务上有哪些,数据平面完成的功能有哪些。(当然,有一篇论文是完全在数据平面监控大流的。)
另一个问题是sketch的部署。sketch部署在数据平面,它完成的功能是统计流量。这个功能应该是额外的功能(相比于交换机核心功能:存储转发而言。)一个p4程序,既定义转发功能,又定义sketch。它们的关系是什么。这个问题要通过阅读sketch解决。还有,数据平面部署多个p4程序,它们的关系又是什么?(数据平面是可以部署多个p4程序的。这个是speed说的)
sonata应该也用到sketch(需调研)。如果sonata要部署,它需要控制平面如何参与。
还有一个点:数据平面的功能除了协议,还有哪些。这是需要思考的点。
2021.12.29更
- 那些是数据平面的功能,哪些是控制平面的功能?
应该尽量把数据平面当成无脑匹配-转发的傻瓜。表+表项(match、action)。P4提供一些基础命令(小的功能、操作模块),这些命令组合在一起可以形成形成想要的action如:
action drop() {
mark_to_drop();//drop是自定义的aciton名称,mark_to_drop();是P4提供的命令;
}
action ipv4_forward(macAddr_t dstAddr, egressSpec_t port) {
//ipv4_forward是自定义的aciton名称;standard_metadata.egress_spec = port;是P4定义的变量。一旦被赋值,即可从对应的端口号转发出去。
standard_metadata.egress_spec = port;
//以下三条语句是对数据包头部的修改。该修改只是为了模拟数据包在网络中的转发过程。
hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
hdr.ethernet.dstAddr = dstAddr;
hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
}
涉及到表项的填充,更新,修改的是控制平面的事情。(通过在数据平面运行路由协议实现)
- P4使数据平面的那些功能可编程,哪些功能不可编程?通用、基本转发功能封装成命令。数据包拆分之后的操作开放。
交换机转发数据包的过程包括:数据包的修改(拆分、修改、组合)和转发(逻辑电路)过程(也就是协议算法的执行过程,比如:更新完目的MAC和Egress_port之后,到数据包到下一个交换机的过程中,交换机要干的事)。个人感觉,前者价值很大(和传统网络相比,数据包的修改(拆分、修改、组合)用户可见是非常让人惊讶的),所以可编程,后者涉及到交换机的底层设计,或者说是整个网络的基础架构。封装成基本命令更利于用户操作。(所以P4提供了一组基本命令(功能模块),组合起来可以组成想要的aciton,类似汇编。) - P4的作用分两部分:1.转发数据包;这部分功能和传统交换机的功能完全相同。这部分的程序也是固定的。数据包在网络中的转发涉及到数据包头部字段的匹配和更改(如:dstMAC地址匹配、dstIP地址匹配、MAC地址更新、TTL更新)。这个过程可以使用P4程序来定义并实现。但是并不能体现出P4的优势。2.转发之外的功能,如统计;使用P4实现转发数据包功能的过程中,需要把数据包拆开。把需要匹配或修改的头部字段拿出来。然后再组装好。在拆开之后,可以做统计,这是在传统网络中想都不敢想的事情。然后再组装好。在完成转发功能的过程中,顺便完成了数据包的统计。