- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要通过 TCP 连接创建一个虚拟 IP 网络。宿主系统是Linux,有TUN/TAP内核驱动,很容易接收和重新注入(inject)虚拟网络的IP数据包。
困难的部分是将接收到的IP数据包传输到另一台主机。由于一些非技术原因,我只能通过 TCP 协议(protocol)传输数据包,而不能通过 UDP 协议(protocol)传输数据包。通过 UDP 传输 IP 数据包很容易,但使用 TCP 就变得棘手了,原因如下:
UDP协议(protocol)不支持重传/重新排序,就像IP一样。因此,如果为每个接收到的虚拟 IP 数据包发送一个 UDP 数据包,内核 TCP/IP 协议(protocol)栈仍然会看到虚拟 IP 数据包丢失/重复/重新排序(如果这些“功能”,TCP/IP 正常工作所必需的)丢失,虚拟网络上的 TCP 连接速度将受到影响)。如果 IP 数据包通过 TCP 传输,则所有必需的“功能”都将丢失,除非以某种方式对其进行模拟。
看来我必须在 TCP 连接上伪造某种数据包重复/丢失/重新排序,或者修补内核 TCP/IP 协议(protocol)栈。这两种选择都不容易。
对于我的问题还有其他更简单的解决方案吗?还是我只是走错了方向?我洗耳恭听。
====更新====
我正在考虑使用原始 IP 套接字(它可以轻松摆脱物理网络上的所有 TCP 重传/重新排序,同时仍然使用 TCP 数据包)来传输接收到的虚拟网络 IP 数据包。但是在接收主机上,我如何才能只接收我感兴趣的数据包并将所有其他 IP 数据包返回给内核 TCP/IP 堆栈?
最佳答案
首先,您不想通过 TCP 创建 VPN,因为您最终会使用 tcp-over-tcp。主要问题是您的内部 TCP 和外部 TCP 的计时器可能有很大差异,这会对您的 TCP session 可靠性产生负面影响。你可以找到更长一点的解释 here .
UDP protocol doesn't support retransmission/reordering, just like IP. So, if one UDP packet is sent for every received virtual IP packet, the kernel TCP/IP protocol stack would still see virtual IP packet loss/duplication/reordering(those are required for TCP/IP to work well, if those "features" are missing, the TCP connection speed on the virtual network would suffer). If IP packets are transmitted over TCP all required "features" will be missing, unless they are simulated some how.
这是没有意义的,如果你的外层使用 TCP 作为传输机制,没有什么能阻止你的内层仍然使用完整的 ip/tcp 堆栈,包括那些功能。它们可能会像我说的那样严重冲突,但这并不是说此功能完全消失或中断。
看起来您实际上只想使用 TCP 来获得 header 并忽略实际协议(protocol),这确实可以避免 tcp over tcp 的问题。然而,这又是一个非常糟糕的主意。防火墙、NAT、DPI、tcp 助推器的流处理变得越来越普遍,如果您伪造 TCP 数据包,您可能会对这些框施加压力,可能会再次破坏您自己的连接。
所以你应该问问自己为什么你不能使用 UDP,如果没有替代协议(protocol)( header )是好的,比如 GRE 或 L2TP。
关于linux - 通过 TCP 连接创建 VPN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27836843/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
Linux 管道可以缓冲多少数据?这是可配置的吗? 如果管道的两端在同一个进程中,但线程不同,这会有什么不同吗? 请注意:这个“同一个进程,两个线程”的问题是理论上的边栏,真正的问题是关于缓冲的。 最
我找到了here [最后一页] 一种有趣的通过 Linux 启动 Linux 的方法。不幸的是,它只是被提及,我在网上找不到任何有用的链接。那么有人听说过一种避免引导加载程序而使用 Linux 的方法
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我试图了解 ld-linux.so 如何在 Linux 上解析对版本化符号的引用。我有以下文件: 测试.c: void f(); int main() { f(); } a.c 和 b.c:
与 RetroPie 的工作原理类似,我可以使用 Linux 应用程序作为我的桌面环境吗?我实际上并不需要像实际桌面和安装应用程序这样的东西。我只需要一种干净简单的方法来在 RaspberryPi 上
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
有什么方法可以覆盖现有的源代码,我应该用 PyQt、PyGTK、Java 等从头开始构建吗? 最佳答案 如果您指的是软件本身而不是它所连接的存储库,那么自定义应用程序的方法就是 fork 项目。据我所
我的情况是:我在一个磁盘上安装了两个 linux。我将第一个安装在/dev/sda1 中,然后在/dev/sda2 中安装第二个然后我运行第一个系统,我写了一个脚本来在第一个系统运行时更新它。
我在 i2c-0 总线上使用地址为 0x3f 的系统监视器设备。该设备在设备树中配置有 pmbus 驱动程序。 问题是,加载 linux 内核时,这个“Sysmon”设备没有供电。因此,当我在总线 0
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我正试图在 linux 模块中分配一大块内存,而 kalloc 做不到。 我知道唯一的方法是使用 alloc_bootmem(unsigned long size) 但我只能从 linux 内核而不是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我有 .sh 文件来运行应用程序。在该文件中,我想动态设置服务器名称,而不是每次都配置。 我尝试了以下方法,它在 CentOS 中运行良好。 nohup /voip/java/jdk1.8.0_71/
我是在 Linux 上开发嵌入式 C++ 程序的新手。我有我的 Debian 操作系统,我在其中开发和编译了我的 C++ 项目(一个简单的控制台进程)。 我想将我的应用程序放到另一个 Debian 操
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我使用4.19.78版本的稳定内核,我想找到带有企鹅二进制数据的C数组。系统启动时显示。我需要在哪里搜索该内容? 我在 include/linux/linux_logo.h 文件中只找到了一些 Log
我知道可以使用 gdb 的服务器模式远程调试代码,我知道可以调试针对另一种架构交叉编译的代码,但是是否可以更进一步,从远程调试 Linux 应用程序OS X 使用 gdbserver? 最佳答案 当然
是否有任何可能的方法来运行在另一个 Linux 上编译的二进制文件?我知道当然最简单的是在另一台机器上重建它,但假设我们唯一能得到的是一个二进制文件,那么这可能与否? (我知道这可能并不容易,但我只是
我是一名优秀的程序员,十分优秀!