Computer Network
  • 实验
    • 计算机网络(H)实验课简介
    • Lab 1:使用Wireshark观察分组
    • Lab 2:应用层协议模拟与观察
    • Lab 3:Socket编程
    • Lab 4:基于UDP的可靠传输
    • Lab 5:网络层数据平面观察实验
    • Lab 6:网络层路由协议模拟与观察
    • Lab 7:网络层控制平面流表下发
    • Lab 8:链路层观察
  • 附录
    • 附录A:Wireshark 教程
    • 常见问题
Powered by GitBook
On this page
  • Lab5 Part 1 : 网络层数据平面IP数据报观察
  • 一、Traceroute 原理
  • 二、实验任务
  • Lab5 Part 2 :Mininet
  • 一、Mininet基本介绍
  • 二、Mininet安装部署
  • 三、Mininet命令操作
  • 四、实验任务
  1. 实验

Lab 5:网络层数据平面观察实验

PreviousLab 4:基于UDP的可靠传输NextLab 6:网络层路由协议模拟与观察

Last updated 6 months ago

前言:计算机网络课程的网络层数据平面的实验主要分为两个部分,第一部分为网络层数据平面IP数据报观察,第二部分为Mininet。

Lab5 Part 1 : 网络层数据平面IP数据报观察

一、Traceroute 原理

首先,我们回顾一下课堂上所讲的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 等。

二、实验任务

实验环境

  1. Linux/MacOS (Traceroute, wireshark) (推荐)

  2. Windows (PingPlotter,wireshark)

执行以下操作,回答下列问题并附必要截图:

用traceroute发送大小为56 bytes的UDP包,比如traceroute fudan.edu.cn 56 ;并使用wireshark抓包

任务1:选择第一个发送的UDP包,观察:

  1. 发送端的IP地址?

  2. 在IP header中,上层协议的数值是多少?

  3. IP header有多少bytes? IP数据报数据载荷有多少bytes?

  4. 该IP数据报是否分片?

任务2:观察连续的UDP包(穿插其他包),观察:

  1. IP数据报中哪些字段不断变化,哪些保持不变 ?

  2. 为什么有些字段不断变化,为什么有些不变 ?

  3. 列出连续IP数据报中的标识序列。

任务3:观察收到的第一个TTL-exceeded replies,观察:

  1. 标识字段与TTL字段分别是多少?

  2. 收到的所有TTL-exceeded replies中,这两个字段是否不变?为什么?

Lab5 Part 2 :Mininet

一、Mininet基本介绍

Mininet是基于Linux Container架构开发的一个进程虚拟化网络模拟器。它可以模拟网络中的各种设备,包括 end-hosts、switches、routers 和 links。其中:(1)各种设备的行为与真实网络中行为一致;(2)用户可以使用SSH登录虚拟host中操作;(3)switch支持OpenFlow。

Mininet具有以下功能:

  1. 网络测试平台:为OpenFlow应用程序提供一个简单,便宜的网络测试平台

  2. 复杂拓扑测试:启用复杂的拓扑测试,无需连接物理网络

  3. CLI工具:具备拓扑感知和OpenFlow感知的CLI,用于调试或运行网络范围的测试

  4. 自定义拓扑:支持任意自定义拓扑,并包括一组基本的参数化拓扑

  5. Python API:提供用户网络创建和实验的可拓展Python API

二、Mininet安装部署

  1. 环境:

1)虚拟机

Windows: VMware Workstation, VirtualBox

Mac: VirtualBox, VMware Fusion 7

2)系统 Ubuntu (建议Ubuntu16.04)

  1. 安装:

sudo apt-get update 
sudo apt-get install mininet 
mn --version

参考:http://mininet.org/download/

三、Mininet命令操作

Mininet命令类型

  1. 网络构建启动参数:--topo, --custom, --mac等

  2. 外部运行参数:-c (清除配置信息), -h等

  3. CLI (Command-Line Interface) 命令:dump, net, iperf等

