TAP网络设备

TAP NetDevice可用于主机系统或虚拟机与仿真交互。

TapBridge模型概述

Tap Bridge被设计成将“真正的”互联网主机(或者更准确地说,支持Tun/TAP设备的主机)集成到ns-3仿真中。其目的是使它看起来像一个“真正的”主机节点,因为它有一个ns-3网络设备作为本地设备。“真实主机”的概念有点模糊,因为“真实主机”实际上可以使用现成的技术(如VMware、VirtualBox或OpenVZ)进行虚拟化。

因为我们本质上是将ns-3网络设备的输入和输出连接到Linux TAP网络设备的输入和输出,所以我们称这种安排为Tap Bridge。

该设备有三种基本操作模式可供用户使用。基本功能基本相同,但是关于如何创建和配置配置,以及哪些设备可以位于bridge的哪一侧,模式细节不同。

我们将这三种模式称为ConfigureLocal、UseLocal和UseBridge模式。驼峰大小写模式标识符中的第一个“word”标识谁负责创建和配置TAP。例如,ConfigureLocal模式下的“Configure”表明TapBridge负责配置TAP设备。在UseLocal模式和UseBridge模式中,“use”前缀指示TapBridge被要求“使用”现有配置。

换句话说,在ConfigureLocal模式下,TapBridge负责创建和配置TAP设备。在UseBridge或UseLocal模式中,用户提供配置,TapBridge适应该配置。

TapBridge ConfigureLocal模式

在configurelocal模式下,TAP设备的配置是以NS-3配置为中心的。配置信息获取自ns-3仿真中的设备,并且匹配ns-3属性的TAP设备被自动创建。在这种情况下,Linux计算机看起来就像直接连接到ns-3仿真网络一样。如下所示:

propertydescriptor 驼峰 驼峰是什么设备_tap bridge

在这种情况下,“ghost节点”中的“ns-3网络设备”看起来好像它实际上正在替换Linux主机中的TAP设备。 ns-3仿真在底层Linux 操作系统上创建TAP设备,并配置TAP设备的IP和MAC地址,以匹配分配给ns-3仿真网络中设备的值。上面显示的“IPC”链接是底层操作系统中的网络TAP机制。整个安排作为传统的桥梁,是恰好具有相同共享MAC和IP地址的设备之间的桥梁。

这里,用户不需要提供针对TAP的任何配置信息。 ns-3将根据其默认值创建和配置TAP设备,并且TAP设备将根据其默认值由底层操作系统分配其名称。

如果用户需要访问创建的TAP设备,则他或她可以选择性地提供“DeviceName”属性。在这种情况下,创建的操作系统 TAP设备将相应地被命名。

ConfigureLocal模式是Tap Bridge的默认操作模式。

TapBridge UseLocal模式

UseLocal模式与ConfigureLocal模式非常相似。正如模式名称所暗示的那样,显着的区别在于TapBridge将“使用”先前由用户创建和配置的现有TAP设备。 当虚拟化方案自动创建TAP设备并且ns-3用于为这些设备提供模拟网络时,此模式特别有用。

propertydescriptor 驼峰 驼峰是什么设备_网络设备_02

在这种情况下,“TAP设备”(MAC X)的预配置MAC地址将与上图中所示的bridge接“ns-3网络设备”(MAC Y)的MAC地址不同。为了bridge接不支持SendFrom()的ns-3网络设备(特别是无线STA节点),我们强制要求只有一个Linux设备(具有一个唯一的MAC地址--这里是X)产生流经IPC链路的流量。这是因为通过IPC链路的流量的MAC地址将被“欺骗”或更改为使Linux和ns-3看起来具有相同的地址。也就是说,从Linux主机移动到ns-3 ghost节点的流量将其MAC地址从X更改为Y,从ghost节点到Linux主机的流量将其MAC地址从Y更改为X。由于设备之间存在一一对应的关系,可能只有一个MAC源从Linux端流出。这意味着添加了多个网络设备的Linux网桥与UseLocal模式不兼容。

在UseLocal模式下,用户需要创建和配置完全超出ns-3仿真范围的TAP设备,如下所示:

propertydescriptor 驼峰 驼峰是什么设备_网络设备_03

要告诉TapBridge发生了什么,用户将直接设置TapBridge或通过TapBridgeHelper设置“DeviceName”属性。 在上述配置的情况下,“DeviceName”属性将设置为“tap0”,“Mode”属性将设置为“UseLocal”。

此模式的一个特定用例是在OpenVZ环境中。 可以在“硬件节点”上创建TAP设备并将其移动到虚拟专用服务器中。 如果TapBridge能够使用现有的TAP设备,则可以避免该环境中操作系统bridge的开销。

TapBridge UseBridge模式

对于熟悉Linux网络的人来说,最简单的模式是UseBridge模式。 同样,“use”前缀表示TapBridge将使用现有配置。 在这种情况下,TapBridge在逻辑上将Linux bridge扩展进ns-3。

如下图所示:

propertydescriptor 驼峰 驼峰是什么设备_桥接_04

