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 属性给出的传输地址所对应的对等方.