P4 学习笔记(2)-- tutorials/exercises 官方练习

    • 写在前面
    • Basic Forwarding (基础ipv4转发)
    • Basic Tunneling(隧道)
    • P4Runtime(控制器)
    • Explicit Congestion Notification(显示拥塞通知)
    • Multi-Hop Route Inspection(多条路由检测)
    • Source Routing(源路由)
    • Calculator(计数)
    • Load Balancing(负载均衡)
    • Quality of Service(服务质量)
    • Firewall(防火墙)
    • Link Monitoring(链路监控)

写在前面

  • P4 的官方例子 链接:https://github.com/p4lang/tutorials
  • 这些练习在一些关键代码上是空缺的,可以根据提示进行填充。其中每个练习的答案都在solution文件夹里,可以在自己填充好后进行对照。
  • 在这里,对每个练习做简要的笔记,主要包括实现的功能、拓扑结构。

这些练习里包含的文件及其功能:

  • sX-runtime文件是对交换机的基本配置文件,其中定义了对应交换机具体的配置方案,即匹配哪些域进行哪些动作,这些动作的集合在 basic.p4文件中进行了定义。
  • basic.p4文件基本包含这几个部分:头部、解析Parser、校验和检验、入口处理Ingress processing、出口处理Egress processing、检验和计算、逆解析Deparser。
  • send.py,receive.py文件是在进行测试时用到的生成发送的数据包与接受数据包的文件,里面主要用到了python的scapy包。

Basic Forwarding (基础ipv4转发)

1. 实现的功能
1)功能:实现基本ipv4转发的P4程序
2)交换机必须对每个数据包执行以下操作:

  • 更新源和目标MAC地址
  • 减少IP报头中的生存时间(TTL)
  • 将数据包转发到适当的端口

2. 拓扑结构

3. 具体分析
       p4中定义了两个action,对于ipv4_forward动作来说,通过传入的dstAddr参数更新目标MAC地址,通过传入的port参数将数据包转发到适当的端口,同时,减少TTL,更新源mac地址。

    action ipv4_forward(macAddr_t dstAddr, egressSpec_t port) {
        standard_metadata.egress_spec = port;
        hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
        hdr.ethernet.dstAddr = dstAddr;
        hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
    }

       在sX-runtime.json文件中可以看到,对于一个交换机,当传入的数据包目的地址不同时,会传入不同的port值和dstAddr值,以确定对应的转发路径。

Basic Tunneling(隧道)

1. 实现的功能
       在上面ipv4转发的基础上,添加基本隧道传输功能。
       可以通过隧道进行转发,如果隧道头不可用,则可以通过ipv4进行转发。
2. 拓扑结构

3. 具体分析
       basic_tunnel.p4文件中在ipv4转发的基础上定义隧道头myTunnel。定义myTunnel_exact表,其中匹配域为隧道头里的dst_id,动作为myTunnel_forward,此动作将出口端口设置为传入的端口参数。在这些表apply的过程中,当隧道头有效时,应用myTunnel_exact表,如果隧道头无效,应用ipv4_forward表。
       在sX-runtime.json文件中可以看到,对于一个交换机,根据不同的匹配域设置不同的出口端口进行转发。
       在send.py中,设置了新格式的包,可根据不同的输入设置包的结构。
当用xterm h1打开主机h1,在主机中输入如下时,即隧道头无效,传输“P4 is cool”信息,按照ipv4转发到目的ip为10.0.2.2的主机中。

./send.py 10.0.2.2 "P4 is cool" 

当在主机中输入如下时,即隧道头有效,按照隧道转发到目的隧道id为2的主机中,不管ip地址是什么。

./send.py 10.0.3.3 "P4 is cool" --dst_id 2

       在receive.py中,对收到的包进行监听,并且显示出数据包。可以接收方的主机中运行此文件,观察是否正常转发。

P4Runtime(控制器)

1. 实现的功能
       观察可发现此练习中不存在sX-runtime.json文件,此练习使用P4Runtime向交换机发送流表,而不是使用交换机的CLI。此练习建立在basic_tunnel的基础上,同时又增加了两个计数器(ingressTunnelCounter, egressTunnelCounter)和两个新动作(myTunnel_ingress, myTunnel_egress)。
       计数器用来读取进入隧道和离开隧道的包个数。
2. 拓扑结构
       与basic_tunnel相同

