我的目的是:
- 不要求用户打开路由器上的端口
- 用我的应用程序通过代码做所有事情
有可能吗?考虑到这个应用程序应该只能与安装了相同应用程序的其他机器一起使用,我可以从头开始编写某种协议来做到这一点吗?
我的总体想法是尽可能快地建立连接,我还必须交换小数据包,降低延迟对我来说比仅仅拥有高吞吐量更重要。
我的目的是:
有可能吗?考虑到这个应用程序应该只能与安装了相同应用程序的其他机器一起使用,我可以从头开始编写某种协议来做到这一点吗?
我的总体想法是尽可能快地建立连接,我还必须交换小数据包,降低延迟对我来说比仅仅拥有高吞吐量更重要。
不要弄乱NAT。无论如何,这对延迟没有太大帮助。您正在使用 TCP/IP,这是一个相当高级的协议,而且速度相对较慢。也就是说 - 该协议为您做了很多很棒的工作 - 但在延迟方面是有代价的。(它维护连接状态,保持数据包有序,并在保证数据包传递等方面做得很好。)
如果您想要一个非常低延迟的网络通道,请使用 UDP - 这是较低级别的,并且做的工作几乎没有 TCP 那么多。UDP 只是尽力将每个数据包传递到目的地,而不保持连接打开,数据包不一定按顺序到达,并且有知道数据包是否到达目的地的已知方法。
你需要自己建造这些东西——或者学会在没有它们的情况下生活。
基于 UDP 构建的应用程序往往会重复大量信息,并且在实现协议逻辑时存在很大的错误空间。结果通常是较低的延迟 - 但通常以可靠性或传输速率为代价。
另外-如果您需要低延迟,请不要通过其他协议进行隧道传输,例如通过 SSH 或其他方式进行隧道传输。这只会增加延迟。
此答案针对您的要求,即您不要求客户调整其网络上的任何设置。如果您可以让客户为您更改其网络上的内容,那么您应该按照 Rafael 的建议实现您自己的自定义应用程序。
如果您需要加密,您可以使用端口 80 上的 HTTP 协议或端口 443 上的 HTTPS(即基于 SSL/TLS 的 HTTP)协议。或者通过端口 22 使用 SSH。
这些只是通常由防火墙打开的端口,因此您很可能会通过。不能保证它们会开放。
使用 HTTP 或 HTTPS 时使用 HTTP 协议的原因是防火墙可能会进行深度数据包检查,如果不符合预期,它可能会黑洞或重置您的连接。在端口 22 上使用 SSH 也是如此。您最好使用 SSL over 443,并且只希望防火墙不会解密数据以进行 HTTP 检查(请记住它可能正在解密)。
对于实现,您可以使用libCURL或Boost.Asio。