10. Send and Data Methods (发送和数据方法)
TURN 支持从对等方发送和接收数据的两种机制。本节描述 Send 和 Data 机制的使用,而第 11 节描述通道机制的使用。
10.1. Forming a Send Indication (构造发送指示)
客户端可以使用 Send 指示将数据传递给服务器以中继到对等方。即使通道已绑定到该对等方,客户端也可以使用 Send 指示。但是,客户端必须 (MUST) 确保为正在发送 Send 指示的对等方的 IP 地址安装了权限,这可以防止第三方使用 TURN 服务器向任意目标发送数据。
在构造 Send 指示时,客户端必须 (MUST) 包含 XOR-PEER-ADDRESS 属性和 DATA 属性。XOR-PEER-ADDRESS 属性包含要向其发送数据的对等方的传输地址,DATA 属性包含要发送到对等方的实际应用程序数据。
如果客户端希望服务器在发送到对等方的 UDP 数据报上设置 DF 位,则客户端可以 (MAY) 在 Send 指示中包含 DONT-FRAGMENT 属性。
10.2. Receiving a Send Indication (接收发送指示)
当服务器接收到 Send 指示时,它按照第 4 节加上此处提到的特定规则进行处理。
首先检查消息的有效性。Send 指示必须 (MUST) 同时包含 XOR-PEER-ADDRESS 属性和 DATA 属性。如果缺少其中一个属性或无效,则丢弃消息。请注意,允许 DATA 属性包含零字节的数据。
Send 指示也可能包含 DONT-FRAGMENT 属性。如果存在此属性时服务器无法在传出的 UDP 数据报上设置 DF 位,则服务器将 DONT-FRAGMENT 属性视为未知的必须理解的属性(因此丢弃 Send 指示)。
服务器还检查是否为 XOR-PEER-ADDRESS 属性中包含的 IP 地址安装了权限。如果不存在此类权限,则丢弃消息。请注意,Send 指示永远不会导致服务器刷新权限。
服务器可以 (MAY) 对 XOR-PEER-ADDRESS 属性中允许的 IP 地址和端口值施加限制 - 如果不允许某个值,服务器静默丢弃 Send 指示。
如果一切正常,则服务器按如下方式构造 UDP 数据报:
-
源传输地址是分配的中继传输地址,其中分配由 Send 指示到达的 5 元组确定。
-
目标传输地址取自 XOR-PEER-ADDRESS 属性。
-
UDP 头之后的数据是 DATA 属性的值字段的内容。
DONT-FRAGMENT 属性(如果存在)的处理在第 12 节中描述。
然后将生成的 UDP 数据报发送到对等方。
10.3. Receiving a UDP Datagram (接收 UDP 数据报)
当服务器在当前分配的中继传输地址接收到 UDP 数据报时,服务器查找与中继传输地址关联的分配。然后,服务器检查分配的权限集是否允许中继 UDP 数据报,如第 8 节所述。
如果允许中继,则服务器检查是否有通道绑定到发送 UDP 数据报的对等方(参见第 11 节)。如果通道已绑定,则处理按照第 11.7 节中的描述进行。
如果允许中继但没有通道绑定到对等方,则服务器构造并发送 Data 指示。Data 指示必须 (MUST) 同时包含 XOR-PEER-ADDRESS 和 DATA 属性。DATA 属性设置为数据报的'data octets'字段的值,XOR-PEER-ADDRESS 属性设置为接收到的 UDP 数据报的源传输地址。然后在与分配关联的 5 元组上发送 Data 指示。
10.4. Receiving a Data Indication (接收数据指示)
当客户端接收到 Data 指示时,它检查 Data 指示是否同时包含 XOR-PEER-ADDRESS 和 DATA 属性,如果不包含则丢弃该指示。客户端还应该 (SHOULD) 检查 XOR-PEER-ADDRESS 属性值是否包含客户端认为存在活动权限的 IP 地址,否则丢弃 Data 指示。请注意,允许 DATA 属性包含零字节的数据。
注意:后一项检查保护客户端免受以某种方式设法欺骗服务器安装客户端不希望的权限的攻击者的攻击。
如果 Data 指示通过上述检查,客户端将 DATA 属性内的数据字节传递给应用程序,同时指示它们是从传输地址由 XOR-PEER-ADDRESS 属性给出的对等方接收的。