将UDP数据包标识为不同的连接

时间:2012-12-10 02:14:16

标签: c sockets networking udp ip

对于我下一个受虐狂的业余时间项目,我正在尝试使用UDP隧道实现基本的匿名协议,其他流量可以通过该隧道流动。我想使用UDP,因为它提供了高吞吐量并防止了TCP over TCP可能发生的超时崩溃。

匿名网络中的每个用户都成为一个节点,并成为其他用户隧道的一部分。每个节点必须能够处理多个隧道,从而将传入和传出的数据包识别为属于特定隧道。

确定数据包所属隧道的最佳方法是什么,而无需查看实际的数据包数据(如果可能,只需要标头或连接)?是否有面向连接的UDP版本?

我对UDP的理解是这样的 - 它是无连接的,并且数据包标头只是说明源/目标地址和源是什么。

我可以想出几种方法来利用这些信息:

  1. 欺骗数据包的源端口以保存与IP地址关联的16位连接ID(因此在每台计算机上,连接表是源或目标IP +连接ID的串联。这需要欺骗原始套接字和可能在系统之间的可移植性较差。我不知道构建UDP数据包和在另一端检查它们的开销是多少。
  2. 使用UDP数据包上的源端口获取唯一的连接ID,但端口字段是16位,因此对于全局ID而言并不实际。我希望能够让应用程序能够使用任意端口,并且只需要一个端口。
  3. 使用基于UDP构建的UDT之类的协议 - 它仍然很快(据称UDP的速度的1 / 4-1 / 3),检查可靠性,拥塞控制并具有连接。虽然看起来很复杂,但我会 不想依赖专有(如果是开源)库。最终我需要在此基础上进行流加密,这样才会更加放缓。
  4. 如果增加最小的开销,

    (1)似乎更可取。我真的更喜欢只使用一个单独的任意端口,除了将数据包识别为给定隧道的一部分之外,在UDP之上没有任何额外的东西。

    编辑:减少开销的一种可能性是监听UDP套接字并通过原始套接字发送,但这并不能解决主要问题。

    EDIT2:Skype或其他集中路由的流媒体服务如何运作?他们是否使用自己的协议?

    EDIT3:Re Xaxxon的回答,我计划用一个tun接口将匿名网络暴露给用户空间程序。这将允许我通过system-ssh,ftp等运行我想要的任何流量。我不希望弄乱与这些更高层协议相对应的数据包报头。

1 个答案:

答案 0 :(得分:3)

数据包的来源可用,并且在来自特定计算机时将保持一致。如果您需要更多,请将其他数据包含在第7层标头中。除了查看IP / UDP报头之外,没有额外的开销查看数据包的前几个字节。如果你已经把它带出了内核空间,你已经付出了代价。