实验内容

这次实验的主要内容是如何让P4 交换机能支持处理ARP数据包。
我们在P4 tutorials的实验中都是提前把ARP记录写入了host缓存里,如果没有提前准备的ARP记录,
那么真实的h1 ping h2流程是:

  1. h1 发出ARP request广播询问网络中h2 IP地址所对应的Mac,
  2. h2 收到arp request后,发送 ARP replay单播回应h1,此时h2也知道h1 IP和Mac,
  3. h1 知道了h2的Mac就可以封装二层帧头,发送单播icmp request,
  4. h2收到icmp request后,单播回应icmp replay。

因为此时ARP request的目的Mac是广播地址,ARP replay和ping 包都是单播,所以我们的P4交换机必须能处理广播和单播。
ARP request 也有单播用于查询的情况,在后面测试时也会看到。

cast_grp
cast_grp:支持多播功能,当有多播数据包时,需要在ingress中写入此字段。值为0表示没有多播。此值必须是通过bmv2运行时接口配置的有效多播组之一。
对于使用 v1model 架构,以下字段(包括cast_grp)都是类型为 standard_metadata_t 的结构的一部分。
header_type intrinsic_metadata_t {
fields {
ingress_global_timestamp : 48;
egress_global_timestamp : 48;
mcast_grp : 16;
egress_rid : 16;
}
}
metadata intrinsic_metadata_t intrinsic_metadata;

实验拓扑

实验的拓扑比较简单,就是一台交换机连三个终端host。

show ip bgp summary 命令哪个表示bgp连接成功呀_cast_grp

h1:IP 10.0.1.1,Mac 08:00:00:00:01:11,接s1:port 1
h2:IP 10.0.1.2,Mac 08:00:00:00:01:22,接s1:port 2
h3:IP 10.0.1.3,Mac 08:00:00:00:01:33,接s1:port 3
加载s1时,安装cmd.txt 文件中的规则。

实验步骤

P4程序以及拓扑、交换机规则链接 因为都是一个局域网,所以只定义了ethernet header

show ip bgp summary 命令哪个表示bgp连接成功呀_bmv2_02


parser也只有一个状态机提取ethernet

show ip bgp summary 命令哪个表示bgp连接成功呀_p4_03


ingress,建立两个table和action支持单播和广播。如果命中mac_broadcast则做广播转发,

否则mac_forward做单播转发。

show ip bgp summary 命令哪个表示bgp连接成功呀_网络_04


交换机的规则,安装cmd.txt安装。

show ip bgp summary 命令哪个表示bgp连接成功呀_bmv2_05


定义多播组 mc_mgrp 1,定义mc_node 0 包含port 2和3,然后两者关联在一起。

广播转发时,如果port 1进的流量,从mc_mgrp 1送出去。依次类推配置。

测试

打开h1,h2,h3的终端,tcpdump

show ip bgp summary 命令哪个表示bgp连接成功呀_bmv2_06


h1 ping h2

show ip bgp summary 命令哪个表示bgp连接成功呀_p4_07


host终端上tcpdump显示

h1 上发出关于h2的arp request广播,收到h2的arp replay,

发出icmp request,

后面还收到了一个来自h2的单播查询arp request,发出arp replay。

show ip bgp summary 命令哪个表示bgp连接成功呀_cast_grp_08


h2上收到h1的arp request,回应arp replay,

收到icmp request,回应icmp replay,

随后向h1发送了一个单播的arp request,并收到h1 arp replay。

show ip bgp summary 命令哪个表示bgp连接成功呀_cast_grp_09


h3上只收到了h1发送的广播arp request。

show ip bgp summary 命令哪个表示bgp连接成功呀_bmv2_10

补充

h2 icmp replay h1后,马上又向h1发送单播arp request比较有意思,我特地wireshark抓包看了一下,一开始忽略了arp request还有单播的情况。

show ip bgp summary 命令哪个表示bgp连接成功呀_sdn_11