TP pile TCP/IP (2)

Pile TCP/IP (seconde partie) #

Dans la seconde partie de ce TP, nous proposons d’observer et de comprendre certains principes de fonctionnement d’un réseau TCP/IP. Nous verrons en particulier :

  • ce que sont les numéros de ports TCP
  • les protocoles HTTP, DNS
  • le principe d’une connexion TCP
Certains faits nouveaux, dont je n’aurais pas eu connaissance, peuvent gêner le bon déroulement de ce TP. Si vous constatez que des manipulations ne fonctionnent pas ou plus, merci de me le signaler.
Afin de faciliter la correction de ce travail, merci d’indiquer clairement les numéros des questions dans votre compte-rendu.

Protocole HTTP #

Le protocole HTTP est celui utilisé sur le web. Il permet de récupérer le contenu d’URL. Une page Web ordinaire est un texte. Dans ce texte peuvent figurer des références à des images, des sons, des animations Flash, des applets Java… Dans un navigateur Web, entrez l’URL suivante : http://deptinfo-ensip.univ-poitiers.fr/demo/page2.html

La page qui apparaît contient texte et image. Vous pouvez voir ce qui a été réceptionné par votre navigateur en affichant le source de la page (du texte, balisé en HTML)

Question 1-1 Fournissez une copie d’écran du source de la page en question.
Question 1-2 À votre avis, combien de requêtes HTTP (GET) le navigateur a-t-il envoyé au serveur (et pour obtenir quoi ?) lors de l’affichage de la page http://deptinfo-ensip.univ-poitiers.fr/demo/page2.html pour la première fois ? Vous pouvez le déduire de la page, l’observer avec Wireshark, ou bien utiliser la console développeur de votre navigateur. Attention toutefois à prendre en compte le fait que le navigateur a un cache. La plupart du temps, on peut forcer le rechargement d’une page sans utilisation du cache avec le raccourci clavier Ctrl+Shift+R.

Nous allons maintenant simuler un navigateur Web et nous mettre à la place d’un client HTTP. Pour ça nous utiliserons un logiciel qui permet de réaliser des connexions TCP. Il y en a plusieurs : PuTTY (Windows) ou les commandes telnet ou nc (Linux, MacOS) permettent de se connecter en mode texte vers une machine distante et sur un port arbitraire.

Voici des exemples de connexion sur le port 80 de deptinfo-ensip.univ-poitiers.fr en utilisant telnet :

telnet deptinfo-ensip.univ-poitiers.fr 80

ou netcat :

nc deptinfo-ensip.univ-poitiers.fr 80

ou bien en utilisant Putty :

Lorsque vous êtes dans la fenêtre de terminal de Putty (la fenêtre noire), vous pouvez, sous Windows, y copier ce qui est dans le presse-papier. Pour cela, il suffit de cliquer sur le bouton droit de la souris.

Dans les trois cas, vous êtes connecté mais rien ne se passe, le serveur attend vos instructions. À présent entrez les lignes suivantes (sans faute):

GET /demo/page2.html HTTP/1.0
Host: deptinfo-ensip.univ-poitiers.fr

puis validez deux fois… Le serveur Web répond et ce que vous voyez est bien le source de la page tel qu’il était dans le navigateur.

Question 1-3 Fournissez une capture d’écran de votre connexion, quel que soit le logiciel utilisé.
Question 1-4 Expliquez la signification de la première ligne que vous avez entrée : GET ...
Question 1-4 Comment faire pour récupérer, par le même principe (telnet, nc, ou PuTTy), l’image qui figure dans la page ? Faites le et expliquez ce que vous obtenez. Fournissez une capture d’écran. Quelle est la taille en octets de l’image que vous avez essayé de récupérer ?

Lorsque le serveur Web répond, il donne, en tout début de réponse, des informations supplémentaires (qu’on ne retrouve pas dans le source de la page et qui constituent le header HTTP).

Question 1-5 Quel logiciel (et en quelle version) est utilisé actuellement comme serveur Web sur deptinfo-ensip.univ-poitiers.fr.
Question 1-6 Essayez de déterminer le type de logiciel serveur qui sert les pages de http://www.univ-poitiers.fr et de http://ensip.univ-poitiers.fr.