3. 具体分析
       mycontroller.py相当于控制平面,对交换机进行配置,其主要功能为:

  • 为P4Runtime服务建立到交换机的gRPC连接。
  • 将P4程序推到每个交换机。
  • 为h1和h2之间的两个隧道编写隧道入口和隧道出口规则。
  • 每2秒读取隧道入口和出口计数器。

Explicit Congestion Notification(显示拥塞通知)

1. 实现的功能
       端到端通信时,如果网络拥塞,则通知发送方降低速率,而不丢弃数据包。如果终端主机支持ECN,则ipv4头部中的对应ecn字段值为1或2。对于这样的数据包,如果交换机队列大小大于阈值,交换机可以将值更改为3。接收方将值复制给发送方,发送方可以降低速率。

2. 拓扑结构

3. 具体分析
       设置ecn字段为3的部分写在了出口处理(Egress processing)中,其中利用到了元数据standard_metadata.enq_qdepth来表示队列长度,当其大于阈值时,设置ecn字段为3。

Multi-Hop Route Inspection(多条路由检测)

1. 实现的功能
       此练习的功能为跟踪数据包经过的交换机路径和队列长度。
       要支持此功能,需要编写一个P4程序,将ID和队列长度附加到每个包的头堆栈中。这些信息都添加在了数据包的ipv4头部的可选字段中。

2. 拓扑结构

3. 具体分析
       添加交换机的路径信息部分写在了出口处理(Egress processing)中,其中不仅要注意添加交换机的名称和队列信息,还要注意修改有关头部长度的字段。

Source Routing(源路由)

1. 实现的功能
       按照发送方主机输入时,自定义的端口顺序进行转发操作,在到达第一个交换机时,根据给定的第一个数字来决定转发方向,以此类推,直至结束。

2. 拓扑结构
       与basic_tunnel相同

3. 具体分析
       添加srcRoutes头部,此头部是一个记录需要转发的端口的堆栈。注意,传输到最后的端口时要把etherType设置为IPV4类型。

Calculator(计数)

1. 实现的功能
       定义一个新的协议与数据包的结构,如下图所示。可以实现两个操作数的‘+’、‘-’、 ‘×’、‘÷’。当交换机收到计算器包报头时,它将对操作数执行操作,并将结果返回给发送方。

2. 拓扑结构

3. 具体分析
       在calc.p4文件中包含了四种操作方式的动作,以及将传入数据包再传回发送方的设置。
       calc.py文件包含了构造数据包和显示出接收到数据包的计算结果的功能。

Load Balancing(负载均衡)

1. 实现的功能
       本练习基于等成本多路径转发的简单版本实现负载均衡。交换机将使用两个表随机地将数据包转发到两个目的地主机中的一个。第一个表将使用散列函数(由源和目标IP地址、IP协议、源和目标TCP端口组成5元组来进行计算)从两个主机中选择一个。第二个表将使用计算得到的哈希值将数据包转发给选定的主机。

2. 拓扑结构
       与basic_tunnel的拓扑结构相同。

Quality of Service(服务质量)

1. 实现的功能
       根据不同的ipv4头部中的协议字段(TCP/UDP/ICMP)来确定头部中diffserv字段的具体值。从而达到服务质量的控制。

2. 拓扑结构

Firewall(防火墙)

1. 实现的功能
       在basic练习的基础上,使用bloom过滤器,实现有状态的防火墙P4程序。

       除了s1以外的交换机应用basic.p4文件,s1上应用firewall.p4文件,其具有以下功能:

  • 主机h1和h2在内部网络上,是互通的。
  • 主机h1和h2可以在外部网络上自由连接到h3和h4。
  • 主机h3和h4只能在从h1或h2建立连接后回复连接,但不能初始化(主动)到内部网络上的主机的新连接。

2. 拓扑结构

3. 具体分析
       使用带有两个散列函数的bloom过滤器来检查进入内部网络的数据包是否是已经建立的TCP连接的一部分。为bloom过滤器使用两个不同的寄存器数组,每一个都将由散列函数更新。

Link Monitoring(链路监控)

1. 实现的功能
       本练习用主机来监视网络中所有链接的使用情况。在basic.p4的基础上,在每一跳拾取出口链路的利用率,并将其发送到主机以进行监视。
       为了监控链路利用率,交换机将维护两个寄存器数组。两个寄存器分别存储自上一个探测包被传输出该端口以来从端口传输出的字节数和探测包上一次从端口传输出去的时间,通过这两个值来计算链路利用率。

2. 拓扑结构

你可能感兴趣的:(p4,SDN,软件定义网络,网络,计算机网络,网络协议)