Aller au contenu

TP4 : TCP/UDP & Linux

Objectifs

Le but de ce travail pratique est de se familiariser avec les protocoles TCP et UDP afin d’intégrer les notions importantes liées au fonctionnement de la couche 4. Le TP se déroule sur une machine virtuelle Linux : vous y découvrirez le système, vous échangerez des messages en TCP et en UDP avec un serveur de chat en observant le trafic, puis vous simulerez un réseau qui perd des paquets pour comparer la fiabilité des deux protocoles.

Rappel

Ne restez pas bloqués trop longtemps sur une question. Si vous êtes bloqués, demandez de l’aide à votre enseignant ou à vos camarades.

Conseil : réalisez les mesures dans un premier temps, en prenant soin de noter grossièrement vos observations. Vous pourrez ensuite répondre calmement aux questions en vous basant sur vos notes et vos mesures.

Connexion à la machine virtuelle

Le travail s’effectue sur un système d’exploitation Linux. Chaque groupe s’est vu attribuer une machine virtuelle dans un cluster de virtualisation de l’école, et l’objectif est de s’y connecter à distance avec le protocole SSH (Secure Shell).

Les attributions sont les suivantes pour chaque groupe :

Hostname Groupe IP
teleinfo-vm-1 G1 160.98.37.66
teleinfo-vm-2 G2 160.98.37.225
teleinfo-vm-3 G3 160.98.37.197
teleinfo-vm-4 G4 160.98.37.48
teleinfo-vm-5 G5 160.98.37.68

Connexion à distance sur une machine virtuelle

  • Téléchargez la clé SSH privée tp04 ici. Attention, normalement, ce fichier n’est JAMAIS partagé. Trouvez comment l’utiliser dans la commande suivante.
  • Commande pour se connecter à distance: ssh ubuntu@ip (dans le terminal)
  • Si le serveur vous demande de valider l’empreinte digitale (fingerprint) du serveur, répondez yes.

Connectez-vous en SSH sur votre serveur Linux.

Pour toutes les questions suivantes, détaillez correctement TOUTES les commandes que vous utilisez. Il faut que toutes les commandes apparaissent.

Partie 1 : Découverte de Linux

Déplacez-vous à la racine du système de fichiers et vérifiez-le avec une commande. Listez ensuite les fichiers avec leurs permissions. Déplacez-vous enfin dans le dossier /tmp et créez un dossier heia.

Question Q1 (1.5pts)

Quelles commandes avez-vous utilisées ? Expliquez en détail ce que vous voyez dans le listing de la racine. Est-ce que le dossier /tmp est un dossier spécial ? Si oui, pourquoi ? Expliquez ses permissions.

Dans /tmp/heia, créez 3 fichiers a.txt, b.txt, c.txt avec chacun un texte différent, en une seule commande. Copiez ensuite le dossier /tmp/heia et son contenu dans /home/ubuntu/heia, en une seule commande également.

Question Q2 (1pt)

Quelles commandes avez-vous utilisées ? Expliquez-les.

Listez les interfaces réseau de votre machine virtuelle et sa table de routage.

Question Q3 (1.5pts)

Quelles commandes avez-vous utilisées ? Quel est le nom de l’interface réseau qui relie la VM au reste du réseau (vous l’utiliserez dans la suite du TP) ? Sur quel réseau est-elle connectée ? Donnez les caractéristiques du réseau (netmask, adresse réseau, adresse de broadcast, gateway…).

Partie 2 : TCP & UDP

Un serveur de chat écoute sur le port 9000, en TCP et en UDP, à l’adresse 160.98.37.115. Vous allez l’utiliser depuis votre machine virtuelle avec nc et mesurer le trafic réseau.

Ce que le serveur fait est très simple : tous les messages qu’il reçoit, il les renvoie à tous les clients connectés. Il permet d’effectuer deux commandes simples :

  • /help : affiche l’aide avec la liste des commandes disponibles.
  • /who : liste tous les clients connectés.

