Vous devez obligatoirement déposer un compte rendu illustré individuel pour chaque TP au format TPi.[pdf|odt|docx] sur Moodle.
Vous pouvez compléter vos TP après une séance en déposant un nouveau fichier TPiv2.[pdf|odt|docx].
Comprendre les fonctionnalités du protocole de transport TCP :
Comprendre les fonctionnalités du protocole de transport UDP :
Une machine virtuelle avec les droits d'administration en mode bridge.
Le protocole TCP est un protocole orienté connexion : il y a donc une phase d'établissement de la connexion qui précède les échanges d'informations entre la source et le destinataire, cette phase d'échanges terminée la connexion se termine par une phase de fermeture de la connexion.
Le protocole UDP est un protocole non orienté connexion : les informations à transmettre sont envoyées telles quelles, aucune phase d'établissement de la connexion, aucune fermeture.
À mettre dans votre compte rendu.
netstat -ln
Bien étudier les options de la commande netstat, netstat -tn, netstat -lnt.
Ouvrez plusieurs connexions SSH ou FTP ou consulter un même site depuis plusieurs onglets d'un navigateur web.
Comme vu en cours, une connexion est identifiée par un couple <adresse ip, numéro de port> appelé socket (une "prise" en français)
Créez un fichier Client.java contenant le code suivant
import java.io.*; import java.net.Socket; public class Client { public static void main(String[] args) throws IOException { try (Socket s = new Socket("localhost", 53200)) { BufferedReader br = new BufferedReader( new InputStreamReader(s.getInputStream(), "utf-8")); System.out.println("Message reçu du serveur : " + br.readLine()); } catch (IOException e) { System.err.println("Connexion au serveur impossible"); } } }
Créez un fichier Serveur.java contenant le code suivant
import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Serveur { public static void main(String[] args) throws IOException { ServerSocket socketEcoute = new ServerSocket(53200); while (true) { System.out.println("En attente de client....."); try (Socket socketService = socketEcoute.accept()) { System.out.println("Un client s'est connecté (" + socketService.getRemoteSocketAddress() + ")"); PrintStream ps = new PrintStream( socketService.getOutputStream(), true, "utf-8"); ps.println("Bonjour"); socketService.close(); } catch (IOException e) { System.err.println("Connexion impossible."); } } } }
Lancez le serveur dans un onglet de terminal. Quel nouveau port voyez-vous maintenant à l'écoute ?
Lancez ensuite le client dans un autre onglet du terminal (le client doit être lancé alors que le serveur est toujours en fonctionnement), quel est le résultat ?
Quitter une connexion SSH ou FTP ou utiliser les programmes Java.
Attention, par défaut wireshark indique des numéros de séquence relatifs (Le premier numéro de séquence est décalé à 0). Pour voir les vrais numéros de séquence, il faut aller dans le menu préférences de wireshark, puis dans le protocole TCP, vous décochez la case "Relative sequence numbers".
Faîtes par exemple un ssh vers une deuxième machine où le service ssh est fermé, ou alors utilisez le programme client Java alors que le serveur n'est pas actif.
Faire un ssh vers une deuxième machine, et une fois la connexion établie, coupez le réseau de cette deuxième machine (déconnectez en mode graphique ou débranchez le câble réseau).
Dans cette partie, au lieu des programmes Java, vous allez utiliser le petit utilitaire très connu netcat permettant d'ouvrir des connexions réseau.
Netcat permet d'ouvrir simplement un serveur grâce à la commande nc -l hote num_port (un serveur sur l'hôte "hote" à l'écoute sur le port "port"). On peut aussi ne pas préciser l'hôte et l'ouverture se fera sur la boucle locale (interface lo).
un client peut alors se connecter grâce à la commande nc hote num_port.
nc -l 8000
nc localhost 8000
Vous disposez alors en fait d'un mini "tchat" (une messagerie instantannée) entre le client et le serveur (Vous tapez votre texte dans les terminaux du client et du serveur).
Par exemple : Bonjour | Salut | Ca va | Oui super
N'oubliez pas que Wireshark fait ça pour vous, avec Follow TCP Stream pour sélectionner le flux TCP que vous voulez étudier, puis "Flow graph" dans le menu "statistics" pour voir l'illustration de l'échange des trames. Spécifiez "TCP flows" (flux TCP) dans Flow type et "Limit to display filter" pour avoir que le trafic TCP concerné.
Voici par exemple une capture du flux TCP associée à l'exemple précédent.
Et le graphe d'échanges TCP est le suivant.
Par exemple : numéro de séquence (Seq) + longueur des données (Len) = numéro d'acquittement (Ack)
Vous pouvez avoir cela par exemple
Une analyse de ports ou scan de ports ou balayage de ports consiste à trouver les ports ouverts d'un machine.
Netcat peut le faire avec l'option -z
nc -l 800
nc -z localhost 800-802
Filtre Wireshark pour aider tcp.port == 800
Un outil bien plus puissant et tout aussi connu pour faire de l'analyse de ports est Nmap. Vous allez pour finir ce TP capturer et analyser grâce à Wireshark différent type de scans via Nmap.
Les scans sur votre localhost (attention ce n'est pas autorisé de faire ceci sur une machine qui n'est pas à vous) à analyser sont les suivants
Pour finir, Nmap peut aussi faire des scans UDP avec la commande nmap -sU localhost.