IUP GMI Licence Informatique Gilles Grimaud Jeremie Dequidt
TP Reseaux : Interrogation dun serveur DNS
Lobjectif de ce TP est de manipuler le protocole UDP en C et en Java et dinterroger un serveur DNS (serveur
qui traduit les adresses symboliques en adresses IP).
1 Le protocole UDP
On rappelle quUDP est un protocole de transport (couche 4 du modele OSI) sans connexion qui fonctionne
au dessus du protocole de reseau IP (couche 3 du modele OSI). Cest un protocole simple a mettre en oeuvre,
cependant il nest pas fiable (perte de messages, messages non ordonnes, . . .). Les messages quenvoit UDP sont
appeles datagrammes.
1.1 Recevoir un message UDP
Il sagit ici de recevoir un message transmis a laide du protocole UDP. En Java, les classes importantes pour
realiser ce programme sont :
La classe DatagramPacket et notamment 2 de ses constructeurs :
DatagramPacket(byte[] buf, int length, InetAddress address, int port);
cree un datagramme de length octets contenus dans buf. Ces octets seront envoyes a ladresse
address sur le port port.
DatagramPacket(byte[] buf, int length); cree un datagramme pour recevoir des donnees,
ces donnees seront stockees dans le buffer buf de taille length.
La classe InetAddress pour construire une adresse internet.
La classe DatagramSocket qui permet dobtenir une socket pour echanger des datagrammes (notamment
avec les methodes send et receive).
Question 1 : Ecrire un programme en Java qui recupere un datagramme UDP et qui affiche le message recu sous
forme dune chane de caracteres (on pourra utiliser le constructeur String(byte[]) ).
1.2 Emettre un message UDP
Il sagit ici de creer un message et de la transmettre a une autre machine en utilisant le protocole UDP. Pour definir
une adresse reseau en C, on utilise la structure sockaddr_in definie dans
Cette structure est definie comme suit :
struct sockaddr_in
{
short sin_family; /* famille dadresse = AF_INET */
u_short sin_port; /* port UDP ou TCP a utiliser */
struct in_addr sin_addr; /* 4 octets de ladresse internet */
char sin_zero[8]; /* doit valoir 0 */
};
Le champ sin_addr peut facilement etre obtenu avec la fonction inet_addr(const char *); qui a partir
dune adresse IP stockee dans une chane de caracteres retourne la structure in_addr correspondante.
Pour pouvoir echanger des messages avec le protocole UDP, vous avez besoin des fonctions suivantes (consulter
les pages du man pour obtenir les informations sur les differents parametres) :
/* Creation de la socket */
int socket(int domain, int type, int protocol);
1
/* Envoi dun message */
int sendto(int s, const void * msg, size_t len, int flags,
const struct sockaddr * to, socklen_t tolen);
/* Reception dun message */
int recv(int s, void * buf, int len, unsigned int flags);
Question 2 : ecrire un programme en C qui prend une chane de caracteres en argument. Ce programme devra
envoyer cette chane a laide du protocole UDP.
2 DNS : Domain Name Server
2.1 Introduction
DNS est un systeme hierarchique distribue permettant de traduire des adresses symboliques en adresses IP. Les
informations sont stockees sur des serveurs organises en domaines hierarchiques. Ainsi, un serveur peut deleguer
une partie des noms du domaine a un serveur subalterne.
On dit dun serveur de noms responsable de la mise a jour des correspondances nom / adresse IP des machines de
son domaine quil est serveur dautorite pour le domaine (Authorative Serveur).
Pour contacter un serveur DNS, les messages doivent etre envoyes avec le protocole UDP sur le port 53.
2.2 Les messages du protocole DNS
Les messages (requete ou reponse) du protocole DNS sont definis dans le RFC1035. La structure dun message est
la suivante :
En-tete specifie le type du message (taille fixe : 12 octets)
Question question posee au serveur de nom
Reponse reponse a la requete
Autorite information sur les serveurs dautorite
Additionnel informations complementaires
2.2.1 Champs den-tete dun datagramme UDP pour une resolution DNS
Identifiant Parametres
QDcount Ancount
NScount ARcount
Chaque champ de lentete est code sur 16 bits.
identifiant est un entier permettant didentifier la requete.
parametres contient les champs suivant :
QR (1 bit) : indique si le message est une question (0) ou une reponse (1).
OPCODE (4 bits) : type de la requete (0000 pour une requete simple).
AA (1 bit) : le serveur qui a fourni la reponse a-til autorite sur le domaine ?
TC (1 bit) : indique si le message est tronque.
RD (1 bit) : demande dune requete recursive.
RA (1 bit) : indique que le serveur peut faire une demande recursive.
UNUSED, AD, CD (1 bit chacun) : non utilises.
RCODE (4 bits) : code de retour. 0 : OK, 1 : erreur sur le format de la requete, 2 : probleme du serveur,
3 : nom de domaine non trouve (valide seulement si AA), 4 : requete non supportee, 5 : le serveur refuse
de repondre (raisons de securite ou autres).
2
QDCount : nombre de questions.
ANCount, NSCount, ARCount : nombre dentrees dans les champs Reponse, Autorite, Additionnel.
2.2.2 Champ de requete DNS dans un datagramme UDP
Une question est representee de la maniere suivante :
Label. Par exemple www.lifl.fr donne 0377 7777 046c 6966 6c02 6672. Les points ne sont
pas codes par contre on utilise des separateurs (02 03 04 . . .). Ainsi le premier octet 03 indique quil y a 3
octets avant le nouveau separateur (i.e. 77 77 77 soit www), de meme 04 indique quil y a 4 octets avant
le nouveau separateur (6c 69 66 6c soit lifl) et le dernier separateur (02) indique quil y a 2 octets
apres : 66 72 soit fr.
00 pour indiquer la fin du nom.
Type (16 bits) pour indiquer le type de la requete.
Class (16 bits) indique le type du protocole.
Exemple de requete (trame emise en faisant nslookup www.lifl.fr) :
08bb 0100 : identifiant 08bb parametre 0100 (requete recursive)
0001 0000 : 1 question, 0 reponse
0000 0000 : 0 autorite, 0 infos complementaire
0377 7777 : .w ww
046c 6966 : .l if
6c02 6672 : l. fr
00
00 01 : type (host address)
00 01 : class (internet)
Question 3 : ecrire une fonction (en Java) qui permet de creer une requete DNS et envoyez la a votre serveur
DNS (adresse dans /etc/resolv.conf) ou tout autre serveur DNS disponible (8.8.8.8, 8.8.4.4,
193.49.225.15, 193.49.225.90
2.2.3 Autres champs dun paquet DNS
Les champs Reponse, Autorite, Additionnel sont tous representes de la meme maniere :
Nom (16 bits) : Pour eviter de recopier la totalite du nom, on utilise des offsets. Par exemple si ce champ
vaut C0 0C, cela signifie quon a un offset (C0) de 12 (0C) octets. Cest-a-dire que le nom en clair se
trouve au 12eme octet du message.
Type (16 bits) : idem que pour le champ Question.
Class (16 bits) : idem que pour le champ Question.
TTL (32 bits) : duree de vie de lentree.
RDLength (16 bits) : nombre doctets de la zone RDData.
RDData (RDLength octets) : reponse
Question 4 : toujours en Java, recuperer la trame de retour fournie par le serveur, lafficher a lecran, lanalyser
et isoler ladresse IP.
Question 5 : en Java, ecrire une methode statique qui prend une adresse symbolique sous la forme dune chane
de caracteres (type String) et retourne une adresse IP sous la forme dun entier (type int, 32 bits).
Question 6 : faire la meme chose en C.
3
Reviews
There are no reviews yet.