我需要在TCP连接上创建一个虚拟IP网络。主机系统采用Linux,采用TUN/TAP内核驱动程序,很容易接收和重新注入虚拟网络的IP数据包。
困难的部分是将接收到的IP分组传送到另一个主机。由于一些非技术原因,我只能通过TCP协议传输数据包,而不能通过UDP传输.在UDP上传输IP数据包很容易,但是对于TCP来说,它变得很棘手,原因如下:
UDP协议不支持重传/重排序,就像IP一样。因此,如果为每个接收到的虚拟IP数据包发送一个UDP数据包,则内核TCP/IP协议栈仍然会看到虚拟IP数据包丢失/重复/重新排序(这些是TCP/IP正常工作所必需的,如果缺少这些“功能”,则虚拟网络上的TCP连接速度将受到影响)。如果IP数据包是通过TCP传输的,那么所有所需的“功能”都将丢失,除非它们被模拟为某种方式。
似乎我必须在TCP连接上伪造某种数据包复制/丢失/重新排序,或者修补内核TCP/IP协议栈。这两种选择都不容易。
对我的问题还有其他更简单的解决办法吗?还是我走错了方向?我在认真地听呢。
====更新====
我正在考虑使用原始IP套接字(它可以轻松地消除物理网络上所有TCP重传/重新排序的内容,同时仍然使用TCP数据包)来传输接收到的虚拟网络IP数据包。但是在接收主机上,如何只接收我感兴趣的数据包并将所有其他IP数据包返回到内核TCP/IP堆栈?
发布于 2015-01-13 11:14:19
首先,您不希望在TCP上建立VPN,因为最终您将使用tcp之上的tcp。主要问题是您的内部TCP和外部TCP的计时器可能会有很大的不同,这会对TCP会话的可靠性产生负面影响。您可以找到更长的解释这里。
UDP协议不支持重传/重排序,就像IP一样。因此,如果为每个接收到的虚拟IP数据包发送一个UDP数据包,则内核TCP/IP协议栈仍然会看到虚拟IP数据包丢失/重复/重新排序(这些是TCP/IP正常工作所必需的,如果缺少这些“功能”,则虚拟网络上的TCP连接速度将受到影响)。如果IP数据包是通过TCP传输的,那么所有所需的“功能”都将丢失,除非它们被模拟为某种方式。
这是没有意义的,如果您的外层使用TCP作为传输机制,没有什么可以阻止您的内部层仍然使用完整的ip/tcp堆栈,包括这些特性。它们可能会像我说的那样严重冲突,但这并不是说这个功能消失或完全崩溃。
似乎您实际上想要使用tcp只是为了拥有头而忽略实际的协议,这确实可以避免TCP通过tcp带来的问题。然而,这又是一个非常糟糕的想法。防火墙、NAT、DPI、tcp增强器的流处理变得越来越普遍,如果您伪造TCP数据包,您可能会增加这些框的压力,可能会再次分离您自己的连接。
因此,您应该问问自己,为什么不能使用UDP,如果没有其他协议(报头)是可以的,比如GRE或L2TP。
https://stackoverflow.com/questions/27836843
复制相似问题