实施源路由

实施源路由

目录

实施源路由

介绍

步骤1:运行(不完整的)入门代码

步骤2:实施源路由

步骤3:运行您的解决方案

思考

疑难解答

清理Mininet

翻译P4 tutorials exercises的README文档,摘要转载自https://blog.csdn.net/weixin_42896572/article/details/110545663?spm=1001.2014.3001.5501

1. 实现的功能
       按照发送方主机输入时,自定义的端口顺序进行转发操作,在到达第一个交换机时,根据给定的第一个数字来决定转发方向,以此类推,直至结束。
2. 拓扑结构
       与basic_tunnel相同
3. 具体分析
       添加srcRoutes头部,此头部是一个记录需要转发的端口的堆栈。注意,传输到最后的端口时要把etherType设置为IPV4类型。

介绍

本练习的目的是实现源路由。 通过源路由,源主机引导网络中的每个交换机将数据包发送到特定端口。 主机在数据包中放入一堆输出端口。 在这个例子中,我们只是将堆栈放在以太网头之后,然后选择一个特殊的etherType来表明这一点。 每个交换机从堆栈中弹出一个项目,并根据指定的端口号转发数据包。

您的交换机必须解析源路由堆栈。 每个项目都有一个bos(堆栈底部)位和一个端口号。 仅对于堆栈的最后一个条目,bos位为1。 然后在入口处,它应该从堆栈中弹出一个条目,并相应地设置出口端口。 最后一跳也可能将etherType还原为TYPE_IPV4。

步骤1:运行(不完整的)入门代码

该自述文件所在的目录还包含一个框架P4程序source_routing.p4,该程序最初会丢弃所有数据包。 您的工作(下一步)是将其扩展为正确地路由数据包。

在此之前,让我们编译不完整的source_routing.p4并在Mininet中建立一个网络以测试其行为。

1.在你的shell中,运行:

make

这将:编译source_routing.p4;然后启动一个Mininet实例,其中的三个交换机(s1,s2,s3)配置为三角形,每个交换机连接到一个主机(h1,h2,h3)。 在mininet中使用net命令检查网络拓扑。 您还可以在topology.json中更改拓扑;为主机分配的IP为10.0.1.1、10.0.2.2等(10.0.<Switchid>.<hostID>)。

2.现在,您应该会看到一个Mininet命令提示符。 分别打开h1和h2的两个终端:

mininet> xterm h1 h2

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

./receive.py

4.在h1的xterm中,从客户端发送一条消息:

./send.py 10.0.2.2

5.键入端口号列表, 说2 3 2 2 1。这应该通过h1,s1,s2,s3,s1,s2和h2发送数据包。 但是,h2将不会收到该消息。

6.键入q退出send.py并键入exit离开每个xterm和Mininet命令行。

由于每个交换机都使用source_routing.p4进行了编程,因此未收到该消息,它将在到达时丢弃所有数据包。 您可以通过查看/tmp/p4s.s1.log进行验证。 您的工作是扩展P4代码,以便将数据包传递到其目的地。

步骤2:实施源路由

source_routing.p4文件包含一个框架P4程序,其关键逻辑部分已由TODO注释替换。 这些应该指导您的实现-用实现缺失部分的逻辑替换每个TODO。

完整的source_routing.p4将包含以下组件:

1.以太网(ethernet_t)和IPv4(ipv4_t)和源路由(srcRoute_t)的header头部类型定义。

2.填充ethernet和srcRoutes字段的以太网和源路由解析器。

3.使用mark_to_drop()丢弃数据包的动作。

4.TODO:一个动作(称为srcRoute_nhop),它将:设置下一跳的出口端口;删除srcRoutes的第一项

5.具有apply块的control:检查源路由的存在;TODO:if语句即如果它是最后一跳,则更改etherent.etherType;TODO:调用srcRoute_nhop这一action

6.deparser用于选择将字段插入传出数据包的顺序。

7.带有parser、control和deparser的实例化包(通常,程序包还需要校验和验证和重新计算控件的实例。 这些对于本教程不是必需的,并由空控件的实例化代替。)

步骤3:运行您的解决方案

请按照步骤1中的说明进行操作。这次,您来自h1的消息应该传递到h2。

检查IP标头的ttl。 每一跳减少ttl。 端口序列2 3 2 2 1强制数据包具有循环,因此ttl在h2处应为59。 您能找到最短路径的端口顺序吗?

思考

我们可以更改程序以同时处理IPv4转发和源路由吗?

您将如何增强程序以使第一个交换机添加路径,以使源路由对end-hosts透明?

疑难解答

问题可能通过几种方式表现出来:

1.source_routing.p4无法编译。 在这种情况下,make将报告编译器发出的错误并停止。

2.source_routing.p4可以编译,但是交换机或mininet无法启动。 您是否正在运行另一个mininet实例? 之前的mininet运行是否崩溃了? 如果是,请在下面检查“清理Mininet”。

3.source_routing.p4会编译,但交换机不会以所需的方式处理数据包。/tmp/p4s.<switch-name>.log文件包含描述每个交换机如何处理每个数据包的跟踪消息。 输出是详细的,可以帮助您查明实现中的逻辑错误。 <switch-name>-<interface-name> _ <direction> .pcap文件包含每个接口上发送和接收的所有数据包的pcap捕获。 使用tcpdump -r <filename> -xxx打印数据包的十六进制转储。

清理Mininet

在上述情况下,make可能会使Mininet实例在后台运行。 使用以下命令清除这些实例:

mn -c

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值