La situation réseau est illustrée par la figure 1. Un étudiant du groupe utilise son laptop comme “poste A”, et le second utilise son laptop comme “poste B”. Chaque poste étant connecté par SSH au serveur Linux du groupe. Pour un étudiant effectuant le TP seul, il peut ouvrir les deux terminaux sur son laptop pour simuler les postes A et B.

Situation réseau

Figure 1 : Situation réseau

Linux embarque la commande tcpdump qui permet de faire des captures de paquets réseau en temps réel, de les filtrer selon différents critères et de les enregistrer dans des fichiers pour une analyse ultérieure (capture .pcap, comme avec Wireshark). Pour récupérer vos fichiers de capture .pcap depuis la machine virtuelle, vous pouvez utiliser la commande scp pour les copier sur votre machine locale. Par exemple :

scp ubuntu@<adresse_ip_vm>:/home/ubuntu/annexe-01.pcap .

Vous devrez ajouter une option à la commande scp pour spécifier la clé privée, comme pour la commande ssh plus tôt.

Avant de passer à la suite, essayez simplement de vous connecter au serveur en TCP avec la commande suivante :

nc 160.98.37.115 9000

Pour envoyer un message, tapez simplement le texte et appuyez sur Entrée.

Échange TCP

La première capture correspond à l’échange TCP entre le client et le serveur.

  1. Terminal A, lancez la capture : sudo tcpdump -i ens3 -n -S -w annexe-01.pcap --print tcp port 9000
  2. Terminal B, connectez-vous au chat en TCP : nc 160.98.37.115 9000.
  3. Terminal B, envoyez un message, puis /who, et reportez le résultat. Qui est listé ?
  4. Terminal B, quittez nc avec Ctrl+C.
  5. Terminal A, arrêtez la capture avec Ctrl+C.
  6. Terminal A, avec ls vérifiez que le fichier annexe-01.pcap a bien été créé.

Annexe 01

Cette mesure sera l’annexe 01 de votre rapport.

Question Q4 (1pt)

Que signifient les options utilisées pour tcpdump et nc ? Que se passe-t-il dans chacun des deux terminaux ?

Question Q5 (1pt)

Quel port source votre VM a-t-elle utilisé, et qui l’a choisi ?

Question Q6 (3pts)

Faites un diagramme en flèches de l’établissement de la connexion, d’un échange /who et de la fin de connexion. Indiquez pour chaque segment les flags TCP (comment tcpdump les note-t-il ?) ainsi que les numéros de séquence et d’acquittement.

Question Q7 (0.5pt)

Dans wireshark, sélectionnez un segment TCP et ouvrez “Analyse > Suivre > Flux TCP”. Décrivez ce que vous observez dans la fenêtre qui s’ouvre (Couleurs, contenu, etc.)

Échange UDP

La capture suivante correspond à l’échange UDP entre le client et le serveur.

  1. Terminal A, lancez la capture : sudo tcpdump -i ens3 -n -A -w annexe-02.pcap --print udp port 9000
  2. Terminal B, nc -u 160.98.37.115 9000.
  3. Terminal B, envoyez un message, puis /who, et reportez le résultat.
  4. Terminal B, quittez nc avec Ctrl+C.
  5. Terminal A, arrêtez la capture avec Ctrl+C.

Annexe 02

Cette mesure sera l’annexe 02 de votre rapport.

Question Q8 (2pts)

Faites un diagramme en flèches de l’échange capturé. Quelles différences voyez-vous avec l’échange TCP (ouverture, fermeture, acquittements) ?

Question Q9 (1.5pts)

Recevez-vous les messages d’autres utilisateurs du chat en UDP ? Pourquoi ou pourquoi pas ? Avez-vous reçu le message de bienvenue de la part du serveur en UDP ? Pourquoi ?

Question Bonus (2pts)

Sans faire de capture, lancez la commande ci-dessous dans l’un des terminaux et décrivez ce que vous observez (que fait strace ?) :

strace -e trace=network nc -N 160.98.37.115 9000

A présent, faites de même avec udp :

strace -e trace=network nc -u -N 160.98.37.115 9000

