2019SDN第7次上机作业

1.作业要求:

作业博客链接:https://edu.cnblogs.com/campus/fzu/fzusdn2019/homework/10165

2.具体操作步骤与截图说明:

  • 本次实验在学校机房完成,操作系统Ubantu。

根据P4教程,将basic和basic_tunnel两个案例程序补充完整,成功运行:

一、补充并运行basic案例程序(basic程序主要是实现基础的交换机转发数据包的功能)

basic.p4补充完整后的代码如下所示:

/* -*- P4_16 -*- */
#include <core.p4>
#include <v1model.p4> const bit<16> TYPE_IPV4 = 0x800; /*************************************************************************
*********************** H E A D E R S ***********************************
*************************************************************************/ typedef bit<9> egressSpec_t;
typedef bit<48> macAddr_t;
typedef bit<32> ip4Addr_t; header ethernet_t {
macAddr_t dstAddr;
macAddr_t srcAddr;
bit<16> etherType;
} header ipv4_t {
bit<4> version;
bit<4> ihl;
bit<8> diffserv;
bit<16> totalLen;
bit<16> identification;
bit<3> flags;
bit<13> fragOffset;
bit<8> ttl;
bit<8> protocol;
bit<16> hdrChecksum;
ip4Addr_t srcAddr;
ip4Addr_t dstAddr;
} struct metadata {
/* empty */
} struct headers {
ethernet_t ethernet;
ipv4_t ipv4;
} /*************************************************************************
*********************** P A R S E R ***********************************
*************************************************************************/ parser MyParser(packet_in packet,
out headers hdr,
inout metadata meta,
inout standard_metadata_t standard_metadata) { state start {
transition parse_ethernet;
} state parse_ethernet {
packet.extract(hdr.ethernet);
transition select(hdr.ethernet.etherType) {
TYPE_IPV4: parse_ipv4;
default: accept;
}
} state parse_ipv4 {
packet.extract(hdr.ipv4);
transition accept;
} } /*************************************************************************
************ C H E C K S U M V E R I F I C A T I O N *************
*************************************************************************/ control MyVerifyChecksum(inout headers hdr, inout metadata meta) {
apply { }
} /*************************************************************************
************** I N G R E S S P R O C E S S I N G *******************
*************************************************************************/ control MyIngress(inout headers hdr,
inout metadata meta,
inout standard_metadata_t standard_metadata) {
action drop() {
mark_to_drop(standard_metadata);
} 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;
} table ipv4_lpm {
key = {
hdr.ipv4.dstAddr: lpm;
}
actions = {
ipv4_forward;
drop;
NoAction;
}
size = 1024;
default_action = drop();
} apply {
if (hdr.ipv4.isValid()) {
ipv4_lpm.apply();
}
}
} /*************************************************************************
**************** E G R E S S P R O C E S S I N G *******************
*************************************************************************/ control MyEgress(inout headers hdr,
inout metadata meta,
inout standard_metadata_t standard_metadata) {
apply { }
} /*************************************************************************
************* C H E C K S U M C O M P U T A T I O N **************
*************************************************************************/ control MyComputeChecksum(inout headers hdr, inout metadata meta) {
apply {
update_checksum(
hdr.ipv4.isValid(),
{ hdr.ipv4.version,
hdr.ipv4.ihl,
hdr.ipv4.diffserv,
hdr.ipv4.totalLen,
hdr.ipv4.identification,
hdr.ipv4.flags,
hdr.ipv4.fragOffset,
hdr.ipv4.ttl,
hdr.ipv4.protocol,
hdr.ipv4.srcAddr,
hdr.ipv4.dstAddr },
hdr.ipv4.hdrChecksum,
HashAlgorithm.csum16);
}
} /*************************************************************************
*********************** D E P A R S E R *******************************
*************************************************************************/ control MyDeparser(packet_out packet, in headers hdr) {
apply {
packet.emit(hdr.ethernet);
packet.emit(hdr.ipv4);
}
} /*************************************************************************
*********************** S W I T C H *******************************
*************************************************************************/ V1Switch(
MyParser(),
MyVerifyChecksum(),
MyIngress(),
MyEgress(),
MyComputeChecksum(),
MyDeparser()
) main;
  • 将代码补充完整后,依次进入tutorials/exercises下的basic文件,输入make run命令运行,运行结果如下所示:

  • 在mininet中用net查看拓扑结构

  • 测试h1 ping h2

  • 测试所有主机之间的连通性:pingall

