【问题标题】:How does STUN perform ICE connectivity check on Candidate Pairs?STUN 如何对候选对执行 ICE 连接检查?
【发布时间】:2018-11-04 18:37:51
【问题描述】:

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

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

"...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 地址、端口、原型。这个 STUN 消息结构在哪里描述?我可以从哪里获得有关 STUN 如何完成此连接检查的详细信息?

【问题讨论】:

    标签: webrtc stun libnice


    【解决方案1】:

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

    假设我最后得到的候选对是:-

    1. IP1,P1
    2. RIP2,P2
    3. TIP3,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 Page 14 基址向每个远程候选对发送一个 STUN 请求。现在,当远程端 B 在其候选对上接收到任何流量时,它必须在其自身端实现一个 STUN 服务器逻辑。因此,基本上套接字在接收任何数据包时都需要能够区分媒体和 STUN 数据包。在后者的情况下,它会发回一个 STUN 响应,指示它从哪里收到请求。

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

    1. IP1,P1 Vs RIP2,P5 这里reuest可能会到达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。所以这可以被标记为“有效对”。

    希望我已经清楚了。

    【讨论】:

    • 评论是否有任何 RFC 参考:“现在,当远程端 B 在其候选对上接收到任何流量时,它必须在其自身端实现 STUN 服务器逻辑。”那句话回答了我的问题。
    • tools.ietf.org/html/rfc8445#page-38,请参阅#7。我引用了“ICE 代理必须符合 [RFC5389]。完整的实现既可以作为 STUN 客户端,也可以作为 STUN 服务器,”
    【解决方案2】:

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

    描述中值得注意的部分:

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

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

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

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

    【讨论】:

    • 我试图找出 STUN 消息中为连接检查指定的目标 IP 的位置。我的意思是如何使用 STUN 检查连接性。例如,您引用的 RFC 中的描述提供了用于获取服务器自反地址的 STUN 消息格式。我缺少的是“连接检查”以及 STUN 在其中发挥作用的地方。
    • 这不是眩晕信息的一部分。它通过 udp 套接字发送到 IP 地址/端口。
    • @PhilippHancke 因此,一旦 stun 客户端在 STUN 响应中从 STUN 服务器获得自己的服务器反射地址,它就会向远程 ip-addr/port 发送一条 UDP 消息以检查连接性?这不是 RFC 中所说的“每次检查都是 STUN 请求/响应事务”我有候选对(L-ip-addr、L-ip-Udp-port)并希望使用 R-ip 进行连接检查-addr,R-ip-Udp 端口​​。 STUN 消息是直接从 L 发送到 R 的吗?
    • @Philipp Hancke 因此,一旦 stun 客户端在 STUN 响应中从 STUN 服务器获得自己的服务器反射地址,它就会向远程 ip-addr/port 发送一条 UDP 消息以检查连接性?这不是 RFC 中所说的“每次检查都是 STUN 请求/响应事务”我有候选对(L-ip-addr、L-ip-Udp-port)并希望使用 R-ip 进行连接检查-addr,R-ip-Udp 端口​​。 STUN 消息是直接从 L 发送到 R 的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2018-09-23
    • 2017-05-08
    • 1970-01-01
    • 2021-09-23
    • 2020-04-16
    相关资源
    最近更新 更多