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 :
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.
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.
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
Expliquez les opérations relatives aux ByteBuffer
et
DatagramChannel
:
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.
Créez une classe TCPNSLookup qui permet d'interroger le même serveur.
Expliquez les différences entre le client basé sur UDP et le client basé sur TCP.
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.
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).
Expliquez vos choix :
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.
Si l'on avait utilisé des threads au lieu d'un selector :