二、补充并运行basic_tunnel案例程序(basic_tunnel程序主要功能是定义新的头部类型并修改交换机部分的

代码,从而将消息封装进IP数据包并让目标端口使用新的头部类型)

basic_tunnel.p4补充完整后的代码如下所示:

/* -*- P4_16 -*- */
#include <core.p4>
#include <v1model.p4> const bit<16> TYPE_MYTUNNEL = 0x1212;
const bit<16> TYPE_IPV4 = 0x800; /*************************************************************************
*********************** H E A D E R S ***********************************
*************************************************************************/ typedef bit<9> egressSpec_t;
typedef bit<48> macAddr_t;
typedef bit<32> ip4Addr_t; header ethernet_t {
macAddr_t dstAddr;
macAddr_t srcAddr;
bit<16> etherType;
} header myTunnel_t {
bit<16> proto_id;
bit<16> dst_id;
} header ipv4_t {
bit<4> version;
bit<4> ihl;
bit<8> diffserv;
bit<16> totalLen;
bit<16> identification;
bit<3> flags;
bit<13> fragOffset;
bit<8> ttl;
bit<8> protocol;
bit<16> hdrChecksum;
ip4Addr_t srcAddr;
ip4Addr_t dstAddr;
} struct metadata {
/* empty */
} struct headers {
ethernet_t ethernet;
myTunnel_t myTunnel;
ipv4_t ipv4;
} /*************************************************************************
*********************** P A R S E R ***********************************
*************************************************************************/ parser MyParser(packet_in packet,
out headers hdr,
inout metadata meta,
inout standard_metadata_t standard_metadata) { state start {
transition parse_ethernet;
} state parse_ethernet {
packet.extract(hdr.ethernet);
transition select(hdr.ethernet.etherType) {
TYPE_MYTUNNEL: parse_myTunnel;
TYPE_IPV4: parse_ipv4;
default: accept;
}
} state parse_myTunnel {
packet.extract(hdr.myTunnel);
transition select(hdr.myTunnel.proto_id) {
TYPE_IPV4: parse_ipv4;
default: accept;
}
} state parse_ipv4 {
packet.extract(hdr.ipv4);
transition accept;
} } /*************************************************************************
************ C H E C K S U M V E R I F I C A T I O N *************
*************************************************************************/ control MyVerifyChecksum(inout headers hdr, inout metadata meta) {
apply { }
} /*************************************************************************
************** I N G R E S S P R O C E S S I N G *******************
*************************************************************************/ control MyIngress(inout headers hdr,
inout metadata meta,
inout standard_metadata_t standard_metadata) {
action drop() {
mark_to_drop(standard_metadata);
} 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;
} table ipv4_lpm {
key = {
hdr.ipv4.dstAddr: lpm;
}
actions = {
ipv4_forward;
drop;
NoAction;
}
size = 1024;
default_action = drop();
} action myTunnel_forward(egressSpec_t port) {
standard_metadata.egress_spec = port;
} table myTunnel_exact {
key = {
hdr.myTunnel.dst_id: exact;
}
actions = {
myTunnel_forward;
drop;
}
size = 1024;
default_action = drop();
} apply {
if (hdr.ipv4.isValid() && !hdr.myTunnel.isValid()) {
// Process only non-tunneled IPv4 packets
ipv4_lpm.apply();
} if (hdr.myTunnel.isValid()) {
// process tunneled packets
myTunnel_exact.apply();
}
}
} /*************************************************************************
**************** E G R E S S P R O C E S S I N G *******************
*************************************************************************/ control MyEgress(inout headers hdr,
inout metadata meta,
inout standard_metadata_t standard_metadata) {
apply { }
} /*************************************************************************
************* C H E C K S U M C O M P U T A T I O N **************
*************************************************************************/ control MyComputeChecksum(inout headers hdr, inout metadata meta) {
apply {
update_checksum(
hdr.ipv4.isValid(),
{ hdr.ipv4.version,
hdr.ipv4.ihl,
hdr.ipv4.diffserv,
hdr.ipv4.totalLen,
hdr.ipv4.identification,
hdr.ipv4.flags,
hdr.ipv4.fragOffset,
hdr.ipv4.ttl,
hdr.ipv4.protocol,
hdr.ipv4.srcAddr,
hdr.ipv4.dstAddr },
hdr.ipv4.hdrChecksum,
HashAlgorithm.csum16);
}
} /*************************************************************************
*********************** D E P A R S E R *******************************
*************************************************************************/ control MyDeparser(packet_out packet, in headers hdr) {
apply {
packet.emit(hdr.ethernet);
packet.emit(hdr.myTunnel);
packet.emit(hdr.ipv4);
}
} /*************************************************************************
*********************** S W I T C H *******************************
*************************************************************************/ V1Switch(
MyParser(),
MyVerifyChecksum(),
MyIngress(),
MyEgress(),
MyComputeChecksum(),
MyDeparser()
) main;
  • 先使用命令sudo mn -c来消除之前创建的拓扑,以免对后面的实验造成影响,然后再运行basic_tunnel.p4程序

  • 将代码补充完整后,进入tutorials/exercises下的basic_tunnel文件,输入make run命令运行,运行结果如下所示:

  • 在mininet中测试主机间的连通性

  • 在mininet命令提示符界面输入xterm h1 h3,用来模拟两个终端

