TP Noté 2014 : DNS

Consignes

Commencez par créer un nouveau projet Java dans votre environnement Eclipse que vous appelez tpnote-VotreNom. Créez aussi dans cette arborescence du projet un fichier readme.txt dans lequel vous mettez vos notes et les réponses aux questions.

Le barème est donné à titre d'indication.

Les exercices sont assortis de questions de compréhension auxquelles vous devez répondre par écrit dans le fichier readme.txt.

En fin de TP :

  1. si ce n'est pas déjà fait, créez un fichier readme.txt dans lequel vous mettez vos notes à destination des correcteurs ;
  2. exportez votre projet Eclipse sous la forme d'une archive :
  3. télé-chargez le fichier sur moodle afin de fournir le résultat de votre travail ;
  4. vérifiez avec l'enseignant présent dans la salle que le fichier téléchargé est correct.

Énoncé

Le Domain Name Service permet, entre autres, de faire la traduction des chaînes de caractères identifiant les machines et les services en des adresses IP. Pour information, les requêtes et les réponses DNS font au plus 512 octets.

1. Partie client DNS via UDP (6 pts)

Cette partie consiste à terminer l'écriture de clients pour envoyer des requêtes à un serveur DNS.

Pour cette étape, créez le paquetage dnsquery, qui contiendra les clients.

Récupérez le fichier dnsarchive.zip et stockez-le dans votre répertoire de téléchargement. Puis, double cliquez dessus avec le navigateur de fichiers. Cette archive s'ouvre dans le gestionnaire d'archive. Extrayez son contenu au niveau du projet que vous avez créé dans le répertoire src. Ensuite, mettez à jour le projet Eclipse (touche F5). Vous devez voir apparaître deux paquetages, appelés dns et dns.record.

Les différentes classes de ces deux paquetages permettent de décoder les données DNS.

Question 1.1 : complétez un client basé sur UDP

Récupérez la classe UDPNSLookupBase et placez-la dans le paquetage par défaut de votre projet Eclipse.

Cette classe contient une fonction main qui reçoit en argument une chaîne de caractères structurée de la manière suivante :

Cette classe construit une requête DNS qui récupère et décode l'ensemble des informations connues sur le nom de machine fourni auprès du serveur DNS référencé par l'adresse IP.

Le fichier UDPNSLookupBase.java contient la base de code que vous devez modifier et compléter en suivant les annotations TODO :

Une fois les modifications terminées, l'exécution de votre classe avec l'argument « www.int-evry.fr@157.159.10.12 » doit donner un résultat proche des lignes suivantes :

Nameserver: 157.159.10.12
Request: www.int-evry.fr

Authoritative answer:

www.int-evry.fr	canonical name = www.it-sudparis.eu

Authoritative answers can be found from:

int-evry.fr	nameserver = ns1.int-evry.fr
int-evry.fr	nameserver = shiva.jussieu.fr
int-evry.fr	nameserver = diamant.int-evry.fr
int-evry.fr	nameserver = dns.univ-orleans.fr

Additional information:

dns.univ-orleans.fr	internet address = 194.167.30.130
ns1.int-evry.fr	internet address = 157.159.11.52
shiva.jussieu.fr	internet address = 134.157.0.129
diamant.int-evry.fr	internet address = 157.159.10.12

Questions 1.2 : donnez des explications relatives à la question 1.1

Expliquez les opérations relatives aux ByteBuffer et DatagramChannel :

  1. quand et pourquoi utilisez-vous la méthode clear ?
  2. quand et pourquoi utilisez-vous la méthode flip ?
  3. qu'elle est la logique des enchaînements d'appels dans la méthode sendQuery ?
  4. qu'elle est la logique des enchaînements d'appels dans la méthode getResponse ?

Question 2 : modifiez le client en utilisant le protocole TCP (5 pts)

Les serveurs doivent accepter les connexions avec TCP pour permettre la transmission d'informations dont la taille est supérieure à 512 octets.

Lorsque le mode connecté avec TCP est utilisé, les messages contenant les requêtes et les réponses ont une entête sur deux octets qui contient la taille du message et qui est décodée comme un entier court.

Question 2.1 : modifiez le client

Créez une classe TCPNSLookup qui permet d'interroger le même serveur.

Question 2.2 : expliquez les différences

Expliquez les différences entre le client basé sur UDP et le client basé sur TCP.

Question 3 : constituez un serveur relais UDP (4 pts)

Un serveur relais accepte les requêtes de clients et transmet ces requêtes vers un serveur. Un serveur relais constitue un cache de données et peut ainsi minimiser les requêtes vers les autres serveurs. Il n'est pas demandé de travailler sur la partie cache de données.

Question 3.1 : écrivez le serveur

Créez une classe UDPNSrelay qui peut recevoir des requêtes DNS et qui les relaye vers un autre serveur.

Ce serveur accepte les requêtes sur le port 2053 et les transmet vers le serveur DNS habituel. Lorsqu'il reçoit une réponse du serveur, il doit transmettre cette réponse au bon client. Pour cela, il est nécessaire de tenir à jour une table avec le couple (question, client).

Question 3.2 : expliquez vos choix

Expliquez vos choix :

  1. comment avez-vous choisi de transmettre les données vers le serveur ?
  2. quelles structures de données utilisez-vous pour mémoriser les requêtes et les clients ?

Question 4 : évitez les points de blocage dans votre serveur relais (5 pts)

Votre serveur relais doit être capable de recevoir une requête ou une réponse à tout moment. Il doit par exemple pouvoir recevoir des requêtes alors qu'il est en attente de réponse de la part du serveur.

Pour ajouter cette fonctionnalité à votre serveur, vous devez créer une solution à base de Selector.

Question 4.1 : écrivez le code

Question 4.2 : question

Si l'on avait utilisé des threads au lieu d'un selector :

  1. combien de threads vous aurait-il fallu ?
  2. quels auraient été leurs rôles ?