我很难理解 tap 和 tun 接口之间的区别。我知道这是一个经常被问到的问题,对此我深表歉意。我在 stackoverflow 上问了同样的问题,有人告诉我试试这个论坛,所以我希望我处于一个好的位置。此外,我只是对网络感到好奇,但我不是网络学生或专业人士,所以如果我的问题对你来说太简单,请原谅我。
我读到tap在第2层工作,tun在第3层工作。我还读到tap用于桥接,tun用于路由。我已经听说过诸如“路由器在第 3 层工作”或“桥在第 2 层工作”之类的说法:这对我来说很有意义,因为路由器操纵第 3 层协议而网桥操纵第 2 层协议?但是,因为 tap 和 tun 是“接口”,这意味着像“接口在第 3 层工作”这样的句子有一定的意义,但我不明白它是什么:我的意思是接口不操纵协议(操作系统会这样做,但是不是接口)所以听起来像 tun 接口 == tap 接口:
如果我使用位于不同网络(192.168.2.1/24 和 192.168.3.1/24)上的两个 IP 创建两个分接接口(使用 tunctl),那么我将它们链接到两个 kvm 虚拟机(一个分接接口与一台虚拟机匹配)如果我在主机上启用路由,我的两个虚拟机就可以通信。
所以tap接口也可以用于路由:与tun有什么区别?也许 Tap 也是 tun 接口?
我也可以使用 tunctl 命令创建一个 tap 接口,但是如何使用相同的命令创建一个 tun 接口(该命令称为 TUNctl 而不是 TAPctl...)?
而且有人告诉我:
TUN 设备是虚拟以太网适配器,而 TAP 设备是虚拟点对点 IP 链路(如果这些没有意义,请询问您的搜索引擎点对点 ip 链路和虚拟 IP 链路之间有什么区别)以太网)
所以我研究了点对点 ip 链路和以太网链路,我还有其他问题:
什么是“点对点 IP 链接”?根据我的说法,点对点链接是指当我们有一个由多台机器组成的网络时,两台机器之间进行通信的事实,而其他机器不知道这一点。所以我猜“点对点 ip 链接”是一种特殊情况,可以称为“第 3 层点对点链接”,这意味着点对点连接由第 3 层确保,对吗?
如果我有几台PC通过以太网连接到交换机,则所有链接都可以被视为“点对点ip链接”。维基以太网页面也说了类似的话(“(...)它是为点对点链接而设计的”)。这里同样的事情:http://ethernetdirect.com/support_faqs.asp“以太网是一种点对点网络方案”那么“点对点ip链路”和以太网链路有什么区别呢?
你能帮我澄清一下吗?
答案1
这基本的 不同之处TUN
和之间TAP
是OSI层它们发挥作用的地方(这确实不是包括每种类型设备所需的编程):
轻敲(OSI 第 2 层) - 名称
TAP
是to TAP into
您与材料进行物理连接的位置(不仅仅是以太网电缆,您可以TAP
进入一桶啤酒例如)
TAP 充当计算机所连接的以太网电缆的物理延伸。这意味着它可以通过frame
该线上存在的任何内容。例如 IPv4/6、Netware IPX 和 Appletalk 等。TUN(OSI 第 3 层) -
TUN
来自函数的名称作为 a和 的TUNnel
终点TUNnel
仅有的通过可路由的IPv4packets
(以及支持的 IPv6)。它还需要正确设置路由,以便packets
可以正确路由到下一跳。
开放VPN提供这信息。
此外,有人告诉我:
TUN设备是虚拟以太网适配器,而TAP设备是虚拟点对点IP链路
正如您现在所看到的,这就是错误的绕路..
答案2
一个系统可以有多个不同类型的网络适配器。
TAP 接口代表虚拟以太网适配器。通过虚拟适配器的数据包将采用带有源和目标 MAC 地址的以太网帧的形式(尽管我认为它们可能会省略帧检查序列,但不确定)。就像真正的以太网适配器一样,内核将使用 ARP/ND 将“下一跳 IP 地址”转换为 MAC 地址,并对传入数据包执行 MAC 过滤。就像真正的以太网适配器一样,Tap 接口可以(如果需要)作为以太网桥的一部分包含在内。
TUN 接口代表虚拟“原始”适配器。通过虚拟适配器的数据包是来自第 3 层协议的原始数据包,带有一个可选标头来指示数据包类型和标志。内核不会尝试将下一跳 IP 地址转换为任何形式的较低级别地址。
答案3
我知道自从提出这个问题以来已经很长时间了,其他答案已经提供了有关两者之间差异的技术信息TAP
,TUN
因此我不会费心重复所说的内容。
我想从以下角度回答这个问题“语言混乱”。
读完这个问题,我觉得你的困惑和沮丧很大一部分来自于他/她阅读的材料中单词的令人困惑和冲突的用法/含义。我认为关键问题是:根据上下文,单词/术语可以用来表示不同的事物。如果文档的作者想要将观点传达给他/她的读者,那么作者必须能够让读者看到上下文。然而,这也部分取决于读者是否有足够或正确的知识来清楚地看到上下文。
当作者和读者不知何故不在同一语境中时,就会发生混乱。
责怪任何一方都不好,但我个人认为更应该责怪作者,因为他们要向读者传达一个观点,所以他们自然承担了说清楚的负担。
回到你的问题。
为了澄清您的困惑,如下:
这对我来说很有意义,因为路由器操纵第 3 层协议而网桥操纵第 2 层协议?但是,因为 tap 和 tun 是“接口”,这意味着像“接口在第 3 层工作”这样的句子有一定的意义,但我不明白它是什么:我的意思是接口不操纵协议(操作系统会这样做,但是不是接口)所以听起来像 tun 接口 == tap 接口:
你要知道,“接口”这个词在这里实际上是指两个对象。
想想物理网桥或路由器:它是一个带有端口的盒子。这些端口是您插入电缆的地方。对第 2 层或第 -3 层协议的操作不会发生在这些端口上,而是由运行在那里的软件在盒子内部进行。因此,如果有人说“网桥/路由器上的端口在第 2/3 层工作”听起来很奇怪,因为是盒子在第 2/3 层工作,而不是端口本身。
然而,如果我们在更大的背景下看待网桥或路由器,即在它们后面的整个网络的背景下,可以说网桥或路由器是网络之间的“接口”。在这里,我们不再将网桥/路由器视为一个“盒子”,而是一个连接到后面更大系统的“点”。是的,网桥或路由器确实是一个带有端口的盒子,但在这个更大的背景下,我们不太关心这个盒子的细节。我们将这个盒子视为一个整体。因此,在本文中,“接口”一词不仅仅指盒子上的端口;还指代盒子上的端口。它包括能够操作第 2/3 层协议的盒子。
那么,回到关于tap
和 的问题tun
。我认为:
- A
tap
或 atun
是一个接口(在端口的意义上),因为它不操作协议。 - 当我们查看更大的上下文时,我们将
tap
/tun
接口及其后面的程序/操作系统/虚拟机作为一个整体来查看,我们可以说这是其他系统与之通信的“接口”。 “界面”这个词的含义在这里略有变化,如果你没有注意到这一点,或者作者没有让你注意到它,就会发生混乱。