Quelle différence entre les deux observations remarquez-vous ? Pourquoi ?

Et si personne n’écoute ?

Utilisez à présent le port de destination 9001 sur lequel le serveur n’écoute pas.

  1. Terminal A, écoutez le port 9001 en udp ET tcp : sudo tcpdump -i ens3 -n -w annexe-03.pcap --print host 160.98.37.115 and port 9001 or icmp
  2. Terminal B, tentez de vous connecter en TCP : nc 160.98.37.115 9001, puis en UDP : nc -u 160.98.37.115 9001 (tapez un message)
  3. Terminal A, arrêtez la capture avec Ctrl+C.

Annexe 03

Cette mesure sera l’annexe 03 de votre rapport.

Question Q10 (1.5pts)

Comment chaque protocole vous informe-t-il qu’aucun service n’écoute ?

Partie 3 : Réseau avec pertes, TCP vs UDP

Jusqu’ici, le réseau était fiable. Nous allons maintenant simuler un réseau qui perd des paquets avec tc (traffic control), qui configure directement le noyau Linux de votre VM.

A partir d’ici, A se connecte avec deux terminaux : l’un pour la capture (“A-1”) et l’autre pour l’envoi des messages (“A-2”). B reste connecté au chat en TCP et note ce qui arrive.

Préfixe des messages

Le chat est commun à toute la classe. A partir d’ici, préfixez vos messages avec votre numéro de groupe (G3 dans les exemples ci-dessous, à remplacer par le vôtre). Cela permet à B de n’afficher que les messages de son groupe : nc 160.98.37.115 9000 | grep G3-

Mise en place de B

  1. Terminal B : nc 160.98.37.115 9000 | grep G3- (remplacez G3 par votre numéro de groupe)
  2. Tout au long de l’expérience, observez et relevez le comportement des messages envoyés par A.

Mise en place des pertes (A)

Les pertes ne s’appliquent qu’aux paquets émis depuis le port local 40000, que A utilisera pour ses envois. Ni votre session SSH, ni la connexion de B ne sont touchées. Depuis le terminal A-1, exécutez les commandes suivantes :

sudo tc qdisc add dev ens3 root handle 1: prio
sudo tc qdisc add dev ens3 parent 1:3 handle 30: netem loss 30%
sudo tc filter add dev ens3 parent 1: protocol ip u32 match ip sport 40000 0xffff flowid 1:3

Petite explication :

  1. La première commande remplace la file d’attente de sortie de ens3 par une file à 3 bandes de priorité.
  2. La deuxième accroche à la 3ᵉ bande un émulateur réseau (netem) qui jette 30 % des paquets.
  3. La troisième envoie dans cette bande les paquets IP dont le port source est 40000.

À la fin de la partie 3

Supprimez les pertes : sudo tc qdisc del dev ens3 root lorsque vous avez terminé la partie 3 du TP.

UDP avec pertes

  1. Terminal A-1 : sudo tcpdump -i ens3 -n -w annexe-04.pcap --print udp port 40000
  2. Terminal A-2 : envoyez 30 messages numérotés depuis le port 40000 (-p) avec la commande suivante :

    for i in $(seq 1 30); do echo "G3-udp-$i"; sleep 0.3; done | nc -u -w 1 -p 40000 160.98.37.115 9000

  3. Terminal B : observez les messages reçus.

  4. Terminal A-1 : arrêtez la capture.

Annexe 04

Cette mesure sera l’annexe 04 de votre rapport.

Question Q11 (1.5pts)

Combien de messages B a-t-il reçus ? Combien de datagrammes voyez-vous dans la capture de A ? Expliquez le résultat.

TCP avec pertes

  1. Terminal A-1 : sudo tcpdump -i ens3 -n -w annexe-05.pcap --print tcp port 40000
  2. Terminal A-2 : l’option -N ferme la connexion dès que la boucle est terminée ; sans elle, nc resterait connecté.

    for i in $(seq 1 30); do echo "G3-tcp-$i"; sleep 0.3; done | nc -N -p 40000 160.98.37.115 9000

  3. B note les messages reçus et la façon dont ils arrivent.

