在这次实验中,要对上一个实验中完成的IP路由器添加对基本隧道协议的支持。交换机根据目的IP地址进行转发,我们的任务是定义一个新的报头类型来封装IP数据包并修改交换机代码,以便它使用一个新的隧道报头来决定目的端口从而指导转发
新的报头类型包括:
开始的代码文件为badic_tunnel.p4,这里面只是基于IP转发,和上次basic_forwading实验差不多
关于控制平面:
步骤一:实现基本的隧道
basic_tunnel.p4文件中包含了一个基于IP转发的路由实现方式。同样TODO是我们自己需要修改的部分。最终basic_tunnel.p4达到的效果是:交换机可以基于自定义封装报头做转发,同样如果是普通的IP数据包也可以做正常的IP转发
解决方案的思路:

步骤二:执行
运行sudo make run,编译basic_tunnel.p4,启动mininet,按照拓扑图配置switch和host

打开h1和h2的终端

每个主机都包含一个小型的基于python的消息传递客户端和服务器。在h2的xterm中,启动服务器:./recieve.py

首先,我们将测试没有隧道。在h1的xterm中,向h2发送一条消息:./send.py 10.0.2.2 “P4 is cool”

包应该在h2接收。如果检查接收到的数据包,应该看到它由以太网报头、IP报头、TCP报头和消息组成。如果你改变了目的IP地址(例如尝试发送到10.0.3.3),那么消息应该不会被h2接收,而会被h3接收。现在我们用隧道来测试。在h1的xterm中,向h2发送一条消息:./send.py 10.0.2.2 “P4 is cool” --dst_id 2

包应该在h2接收。如果检查接收到的数据包,应该看到它由以太网报头、隧道报头、IP报头、TCP报头和消息组成。在h1的xterm中,发送一条消息:./send.py 10.0.3.3 “P4 is cool” --dst_id 2

包应该在h2接收,即使该IP地址是h3的地址。这是因为当MyTunnel头在包中时,交换机不再使用IP头进行路由。键入exit或Ctrl-D以离开每个xterm和Mininet命令行。

Python Scapy本身并不支持myTunnel头类型,所以我们提供了一个名为myTunnel_header.py的文件,它为我们新的自定义头添加了对Scapy的支持
在真实的网络环境中通常是:数据包进入网络时会打上tunnel封装,而离开网络时再剥离tunnel封装。那么如何修改P4代码使我们的实验更接近现网的情况?
在进入网络的第一台交换机,我们应该为myTunnel包头做一个目的IP和dst_id的映射。同时设置一个有效位,以便在逆解析器(deparser)处理时可以填充数据包。
在离开网络的最后一台交换机,根据dst_id字段找到了出接口之后,我们还需要移除myTunnel包头。