命令使用方式

  1. CLI外:sudo mn [options]

  2. 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”,可尝试如下指令:

sudo apt-get install openvswitch-testcontroller
sudo ln /usr/bin/ovs-testcontroller /usr/bin/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

下面的示例代码是一个简单的自定义拓扑的例子:

"""Custom topology example

Two directly connected switches plus a host for each switch:

   host --- switch --- switch --- host

Adding the 'topos' dict with a key/value pair to generate our newly defined
topology enables one to pass in '--topo=mytopo' from the command line.
"""

from mininet.topo import Topo

class MyTopo( Topo ):
    "Simple topology example."

    def build( self ):
        "Create custom topo."

        # Add hosts and switches
        leftHost = self.addHost( 'h1' )
        rightHost = self.addHost( 'h2' )
        leftSwitch = self.addSwitch( 's3' )
        rightSwitch = self.addSwitch( 's4' )

        # Add links
        self.addLink( leftHost, leftSwitch )
        self.addLink( leftSwitch, rightSwitch )
        self.addLink( rightSwitch, rightHost )


topos = { 'mytopo': ( lambda: MyTopo() ) }

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

下面是mininet代码仓库中examples文件夹下的一份示例代码,examples文件夹下提供了许多示例python代码供同学们学习:

#!/usr/bin/env python

"""
Simple example of setting network and CPU parameters

NOTE: link params limit BW, add latency, and loss.
There is a high chance that pings WILL fail and that
iperf will hang indefinitely if the TCP handshake fails
to complete.
"""

from sys import argv

from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import CPULimitedHost
from mininet.link import TCLink
from mininet.util import dumpNodeConnections
from mininet.log import setLogLevel, info


# It would be nice if we didn't have to do this:
# pylint: disable=arguments-differ

class SingleSwitchTopo( Topo ):
    "Single switch connected to n hosts."
    def build( self, n=2, lossy=True ):
        switch = self.addSwitch('s1')
        for h in range(n):
            # Each host gets 50%/n of system CPU
            host = self.addHost('h%s' % (h + 1),
                                cpu=.5 / n)
            if lossy:
                # 10 Mbps, 5ms delay, 10% packet loss
                self.addLink(host, switch,
                             bw=10, delay='5ms', loss=10, use_htb=True)
            else:
                # 10 Mbps, 5ms delay, no packet loss
                self.addLink(host, switch,
                             bw=10, delay='5ms', loss=0, use_htb=True)


def perfTest( lossy=True ):
    "Create network and run simple performance test"
    topo = SingleSwitchTopo( n=4, lossy=lossy )
    net = Mininet( topo=topo,
                   host=CPULimitedHost, link=TCLink,
                   autoStaticArp=True )
    net.start()
    info( "Dumping host connections\n" )
    dumpNodeConnections(net.hosts)
    info( "Testing bandwidth between h1 and h4 (lossy=%s)\n" % lossy )
    h1, h4 = net.getNodeByName('h1', 'h4')
    net.iperf( ( h1, h4 ), l4Type='UDP' )
    # Debugging
    h1.cmd('jobs')
    h4.cmd('jobs')
    net.stop()


if __name__ == '__main__':
    setLogLevel( 'info' )
    # Debug for now
    if 'testmode' in argv:
        setLogLevel( 'debug' )
    # Prevent test_simpleperf from failing due to packet loss
    perfTest( lossy=( 'testmode' not in argv ) )

四、实验任务

任务1:定制化拓扑

要求:

(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指令检验,并截图。描述一下出现的现象,并阐述一下原因。

任务2:在虚拟终端上执行任务

利用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 之间链路的丢包率,重复任务二,观察并描述在不同丢包率下出现的现象,尝试利用所学的知识解释一下原因。

参考:

https://github.com/mininet/mininet/wiki/Introduction-to-Mininet
Traceroute 示意图
基于UDP的Traceroute实现
基于ICMP的Traceroute实现
创建拓扑
CLI命令
定制化拓扑
在虚拟终端上执行任务
截图参考