xterm h1 h3

现在主机h3的xterm界面运行receive.py文件,作为接收端

./receive.py

  • 接着通过主机h1向主机h3发送信息
./send.py 10.0.3.3 "SDN fun"

  • 检查主机h3的xterm界面,可以看到已经接收到了信息,内容包括以太网头部,IP头部,TCP头部以及发送的信息

  • 接着在主机h1的xterm界面更改dst_id,再次发送信息
./send.py 10.0.1.1 "I receive the message!"--dst_id 3

  • 检查主机3的xterm界面,可以看到已经接收到了信息,内容包括以太头部,IP头部,TCP头部以及发送的信息

(5)实验体会:

P4是一门主要用于数据平面的编程语言,主要用于编程程序以下达指令给数据转发平面的设备(如交换机、网卡、防火墙、过滤器等)如何处理数据包,P4试图在从根本上改变我们设计网络系统的方式。通过P4语言,我们可以定义我们想要的数据面。进而再通过南向协议添加流表项。P4凭借其优异的抽象能力以及灵活性,让数据包的解析和转发流程也能通过编程控制,而且P4可以完整描述openflow的功能,为实现SDN的终极目标提供了有力支撑。

2019SDN第7次上机作业的更多相关文章

  1. C++ 第一次上机作业

    今天完成了C++第一次上机作业,感觉比较简单. 题目: 求2个数或3个正整数中的最大数,用带有默认参数的函数实现. 对3个变量按由小到大顺序排序,要求使用变量的引用. 编写一个程序,用同一个函数名对几 ...

  2. SDN第5次上机作业

    SDN第5次上机作业 实验目的 1.搭建如下拓扑并连接控制器 2.下发相关流表和组表实现负载均衡 3.抓包分析验证负载均衡 实验步骤 1.建立以下拓扑,并连接上ODL控制器. 提交要求:ODL拓扑界面 ...

  3. 17秋 SDN课程 第五次上机作业

    17秋 SDN课程 第五次上机作业 Project:https://github.com/Wasdns/new_balance Slide is available at https://github ...

  4. 17秋 SDN课程 第三次上机作业

    SDN 第三次上机作业 1.创建拓扑 2.利用OVS命令下发流表,实现vlan功能 3.利用OVS命令查看流表 s1: s2: 4.验证性测试 5.Wireshark 抓包验证

  5. SDN 第三次上机作业

    SDN 第三次上机作业 1.创建拓扑 2.利用OVS命令下发流表,实现vlan功能 3.利用OVS命令查看流表 s1: s2: 4.验证性测试 5.Wireshark 抓包验证

  6. SDN 第二次上机作业

    SDN第二次上机作业 1.控制器floodlight所示可视化图形拓扑的截图,及主机拓扑连通性检测截图 拓扑 连通性 2.利用字符界面下发流表,使得'h1'和'h2' ping 不通 流表截图 连通性 ...

  7. mininet、floodlight在第一次SDN上机作业中出现的一些问题

    mininet.floodlight在第一次SND上机作业中出现的一些问题 首先给出链接 VMware安装 mininet安装 floodlight安装及问题,各个版本Ubuntu SDN第一次上机作 ...

  8. 2019 SDN第五次上机作业

    2019 SDN第五次上机作业 作业链接 1.浏览RYU官网学习RYU控制器的安装和RYU开发入门教程,提交对于教程代 码的理解,包括但不限于: 安装RYU控制器并测试 安装教程 安装过程及遇到各种问 ...

  9. 2019 SDN第二次上机作业

    2019 SDN第二次上机作业 1. 利用mininet创建如下拓扑,要求拓扑支持OpenFlow 1.3协议,主机名.交换机名以及端口对应正确,请给出拓扑Mininet执行结果,展示端口连接情况 创 ...

