跳到主要内容

10. Send 和 Data 方法

TURN 支持两种用于向对等方发送数据以及从对等方接收数据的机制. 本节描述 Send 和 Data 机制的用法, 第 11 节描述 channel 的用法.

10.1. 构造 Send 指示​

客户端可以使用 Send indication 将数据传递给服务器, 由服务器转发给对等方. 即使已有一个 channel 绑定到该对等方, 客户端也可以使用 Send indication. 但是, 客户端必须确保已经为 Send indication 目标对等方的 IP 地址安装了 permission, 这可以防止第三方利用 TURN 服务器向任意目的地发送数据.

构造 Send indication 时, 客户端必须同时包含 XOR-PEER-ADDRESS 属性和 DATA 属性. XOR-PEER-ADDRESS 属性包含数据要发送到的对等方传输地址, DATA 属性包含要发送给对等方的实际应用数据.

如果客户端希望服务器在发往对等方的 UDP 数据报上设置 DF 位, 则客户端可以在 Send indication 中包含 DONT-FRAGMENT 属性.

10.2. 接收 Send 指示​

当服务器收到 Send indication 时, 它按照第 4 节以及此处提到的特定规则进行处理.

首先检查消息的有效性. Send indication 必须同时包含 XOR-PEER-ADDRESS 属性和 DATA 属性. 如果其中任一属性缺失或无效, 则丢弃该消息. 注意, DATA 属性允许包含零字节数据.

Send indication 还可以包含 DONT-FRAGMENT 属性. 如果存在该属性时服务器无法在出站 UDP 数据报上设置 DF 位, 则服务器将 DONT-FRAGMENT 属性视为未知的 comprehension-required 属性, 因而丢弃该 Send indication.

服务器还会检查是否已经为 XOR-PEER-ADDRESS 属性中包含的 IP 地址安装 permission. 如果不存在这样的 permission, 则丢弃该消息. 注意, Send indication 永远不会导致服务器刷新该 permission.

服务器可以对 XOR-PEER-ADDRESS 属性中允许的 IP 地址和端口值施加限制 -- 如果某个值不被允许, 服务器会静默丢弃该 Send indication.

如果一切正常, 服务器按如下方式构造 UDP 数据报:

  • 源传输地址是 allocation 的 relayed transport address, 其中 allocation 由接收该 Send indication 的 5-tuple 确定

  • 目的传输地址取自 XOR-PEER-ADDRESS 属性

  • UDP 头之后的数据是 DATA 属性 value 字段的内容

DONT-FRAGMENT 属性的处理方式 (如果存在) 在第 12 节中描述.

随后将生成的 UDP 数据报发送给对等方.

10.3. 接收 UDP 数据报​

当服务器在当前已分配的 relayed transport address 上收到 UDP 数据报时, 服务器查找与该 relayed transport address 关联的 allocation. 然后, 服务器按照第 8 节所述检查该 allocation 的 permission 集合是否允许转发该 UDP 数据报.

如果允许转发, 服务器会检查是否存在绑定到发送该 UDP 数据报的对等方的 channel (见第 11 节). 如果已绑定 channel, 则按第 11.7 节所述继续处理.

如果允许转发但没有 channel 绑定到该对等方, 则服务器构造并发送 Data indication. Data indication 必须同时包含 XOR-PEER-ADDRESS 属性和 DATA 属性. DATA 属性设置为该数据报中 'data octets' 字段的值, XOR-PEER-ADDRESS 属性设置为收到的 UDP 数据报的源传输地址. 随后在与 allocation 关联的 5-tuple 上发送该 Data indication.

10.4. 接收 Data 指示​

当客户端收到 Data indication 时, 它会检查该 Data indication 是否同时包含 XOR-PEER-ADDRESS 属性和 DATA 属性, 如果不包含则丢弃该 indication. 客户端应该还检查 XOR-PEER-ADDRESS 属性值是否包含一个客户端认为具有活动 permission 的 IP 地址, 否则丢弃该 Data indication. 注意, DATA 属性允许包含零字节数据.

注: 后一项检查可以保护客户端, 防止攻击者以某种方式诱使服务器安装客户端不希望安装的 permission.

如果 Data indication 通过上述检查, 客户端会将 DATA 属性中的数据八位组交付给应用, 并同时指示这些数据来自 XOR-PEER-ADDRESS 属性给出的传输地址所对应的对等方.