Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 绕过NAT并通过C+打开端口+;以实现低延迟_C++_Networking_Tcp_Udp - Fatal编程技术网

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

C++ 绕过NAT并通过C+打开端口+;以实现低延迟,c++,networking,tcp,udp,C++,Networking,Tcp,Udp,我的目的是: 不要求用户打开其路由器上的端口 使用我的应用程序通过代码完成所有工作 有可能吗?考虑到这个应用程序应该只与安装了相同应用程序的其他机器一起工作,我可以从头开始编写某种协议来做到这一点吗 我的总体想法是使连接尽可能快,我还必须交换小数据包,降低延迟对我来说比拥有高吞吐量更重要。不要干扰NAT。无论如何,这对延迟没有多大帮助。您使用的是TCP/IP,这是一个相当高级的协议,速度相对较慢。也就是说,该协议为您做了大量的工作,但在延迟方面付出了代价。(它维护连接状态,保持数据包有序,并

我的目的是:

  • 不要求用户打开其路由器上的端口
  • 使用我的应用程序通过代码完成所有工作
有可能吗?考虑到这个应用程序应该只与安装了相同应用程序的其他机器一起工作,我可以从头开始编写某种协议来做到这一点吗


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

不要干扰NAT。无论如何,这对延迟没有多大帮助。您使用的是TCP/IP,这是一个相当高级的协议,速度相对较慢。也就是说,该协议为您做了大量的工作,但在延迟方面付出了代价。(它维护连接状态,保持数据包有序,并在保证数据包交付等方面做得很好。)

如果您想要一个非常低延迟的网络通道,请使用UDP—这是较低的级别,并且没有TCP做那么多的工作。UDP只是尽最大努力将每个数据包发送到目的地,而不保持连接打开,数据包不一定按顺序到达,而且有知道数据包是否到达目的地的方法

你需要自己建造这些东西——或者学会没有它们的生活

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


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

不要干扰NAT。无论如何,这对延迟没有多大帮助。您使用的是TCP/IP,这是一个相当高级的协议,速度相对较慢。也就是说,该协议为您做了大量的工作,但在延迟方面付出了代价。(它维护连接状态,保持数据包有序,并在保证数据包交付等方面做得很好。)

如果您想要一个非常低延迟的网络通道,请使用UDP—这是较低的级别,并且没有TCP做那么多的工作。UDP只是尽最大努力将每个数据包发送到目的地,而不保持连接打开,数据包不一定按顺序到达,而且有知道数据包是否到达目的地的方法

你需要自己建造这些东西——或者学会没有它们的生活

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


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

此答案旨在满足您的要求,即您不要求客户调整其网络上的任何设置。如果您同意让客户在他们的网络上为您更改内容,那么您应该按照Rafael的建议实现自己的定制应用程序

如果需要加密,可以在端口80上使用HTTP协议,也可以在端口443上使用HTTPS(即HTTP over SSL/TLS)协议。或者通过端口22使用SSH

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

使用HTTP或HTTPS时使用HTTP协议的原因是防火墙可能正在进行深度数据包检查,如果不符合预期,它可能会将您的连接设为黑洞或重置。通过端口22使用SSH也是如此。您最好使用SSL over 443,只希望防火墙没有解密数据以进行HTTP检查(请记住它可能正在解密)


对于实施,您可以使用,或。

此答案适合您的要求,即您不要求客户调整其网络上的任何设置。如果您同意让客户在他们的网络上为您更改内容,那么您应该按照Rafael的建议实现自己的定制应用程序

如果需要加密,可以在端口80上使用HTTP协议,也可以在端口443上使用HTTPS(即HTTP over SSL/TLS)协议。或者通过端口22使用SSH

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

使用HTTP或HTTPS时使用HTTP协议的原因是防火墙可能正在进行深度数据包检查,如果不符合预期,它可能会将您的连接设为黑洞或重置。通过端口22使用SSH也是如此。您最好使用SSL over 443,只希望防火墙没有解密数据以进行HTTP检查(请记住它可能正在解密)


对于实现,您可以使用,或。

您可以使用一个常见的开放端口,如端口80,但如果这样做,您将从internet流量中获得竞争。@JamWaffles可以给我举个例子吗?基本上我必须过滤数据包和/或签名?我对TCP/IP协议栈的工作原理有一个大致的了解,但现在我开始编程,我必须更深入。你可以使用HTTP协议作为你的传输,你可以通过它发送和接收加密/签名的数据。如果使用SSL库使用HTTPS,您可能会发现这样做更容易。那么,端口将是443,而不是80。443也普遍开放。还有,端口22上有SSH。或者P2P有穿孔:如果路由器支持UPNP,你可以这样做。否则,您必须手动配置路由器。没有办法解决这个问题。您可以使用一个常见的开放端口,如端口80,尽管您会得到con