问题标签 [stun]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
14524 浏览

protocols - 为什么 STUN 服务器需要两个不同的公共 IP 地址

我查看了 openfire 中的 STUN Server 设置并从那里声明:

“为了充当 STUN 服务器,需要同一台机器上的两个不同的公共 IP 地址,以及每个 IP 的两个不同的端口号。”

我在google上研究过,一般stun服务器需要两个公共IP,这是什么原因?

0 投票
2 回答
1231 浏览

java - 创建与外部主机的连接时如何获取 NAT 的外部端口以及如何在 Java 中实现 STUN

我正在研究 NAT 和 STUN 协议,但我还没有理解它们,所以我尝试在 Java 中实现 STUN。

假设我有 2 台计算机通过 2 个各自的全锥 NAT 设备连接到 Internet,我正在尝试用 Java 实现 STUN 协议,我只是实现了当 2 个对等方都知道彼此的外部 IP 和端口时的部分,其中一个(我们称这个对等点是“客户端”)正在尝试向另一个(这个对等点是“服务器”)发送消息。我做了这样的事情:

但是服务器收不到任何东西,所以我有一些问题:

  1. 我认为我通过上述方式获得的服务器外部端口不是另一个对等方将用于向服务器发送消息的外部端口,那么在 Java 中获取它的正确方法是什么?

  2. 我的做法是在与 STUN 服务器交换后 2 个对等方知道彼此的外部 ip 和端口时实现 STUN 部分的正确方法?如果不是,那么正确的方法是什么?

希望大家给我解释一下,谢谢大家!

0 投票
1 回答
2940 浏览

nat - 以编程方式确定路由器 NAT 类型

我需要在我的程序中以编程方式确定路由器 NAT 类型。我确实查看了一些与 STUN 相关的答案和关于 SO 的 UPnP 相关信息。但没有得到任何确定的答案。

我查看了 STUN RFC (rfc 5389),它没有指定如何确定 NAT 类型。它确实提到它的先前版本(RFC 3489)确实提供了确定 NAT 类型的机制。但也提到

此外。经典的 STUN 用于分类 NAT 类型的算法被发现是错误的,因为许多 NAT 并没有完全适合那里定义的类型。

鉴于上述情况,您能否就我应该如何在我的软件中确定路由器 NAT 类型提出建议。此外,既然 RFC 3489 已经过时,还有其他方法吗?

提前致谢。

0 投票
1 回答
4049 浏览

firewall - STUN 协议:如何检测两次或双重 NAT 防火墙?

STUN 的RFC 5780为服务器发送回请求客户端的 STUN 消息响应定义了 Response-Origin 属性。

它将其描述为:

RESPONSE-ORIGIN 属性由服务器插入,并指示发送响应的源 IP 地址和端口。它对于检测双 NAT 配置很有用。它仅存在于绑定响应中。

客户端如何使用服务器的源 IP 和端口来检测双重 NAT 配置?难道不能从 UDP 数据包的源字段中轻松读取源地址信息,因为入站 NAT 只重写目标地址而不是源地址?

0 投票
4 回答
19701 浏览

java - Java UDP 打孔示例 - 通过防火墙连接

假设我有两台电脑。

他们通过ice4j.

一个客户端监听,另一个发送一些字符串。

我希望通过 UPD 打孔看到这种情况发生:

任何人都可以发布如何通过对称 NAT 进行打孔的伪示例吗?假设将有服务器 S 帮助猜测端口号并在客户端 A 和 B 之间建立连接。

如果您也考虑双 NAT,那就太好了。

笔记:

您可以使用 STUN 来发现 IP 和端口,但您必须编写自己的代码,通过keepalive技术将 IP:Port 发送到您的服务器。

一旦一个客户端通过服务器上的唯一 ID 识别另一个客户端,它将提供另一个客户端的 IP:端口信息,以便 UDP 打孔它需要发送和接收的数据。

小更新:

有一个即将出现的库供 java 检查一下:
https ://github.com/htwg/UCE#readme

0 投票
1 回答
1978 浏览

android - 如果设备处于待机模式,程序执行会在 datagramSocket.receive 方法上冻结

我实现了 STUN 客户端,它在指定的时间段内向 STUN 服务器发送请求,并在此期间监听来自 STUN 服务器的请求:

如果设备进入待机模式(屏幕关闭时),程序执行将冻结在 datagramSocket.receive() 上,并且在屏幕解锁之前不会抛出 SocketTimeoutException。当屏幕解锁时,成功抛出 SocketTimeoutException 并继续执行程序。这种行为的原因是什么?

UPD: 如果设备空闲程序执行在 datagramSocket.receive 方法上冻结并且没有接收任何传入数据。我尝试使用 WifiLock 但没有结果。

UPD 2: 如果我使用 WakeLock 一切正常,但我想这不是一个好方法