Annexe 05

Cette mesure sera l’annexe 05 de votre rapport.

Question Q12 (2pts)

B a-t-il reçu tous les messages ? A quel rythme ? Pourquoi ?

Question Q13 (1.5pts)

Dans la capture, comment repérez-vous une perte ? Décrivez ce que vous observez et comment vous l’interprétez.

Pour aller plus loin

Dans le terminal A-1, appliquez les commandes suivantes. Cela permettra de simuler des duplications et des réordres de paquets.

sudo tc qdisc change dev ens3 parent 1:3 handle 30: netem duplicate 30%
sudo tc qdisc change dev ens3 parent 1:3 handle 30: netem delay 500ms reorder 50%

Cette partie ne nécessite pas d’être capturée avec tcpdump.

  1. Terminal A-2 : envoyez d’abord les messages en UDP :

    for i in $(seq 1 30); do echo "G3-udp-$i"; sleep 0.3; done | nc -u -p 40000 160.98.37.115 9000

  2. Terminal A-2 : envoyez ensuite les messages en TCP :

    for i in $(seq 1 30); do echo "G3-tcp-$i"; sleep 0.3; done | nc -N -p 40000 160.98.37.115 9000

  3. Terminal B : notez les messages reçus et la façon dont ils arrivent.

Question Q14 (1.5pts)

Que voit B en UDP et en TCP lorsque des paquets sont dupliqués ? Lorsqu’ils arrivent dans le désordre ? Quel mécanisme de TCP permet de corriger ces deux problèmes ?


Partie 4 : Programmer un client

On vous fournit client.py, un client de chat presque complet, compatible TCP et UDP. Il est écrit en Python 3. Si vous ne connaissez pas Python, ce n’est pas grave, les modifications à apporter sont minimes. N’hésitez pas à vous aider d’Internet.

Il est téléchargeable ici : client.py. Trouvez un moyen de le télécharger directement sur votre machine virtuelle.

Question Q15 (0.5pt)

Comment téléchargez-vous client.py sur votre machine virtuelle ?

Une fois téléchargé, vous pouvez le modifier avec un éditeur de texte comme nano ou vim :

nano client.py

Il reste 2 parties à compléter (TODO 1 et TODO 2). Trouvez un moyen de rechercher ces parties dans le fichier client.py, quel que soit l’éditeur que vous utilisez.

Question Q16 (0.5pt)

Comment trouvez-vous les parties TODO dans client.py ? Répondez uniquement pour nano ou vim en fonction de l’éditeur que vous avez choisi.

Ne répondez pas que vous avez simplement scrollé dans le fichier, ça, je sais que vous savez le faire :-)

Complétez les parties marquées TODO dans client.py, puis essayez de l’exécuter :

python3 client.py 160.98.37.115 9000 tcp
python3 client.py 160.98.37.115 9000 udp

Question Q17 (2pts)

Expliquez comment vous avez complété client.py.

Question Q18 (1pt)

Vous aurez remarqué que le client fonctionne sur le même serveur que pour les parties précédentes. Que pouvez-vous en déduire au niveau du modèle OSI ?

Rendu

Rendu

  • Délais de rendu : Lu 26.10.2026 à 23:59 (toute minute de retard sera pénalisée)
  • Le rapport au format PDF
  • Les captures Wireshark et tcpdump au format .pcap ou .pcapng. N’oubliez pas de les renommer selon la nomenclature.
  • A envoyer par mail à l’adresse vincent.audergon@hefr.ch avec en copie tous les autres membres du groupe de laboratoire.
  • Nomenclatures selon les consignes données dans la page “Rapports” de ce site (documents, annexes, mail !).

Bonus

Pour les curieuses et les curieux, voici le code source du serveur server.py : server.py

Pour celles et ceux qui veulent aller plus loin avec vim, difficile en apparence, mais très puissant une fois maîtrisé, vous pouvez jouer à ce petit jeu en ligne : Vim Adventures