将数据推送到客户端而不被防火墙阻止的最佳方式

信息安全 防火墙 协议 路由
2021-09-03 11:49:23

我在这里问这个问题是因为我认为这个论坛上的人可能对防火墙和路由器有最好的了解。

假设我正在设计一个多人游戏,我想自发地将数据推送到客户端。因为它可能比客户端不断轮询服务器以检查更改更有效并且在服务器上施加的负载更少。

据我了解,当今大多数计算机都有防火墙,并且许多家用计算机也在路由器后面,因此如果您只是发送数据包,它可能会被阻止,特别是因为路由器不知道将数据包路由到哪台 PC。

有什么好方法可以在不被阻塞的情况下推送数据?
防火墙在哪些情况下允许数据包通过默认配置的 PC?
路由器如何知道将数据包路由到哪台 PC?

我希望这个问题不是太大,我认为我提出的问题都是相关的,否则我将删除关于路由器的最后一个问题,因为它可能不太相关。

编辑:我说的是自发发送数据包,但我的意思是只有在用户登录游戏并发送他的 IP 之后。

编辑2:(评论的答案)

游戏通过互联网进行。

有多少流量 - 最初这将有可能一百个并发用户,但应该是可扩展的几百,但我还是想听听这两种情况下的解决方案,因为我可能会决定有更多的服务器,如果它改变了答案。

延迟 - 应尽可能低(实时游戏)。

4个回答

通用注意事项

这是常见的大多数防火墙和NAT设备允许服务器回覆从内部发出的数据包的计算机。还有什么是边缘的情况下或精神失常的行为。因此,如果一个游戏客户端可以启动你的连接,我们可以假设,你可以顶嘴该通道上。然后,我们的目标是保持连接。随着TCP和UDP,NAT设备将最终超时的应用程序,如果没有被发送过。

UDP

简单和直接,最NAT路由器将允许UDP数据包返回到发送它们的主人。在实时游戏,这是正常的协议,不丢弃报文执行的帧重新排序。游戏和它的服务器负责从协议中同步它们的状态。预计默哀一分钟后,被人遗忘的连接。DD-WRT框默认为2分钟。

TCP

保持连接的开销下令从游戏到系统转移。数据包到达应用为了,尽管当数据包丢弃或者到计算机外的顺序这会产生一些不必要的延误。至少通过RFC,NAT设备应保持已建立的TCP连接打开忘记他们之前至少两小时。实际上,指望不超过5分钟。DD-WRT路由器,例如,忘记在10。

你没有将数据包从蓝色中发送; 你必须知道客户是谁以及它的位置。因此,正常模型是以下内容:每个客户端打开到服务器的TCP连接。连接刚刚坐在那里。当服务器对客户端有话要说时,它就会在相关的连接上写入。

空闲连接不需要数据包。您实际上不时发送一些数据包,因为某些路由器/防火墙倾向于终止空闲时间过长的连接(“太长”有时短至“五分钟”)。

在某些网络中,外部 TCP 连接被拒绝,所有网络活动都必须通过 HTTP 协议下的代理(我已经看到在某些业务网络中——正是要求特殊防火墙规则才能玩游戏的情况可能有点不悦)。通常的解决方法是使用 HTTPS(即 SSL),因为这样代理将作为通用双向 TCP 转发器(使用CONNECTproxy 命令)工作。如果这也被阻止,您将不得不求助于技巧,例如发送一个虚拟的 HTTP 请求,并让服务器通过小块发送“无限”响应(没有明确的“Content-Length”标头的响应)。请参阅此博客文章进行讨论。

快速响应:

家用路由器或防火墙的普遍问题是它们允许向外连接而不允许向内连接。

每个品牌/型号通常具有相同的功能以允许旁路或向内端口映射。但是,确切的方法(GUI、设置)可能完全不同(因此很复杂)。

让客户端连接(到服务器)肯定会更安全。但仍然主要发送(从服务器),您可以让客户端首先建立向外连接,然后通过该路径侦听数据包。

简短的回答是您将需要客户端充当客户端 - 即启动“推送”数据的连接。

正如您所说,在“服务器”端发起的 UDP 和 TCP 连接不会跨越大多数防火墙,也不会跨越大多数 NAT 路由器。

事实上,即使在用户端启动了套接字,您也可以通过使用端口 80 获得最佳覆盖 - 所以您至少应该考虑彗星

(然而 IME,大多数 MORPG 依赖于用户明确允许传入连接。)

这是websocket旨在解决的问题之一

在这两种架构中,使用每个连接一个线程/进程的传统服务器模型都会遇到严重的可伸缩性问题。(去阅读node.js)。

毫不奇怪,node.js 有很好的 websocket 支持。