Lab 5:网络层数据平面观察实验
Last updated
Last updated
前言:计算机网络课程的网络层数据平面的实验主要分为两个部分,第一部分为网络层数据平面IP数据报观察,第二部分为Mininet。
首先,我们回顾一下课堂上所讲的Traceroute:
源主机向目的主机发送一组UDP段,其中第一个集合数据包的TTL =1, 第二个集合数据包的TTL=2, 按照上述规律发送数据包。
第n组中的数据报到达第n跳路由器: 路由器丢弃数据报,向源主机发送ICMP报文(type 11, code 0)。ICMP报文可能包括路由器的名称和IP地址
有以下的停止判则: (1)UDP段最终到达目的主机 (2)目的主机返回ICMP“端口不可达”报文(type 3, code 3) (3)源主机获得这个报文时,停止。
Traceroute有两种具体的实现方式:(1)UDP (2)ICMP
基于UDP的Traceroute实现如下所示:
TTL 递增的UDP段
基于ICMP的Traceroute实现:
TTL 递增的ICMP ECHO Request (Ping)
注意:使用 UDP 的 traceroute,失败还是比较常见的。这常常是由于,在运营商的路由器上,UDP 与 ICMP 的待遇大不相同。为了利于 troubleshooting,ICMP ECHO Request/Reply 是不会被封禁的,而 UDP 则不同。UDP 常被用来做网络攻击,因为 UDP 无需连接,因而没有任何状态约束它,比较方便攻击者伪造源 IP、伪造目的端口发送任意多的 UDP 包,长度自定义。所以运营商为安全考虑,对于 UDP 端口常常采用白名单 ACL,就是只有 ACL 允许的端口才可以通过,没有明确允许的则统统丢弃。比如允许DNS/DHCP/SNMP 等。
实验环境
Linux/MacOS (Traceroute, wireshark) (推荐)
Windows (PingPlotter,wireshark)
执行以下操作,回答下列问题并附必要截图:
用traceroute发送大小为56 bytes的UDP包,比如traceroute fudan.edu.cn 56 ;并使用wireshark抓包
发送端的IP地址?
在IP header中,上层协议的数值是多少?
IP header有多少bytes? IP数据报数据载荷有多少bytes?
该IP数据报是否分片?
IP数据报中哪些字段不断变化,哪些保持不变 ?
为什么有些字段不断变化,为什么有些不变 ?
列出连续IP数据报中的标识序列。
标识字段与TTL字段分别是多少?
收到的所有TTL-exceeded replies中,这两个字段是否不变?为什么?
Mininet是基于Linux Container架构开发的一个进程虚拟化网络模拟器。它可以模拟网络中的各种设备,包括 end-hosts、switches、routers 和 links。其中:(1)各种设备的行为与真实网络中行为一致;(2)用户可以使用SSH登录虚拟host中操作;(3)switch支持OpenFlow。
Mininet具有以下功能:
网络测试平台:为OpenFlow应用程序提供一个简单,便宜的网络测试平台
复杂拓扑测试:启用复杂的拓扑测试,无需连接物理网络
CLI工具:具备拓扑感知和OpenFlow感知的CLI,用于调试或运行网络范围的测试
自定义拓扑:支持任意自定义拓扑,并包括一组基本的参数化拓扑
Python API:提供用户网络创建和实验的可拓展Python API
环境:
1)虚拟机
Windows: VMware Workstation, VirtualBox
Mac: VirtualBox, VMware Fusion 7
2)系统 Ubuntu (建议Ubuntu16.04)
安装:
参考:http://mininet.org/download/
Mininet命令类型
网络构建启动参数:--topo, --custom, --mac等
外部运行参数:-c (清除配置信息), -h等
CLI (Command-Line Interface) 命令:dump, net, iperf等
命令使用方式
CLI外:sudo mn [options]
CLI内:详见help
常用命令操作介绍:
创建拓扑
sudo mn --topo=TOPO linear|minimal|reversed|single|tree[,param=value...]
e.g. sudo mn --topo=single,2
Tips:
如遇到:“Exception: Could not find a default OpenFlow controller”,可尝试如下指令:
创建拓扑(自定义)
安装python的mininet支持:pip install mininet
sudo mn --custom path/python file --topo mytopo
e.g. sudo mn --custom ./topo-2sw-2host.py --topo mytopo
在addHost方法中可定义IP地址、mac地址等
在addLink方法中可定义带宽、时延、丢包率等
from mininet.link import TCLink
--link tc
下面的示例代码是一个简单的自定义拓扑的例子:
CLI命令
查看网络节点: nodes
查看物理拓扑: net
查看节点信息: dump
<host> ping <host> : ping from one host to another
xterm <host> : Open up a terminal of a host; sudo apt-get install xterm
<host> ifconfig : Check the interface configuration of a host
iperf <host> <host> : test the bandwidth between hosts
iperf命令
宽测量与流量生成工具 (建议打开xterm使用)
默认生成TCP
iperf -s (run in server mode)
iperf -c server_ip (run in client mode)
更多详细用法参见 iperf --help
Mininet命令操作-lab with Python
参考:https://github.com/mininet/mininet/wiki/Introduction-to-Mininet
下面是mininet代码仓库中examples文件夹下的一份示例代码,examples文件夹下提供了许多示例python代码供同学们学习:
要求:
(1)定制化上述拓扑,并将脚本文件命名为customized_topo.py,提交文件中需包含该python文件
(2)利用iperf验证端到端带宽,并截图,下面提供了各主机间端到端带宽的参考范围:
H1 – H2: 10Mbps with ~12ms latency
H2 – H4: <<16Mbps with ~22ms latency
H3 – H4: 10Mbps with ~12ms latency
(3)通过sudo mn --custom ./customized_topo.py --topo mytopo --test pingall --link tc指令检验,并截图。描述一下出现的现象,并阐述一下原因。
利用iperf生成TCP流
TCP Flow 1: 由h1按最大速率发向h3,持续时间为T=0sec~20sec
TCP Flow 2: 由h2按最大速率发向h4,持续时间为T=10sec~30sec
要求:
(1) 利用python实现上述功能,并将脚本文件命名为host_iperf.py ,提交文件需包含该python文件。
(2)提交 Flow 1 和 Flow 2 带宽测试截图或文本文件,要求每0.5s测量一次。
(3)请描述一下出现的现象,并尝试解释一下原因。
(4)尝试修改 Switch S1 和 Switch S2 之间链路的丢包率,重复任务二,观察并描述在不同丢包率下出现的现象,尝试利用所学的知识解释一下原因。