在这种情况下,运行Linux应用程序、协议等的计算机连接到ns-3模拟网络,以便从Linux主机看来,TAP设备是参与Linux bridge的真实网络设备。

在ns-3仿真中, TapBridge被创建以匹配每个TAP设备。使用“DeviceName”属性将TAP设备的名称分配给Tap Bridge。然后TapBridge在逻辑上扩展操作系统bridge,以包含ns-3网络设备。

由于此模式在逻辑上扩展了操作系统bridge,因此在bridge的非ns-3侧可能存在许多Linux网络设备。因此,与任何网桥上的网络设备一样,ns-3网络设备必须处理可能出现的许多源地址。因此,ns-3设备必须支持SendFrom()(NetDevice :: SupportsSendFrom()必须返回true)才能在UseBridge模式下使用。

预计用户将完全在ns-3之外执行以下操作来配置bridge和TAP:

propertydescriptor 驼峰 驼峰是什么设备_tap bridge_05

要告诉TapBridge发生了什么,用户将直接设置TapBridge或通过TapBridgeHelper设置“DeviceName”属性。 在上述配置的情况下,“DeviceName”属性将设置为“mytap”,“Mode”属性将设置为“UseBridge”。

此模式在虚拟化的情况下特别有用,其中虚拟主机的配置可能由另一个系统规定,并且不能更改以适合ns-3。 例如,特定VM方案可以创建出对于虚拟主机来说就像本地的虚拟“vethx”或“vmnetx”设备。 为了连接到这样的系统,需要在主机系统上手动创建TAP设备并将这些TAP设备桥接到现有的(VM)虚拟设备。 在这种情况下,Tap Bridge的工作是扩展bridge以加入ns-3网络设备。

TapBridge ConfigureLocal操作

在ConfigureLocal模式下,TapBridge及其关联的ns-3网络设备在Linux主机上显示为网络设备,就像任何“eth0”或“ath0”可能出现一样。 TAP设备的创建和配置由ns-3仿真完成,用户无需手动配置。创建的TAP设备的IP地址,MAC地址,网关等通过查询ns-3设备的配置和TapBridge属性从仿真本身中提取。

由于Linux端和ns-3端的MAC地址相同,我们可以在ns-3设备上使用Send()函数,该函数可在所有ns-3网络设备上使用。由于MAC地址相同,因此不需要在接收端设置混杂回调。因此,对ConfigureLocal模式中可用的网络设备的种类没有限制。

TapBridge在ns-3仿真中显示为无通道网络设备。此设备不得具有与之关联的IP地址,但桥接的(ns-3)网络设备必须具有IP地址。请注意,这与ns-3 BridgeNetDevice(或一般的传统网桥)相反,后者要求其网桥端口不具有IP地址,但允许网桥设备本身具有IP地址。

主机将在仿真中显示为“ghost”节点,其中包含一个用于桥接每个NetDevice的TapBridge。从仿真的角度来看,ghost节点和任何其他节点之间的唯一区别将是TapBridge设备的存在。但请注意,TapBridge的存在确实会影响网络设备与ghost节点的IP堆栈的连接。

如果存在TapBridge,ns-3设备和地址信息的配置将不会以任何方式被更改。 TapBridge将从与其连接的ns-3网络设备(其“桥接”的网络设备)中获取地址信息,并使用该信息在真实主机上创建和配置TAP设备。

最终结果是,例如,可以使用真实主机上的标准ping应用程序来ping ns-3仿真中的节点。如果将正确的路由添加到Internet主机(预计将在未来的ns-3版本中自动完成),ns-3中的路由系统将支持在ns-3仿真网络上正确转发数据包。有关此示例,请参阅ns-3发行版中的示例程序TAP-wifi-dumbbell.cc。

Tap Bridge位于Linux主机和ns-3 bridge设备之间的某种灰色世界中。从Linux的角度来看,此代码显示为TAP网络设备的用户模式处理程序。在ConfigureLocal模式下,此TAP设备由ns-3仿真自动创建。当Linux主机写入其中一个自动创建的/dev/tap设备时,写入被重定向到存在于ns-3世界中的TapBridge;从这个角度来看,Linux上数据包的写入成为Tap Bridge中的数据包读取。换句话说,Linux进程将数据包写入TAP设备,并且该数据包被网络TAP机制重定向到ns-3进程,在ns-3中,数据包被TapBridge进行读操作进行接收。然后TapBridge将数据包写入与其桥接的ns-3网络设备;因此,似乎Linux主机直接通过ns-3网络设备将数据包发送到ns-3网络。

在另一个方向上,连接到Tap Bridge的ns-3网络设备接收到数据包,会通过接收callback函数将数据包发送到TapBridge。然后TapBridge接收该数据包并使用网络TAP机制将其写回主机。对设备的写入将在Linux主机上显示,就像数据包已到达网络设备一样;因此,仿真过程中ns-3网络设备接收到的数据包好像出现在真正的Linux网络设备上。