0 投票
1 回答
3632 浏览

java - Java UDP STUN 打孔与 DatagramSocket

我正在尝试通过 NAT 向客户端发送 udp 数据包,我们都属于不同的 NAT,我们熟悉 STUN 的理论,因此实现此目的的方法是通过“打孔”通过一个简单的 STUN 服务器..

基本上,服务器只返回另一个“已连接”客户端的外部 IP 地址和端口,然后我可以使用它通过 NAT 将数据包发送到客户端......但是,尽管我们设法获取了彼此的外部 IP 和端口。 .我们在发送后仍然无法收到来自对方的任何东西......在搜索论坛和数小时的头颅后,我们仍然无法提出解决方案......想知道是否有熟悉 STUN 的人能够给我们一些关于我们哪里出错的指示或建议......

下面是我们写的小客户...

0 投票
3 回答
3302 浏览

sip - 如何开始编写基于 SIP / VoIP 的软件

我需要在我公司的基于 Windows 的软件中添加一些基于 SIP 的功能,允许用户呼叫分机并从注册到 SIP 服务器的分机接收呼叫。本质上,我将创建一个简单的软电话。该软件可能在不同的网络上运行,因此需要考虑 NAT、防火墙和 STUN 服务器。

我想知道其他人是否做过这种事情,如果是这样,您对如何开始有任何建议。

我应该从头开始编写自己的 SIP 堆栈吗?

我应该考虑使用 OPAL 吗?它看起来很理想,但他们只列出了一家他们知道使用他们的图书馆的公司,这让我很担心。

我应该考虑其他 3rd 方库吗?

0 投票
3 回答
3839 浏览

android - NAT traversal techniques and idea

So I was in a middle of making NAT traversal.

The scenario is next: I got two Android phones and I want to connect them(sockets) using HTTP server(both devices are behind NAT).

So far so good, both clients connect to HTTP server, HTTP server records their IP address&PORTS,

however there is a little problem, since I use Java HttpDefaultClient(), it will change the port each time I send request from client to the server. Okay that sounds like simple problem: let's just use Socket() to actually maintain a valid TCP connection into server.

public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException

I will just use this class and put the localPort something random which I will remember. Now I do everything again, this time it seems that port wont change, like I want.

Now after I have opponent's IP&port(he's also behind NAT), theoretically I could drop the SERVER connection and use the same localPort I already used to actually host a clientServer?

unless, and now comes the part where I have question: 1)If I drop the HTTP server socket, will NAT understand that and remove the port mapping?(that's bad) 2) How does actually passing symmetric-cone nat work? 3) does the STUN libraries work somehow differently?

0 投票
1 回答
2370 浏览

networking - TURN 服务器在防火墙后面 - 如何处理 XOR-RELAYED-ADDRESS

我在防火墙后面的服务器上运行 TURN 服务器 (http://tools.ietf.org/html/rfc5766)。机器有一个公共 IP 地址,传入和传出的网络数据包从服务器的专用 IP 地址发送到/从该地址发送。基本上,服务器不能将套接字绑定到公共 IP 地址,只能绑定私有 IP 地址。运行ifconfig显示具有私有 IP 地址的网络设备。

当我运行 TURN 服务器时,我必须绑定到私有 IP 地址(因为服务器认为它没有连接到公共 Internet)。对分配创建的所有响应都会发回带有私有 IP 地址的 XOR-RELAYED-ADDRESS。客户端收到 XOR-RELAYED-ADDRESS 并将数据发送到服务器的私有 IP 地址,这显然失败了。

我正在考虑两种选择来克服这个问题:

  • 让我的客户端代码忽略 XOR-RELAYED-ADDRESS 的 IP 地址,只使用 XOR-RELAYED-ADDRESS 的端口。客户端会将所有中继消息发送到 TURN 服务器的公共 IP(因为客户端已经事先知道该值)和 XOR-RELAYED-ADDRESS 端口。
  • 更改我的服务器以了解其公共 IP(即使它无法将套接字绑定到它),并始终在 XOR-RELAYED-ADDRESS 响应中发回公共 IP。

我觉得第一种方法破坏了 TURN RFC ......即使我无法想象 TURN 服务器会将 XOR-RELAYED-ADDRESS 的 IP 作为 TURN 服务器的公共 IP 以外的东西发回的情况,RFC 说XOR-RELAYED-ADDRESS 是客户端应该发送数据的地方。

我觉得第二种方法对 RFC 的破坏更少……如果这有意义的话。此外,这种方法不会强制客户端做任何特殊的事情,而第一种方法需要所有客户端都遵守上述规定。

你怎么看待这件事?有没有人经历过这种情况,和/或对哪种方法对 RFC 的破坏更少,或者任何一种方法是否违反了 RFC 有任何意见?