随机推荐

  1. JavaScript实现网页回到顶部效果

    在浏览网页时,当我们浏览到网页底部,想要立刻回到网页顶部时,这时候一般网页会提供一个回到顶部的按钮来提升用户体验,以下代码实现了该功能 HTML代码: <p id="back-top& ...

  2. 处理vue-quill-editor回显数据的时候没有空格问题

    这是我要实现的效果 这是我回显后的情况(可以看见空格都没有了) 处理后 处理方法  添加一个class="ql-editor" <quill-editor class=&qu ...

  3. iOS学习——iOS项目增加新的字体

    基本思路 在项目开发过程中,iOS系统自带的字体库可能不适应需求,需要导入其他的字体库.下面是iOS项目增加新的字体的基本思路,基本上分为三步: 将字体库添加到项目中 在info.plist中添加所需 ...

  4. idea2018.3导入grails项目,无法正常使用问题解决

    注:作者的grails版本为2.0.4,grails3版本以上的导入方式为gradle方式 一.导入grails项目 1.启动新项目向导.如果IntelliJ IDEA目前没有打开任何项目,请在欢迎屏 ...

  5. 1M大概多少个字

    <?php echo strlen("你"); 保存文件为gbk 输出2 保存文件为utf-8 输出3 说明不同编码占用字节不同 1M=1024kB 1KB = 1024B ...

  6. Linux DHCP 中继

    具体到一个公司的网络环境中,不可能只有一个VLAN,更不可能对每个VLAN都架设一个DHCP服务器,这时就要做一个DHCP的中继,使得DHCP的广播可以通过VLAN. 实验拓扑 三层交换机下面连接一台 ...

  7. linux内核makefile概览

    linux内核makefile概览 本博客参照内核官方英文文档 linux的内核makefile主要用于编译整个内核源码,按照用户的需求生成各种目标文件,对于用户来说,编译内核时非常简单的,只需要几个 ...

  8. mysql - Centos安装MySQL

    环境:Centos7.3 No.1 切换为root用户,是则略过 su root No.2 下载MySQL的repo源 wget http://repo.mysql.com/mysql-communi ...

  9. *P3694 邦邦的大合唱站队[dp]

    题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶像. 现在要求重新安排队列,使来自同一乐队的偶像连续的站在一起.重新安排的办法是,让若干偶像出列(剩下的偶像不动),然后让出列的 ...

  10. ARTS-week7

    Algorithm 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. Two Sum 编写一个 SQL 查询,满足条件:无论 ...