结果是Tap Bridge似乎将“现实世界”中Linux主机上的TAP设备桥接到ns-3仿真中的网络设备。由于TAP设备和桥接的ns-3网络设备具有相同的MAC地址,并且网络TAP IPC链路未外部化,因此在这种特殊类型的网桥的作用下,看起来似乎在Linux主机中安装了ns-3网络设备。

为了在ns-3一侧实现这一点,我们需要在仿真中使用“ghost节点”来保存桥接的ns-3网络设备和TapBridge。此节点实际上不应该在仿真中执行任何其他操作,因为它的工作只是使网络设备出现在Linux中。这不仅仅是任意政策,而是因为:

• 在幽灵节点中,从较高层发送到TapBridge的位会被完全忽略(使用TapBridge发送方法)。 TapBridge本身并不连接到任何网络,无论是在Linux还是在ns-3中。您永远不能从ghost节点通过TapBridge发送或接收数据。

• 桥接的ns-3网络设备使其接收回调从ns-3节点断开并重新连接到Tap Bridge。然后,桥接设备接收的所有数据将被发送到Linux主机,而该节点却不会接收该数据。从ghost节点的角度来看,您可以通过此设备发送,但您无法接收。

当然,如果您了解所有问题,您可以控制自己的命运并做任何您想做的事情--我们不会主动阻止您使用ghost节点做任何您决定的事情。如果您愿意,您将能够在ghost节点上执行典型的ns-3操作。例如,internet堆栈必须在那个节点上并且在该节点上起作用为了参与IP地址分配和全局路由。但是,如上所述,与任何TapBridge或相关桥接网络设备通信的接口将无法完全正常工作。如果您完全了解自己在做什么,可以在ghost节点上设置其他接口和设备并使用它们;或利用桥接设备的操作发送端来创建流量生成器。我们通常建议您将此节点视为Linux主机的幽灵,并将其留给自己。

TapBridge UseLocal模式操作

如上所述,TapBridge就像是从“真实”世界到ns-3仿真世界的桥梁。在ConfigureLocal模式的情况下,由于TAP设备的IP地址与ns-3设备的IP地址匹配,并且TAP设备的MAC地址与ns-3设备的MAC地址匹配,因此事情很容易;并且设备之间存在一对一的关系。

当TAP设备在外部配置与ns-3网络设备不同的MAC地址时,情况会稍微复杂一些。处理这种差异的传统方法是在桥接设备中使用混杂模式来接收发往不同MAC地址的数据包并将它们转发到Linux。为了以另一种方式转发数据包,传统的解决方案是SendFrom()函数,它允许调用者“欺骗”或更改源MAC地址以匹配不同的Linux MAC地址。

我们确实有一个特定的要求,即能够将Linux虚拟机桥接到无线STA节点上。不幸的是,802.11规范没有提供实现SendFrom()的好方法,所以我们必须解决这个问题。

为此,我们提供了Tap Bridge的UseLocal模式。此模式允许您如同创建一个桥接单个设备的网桥一样解决问题。在TapBridge中记住Linux端的一个允许地址,并且使用ns-3设备MAC源地址将来自Linux端的所有数据包从ns-3侧重复传出。所有从ns-3端传入的数据包都使用记忆的MAC地址在Linux端重复传出。这允许我们在ns-3设备端使用Send()函数,这函数在所有ns-3网络设备上都可用。

除了TAP设备的创建和配置以及MAC地址欺骗之外,UseLocal模式与ConfigureLocal模式相同。

TapBridge UseBridge操作

如ConfigureLocal模式部分所述,当Linux主机写入其中一个/dev/tap设备时,写入的数据包将重定向到存在于ns-3世界中的TapBridge。 在UseBridge模式的情况下,这些数据包需要在ns-3网络上发送,就好像它们是在参与Linux网桥的设备上发送的一样。 这意味着在桥接设备上调用SendFrom()方法并提供在数据包中找到的源MAC地址。

在另一个方向上,由ns-3网络设备接收的数据包通过回调挂钩到TapBridge。 这必须以混杂模式完成,因为目标是将ns-3网络设备桥接到TAP设备所属的操作系统(brctl)网桥上。

由于这些原因,只允许支持SendFrom()并具有可挂钩的混杂接收回调的ns-3网络设备参与UseBridge模式的TapBridge配置。

Tap Bridge通道模型

没有与Tap Bridge相关联的通道模型。 实际上,目的是使真实的互联网主机看起来连接到桥接网络设备的通道。

Tap Bridge追踪模型

与大多数ns-3设备不同,TapBridge不提供任何标准跟踪源。 这是因为bridge是一个中介,它实质上是远离桥接设备的一个函数调用。我们希望桥接设备中的跟踪挂钩足以满足大多数用户的需求,

使用TapBridge

我们希望大多数用户都可以通过TapBridgeHelper与TapBridge设备进行互动。其他帮助类的用户,例如CSMA或Wifi,应该对那里使用的习语感到满意。

翻译自官网:https://www.nsnam.org/docs/models/html/tap.html#tapbridge-configurelocal-operation

切记:对于资源很少的知识还是要第一时间找官网!!