关于眩晕服务器的困惑

Posted

技术标签:

【中文标题】关于眩晕服务器的困惑【英文标题】:Confusion about the stun server 【发布时间】:2014-05-07 21:12:08 【问题描述】:

我需要的是,我将打开一个UDP 服务器监听X 端口(本地机器),并且一个machine(public IP) 可以向我发送UDP 数据包。我的机器没有public IP。基本上我需要stun

我正在测试stuntman 服务器/客户端项目。我在服务器(公共 IP)中运行 stuntman-server。在我的系统中运行客户端(本地 ip)。我要求为9999 端口提供映射的IP/端口。

./stunclient --mode full --protocol udp --localport 9999 stun.server.ip

Stun 服务器返回一个 IP 和端口。然后我做了什么,在我的本地系统中打开一个UDP 服务器(使用java)并开始监听9999 端口并从other machine (which has public IP) 发送UDP 消息到mapped IP/port 由stun 服务器返回。但我无法接收任何数据。您可以假设我的服务器/客户端代码(用 java 编写)在本地网络中运行良好。

流程:

My machine ->>>>>stun request for 9999 port and my ip ------> stun server
My machine <<<<<<<<<<<<<<<<<<mapped ip/port <<<<<<<<<<<<<<<  stun server
My machine : Run JAVA udp server socket in 9999 port

My machine  <<<<<<<<<<<<<<<<<<<UDP message to mapped ip/port<<<<<< other public machine 
            xxxxxxxxxxxxxxxxxxxNot workingxxxxxxxxxxxxxxxxxxxxxxxx

【问题讨论】:

【参考方案1】:

您没有发布 stunclient 运行的结果,但我想它看起来像下面这样:

$ stunclient --mode full --localport 9999 stun.stunprotocol.org
Binding test: success
Local address: 192.168.1.8:9999
Mapped address: 1.2.3.4:9999
Behavior test: success
Nat behavior: Endpoint Independent Mapping
Filtering test: success
Nat filtering: Address and Port Dependent Filtering

我猜您的行为测试是“端点独立”,而过滤测试是“地址和端口相关”,因为这些测试是家庭中最常见的,并且大部分与您上面描述的匹配。 (又名“端口受限 NAT”)。

无论如何,这意味着您已经在自己和 STUN 服务器之间创建了一个端口映射。在上面的示例中,我的公共 IP 地址是 1.2.3.4。并且很常见,但并非总是如此,我的本地端口(9999)与公共端口相同。

在内部,您的 NAT 保留如下逻辑表:

------------------------------------------------------------------------------------
||     LOCAL IP    | LOCAL PORT ||  EXT PORT    ||   REMOTE IP      | REMOTE PORT ||
||================================================================================||
||   192.168.1.8   | 9999       ||  9999        ||  107.23.150.92   | 3478        ||
------------------------------------------------------------------------------------

由于您从端口 9999 向 stun 服务器 (107.23.150.92) 发送了一个数据包,因此 NAT 在其表中创建了一个端口映射条目几分钟。当一个数据包从 Internet 到达 NAT/路由器时,它会查询该表。当响应从 STUN 服务器的 IP:port 返回时,NAT 能够根据上表中的“远程”字段将其转发到 NAT 后面的计算机。

但是您和您希望从中接收数据的“其他公共机器”之间没有端口映射。让我们假设另一台机器的 IP 地址是 2.4.6.8,它正试图从它的本地端口 8888 发送。NAT 表中仍然没有任何内容可以将流量从 2.4.6.8:8888 映射到后面的主机NAT。因此,当流量从不在表中的主机到达 NAT 时,NAT 只知道将数据包丢弃在地板上。有一种称为“Cone NAT”的 NAT 分类可以使用,但并不常见。

在您的情况下,有一个简单的解决方法。从 STUN 服务器获得端口映射后,从同一本地端口 (9999) 向要接收数据的远程主机(和远程端口)发送另一个数据报。远程主机可以简单地忽略此数据报,但它会有效地在您的 NAT 上创建另一个端口映射条目

------------------------------------------------------------------------------------
||     LOCAL IP    | LOCAL PORT ||  EXT PORT    ||   REMOTE IP      | REMOTE PORT ||
||================================================================================||
||   192.168.1.8   | 9999       ||  9999        ||  107.23.150.92   | 3478        ||
||   192.168.1.8   | 9999       ||  9999        ||  2.4.6.8         | 8888        ||
------------------------------------------------------------------------------------

到 2.4.6.8:8888 的简单 1 字节数据包允许 NAT 将流量从该地址转发回 NAT 后面的主机。

换句话说,使用您自己的网络流命名法:

My machine:9999 ---->[STUN BINDING REQUEST]--->stun server:3478

My machine:9999 <----[STUN BINDING RESPONSE mapped IP:port]<--- stun server:3478

My machine:9999 [Open socket on port 9999]

My machine:9999 ---->[1 byte datagram] -------> 'other:8888'

My machine:9999 <---- [UDP to public IP:port obtained in step 2]<----'other:8888'

通常,在正常的 P2P 流程中,两个端点都与 STUN 服务器一起工作以发现它们的端口映射。然后使用另一个服务在彼此之间交换 IP:port 信息。根据您的描述,您是在程序之间手动交换这些值,这对于测试来说很好。

如果另一台机器在公共互联网上,从技术上讲,您不需要 STUN。第一台机器(在 NAT 之后)可以直接发送到远程 IP 和端口,说“给我发送一些数据”。远程端只检查此消息的对等地址和端口,以决定将其发送回何处。端口映射已创建。一些 RTSP 客户端假定服务器是公共的

我对套接字 NAT 遍历基础的回答是here。

我碰巧认识 STUNTMAN 的开发者。他是一个相当不错的人,长得好看,而且非常聪明。他们还说他和我看起来很像,并且与我们的名字的拼写几乎相同。如果您对 STUN 和 NAT 穿越有任何疑问,可以随时直接给他发邮件。

【讨论】:

以上是关于关于眩晕服务器的困惑的主要内容,如果未能解决你的问题,请参考以下文章

克服VR眩晕之帧数 提升UE4内容实时渲染效率

蓝桥杯集训100题scratch眩晕苹果 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第12题

小5聊移动开发性能优化解决卡顿眩晕问题提高用户体验

对使用 SSL 支持配置 Apache 感到茫然和困惑

对 ESB 作为点对点集成的解决方案感到困惑

如何解决python的re模块groupgroups与findall遇见正则表达式中分组"()"后产生的”眩晕反应“