Question 1.7 Dans sa requête, votre navigateur transmet des informations sur sa nature. Pour observer ces informations, il faut consulter une page (par exemple http://deptinfo-ensip.univ-poitiers.fr/demo/page2.html) et capturer les trames avec Wireshark. Puis, recherchez la trame contenant la requête GET et voyez les information supplémentaires envoyées par le navigateur (utilisez l’option Follow TCP Stream pour faciliter la lecture).

La console développeur de votre navigateur vous donne aussi peut-être ces informations.

Donnez aussi une copie d’écran qui permet de vérifier ce que vous avancez.

À présent, vous allez consulter la page suivante, à partir de votre navigateur : https://deptinfo-ensip.univ-poitiers.fr/demo/page2.html Notez bien le https au début.

Question 1-8 Quel est le port utilisé ?

Lancez Wireshark, filtrez le bon port, et capturez les trames échangées lorsque vous communiquez avec le serveur.

Question 1-9 Fournissez une copie d’écran de la capture. Arrivez-vous à trouver la trame qui contient la commande GET ? Si oui, mettez-la en évidence dans le rapport. Si non, expliquez pourquoi.

Ports #

Les numéros de port TCP permettent de cibler telle ou telle application sur une machine serveur. Ces numéros sont plus ou moins normalisés. Le port pour le web (HTTP) est 80 comme nous venons de le voir, celui pour lire ses mails via POP3 est 110, celui pour envoyer des mails via SMTP est 25, celui pour se connecter en SSH est 22… La machine A lorsqu’elle communique via TCP pour lire une page web s’adressera au port 80 de la machine B. Sur la machine B, on dira que le serveur web écoute sur le port 80.

Sur une machine de type serveur, il y a donc en permanence des programmes (couche application) qui écoutent sur certains ports, en attendant les connexions. Par exemple, le programme Apache, qui est un serveur web écoute généralement le port 80, et postfix qui est un agent de transport de mail écoute le port 25.

Il y a de nombreux autres programmes qui tournent ainsi en permanence et écoutent certains ports, même sur des machines qui ne sont pas des serveurs. Pour connaître la correspondance (simple convention) entre un numéro de port et le service qui est généralement associé, on pourra consulter : http://www.iana.org/assignments/port-numbers.

Un programme qui permet, depuis une machine A de savoir quels sont les ports ouverts sur une machine B s’appelle un scanneur de ports. L’utilisation d’un tel logiciel est soumise à condition. En dehors d’exercices pédagogiques (!) seul l’administrateur d’un réseau peut scanner des ports, et uniquement ceux de ses propres machines.

En conséquence…. réfléchissez aux manipulations que vous faites avant de les faire.

Scanner des ports #

Pour scanner les ports d’une machine, vous pouvez utiliser nmap (en ligne de commande on avec son interface graphique Windows zenmap) ou bien nc (utilitaire netcat).

Pour scanner les ports 100 à 200 de la machine 192.168.81.50 on peut procéder ainsi :

  • nmap -p 100-200 192.168.81.50
  • nc -vz 192.168.81.50 100-200

Question 2-1 Déterminez quels sont les ports ouverts sur les postes :

  • 192.168.8X.X (choisissez un poste dans la salle)
  • 192.168.81.131
  • 192.168.81.1

Identifiez les fonctions associées à ces ports en utilisant le site web donné plus haut ou les indications donnés par le scanneur de ports.

Le programme PuTTY permet de se connecter en ssh sur une machine distante (port 22, type de connexion : SSH).

Avec linux ou macos, utilisez simplement la commande ssh suivie de l’IP à laquelle vous connecter.

Question 2-2 Essayez de vous connecter en ssh sur les machines suivantes :

  • 192.168.8X.X (choisissez un poste (allumé) dans la salle)
  • 192.168.81.131

Qu’est ce qui marche/ne marche pas et pourquoi selon vous ?

Le scanneur vérifie juste qu’un port est ouvert, et vous indique le service qui correspond généralement. Mais ça ne signifie pas que c’est ce service qui tourne effectivement. Pour le savoir, il faut essayer. Si vous pensez qu’il y a un serveur SSH, essayez de vous connecter en SSH, si vous pensez qu’il y a un serveur Web, essayez de vous connecter en HTTP (avec un navigateur ou en ligne de commande)…

Question 2-3 En utilisant PuTTY, telnet ou nc, vérifiez, pour la machine 192.168.81.131 que les services qui tournent sont bien ceux que vous avez identifié. Quel service/fonctionnalité avez-vous découvert ?

Question 2-4 Il y a une imprimantes dans votre réseau. Les postes communiquent avec l’imprimante en se connectant généralement sur les ports printer spooler ou jetdirect. Recherchez à quels numéros correspondent ces services, puis repérez l’imprimante en recherchant ces ports ouverts. Vous devez indiquer dans votre rapport la commande utilisée pour scanner.

Attention de ne pas faire un scan «sauvage» de tout le réseau. Demandez avant de lancer votre commande.

Quel est le modèle de cette imprimante ?

Trames TCP #

Nous avons vu que toute connexion TCP était initiée par une phase d’échange nommée three way handshake. Ce qui suit a été obtenu de la façon suivante : Une première machine (10.16.90.70) utilise un navigateur Web pour regarder le contenu de la page (qui n’existe plus maintenant) http://wwwesip2.univ-poitiers.fr/accueil.php. Une autre machine, non loin de là, utilise Wireshark et capture toutes les trames dont la source ou la destination est 10.16.90.70 :

Nous avons capturé… 70 trames pour un simple affichage de page web…. En effet, une seule trame ne peut pas contenir toutes ces informations. C’est là qu’intervient le protocole TCP…. Le navigateur web (application) est basé sur le protocole HTTP (HyperText Transfert Protocol), lui même basé sur TCP (Transmission Control Protocol), lui même basé sur IP (Internet Protocol)… Le but de TCP est d’établir une connexion (TCP est un protocole orienté connexion) “courtoise” avec une machine distante, de découper les informations provenant du protocole supérieur en morceaux, qu’il donnera à IP pour qu’il les transmette. De plus, TCP vérifie que chaque morceau a été correctement transmis et reçu. Il s’occupe aussi de remettre les segments dans l’ordre lors d’une réception (en effet, les informations, étant transmises «par morceaux», peuvent ne pas suivre la même route et il se peut que leur ordre d’arrivée ne soit pas leur ordre de départ….).

Après avoir vidé le cache de votre navigateur, lancez Wireshark, réglez correctement les filtres et consultez la page suivante ; http://deptinfo-ensip.univ-poitiers.fr/demo/champernowne/index.html. Vous allez devoir analyser le résultat obtenu dans Wireshark.

Question 3-1 Repérez un three way handshake TCP, mettez le en surbrillance et donnez une copie d’écran. Durant cet échange, client et serveur synchronisent leurs numéros de séquence respectifs. Indiquez les numéros de séquence initiaux réels du client et du serveur. Faites en sorte qu’on puisse vérifier votre résultat à partir de copies d’écran que vous fournirez.
Question 3-2 Donnez une copie d’écran qui montre (surbrillance) la fin d’une connexion TCP. Il est possible que votre navigateur ne se déconnecte pas (au sens de TCP) après avoir fait des requêtes sur le serveur. Si c’est le cas, faites la requête manuellement (avec Putty) pour observer la déconnexion.

Un peu d’imagination ? #

Vous avez dû découvrir un service sur le port 8081 de 192.168.81.131. Si ce n’est pas le cas… revenez en arrière, et reprenez la question qui vous demande de découvrir ces services.

Indiquez à l’enseignant que vous êtes à la question 4-1.

Question 4-1 Une fois le type de service identifié, connectez-vous et testez la fonctionnalité. Proposez une explication du fonctionnement de ce service.

Résolution de noms #

Lorsque vous consultez une page sur deptinfo-ensip.univ-poitiers.fr avec un navigateur Web, les datagrammes IP émis ne contiennent pas le nom de la machine, mais son adresse IP.

Question 5-1 Quelle est l’adresse IP de deptinfo-ensip.univ-poitiers.fr ? Pour s’y connecter, votre machine a besoin de son adresse IP. OR vous n’avez fourni que le nom. Comment votre machine a-t-elle obtenue l’adresse IP de deptinfo-ensip.univ-poitiers.fr ? (non, pas en la pinguant…)

Donnez des trames capturées montrant ce mécanisme.

Vous pouvez voir le serveur DNS que votre machine utilise en entrant ipconfig /all (Windows) ou cat /etc/resolv.conf (Linux).

Notons que le protocole DNS fait partie de la couche application et qu’il n’est pas basé sur TCP comme HTTP, mais sur UDP. UDP a la même fonction que TCP mais ne s’occupe pas, en particulier, de vérifier que la transmission s’est faite correctement ou que tout ce qui a été envoyé a été reçu.

Question 5-2 Identifiez votre DNS par défaut (copie d’écran) et réalisez une capture d’une requête. Vous prendrez comme exemple une requete concernant www.google.fr. Analysez ensuite la reponse du DNS concernant www.google.fr.

Bonus #

Question 6-1 Indiquez à l’encadrant que vous en êtes à la question Bonus. Essayez de consulter quelques pages Webs, puis déterminez pourquoi votre machine ne fonctionne plus correctement.