10. Méthodes Send et Data
TURN prend en charge deux mécanismes pour envoyer et recevoir des données des pairs. Cette section décrit l'utilisation des mécanismes Send et Data, tandis que la section 11 décrit l'utilisation des canaux.
10.1. Formation d'une indication Send
Le client peut utiliser une indication Send pour transmettre des données au serveur pour relayage vers un pair. Un client peut utiliser une indication Send même si un canal est lié à ce pair. Cependant, le client doit s'assurer qu'il existe une permission installée pour l'adresse IP du pair auquel une indication Send est envoyée, ce qui protège le serveur TURN contre l'utilisation pour envoyer des données vers des destinations arbitraires par des tiers.
Lors de la formation d'une indication Send, le client doit inclure à la fois un attribut XOR-PEER-ADDRESS et un attribut DATA. L'attribut XOR-PEER-ADDRESS contient l'adresse de transport du pair auquel les données doivent être envoyées, et l'attribut DATA contient les données d'application réelles à envoyer au pair.
Le client peut inclure un attribut DONT-FRAGMENT dans l'indication Send s'il souhaite que le serveur définisse le bit DF sur le datagramme UDP envoyé au pair.
10.2. Réception d'une indication Send
Lorsque le serveur reçoit une indication Send, il traite conformément à la section 4 plus les règles spécifiques mentionnées ici.
Le message est d'abord vérifié pour sa validité. L'indication Send doit contenir à la fois un attribut XOR-PEER-ADDRESS et un attribut DATA. Si l'un de ces attributs est manquant ou invalide, alors le message est rejeté. Notez que l'attribut DATA est autorisé à contenir zéro octet de données.
L'indication Send peut également contenir l'attribut DONT-FRAGMENT. Si le serveur est incapable de définir le bit DF sur le datagramme UDP sortant lorsque cet attribut est présent, alors le serveur traite l'attribut DONT-FRAGMENT comme un attribut de compréhension requis inconnu (et rejette donc l'indication Send).
Le serveur vérifie également qu'il existe une permission installée pour l'adresse IP contenue dans l'attribut XOR-PEER-ADDRESS. Si aucune telle permission n'existe, le message est rejeté. Notez qu'une indication Send n'entraîne jamais le rafraîchissement de la permission par le serveur.
Le serveur peut imposer des restrictions sur les valeurs d'adresse IP et de port autorisées dans l'attribut XOR-PEER-ADDRESS -- si une valeur n'est pas autorisée, le serveur rejette silencieusement l'indication Send.
Si tout est correct, alors le serveur forme un datagramme UDP comme suit :
-
l'adresse de transport source est l'adresse de transport relayée de l'allocation, où l'allocation est déterminée par le 5-tuple sur lequel l'indication Send est arrivée
-
l'adresse de transport de destination est tirée de l'attribut XOR-PEER-ADDRESS
-
les données suivant l'en-tête UDP sont le contenu du champ de valeur de l'attribut DATA
Le traitement de l'attribut DONT-FRAGMENT (s'il est présent) est décrit dans la section 12.
Le datagramme UDP résultant est ensuite envoyé au pair.
10.3. Réception d'un datagramme UDP
Lorsque le serveur reçoit un datagramme UDP à une adresse de transport relayée actuellement allouée, le serveur recherche l'allocation associée à l'adresse de transport relayée. Le serveur vérifie ensuite si l'ensemble des permissions pour l'allocation permet le relais du datagramme UDP comme décrit dans la section 8.
Si le relais est autorisé, alors le serveur vérifie s'il existe un canal lié au pair qui a envoyé le datagramme UDP (voir section 11). Si un canal est lié, alors le traitement se poursuit comme décrit dans la section 11.7.
Si le relais est autorisé mais qu'aucun canal n'est lié au pair, alors le serveur forme et envoie une indication Data. L'indication Data doit contenir à la fois un XOR-PEER-ADDRESS et un attribut DATA. L'attribut DATA est défini sur la valeur du champ 'data octets' du datagramme, et l'attribut XOR-PEER-ADDRESS est défini sur l'adresse de transport source du datagramme UDP reçu. L'indication Data est ensuite envoyée sur le 5-tuple associé à l'allocation.
10.4. Réception d'une indication Data
Lorsque le client reçoit une indication Data, il vérifie que l'indication Data contient à la fois un XOR-PEER-ADDRESS et un attribut DATA, et rejette l'indication si ce n'est pas le cas. Le client devrait également vérifier que la valeur de l'attribut XOR-PEER-ADDRESS contient une adresse IP avec laquelle le client croit qu'il existe une permission active, et rejeter l'indication Data sinon. Notez que l'attribut DATA est autorisé à contenir zéro octet de données.
NOTE : Cette dernière vérification protège le client contre un attaquant qui parvient d'une manière ou d'une autre à tromper le serveur pour qu'il installe des permissions non désirées par le client.
Si l'indication Data passe les vérifications ci-dessus, le client transmet les octets de données à l'intérieur de l'attribut DATA à l'application, ainsi qu'une indication qu'ils ont été reçus du pair dont l'adresse de transport est donnée par l'attribut XOR-PEER-ADDRESS.