负载均衡
在本练习中,您将基于简单版本的Equal-Cost Multipath Forwarding实现一种负载平衡形式。您将实现的交换机将使用两个表随机将数据包转发到两个目标主机之一。第一个表将使用散列函数(应用于由源和目标IP地址,IP协议以及源和目标TCP端口组成的5元组)来选择两个主机之一。第二个表将使用计算的哈希值将数据包转发到选定的主机。
Spoiler alert:solution 子目录中有一个参考解决方案。随意将您的实现与参考进行比较。
第1步:运行(不完整的)入门代码
具有此README的目录还包含骨架P4程序load_balance.p4,该程序 最初会丢弃所有数据包。您的工作(在下一步中)将扩展它以正确转发数据包。
在此之前,让我们编译不完整的load_balance.p4并在Mininet中调出一个开关来测试它的行为。
在你的shell中,运行:
make
这会:
编译load_balance.p4,和
启动一个Mininet实例与三个开关(s1,s2,s3)以三角形构造中,每个连接到一个主机(h1,h2,h3)。
该主机被分配的IP地址10.0.1.1,10.0.2.2等等。
我们使用IP地址10.0.0.1来指示应在h2和之间进行负载平衡的流量h3。
您现在应该看到Mininet命令提示符。开三个端子h1,h2并h3分别:
mininet > xterm h1 h2 h3
每个主机都包含一个基于Python的小型消息传递客户端和服务器 在h2和h3XTerms中,启动服务器:
./receive.py
在h1XTerm中,从客户端发送消息:
./send.py 10.0.0.1 “ P4 is cool!”
将不会收到该消息。
键入exit以离开每个XTerm和Mininet命令行。
由于每个交换机load_balance.p4都已编程,因此未收到消息 ,这会在到达时丢弃所有数据包。你的工作是扩展这个文件。
关于控制平面的说明
P4程序定义了数据包处理流水线,但是控制平面将管理数据包处理的规则插入到流水线中。当规则与数据包匹配时,将使用控制平面提供的参数作为规则的一部分来调用其操作。
在本练习中,控制平面逻辑已经实现。作为启动Mininet实例的一部分,该make 脚本将在每个交换机的表中安装数据包处理规则。这些是在sX-runtime.json文件中定义的。
第2步:实施负载平衡
该load_balance.p4文件包含一个骨架P4程序,其中关键的逻辑部分被TODO注释替换。这些应该指导您的实现 - 用TODO实现缺失部分的逻辑替换每个实现。
完整load_balance.p4包含以下组件:
以太网(ethernet_t)和IPv4(ipv4_t)的标头类型定义。
以太网和IPv4的解析器,用于填充ethernet_t和填充ipv4_t字段。
使用丢弃数据包的操作mark_to_drop()。
TODO:一个动作(称为set_ecmp_select),它将:
使用hashextern对上面指定的5元组进行哈希处理
将结果存储在meta.ecmp_select字段中
TODO:一个控件:
应用ecmp_group表格。
应用ecmp_nhop表格。
一个deparser,用于选择字段插入到传出数据包中的顺序。
package解析器,控件和解析器提供的实例化。
通常,包还需要校验和验证和重新计算控制的实例。这些不是本教程所必需的,而是替换为空控件的实例化。
第3步:运行您的解决方案
按照步骤1中的说明进行操作。这次,您的消息 h1应该发送到h2或h3。如果发送多条消息,则每台服务器都应收到一些消息。
这里可以由h1多次发送消息,h2或h3会收到相应的消息。只进行一次看不出这种效果。
故障排除
有几种方法可能会出现问题:
load_balance.p4无法编译。在这种情况下,make将报告编译器发出的错误并停止。
load_balance.p4编译但不支持尝试使用Python控制器安装的sX-runtime.json文件中的控制平面规则make。在这种情况下,make将记录控制器输出在logs目录中。使用错误消息来修复您的load_balance.p4实现。
load_balance.p4编译,并安装控制平面规则,但交换机不会以所需的方式处理数据包。这些/tmp/p4s..log文件包含跟踪消息,描述每个交换机如何处理每个数据 输出详细,可以帮助查明实现中的逻辑错误。