P4
P4是一门SDN数据平面的编程语言,用于定义转发设备处理数据报的整个过程.
一个完整的P4语言包含以下几个组成部分:
(1)首部(header): 定义数据报首部结构
(2)解析器(parser): 根据首部定义解析数据包
(3)流表(table): 用于处理数据报的流表结构
(4)动作(action): 用于处理数据报的动作
(5)控制程序(control program): P4语言的“main”函数
1.协议无关性: P4灵活定义数据报协议格式和交换机的解析过程,使P4交换机能够处理基于新协议的数据报,解耦于特定协议。
header p4_route {
fields {
srcIP : 32;
dstIP : 32;
srcPort : 16;
dstPort : 16;
}
}
2.设备独立性: 无需关心底层细节。
过去,写硬件代码(Verilog等)非常痛苦,需要了解底层细节,掌握特定硬件的机理。
现在,只要懂一些C语言的编程,即可上手P4语言,写出高层次的处理流程描述代码,通过编译器再转换为硬件代码。
3.可重配置性: 能够在运行时改动交换机内部处理数据报的行为。
P4实验
环境:
1.BMv2 P4交换机
2.P4c-bm 编译器
工具:
1.scapy 使用python编写的收发数据包的工具库
2.simple_switch_CLI P4交换机的控制台
实验原理:
本次实验通过P4实现了一个较为简单的路由协议: EasyRoute,该协议通过在数据包首部字段中指定特定交换机的输出端口,实现简单的路由。
在发送数据包时,通过Dijkstra算法计算得到到达终点的最短路径,将这条路径上所有需要经过的交换机以及输出端口记录在数据包首部中,数据包通过这些信息进行路由。
EasyRoute协议字段:
1.preamble(8 bytes): 用于区别EasyRoute数据包和其他数据包
2.num_valid(4 bytes): 用于记录首部中合法端口的数目
3.port_n(1 bytes): 数据包的输出端口
4.data: 用于记录我们希望发送的数据
实验步骤:
1.启动mininet仿真网络:
$ ./run_demo.sh
2.启动h1和h3的控制终端:
mininet> xterm h1 h3
3.在h1的终端上执行:
$ ./send.py h1 h3
4.在h3的终端上执行:
$ ./receive.py
5.在h1的终端上编辑文本信息,并发送,在h3的终端界面上就能够 看见h1发送的信息。