2

我已经阅读了 RFC 5389 和 RFC 5245 以及更新的 RFC 8445。我了解 STUN 在返回服务器自反地址或中继地址时的工作原理。请求被发送到 STUN 服务器。

我的基本问题是关于使用 STUN 的 ICE 连接检查。RFC 8445 在第 10 页上声明:

"...At the end of
this process, each ICE agent has a complete list of both its
candidates and its peer's candidates.  It pairs them up, resulting in
candidate pairs.  To see which pairs work, each agent schedules a
series of connectivity checks.  Each check is a STUN request/response
transaction that the client will perform on a particular candidate
pair by sending a STUN request from the local candidate to the remote
candidate."

对于检查候选对的连接性检查,STUN 消息必须至少提供目标 IP 地址、端口、Proto。这个 STUN 消息结构在哪里描述?我在哪里可以获得 STUN 如何完成此连接检查的详细信息?

4

2 回答 2

4

我可以理解解释过程的 RFC 描述的困难。我试图简化: -

假设我最终获得候选对:-

  1. IP1,P1
  2. RIP2,P2
  3. 提示3,P3

同样,我的同伴有他自己的一套

  1. (B)IP1,P4
  2. (B)RIP2,P5
  3. (B)TIP3,P6

让我们快进到未来,我们拥有良好的媒体流量。显然,对于从 A->B 的媒体方向,我们有两个传输地址。由于 UDP 用于发送媒体,因此套接字具有源地址和目标地址。让我们称它们为 SrcIP_A、SrcPort_A 和 SrcIP_B、SrcPort_B。

必须明确SrcIP_A,SrcPort_A是A的候选对的一部分,SrcIP_B,SrcPort_B是B的候选对的一部分。

现在,来到当前时间,从 A 的角度来看,为了实现从 A->B 的流畅媒体流,我们只需要锁定我们已经拥有的集合中最终将使用的对。

这就是 STUN 出现的地方。记住 STUN 请求需要发送到特定的 IP、端口。并且响应告诉 STUN 服务器在请求中注意到哪个是经过 NAT 处理的外部地址。

因此,A 创建了 9 个对,将其自己的候选对中的每个条目与其对等点进行匹配。然后,它从它自己的每个候选集的对的RFC 8445 第 14 页基础向每个远程候选对发送 STUN 请求。现在,当远程端 B 在其候选对上接收到任何流量时,它必须在其自身端实现一个 STUN 服务器逻辑。因此,基本上套接字在接收任何数据包时都需要能够区分媒体和 STUN 数据包。在后者的情况下,它将发回一个 STUN 响应,指示它从哪里收到请求。

让我们假设在迭代 A 时处于以下组合。

  1. IP1,P1 Vs RIP2,P5这里请求可能会到达 B,因为 RIP2,P5 的反射地址将到达 NAT 内部。返回的观察地址将是IP1,P1的反射地址。在A侧,当收到响应时,由于包含的地址不是IP1,P1,它将丢弃该集合。
  2. RIP2,P2 Vs (B)IP1,P4这显然会失败。由于您无法发送到 IP1、P4,这是一个私有地址。
  3. RIP2,P2 Vs RIP2,P5这里reuest 可能到达B,因为RIP2,P5 的反射地址将到达NAT 内部。观察到的返回地址也将是 RIP2,P2。所以这可以被标记为“有效对”。

希望我已经清楚了。

于 2019-10-02T06:40:19.007 回答
1

您将找到 RFC-5389 第 6 节中描述的 STUN 消息结构。https: //www.rfc-editor.org/rfc/rfc5389#page-10 。

描述中值得注意的部分:

STUN 消息使用面向网络的格式(最高有效字节或八位字节优先,通常也称为大端)以二进制编码。传输顺序在 RFC 791 [RFC0791] 的附录 B 中有详细描述。除非另有说明,否则数字常量是十进制的(以 10 为基数)。

所有 STUN 消息必须以 20 字节的标头开头,后跟零个或多个属性。STUN 标头包含 STUN 消息类型、魔术 cookie、事务 ID 和消息长度。

每个 STUN 消息的最高有效 2 位必须为零。当 STUN 与同一端口上的其他协议复用时,这可用于区分 STUN 数据包与其他协议。

消息类型定义了 STUN 消息的消息类别(请求、成功响应、失败响应或指示)和消息方法(主要功能)。虽然有四种消息类别,但 STUN 中只有两种类型的事务:请求/响应事务(由请求消息和响应消息组成)和指示事务(由单个指示消息组成)。响应类分为错误和成功响应,以帮助快速处理 STUN 消息。

于 2018-11-05T21:46:55.290 回答