我的目的是:
可以这样做吗?考虑到这个应用程序只适用于安装了相同应用程序的其他机器,我可以从头开始编写某种协议吗?
我的一般想法是尽可能快地建立连接,我还必须交换小数据包,降低延迟对我来说比拥有高吞吐量更重要。
答案 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检查(只记得它可能正在解密)。
要实施,您可以使用libCURL或Boost.Asio。