- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
PPP 和 tun/tap 有什么区别?两者似乎都用于通过用户空间程序实现网络。
使用 PPP,内核创建 ppp%d 以供使用,并让用户空间程序为其提供后端。
使用 tun/tap,内核会创建 tun%d 以供使用,并让用户空间程序为其提供后端...
将程序从使用 tun/tap(在我的 Android 设备上似乎不可用)更改为 ppp 有多难?
最佳答案
它们都提供某种形式的网络访问,为什么有两种不同的东西似乎在做同样的事情?答案是他们做的事情并不完全相同。
点对点协议(protocol) (ppp
) 旨在通过串行链路提供 IP 网络连接。提供串行链接的最常见的东西是调制解调器,它们存在于手机中,并且在几年前您拨打服务提供商以连接到互联网时无处不在。您的 ppp
连接从您的 PC 连接到接收器,该接收器将串行信号转换回通过 Internet 路由的 IP 数据包。
如今,当您从服务提供商处获得电缆调制解调器或 ADSL 调制解调器时,它会通过以太网或 WiFi 链接提供 IP 网络连接。调制解调器实际上正在执行向您的服务提供商提供连接的工作,这可以被视为与 ppp
连接相同;只是您的计算机不再执行通过 ADSL 线路或电缆连接从 IP 数据包到信号的转换工作。单独的调制解调器提供了一个远离与提供商交谈的复杂性的层,您只是在谈论“简单”的以太网/WiFi。
Tun/Tap 机制是允许您访问标准网络连接之上一层的虚拟专用网络(vpn
);例如,如果您通过以太网连接到您的电缆调制解调器,那么这将通过您的以太网连接提供对 vpn 的访问。如果您通过直接插入电脑的调制解调器访问互联网,那么您将通过 ppp
访问您的 vpn。 tun/tap 接口(interface)本身不提供互联网访问,它依赖于预先存在的连接。这是网络分层的一个例子。
询问将程序从使用 tun/tap 网络连接转换为使用 ppp 连接有多困难会误解这两个接口(interface)在提供网络访问时的位置 - tun/tap 将位于 ppp 之上。未加密的数据包进入 tun/tap 接口(interface),被加密,然后作为 IP 数据包发送到 ppp 接口(interface),该接口(interface)将它们转换为串行信号,然后发送到远程端,将它们变回 IP 数据包并将它们转发到 vpn
目标它解密它们并通过它自己的专用网络路由它们。
如果您删除了 tun/tap 接口(interface),那么您将必须修改 任何希望通过 vpn 进行通信的 应用程序,以便您需要拦截它们的任何网络通信;加密它们;转发他们;接收响应并解密它们。通过使用 tun/tap 层,您可以允许内置 IP 路由将未加密的数据包加密并转发给它们 - 即您不需要修改任何与专用网络通信的应用程序。
计算机科学中的几乎所有问题都可以通过添加一个间接层来解决。通过添加这些层,我们降低了单个组件的复杂性,但可以构建强大的系统。如果我们没有 ppp 接口(interface),每个程序都需要知道如何连接串口,如果我们没有 tun/tap,每个程序都需要知道如何连接 vpn 以及需要知道如何连接串口.
您可以删除 tun/tap 连接的唯一方法是将 ppp 连接建立到私有(private)系统。你将不得不使用类似于 GSM 数据的东西(它是 9600 位/秒,这是一个实际的电话),即使这样你也没有加密,而且你正在通过蜂窝网络,这会打败专用网络的全部意图。
以下是对各种隧道协议(protocol)如何工作的粗略简化,但应该足够详细地解释您应该能够理解为什么不能只是交换另一个。
要了解为什么不同的 vpn 协议(protocol)使用不同的接口(interface)来完成它们的工作,您必须了解它们是如何设计的。 TAP、L2TP 和 PPTP 都是第 2 层协议(protocol)的示例。 TUN 是第 3 层协议(protocol)的一个示例。
为了理解差异,我将使用邮政类比。第 2 层(也称为链路层),相当于一个 express 员。你递给他一封信,他亲自把它交给收件人。 express 员知道他所在地区的所有潜在目的地,任何有关该地区的消息都可以由他处理。
如果我们扩展这个类比,邮箱也可以被视为有效的第 2 层端点。如果您想在全国范围内收到信件,请将它们放入邮箱。这类似于 L2TP、PPTP 和 TAP 包装它们的数据包以通过网络传输。
第 3 层是信件上的地址 - 它可用于将信件从邮局移动到邮局,最终到达 postman 手中。这是包装的数据包通过网络路由的地方。
它返回到第 2 层, postman 知道他的递送区域内的目的地并将信件交给预定的收件人。这是被包装的数据包解包然后由 L2TP、PPTP 或 TAP 端点处理的地方
对于 TUN 来说,要容易一些。您的信件会直接送到您本地的邮局,然后集中送到您收集它们的目的地邮局。可能有一些关于将信件送到邮局或从邮局到目的地地址的细节,但这实际上不是协议(protocol)的一部分。
然后是如何实现它们的尴尬细节。 L2TP 和 PPTP 都是根据 ppp
定义的,这是一种用于在两个端点之间建立直接连接的完善机制,因此为了跨这种系统进行通信,起点和终点都需要说点对点-点协议(protocol)。隧道提供了一个虚拟层,这些 ppp
消息通过该层传输(这个隧道是它们名称中的 T
)。
TAP 接口(interface)是根据以太网数据包的隧道定义的 - 这些是您会看到通过 WiFi 连接快速传输的数据包。它在两个网络之间建立了一个简单的桥梁,这些以太网数据包通过这些网络传递。以太网数据包通常包含 IP 数据包,允许您将它们直接放在目的地的线路上,而无需重新封装它们。
TUN 接口(interface)是根据 IP 数据包的隧道定义的 - 这些数据包在被转换之前可以通过以太网/WiFi 等物理连接传输。这意味着您正在计算机和目标网络之间建立路由虚拟 IP 网络。具有由该接口(interface)提供的路由定义的目的地的 IP 数据包被发送到该接口(interface)。
最终产品是他们系统上的另一个网络接口(interface),IP 数据包可以发送到该接口(interface)。该接口(interface)包装数据包(在用于 PPTP/L2TP 的 ppp 数据包中;用于 TAP 的以太网数据包;用于 TUN 的另一个 IP 数据包)。加密可能在包装之前、包装之后或两个点都涉及(取决于协议(protocol))。理解 L2TP 的程序将精通 PPP
,但如果不进行重大重写,则无法与其他协议(protocol)进行通信。
关于linux -/dev/ppp 和/dev/net/tun 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15845087/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!