绕过NAT并通过C ++打开端口以实现低延迟

时间:2012-07-08 16:07:58

标签: c++ networking tcp udp

我的目的是:

  • 没有要求用户在路由器上打开端口
  • 使用我的应用程序通过代码执行所有操作

可以这样做吗?考虑到这个应用程序只适用于安装了相同应用程序的其他机器,我可以从头开始编写某种协议吗?

我的一般想法是尽可能快地建立连接,我还必须交换小数据包,降低延迟对我来说比拥有高吞吐量更重要。

2 个答案:

答案 0 :(得分:5)

不要乱用NAT。无论如何,这对延迟无济于事。您正在使用TCP / IP,这是一种相当高级别的协议,而且速度相对较慢。也就是说 - 该协议为您做了很多伟大的工作 - 但是在延迟方面付出了代价。 (它保持连接状态,并保持数据包的顺序,并做好保证数据包传送等工作。)

如果您想要一个非常低延迟的网络通道使用UDP - 这是较低级别,并且几乎不会像TCP那样工作。 UDP只是尽力将每个数据包传送到目的地而不保持连接打开,数据包不一定按顺序到达,并且知道数据包是否到达目的地。

你需要自己构建这些东西 - 或者学会没有它们。

基于UDP构建的应用程序往往会重复大量信息,并且实现具有很大错误空间的协议逻辑。结果通常是较低的延迟 - 但成本通常是可靠性或传输速率。

此外 - 如果您需要低延迟,请不要通过其他协议进行隧道传输,例如通过SSH或其他方式进行隧道传输。这只会增加延迟。

答案 1 :(得分:0)

此答案适用于您不要求客户调整其网络上的任何设置的要求。如果您可以让客户为您更改网络上的内容,那么您应该按照Rafael的建议实施自己的自定义应用程序。

如果需要加密,可以通过端口44或HTTPS(基于SSL / TLS的HTTP)协议使用HTTP协议。或者通过端口22使用SSH。

这些只是通常由防火墙打开的端口,因此您可能会通过。无法保证它们会开放。

在使用HTTP或HTTPS时使用HTTP协议的原因是防火墙可能正在进行深度数据包检查,如果连接不符合预期,它可能会黑屏或重置连接。在端口22上使用SSH也是一样。最好使用SSL超过443,并希望防火墙不解密数据进行HTTP检查(只记得它可能正在解密)。

要实施,您可以使用libCURLBoost.Asio