You are on page 1of 61

Réseaux avancés : interconnexion et TCP/IP

1 Les réseaux locaux


1.1 Pré-requis (Ethernet)

 La norme ISO 8802.3


 Exemple de fonctionnement
 Bits de brouillage
 L'adressage
 Format de la trame

1.2 Construire un réseau local

 Les types de relais classiques


 Démocratisation des commutateurs
 Le Spanning Tree
 Les réseaux virtuels
 Les commutateurs ATM
 Structure de la cellule ATM
 Routage dans un nuage ATM

1.3 Configuration IP

 Hypothése de travail
 Les protocoles d'Internet
 L'adressage IP
 Exemple d'adresse
 Résolution d'adresse (DHCP)
 Paquet DHCP

1.4 La communication dans les réseaux locaux

 Principe de la résolution d'adresse


 Résolution d'adresse Ethernet
 Classical IP sur ATM
 Émulation LAN sur ATM

1.5 Le routage entre réseaux locaux

 Les classes d'adresses IP


 Notion de sous-réseaux
 Principes du routage IP
 Exemple de table de routage
 Exemple de route par défaut
 Principe de la table de routage
 Introduction d'une stratégie de routage
 Exemple de routage de sous-réseaux
 Plan du réseau de l'UVSQ

2 Protocoles TCP/IP
2.1 Protocole réseau IP
 Format des paquets IP
 Fragmentation des paquets

2.2 Protocole de contrôle ICMP

 Format des paquets ICMP


 Gestion de congestion
 Gestion d'erreurs de routage
 Utilitaires basés sur ICMP

2.3 Protocole de transport UDP

 Adressage UDP
 Les caractéristiques d'UDP
 Format des datagrammes
 Exemple de datagramme

2.4 Protocole de transport TCP

 Adressage TCP
 Les caractéristiques de TCP
 Format des datagrammes
 Options TCP
 Fiabilité
 Adaptabilité
 Quelques types d'attaques
 Exemple de datagramme

3 Programmation réseau : les sockets


3.1 Généralité sur les sockets

 Présentation
 Caractéristiques des sockets
 Les familles de sockets
 Les modes de connexion
 Les adressages
 Les adressages

3.2 Primitives communes

 Création d'une socket


 Contrôle d'une socket

3.3 Primitives pour le mode connecté

 Schéma de principe
 Primitives pour le serveur
 Primitive pour le client
 Exemple de serveur
 Exemple de client

3.4 Primitives pour le mode non connecté

 Schéma de principe
 Primitives de communication
 Exemple de serveur
 Exemple de client

3.5 Fonctions de bibliothèque

 Obtention des adresses IP (fonctions)


 Trouver l'adresse de socket
 Numéros de ports
 Numéros de protocoles
 Exemples de résolution

3.6 Le super-serveur Unix

 Définition d'un démon


 Le super-serveur d'Unix
 Schéma de fonctionnement
 Exemples de serveurs

A Annexes
A.1 Démonstrations

 Construire un réseau local


 Configuration IP de base
 La communication dans les réseaux locaux
 Le routage entre réseaux locaux
 Programmation réseau
 Protocoles TCP/IP

A.2 Programmation en Bourne Shell

 Serveur Web en Bourne Shell


 Exemple de page Web

A.3 Sources pour RPC

 Makefile pour le serveur et le client RPC


 Définition des RPC
 Fichier C du serveur
 Fichier C du client

This document was translated from LATEX by HEVEA and HACHA.


1 Les réseaux locaux
1.1 Pré-requis (Ethernet)

1.1.1 La norme ISO 8802.3

 Utilise la méthode CSMA/CD persistant ;


 Principe de la méthode :
o vérifier que le bus est libre ;
o émettre la trame en attente ;
o arrêter l'émission si collision ;
o ré-émettre après un temps aléatoire.
 Calcul du temps avant ré-émission :
o l'unité de temps est 51,2 µs ;
o tirage aléatoire entre 0 et max unités ;
o pour les 10 premiers essais max=2n-1 ;
o ensuite max est fixé à 1023 ;
o après 16 essais la trame est jetée.

1.1.2 Exemple de fonctionnement

1.1.3 Bits de brouillage

 Décalage dans la détection de collision :

 Décalage temporel maximal : 2× tpropagation.


 Ce décalage est la tranche de temps d'Ethernet.
 Calcul de la taille maximal du câble :
o vitesse du signal vpropagation=200.000 km/s ;
o taille minimale la trame T=64 octets ;
o débit du médium d=10 Mbit/s ;
o longueur maximale du câble l ;
o équation reliant les termes :

l
T 2 d
v propagation
o longueur maximale du médium l=vpropag× T/2d.
o soit environ 5 km (en pratique 2,5 km).

1.1.4 L'adressage

 Adresse sur 6 octets

08:00:20:10:E5:C5

 Adresse unique liée au matériel

préfixe constructeur
00:00:1B Novell
10:00:5A IBM
08:00:09 Hewlett Packard
AA:00:00,03,04 Digital

 Adresse de diffusion

ff:ff:ff:ff:ff:ff

1.1.5 Format de la trame

1.2 Construire un réseau local

1.2.1 Les types de relais classiques

 Les répéteurs (couche physique) :


 Les ponts (couche liaison) :

 Les routeurs (couche réseau)

 Les convertisseurs (couches supérieures)


o TCP/IP => SNA (ibm) ;
o TCP/IP => IPX (netware) ;
o TCP/IP => AppleTalk (apple) .
o TCP/IP => SMB (microsoft) ;

1.2.2 Démocratisation des commutateurs

 Commutateur <=> pont avec plus de 2 ports.


 Étapes de l'évolution des réseaux :
o Un réseau local à diffusion :

o Vers des réseaux segmentés :


o Le but, la commutation totale:

 Trois méthodes de relais :


o Cut Through (Fast Forward) ;
o Store and Forward ;
o Fragment Free (64 octets).
 Techniques de commutation :

1.2.3 Le Spanning Tree

 Liens redondants pour la robustesse :


 Eviter les doublons dans les réseaux ...

 ... mais surtout éviter les boucles.

 Principe de fonctionnement du Spanning Tree :


o un identifiant associé à chaque élément,
o messages BPDU échangés entre éléments (Bridge Protocol Data Units),
o un algorithme itératif pour casser les cycles.
 Grandes lignes de l'algorithme :
o Election d'un élément racine (plus petit identifiant) :

o Par élément, élection d'un port racine (le plus proche de l'élément racine) :
o Par segment, élection d'un élément priviligié :

o Les port non marqués sont désactivés (uniquement réception des BPDU).
 Importance du choix de l'élément racine.

1.2.4 Les réseaux virtuels

 Concept de réseaux virtuels (VLAN) :

 Encapsulation des trames (ISL) ou ajout de champs dans la trame.


 Définition des VLAN par ports, adresses MAC ou adresses IP.
 Communication inter-VLAN par routeur.
.2.5 Les commutateurs ATM

 ATM = Asynchronous Transfert Mode.


 Technologie utilisée dans les réseaux locaux.
 Couche physique :
o paire torsadée (25 Mbit/s)
o fibre optique (Synchronous Optical NETwork) :
 STS-3c 155 Mbit/s ;
 STS-12 622 Mbit/s ;
 STS-48 2.4 Gbit/s.
 Commutation de cellules (53 octets).
 Temps de commutation de l'ordre de la ms.
 Mode connecté (circuits virtuels).
 Transport des données, de la voix, ...

1.2.6 Structure de la cellule ATM

 Format de la trame :

 Identification des circuits virtuels :


o VCI (Virtual Channel Identification) ;
o VPI (Virtual Path Identification) ;
o un VPI regroupe plusieurs VCI ;
o commutation possible au niveau VPI.
 Gestion de la congestion (et de la QoS) :
o le champ Contrôle de flux :
 à l'interface avec l'utilisateur ;
 indique la QoS désirée.
o le bit Priorité ;
 destruction de cellule si à 1 ...
 ... et commutateur surchargé.
o le champ Type :
 cellule utilisateur ou de contrôle ;
 indique la rencontre de congestion.

1.2.7 Routage dans un nuage ATM

 Phase de création d'un circuit virtuel :


 Des tables au niveau de chaque commutateur :

 Cellules livrées dans l'ordre (perte possible)


 Deux types de commutateurs :

1.3 Configuration IP

1.3.1 Hypothése de travail

 Une hypothèse : utilisation d'Ethernet.


 Les protocoles sont encapsulés :
 Quelques codes Ethernet de protocoles :

0600 XNS 0800 IP


0805 X.25 0806 ARP
6004 LAT 8035 RARP
8037 IPX 809B EtherTalk
80F3 AARP 814C SNMP
86DD IPv6

1.3.2 Les protocoles d'Internet


Les protocoles liés à Internet

1.3.3 L'adressage IP

 Au moins une adresse par interface.


 Adresses sur 32 bits.
 Notation quadruplet pointé.
 L'adresse est la juxtaposition de :
o une adresse de réseau ;
o un numéro de machine.
 Deux adresses spéciales :
o les bits machine à zéro => le réseau ;
o les bits machine à un => la diffusion.

.3.4 Exemple d'adresse

 Adresse de oleron.eudil.fr : 0xC1304027.


 Adresse usuelle : 193.48.64.39.
 Masque de réseau : 255.255.255.0.
 Adresse de réseau : 193.48.64.0.
 Adresse de diffusion : 193.48.64.255.
1.3.5 Résolution d'adresse (DHCP)

 Problème des machines amnésiques :


o stations sans disque (diskless) ;
o terminaux X ;
o imprimantes réseau ;
o micro à accès Internet ...
 Récuperer les informations réseau :
o l'indispensable adresse IP ;
o Le masque réseau, l'adresse de diffusion ;
o les adresses de la passerelle et du DNS ;
o les paramètres MTU, TTL, ...
 Protocole Reverse ARP (obsolète) ;
 BOOTstrap Protocol et son successeur ...
 ... Dynamic Host Configuration Protocol.
 DHCP décrit par le Request for Comments 1541.
 BOOTP et DHCP utilisent IP !
o DHCP serveur sur le port UDP 67 ;
o DHCP client sur le port UDP 68.
 Problème de l'oeuf et de la poule :
o IP inutilisable sans l'adresse IP ;
o DHCP non implantable sans IP.
 Solution préconisée :
o paquet DHCP diffusé sans adresse source ;
o protocole ARP inutilisable pour la réponse :
 facilité : utiliser la diffusion ;
 efficacité : court-circuiter ARP.
 Base de données de paramètres réseau :
o indexée par un identificateur unique ;
o exemple : l'adresse Ethernet.
 Assignation automatique d'adresses réseau :
o adresse assignée pour une période fixée ;
o assigner toujours la même adresse, si possible.
 Dialogue entre serveurs et client DHCP :
1.3.6 Paquet DHCP

1.5 Le routage entre réseaux locaux

1.4.1 Principe de la résolution d'adresse

 Communiquer => connaître l'adresse physique de la cible.


 Dépendant de la couche matériel.
 Deux principes :
o résolution statique (table, fonction) ;
o résolution dynamique.

1.4.2 Résolution d'adresse Ethernet

 Résolution dynamique : IP => Ethernet.


 Protocole ARP (Address Resolution Protocol).
 Principe :
o diffusion de "qui s'appelle xx.yy.zz.yy ?" ;
o réponse directe "moi, aa:bb:cc:dd:ee:ff !".
 Cache des réponses ARP récentes.
 Format du paquet ARP :

 Exemple de dialogue ARP :


1.4.3 Classical IP sur ATM

 Pas de diffusion possible sur ATM.


 Solution : un serveur ATMARP.
 Mise à jour de la table du serveur :
o adresse ATM du serveur connue ;
o les stations contactent le serveur ;
o des contacts réguliers (20 min) ;
o le serveur stocke les couples (AdrIP,AdrATM).
 Utilisation du serveur ATMARP :
o donnée : l'adresse IP du destinataire ;
o ouverture d'une liaison ATM avec le serveur ;
o récupération de l'adresse ATM du destinataire ;
o ouverture d'une liaison avec le destinataire.

1.4.4 Émulation LAN sur ATM

 Une pléthore de services pour LANE V2.0 :


o LAN Emulation Configuration Server (LECS) ;
o LAN Emulation Server (LES) ;
o Broadcast and Unknown Servers (BUS) ;
o LAN Emulation Client (LEC).
 Localisation des services :
 Résolution d'adresse MAC :

 Envoi d'un paquet unicast :


 Routage entre ELAN :

1.5 Le routage entre réseaux locaux

1.5.1 Les classes d'adresses IP


Les classes d'adresses :
Classe Préfixe Intervalle
A 0 1. -- 126.
B 10 128.0. -- 191.255.
C 110 192.0.0. -- 223.255.255.
D 1110 224.0.0. -- 239.255.255.
LoopBack 127.

Classe Nb réseaux Nb hôtes


A 126 16.777.216
B 16.384 65.536
C 2.097.152 256
D -- --
LoopBack 1 1
1.5.2 Notion de sous-réseaux

 Les adresses IP s'épuisent.


 Rentabiliser les classes C.
 Découper le numéro de machine :
o en un numéro de sous-réseau ;
o et en un numéro d'hôte.
 Exemple, la classe des serveurs de l'EUDIL :
o une classe C 193.48.57.0 ;
o un masque réseau 255.255.255.224 ;
o soit 8 sous-réseaux de 32 machines :

1.5.3 Principes du routage IP


Communication entre machines non directement connectées

 Nombre de répéteurs limité.


 Diffusion impossible sur l'Internet.
 Solution : des tables de routage.

1.5.4 Exemple de table de routage


Table de routage de soleil.uvsq.fr
réseau cible routeur
193.51.24.0 193.51.24.1
193.51.25.0 193.51.24.2
193.51.38.0 193.51.24.12

1.5.5 Exemple de route par défaut


Table de routage de soleil.uvsq.fr

réseau cible routeur


193.51.24.0 193.51.24.1
193.51.25.0 193.51.24.2
193.51.38.0 193.51.24.12
défaut 193.51.24.30

1.5.6 Principe de la table de routage

 Liste de paires ( clef, attribut ).


 Cas simple :
o la clef est un préfixe réseau (numéro et masque),
o l'attribut est l'adresse du routeur,
o algorithme de choix de la route :
 table de routage à trois champs :
 numéro de réseau (r) ;
 masque de réseau (m) ;
 adresse du routeur (ar).
 adresse de la destination : a,
 routeur (ar) choisi si ( a & m ) = r,
 généralisation aux sous-réseaux.
 Routage du paquet sur l'adresse destination.
 Sélection des préfixes réseau convenables.
 Les préfixes les plus longs sont retenus.
 Utilisation du premier couple ( préfixe, adresse).
 Raffinement (routage Linux > 2.2) :
o la clef comporte les éléments suivants :
 le préfixe réseau,
 le type de service,
 un niveau de priorité.
o l'attribut comporte un type :

unicast
: route normale,
unreachable
: ICMP "destination non atteignable",
blackhole
: rien,
prohibit
: ICMP "communication interdite",
nat
: réécriture de l'adresse destination,
...

1.5.7 Introduction d'une stratégie de routage

 Stratégie de routage de Linux > 2.2


 Il s'agit d'une liste séquentielle de règles.
 Chaque règle est une paire ( sélecteur, action).
 Le sélecteur s'applique sur plusieurs éléments :
o l'adresse source du paquet,
o l'adresse destination du paquet,
o interface de provenance du paquet,
o type de service,
o marque du paquet.
 L'action consiste à utiliser une table de routage.
 Il existe des règles de types différents :

unicast
: utiliser la route ad hoc de la table,
unreachable
: ICMP "destination non atteignable",
blackhole
: rien,
prohibit
: ICMP "communication interdite",
nat
: réécriture de l'adresse source,
...

1.5.8 Exemple de routage de sous-réseaux


Table de routage de soleil.uvsq.fr
réseau cible masque réseau routeur
193.51.24.0 255.255.255.224 193.51.24.1
193.51.24.64 255.255.255.224 193.51.24.30
193.51.25.0 255.255.255.0 193.51.24.2
193.51.38.0 255.255.255.0 193.51.24.12
0.0.0.0 0.0.0.0 193.51.24.30

1.5.9 Plan du réseau de l'UVSQ


2 Protocoles TCP/IP
2.1 Protocole réseau IP

2.1.1 Format des paquets IP

 Type de service :

 Protocoles : ICMP(1), UDP(17), TCP(6).


 Options IP :

 Exemples d'options :
o routage strict ; enregistrement de route ;
o routage lâche ; enregistrement d'horloge.
2.1.2 Fragmentation des paquets

 Taille des paquets IP <= 65535.


 Les réseaux ne sont pas identiques.
 La taille des trames est variable.
 Fragmentation des paquets :

 Découpage à l'identique :

 Puis modification de l'entête :

Paquet Lg. totale Drap. Dép.


original lg-ent+1000 000 0
fragment 1 lg-ent+344 001 0
fragment 2 lg-ent+328 001 344
fragment 3 lg-ent+328 000 672

 Ce procédé tombe en désuétude :


o perte d'un fragment => perte du paquet,
o charge CPU pour les routeurs et le destinataire,
o bloquage des fragments par des filtres primitifs.
 Attaque "Ping of Death" :
o forger un fragment dépassant les 64Ko,
o ecrasement mémoire sur le destinataire ...
o ... plantage du système d'exploitation.
 Principe de découverte du MTU sur le chemin :
o paquets envoyés avec le bit "pas de fragmentation",
o on commence par des paquets de taille maximale,
o sur réception d'ICMP "fragmentation impossible" ...
o ... on diminue la taille des paquets.
2.2 Protocole de contrôle ICMP

2.2.1 Format des paquets ICMP

 ICMP (Internet Control Messages Protocol).


 Protocole encapsulé dans IP.
 Véhicule les erreurs réseau.
 Format général :

 Types de message :

Type Description
0 Réponse d'écho
3 Destination inaccessible
4 Limitation du débit de la source
5 Modification de route
8 Demande d'écho
11 Datagramme trop vieux
12 Problème de paramètre
13 Demande d'estampille de temps
14 Réponse d'estampille de temps
17 Demande de masque
18 Réponse de masque

 Codes possibles pour le type 3 :

Code Description
0 Réseau inaccessible
1 Machine inaccessible
2 Protocole inaccessible
3 Port inaccessible
4 Fragmentation impossible
5 Route impossible à suivre

2.2.2 Gestion de congestion

 Résolution de congestion :
o diversité des liens sur Internet :
o un routeur peut être submergé ;
o émission du paquet Source Quench ;
o la source réduit son débit.

2.2.3 Gestion d'erreurs de routage

 Redirection de paquets :
o origine : une erreur de routage : (M1 route pour M2 par R1)

o le fautif est averti de son erreur ;


o le paquet est ré-orienté.

2.2.4 Utilitaires basés sur ICMP

 Utilisation d'ICMP dans ping :


o envoi d'un paquet ICMP de type 8 (Echo Request) ;
o réception d'un paquet ICMP de type 0 (Echo Reply) ;
o (+) calcul d'un délai de propagation ;
o (+) émission de plusieurs Echo Request.
 Utilisation d'ICMP dans traceroute :
o émission d'un paquet IP avec un TTL=0 ;
o réception d'un paquet ICMP de type 11 ...
o ... émis par la 1ère passerelle du chemin ;
o augmentation du Time To Live jusqu'à ...
o ... obtenir une réponse de la machine visée.

2.3 Protocole de transport UDP

2.3.1 Adressage UDP

 IP : communication de machine à machine.


 UDP : plusieurs points d'accès par hôte.
 Notion de ports UDP (sur 16 bits) :

Port Nom Description
7 echo Y a de l'écho
9 discard Trou noir
37 time Serveur de date
53 domain Serveur de noms
67 bootps Serveur d'adresses
69 tftp Transfert de fichiers
137 netbios-ns Serveur de noms NETBIOS
517 talk Utilitaire de conversation

 Une queue de messages par port.

2.3.2 Les caractéristiques d'UDP


UDP c'est IP offert aux utilisateurs :
(+) simplicité
(+) rapidité
(+) robustesse
(-) non fiable
(-) messages non ordonnés
(-) programmation complexe

2.3.3 Format des datagrammes

2.3.4 Exemple de datagramme

2.4 Protocole de transport TCP


2.4.1 Adressage TCP

 Comme UDP, TCP utilise les ports :

Port Nom Description


21 ftp Transfert de fichiers
23 ssh Connexion à distance sécurisée
23 telnet Connexion à distance
25 smtp Service de messagerie
80 www Explorateur hypertexte
110 pop3 Messagerie pour micros
119 nntp Groupes de discussion
6000 X11 X-Windows (version 11)

 TCP est orienté connexion :

(machine source,port source)


(machine cible,port cible)

2.4.2 Les caractéristiques de TCP


TCP est une couche transport orientée connexion :

 remise des messages assurée ;


 remise dans l'ordre ;
 transferts tamponnés (performances) ;
 flux de données séquentiel ;
 transfert bi-directionnel.
2.4.3 Format des datagrammes

2.4.4 Options TCP

 L'option No operation
o format de l'option :

o rôle : aligner sur des mots.


 L'option maximum segment
o format de l'option :

o rôle : donne la taille maximum d'un segment TCP en réception.


 L'option window scale
o format de l'option :

o rôle : multiplicateur de la fenêtre de réception


(multiplication par décalage de bits sur la gauche).
 Les options Selective Acknowledgment
o formats des options :

o rôle : accuser réception de données hors séquence.


 Les options d'écho (obsolètes)
o formats des options :

o rôle : calculer un temps d'aller-retour.


 L'option d'estampille de temps
o formats des options :

o rôle : calculer un temps d'aller-retour.

2.4.5 Fiabilité

 Accusé de réception :
o Attendre une confirmation de réception :
o Retransmettre après un délai :

 Efficacité due au fenétrage :

 Une connexion concertée :


 Une déconnexion concertée :

2.4.6 Adaptabilité

 Fenêtre mobile (la cible décide).


 Calcul d'un temps moyen aller-retour :

- 0

 Temporisateurs constamment adaptés :

 Prise en compte des erreurs réseau.

2.4.7 Quelques types d'attaques

 Attaque : prédiction de numéros de séquence :


 Solution : numéros aléatoires.
 Attaque : inondations de paquets SYN.
 Solutions :
o augmentation de la taille des tampons,
o diminution des temporisations,
o vérification adresse d'entrée / de sortie,
o suppression de la queue de connexions (liste de cookies).

2.4.8 Exemple de datagramme

3 Programmation réseau : les sockets


3.1 Généralité sur les sockets
3.1.1 Présentation

 Intégration d'IP dans Unix BSD (1981).


 Interface de programmation «socket» (1982) :
o la plus utilisée ;
o intégrée dans le noyau ;
o nouveaux services (Web, IRC, ICQ).
 Il existe d'autres interfaces :
o Remote Procedure Call (NFS) ;
o Transport Layer Interface (OSI) ;
o ...
 Schéma des couches logicielles :

 Représentation gros-boutiste des données :


 #include <netinet/in.h>
 unsigned long int htonl(unsigned long int hostlong);
 unsigned short int htons(unsigned short int hostshort);
 unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);

3.1.2 Caractéristiques des sockets

 Une interface de programmation générique.


 Une interface semblable à celle des fichiers.
descripteur de fichier <=> descripteur de socket
 Une socket appartient à une famille.
 Il existe plusieurs modes de connexion.
 À chaque famille un adressage.

3.1.3 Les familles de sockets

 Détermine le protocole réseau :

Famille Protocole
PF_UNIX, PF_LOCAL Tubes nommés
PF_INET Protocoles TCP et UDP
PF_INET6 Protocoles IPv6
PF_APPLETALK Protocole AppleTalk
PF_IPX Protocole Novell
PF_X25, PF_CCITT Protocole X25

 Des caractéristiques liées au protocole.


3.1.4 Les modes de connexion

 Détermine la qualité de connexion.


 Plusieurs modes par famille :

Unix
: SOCK_DGRAM, SOCK_STREAM ;
IP
: SOCK_DGRAM, SOCK_STREAM, SOCK_RAW ;
X25
: SOCK_SEQPACKET.

 Les modes courants :


o mode connecté : SOCK_STREAM ;
o mode non connecté : SOCK_DGRAM ;
o accès direct au protocole : SOCK_RAW.

3.1.5 Les adressages

 L'adressage dépend du protocole :

Unix
: un nom de fichier ;
IPv4
: adresse IPv4 et numéro de port ;
IPv6
: adresse IPv6, numéro de port, marque et champ d'utilisation ;
X25
: adresse X.121 ;

 Une structure d'adresse générique :

Fichiers d'inclusion <sys/types.h> et <sys/socket.h>


 struct sockaddr {
 unsigned short int sa_family;
 unsigned char sa_data[14];
 };

3.2 Primitives communes

3.1.6 Les adressages

 Une structure compatible par famille.


 Exemple : Famille PF_UNIX :

Fichier d'inclusion <sys/un.h>


 struct sockaddr_un {
 unsigned short int sun_family;
 char sun_path[UNIX_PATH_MAX]];
 };
 Exemple : Famille PF_INET :

Fichier d'inclusion <netinet/in.h>


 struct in_addr { unsigned int s_addr; };

 struct sockaddr_in {
 unsigned short int sin_family;
 unsigned short int sin_port;
 struct in_addr sin_addr;
 unsigned char sin_zero[8];
 };
 Exemple : Famille PF_INET6 :

Fichier d'inclusion <netinet/in6.h>


 struct in6_addr {
 union {
 unsigned char u6_addr8[16];
 unsigned short int u6_addr16[8];
 unsigned int u6_addr32[4];
 } in6_u;
 #define s6_addr in6_u.u6_addr8
 #define s6_addr16 in6_u.u6_addr16
 #define s6_addr32 in6_u.u6_addr32
 };

 struct sockaddr_in6 {
 unsigned short int sin6_family;
 unsigned short int sin6_port;
 unsigned int sin6_flowlabel;
 struct in6_addr sin6_addr;
 unsigned int sin6_scope_id;};

3.2.1 Création d'une socket

 Réservation des ressources par socket :


 #include <sys/types.h>
 #include <sys/socket.h>
 int socket(int famille,int mode,int protocol);
 Retourne un descripteur de socket.
 Le protocole doit correspondre au mode.
 Exemple : la famille AF_INET :
o SOCK_STREAM utilise TCP ;
o SOCK_DGRAM utilise UDP ;
o SOCK_RAW utilise ICMP, IPIP, etc.
 Mettre protocol à zéro 0 pour le protocole par défaut.
 Assignation d'une adresse par bind :
 #include <sys/types.h>
 #include <sys/socket.h>
 int bind(int sockfd,struct sockaddr *address,int length);
 Coercition de l'adressage de la famille.
 Cas particulier de la famille PF_INET :
o une adresse joker : INADDR_ANY ;
o un port joker : 0.

3.3 Primitives pour le mode connecté

3.2.2 Contrôle d'une socket

 Positionnement des options d'une socket par setsockopt :


 #include <sys/types.h>
 #include <sys/socket.h>
 int setsockopt(int sockfd,int level,int option,
 char *arguments,int number);
 Niveau level de l'option :
o soit au niveau socket (SOL_SOCKET) ;
o soit au niveau protocole (SOL_IP,SOL_TCP,SOL_UDP).
 L'option est codée par option :
o Quelques options au niveau SOL_SOCKET :
 SO_KEEPALIVE : teste la socket ;
 SO_DONTROUTE : pas de routage ;
 SO_REUSEADDR : réutilisation immédiate ;
 SO_SNDBUF : taille du tampon ;
 SO_RCVBUF : taille du tampon.
o Quelques options au niveau SOL_IP :
 IP_TOS : type de service ;
 IP_TTL : durée de vie ;
 IP_PMTU_DISCOVER : calcul du MTU minimum.
o Une option au niveau SOL_TCP :
 TCP_NODELAY : pas de tampon en sortie.

3.3.1 Schéma de principe

3.3.2 Primitives pour le serveur

 Définition du tampon des connexions :


o primitive système listen :
o int listen(int sockfd,int size);
o size représente la taille du tampon.
 Attente des connexions des clients :
o primitive système accept :
o #include <sys/types.h>
o #include <sys/socket.h>
o int accept(int sockfd,struct sockaddr *address,int *length);
o une nouvelle socket est retournée ;
o l'adresse du correspondant est address ;
o length est utilisée en entrée et sortie.

3.3.3 Primitive pour le client

 Connexion au serveur.
 Primitive système connect :
 #include <sys/types.h>
 #include <sys/socket.h>
 int connect(int sockfd,struct sockaddr *address,int length);
 L'adresse du serveur est dans address.

3.3.4 Exemple de serveur

 La fonction d'initialisation du serveur :


 int initialisationServeur(short int *port,int connexions)
 {
 int df;
 struct sockaddr_in adresse;
 int statut;
 int taille=sizeof adresse;

 /* Creation d'une socket */
 df=socket(PF_INET,SOCK_STREAM,0);
 if(df<0){
 perror("initialisationServeur.socket");
 exit(-1);
 }

 /* On fixe l'adresse de la socket */
 adresse.sin_family=AF_INET;
 adresse.sin_addr.s_addr=INADDR_ANY;
 adresse.sin_port=htons(*port);
 statut=bind(df,(struct sockaddr *)&adresse,sizeof(adresse));
 if(statut<0) return -1;

 /* On recupere le numero du port utilise */
 statut=getsockname(df,(struct sockaddr *)&adresse,&taille);
 if(statut<0){
 perror("initialisationServeur.getsockname");
 exit(-1);
 }
 *port=ntohs(adresse.sin_port);

 /* Initialisation de l'ecoute */
 statut=listen(df,connexions);
 if(statut<0) return -1;

 return df;
 }
 La fonction de gestion des clients :
 int boucleServeur(int ecoute,int (*traitement)(int))
 {
 struct sockaddr_in adresse;
 int taille=sizeof adresse;
 int dialogue;

 while(1){

 /* Attente d'une connexion */
 dialogue=accept(ecoute,(struct sockaddr *)&adresse,&taille);
 if(dialogue<0) return -1;

 /* Passage de la socket de dialogue a la fonction de traitement */
 if(traitement(dialogue)<0){ close(ecoute); return 0;}

 }
 }

 int gestionClient(int sd){
 int pid;
 int statut;

 pid=fork();
 if(pid<0){perror("fork"); exit(-1);}
 if(pid!=0)
 close(sd);
 else{
 dup2(sd,0); dup2(sd,1); dup2(sd,2);
 statut=execl(CHEMIN_PROGRAMME,CHEMIN_PROGRAMME,NULL);
 }
 return 0;
 }
 La fonction principale :
 int main(int argc,char *argv[])
 {
 int s; /* Descripteur de la SOCKET */

 /* Lecture des arguments de la commande */
 analyseArguments(argc,argv);

 /* Initialisation du serveur */
 s=initialisationServeur(&port,MAX_CONNEXIONS);

 /* Mise en place de la procedure de recuperation de la mort d'un fils */
 signal(SIGCHLD,mortdefils);

 /* Lancement de la boucle d'ecoute */
 boucleServeur(s,gestionClient);
 }

3.3.5 Exemple de client

 La fonction de connexion au serveur :


 int connexionServeur(char *hote,int port)
 {
 int df;
 struct sockaddr_in adresse;
 struct in_addr adresseIP;
 int statut;

 /* Creation d'une socket */
 df=socket(PF_INET,SOCK_STREAM,0);
 if(df<0){
 perror("connexionServeur.socket");
 exit(-1);
 }

 /* Connection de la socket a l'hote */
 statut=nomVersAdresse(hote,&adresseIP);
 if(statut<0) return -1;
 adresse.sin_family=AF_INET;
 adresse.sin_addr=adresseIP;
 adresse.sin_port=htons(port);
 if(connect(df,(struct sockaddr *)&adresse,sizeof(adresse))<0) return(-1);
 else return df;
 }
 La fonction principale :
 int main(int argc,char *argv[])
 {
 struct sockaddr_in adresse; /* Adresse du serveur distant */
 char statut; /* Stocke le statut des primitives */
 int s; /* Descripteur de la SOCKET */

 /* Lecture des arguments de la commande */
 analyseArguments(argc,argv);

 /* Connection au serveur */
 s=connexionServeur(machine,port);
 if(s<0){ fprintf(stderr,"Erreur de connexion au serveur\n"); exit(-1); }

 /* Boucle de communication avec le serveur */

 while(1){
 fd_set ens_lecture;
 char tampon[MAX_TAMPON];
 int taille;

 FD_ZERO(&ens_lecture); FD_SET(0,&ens_lecture); FD_SET(s,&ens_lecture);
 statut=select(s+1,&ens_lecture,NULL,NULL,NULL);
 if(statut<0){perror("select"); exit(-1);}
 if(FD_ISSET(0,&ens_lecture)){
 if((taille=read(0,tampon,MAX_TAMPON))<=0) break;
 if(write(s,tampon,taille)!=taille) break;
 }
 if(FD_ISSET(s,&ens_lecture)){
 if((taille=read(s,tampon,MAX_TAMPON))<=0) break;
 if(write(1,tampon,taille)!=taille) break;
 }
 }
 }

3.4 Primitives pour le mode non connecté

3.4.1 Schéma de principe

3.4.2 Primitives de communication

 Envoi d'un message (datagramme) par sendto :


o le prototype :
o #include <sys/types.h>
o #include <sys/socket.h>
o int sendto(int sockfd,char *message,int size,int flag,
o struct sockaddr *address,int length);
oretourne le nombre d'octets envoyés ;
ole message est contenu dans message ;
ola longueur du message est size ;
ol'adresse cible est dans address ;
ole drapeau flag contrôle les options :
 MSG_OOB : messages urgents ;
 MSG_DONTROUTE : interdit le routage.
 Réception d'un message par recvfrom :
o le prototype :
o #include <sys/types.h>
o #include <sys/socket.h>
o int recvfrom(int sockfd,char *message,int size,int flag,
o struct sockaddr *address,int *length);
o retourne le nombre d'octets reçus ;
o le message est stocké dans message ;
o la taille du tampon message est size ;
o l'adresse source est dans *address ;
o le drapeau flag contrôle les options :

MSG_OOB : messages urgents ;


MSG_PEEK : le système garde le message.
MSG_WAITALL : remplit le tampon.

 Des primitives de dialogue plus concises :


o les prototypes :
o #include <sys/types.h>
o #include <sys/socket.h>
o int send(int sockfd,char *message,int size,int flag);
o int recv(int s,char *message,int size,int flag);
o Utilisable en mode SOCK_DGRAM après un connect.
o Utiles en mode SOCK_STREAM pour les messages urgents :
o static void sig_urg(int signo){
o int n; char c;
o if((n=recv(servfd,&c,1,MSG_OOB))<0){
o perror("recv error");
o exit(-1);
o }
o ...
o }
o
o void main(void){
o ...
o signal(SIGURG,sig_urg);
o ...
o }

3.4.3 Exemple de serveur


int main(int argc,char *argv[])
{
int s; /* Descripteur de la SOCKET */
struct sockaddr_in adresseServeur; /* Structure adresse du serveur */
int taille;
int statut;

/* Lecture des arguments de la commande */


analyseArguments(argc,argv);

/* Creation de la SOCKET d'ecoute du serveur */


s=socket(AF_INET,SOCK_DGRAM,0);
if(s<0) {perror("socket"); exit(-1);}

/* Preparation de la structure adresse du serveur */


adresseServeur.sin_family=AF_INET;
adresseServeur.sin_addr.s_addr=INADDR_ANY;
adresseServeur.sin_port=htons(port);

/* Installation du serveur a la bonne adresse */


statut=bind(s,(struct sockaddr *)&adresseServeur,sizeof adresseServeur);
if(statut<0) {perror("bind"); exit(-1);}

/* On recupere le numero du port utilise */


statut=getsockname(s,(struct sockaddr *)&adresseServeur,&taille);
if(statut<0){perror("getsockname"); exit(-1); }
port=ntohs(adresseServeur.sin_port);
fprintf(stdout,"Le serveur est sur le port %d.\n",port);

/* Attente de la connexion d'un client puis dialogue avec ce client */


while(1){
struct sockaddr_in adresseClient; /* Structure adresse du client */
int taille=sizeof adresseClient; /* Taille de cette adresse */
char tampon1[MAX_TAMPON];
char tampon2[MAX_TAMPON];
int nboctets;

nboctets=recvfrom(s,tampon1,MAX_TAMPON-1,0,
(struct sockaddr *)&adresseClient,
&taille);
tampon1[nboctets]='\0';
sprintf(tampon2,"%s%s",PREFIXE,tampon1);
sendto(s,tampon2,strlen(tampon2),0,
(struct sockaddr *)&adresseClient,taille);
}
}

3.4.4 Exemple de client


int main(int argc,char *argv[])
{
int s; /* Descripteur de SOCKET */
struct sockaddr_in adresse; /* Adresse de la SOCKET du serveur */
int statut; /* Stocke le statut des commandes */

/* Analyse des arguments */


analyseArguments(argc,argv);

/* Creation de la SOCKET du client */


s=socket(AF_INET,SOCK_DGRAM,0);
if(s<0){perror("socket"); exit(-1);}

/* Preparation de la structure adresse du serveur */


nomVersAdresse(machine,&adresse.sin_addr);
adresse.sin_family=AF_INET;
adresse.sin_port=htons(port);

/* Dialogue avec le serveur */


{ char tampon[MAX_TAMPON];
int taille;

fgets(tampon,MAX_TAMPON,stdin);
sendto(s,tampon,strlen(tampon),0,(struct sockaddr *)&adresse,sizeof adresse);
taille=recvfrom(s,tampon,MAX_TAMPON,0,NULL,NULL);
fputs(tampon,stdout);
}

/* Fermeture de la SOCKET de dialogue */


close(s);
exit(0);
}

3.5.1 Obtention des adresses IP (fonctions)

 Trouver une machine à partir du nom par gethostbyname :


 #include <netdb.h>
 struct hostent *gethostbyname(char *name);
 Tout est dans la structure hostent :
 struct hostent {
 char *h_name; /* nom officiel */
 char **h_aliases; /* liste des surnoms */
 int h_addrtype; /* type de l'adressage */
 int h_length; /* taille des adresses */
 char **h_addr_list; /* liste des adresses */
 };

 #define h_addr h_addr_list[0]
 Trouver une machine à partir de l'adresse par gethostbyaddr :
 #include <netdb.h>
 struct hostent *gethostbyaddr(char *address,int length,int type);
 En pratique le type type est AF_INET ;
 L'adresse address doit être en binaire ;
 L'adresse peut être obtenue par inet_aton :
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 int inet_aton(const char *string, struct in_addr *address);

3.5 Fonctions de bibliothèque

3.5.2 Trouver l'adresse de socket

 On ne connait parfois que le descripteur de socket.


 On souhaite connaitre l'adresse de l'émetteur.
 Il faut utiliser la fonction getpeername :
 #include <sys/socket.h>
 int getpeername(int sockfd, struct sockaddr *address, int length);
 L'adresse IP et le port se retrouvent dans address.
 Très utile pour les serveurs sous le super-démon Unix.

3.5.3 Numéros de ports

 Un port de transport est défini par :


o un numéro (sur 16 bits) ;
o un protocole (UDP ou TCP).
 Fichier de description : /etc/services.
 Les champs d'une ligne de ce fichier :
o service : nom officiel du service ;
o port/proto : le type de port (UDP ou TCP) ;
o synonymes : surnoms du service.
 Exemple de fichier /etc/services :
 smtp 25/tcp mail
 time 37/tcp timserver
 domain 53/udp nameserver
 nntp 119/tcp readnews
 printer 515/tcp spooler
 talk 517/udp
 Trouver le numéro de port d'un service par getservbyname :
 #include <netdb.h>
 struct servent *getservbyname(char *name,char *protocol);
 La réponse est une structure servent :
 struct servent {
 char *s_name; /* nom officiel */
 char **s_aliases; /* liste de surnoms */
 int s_port; /* numero de port */
 char *s_proto; /* protocole */
 };

3.5.4 Numéros de protocoles

 Fichier de définitions : /etc/protocols.


 Les champs d'une ligne de ce fichier :
o protocole : nom officiel du protocole ;
o numéro : numéro du protocole ;
o synonymes : surnoms du protocole.
 Exemple de fichier /etc/protocols :
 ip 0 IP
 icmp 1 ICMP
 tcp 6 TCP
 udp 17 UDP
 Trouver le numéro d'un protocole par getprotobyname :
 #include <netdb.h>
 struct protoent *getprotobyname(char *name);
 La réponse est une structure protoent :
 struct protoent {
 char *p_name; /* nom officiel */
 char **p_aliases; /* liste des surnoms */
 int p_proto; /* numero de protocole */
 };

3.5.5 Exemples de résolution

 Résolution d'adresse de machine (en fonction du nom) :


 int nomVersAdresse(char *hote,struct in_addr *adresse)
 {
 struct hostent *h;

 /* On cherche l'adresse via le DNS */
 h=gethostbyname(hote);
 if(h!=NULL) memcpy(adresse,h->h_addr_list[0],h->h_length);
 else return -1;

 return 0;
 }
 Résolution d'adresse de machine (en fonction du descripteur) :
 int socketVersNom(int ds,char *nom)
 {
 struct sockaddr_in adresse;
 int taille=sizeof(adresse);
 int statut;
 struct hostent *machine;

 /* Recupere l'adresse de la socket distante */
 statut=getpeername(ds,(struct sockaddr *)&adresse,&taille);
 if(statut<0){
 perror("socketVersNom.getpeername");
 exit(-1);
 }

 /* Recupere le nom de la machine */
 machine=gethostbyaddr((const char *)&(adresse.sin_addr),
 sizeof(adresse.sin_addr),AF_INET);
 if(machine==NULL){
 strcpy(nom,inet_ntoa(adresse.sin_addr));
 return -1;
 }
 else{
 strcpy(nom,machine->h_name);
 return 0;
 }
 }
 Résolution de nom de service :
 int cherchePortTCP(char *nom)
 {
 struct servent *pinfo;

 pinfo=getservbyname(nom,"tcp");
 return ntohs(pinfo->s_port);
 }

3.6 Le super-serveur Unix

3.6.1 Définition d'un démon

 Caractéristiques :
o Processus serveur ordinaire ;
o Processus fils du processus init ;
o Processus du super-utilisateur ;
o Même durée de vie que le système.
 Réalisation :
o fork() : pour se lancer en tâche de fond ;
o setsid() : pour se détacher du terminal courant ;
o chdir("/") : évite d'empêcher un démontage ;
o close(0,1,2) : fermer les descripteurs inutiles ;
o umask(022) : pour créer des fichiers non modifiables ;
o openlog,syslog,closelog : avertissements, erreurs.
 Nouvelle fonction (4 premières étapes) :
 #include <unistd.h>
int daemon (int nochdir, int noclose);

3.6.2 Le super-serveur d'Unix

 Problèmes avec les serveurs :


o phase d'initialisation identique ;
o appropriation de ressources systèmes.
 Le super-serveur inetd :
o résout les problèmes mais ralentit le traitement ;
o un fichier de configuration inetd.conf ;
o une ligne contient les champs :

service voir /etc/services


mode soit dgram, soit stream
protocole voir /etc/protocols
traitement soit nowait, soit wait
user généralement root
exécutable chemin complet du serveur
arguments arguments de l'exécutable

o exemple du fichier inetd.conf :


o ftp stream tcp nowait root /usr/sbin/wu.ftpd wu.ftpd
o telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd
o talk dgram udp wait root /usr/sbin/in.ntalkd in.ntalkd
o pop3 stream tcp nowait root /usr/sbin/in.pop3d in.pop3d

3.6.3 Schéma de fonctionnement

 Mode connecté :

 Mode non connecté :


3.6.4 Exemples de serveurs

 Serveur TCP utilisant inetd :


 int main(int argc,char **argv)
 {
 char *url; /* Nom du fichier demande */

 /* Ouverture de la session SYSLOG */

 openlog(NOM_SERVEUR,LOG_PID,LOG_DAEMON);
 syslog(LOG_INFO,"Traitement d'une requete");

 /* Envoi eventuel du fichier demande */

 url=requeteValide(stdin);
 if(url!=NULL){
 char *type=typeDeFichier(url);
 printf("%s\nContent-Type: %s\n\n",REP_SUCCES,type);
 envoiFichier(url,stdout);
 syslog(LOG_INFO,"Succes, fichier %s envoye",url);
 }
 else{
 printf("%s\n",REP_ERREUR);
 syslog(LOG_INFO,"Echec, requete invalide ",url);
 }

 /* Fermeture de la session SYSLOG */

 syslog(LOG_INFO,"Fin du traitement de la requete");
 closelog();

 exit(0);
 }
 Serveur UDP utilisant inetd :
 int main(int argc,char **argv)
 {
 char tampon[MAX_TAMPON]; /* Stocke le message de la sonde */
 int longueur; /* Longueur du message */
 char reponse[MAX_TAMPON]; /* Stocke la reponse a la sonde */
 struct sockaddr_in adresse; /* Adresse de socket de l'emetteur */
 int taille=sizeof(adresse); /* Taille de cette adresse */

 /* Ouverture de la session SYSLOG */

 openlog(NOM_SERVEUR,LOG_PID,LOG_DAEMON);
 syslog(LOG_INFO,"Traitement d'un paquet-sonde");

 /* On retourne les donnees avec un prefixe */

 longueur=recvfrom(0,tampon,MAX_TAMPON-1,0,&adresse,&taille);
 tampon[longueur]='\0';
 { char *texte=inet_ntoa(adresse.sin_addr);
 syslog(LOG_INFO,"Sonde en provenance de %s",texte); }
 sprintf(reponse,"%s%s",ECHO_PREFIXE,tampon);
 sendto(0,reponse,strlen(reponse),0,&adresse,taille);
 /* Fermeture de la session SYSLOG */

 syslog(LOG_INFO,"Fin du traitement");
 closelog();

 exit(0);
 }

A Annexes
A.1 Démonstrations

A.1.1 Construire un réseau local

 Adresses apprises sur un commutateur :


 RG20-4# show mac-address-table
 Dynamic Address Count: 142
 Secure Address (User-defined) Count: 0
 Static Address (User-defined) Count: 0
 System Self Address Count: 50
 Total MAC addresses: 192
 Maximum MAC addreses: 8192
 Non-static Address Table:
 Destination Address Address Type VLAN Destination Port
 ------------------- ------------ ---- --------------------
 0000.9431.1968 Dynamic 8 FastEthernet0/1
 0000.b438.80e2 Dynamic 7 FastEthernet0/1
 0000.b452.e1cf Dynamic 3 FastEthernet0/1
 0000.b45c.95c1 Dynamic 11 FastEthernet0/1
 0000.e899.8873 Dynamic 8 FastEthernet0/1
 0000.e8ee.d420 Dynamic 8 FastEthernet0/1
 0005.0254.9f41 Dynamic 8 FastEthernet0/1
 0005.0276.2442 Dynamic 8 FastEthernet0/1
 0010.4b5b.8557 Dynamic 3 FastEthernet0/1
 0010.4bce.7310 Dynamic 8 FastEthernet0/1
 ...
 Définition des VLANS :
 RG20-2# show vlan
 VLAN Name Status Ports
 ---- -------------------------------- --------- -------------------------------
 1 default active Fa0/6, Fa0/7, Fa0/8, Fa0/20
 2 SERVERS active
 3 STAFF active Fa0/22, Fa0/23, Fa0/24
 4 STUDENTS active Fa0/9, Fa0/10, Fa0/11, Fa0/12,
 Fa0/13, Fa0/14, Fa0/15, Fa0/16,
 Fa0/17, Fa0/18, Fa0/19, Fa0/21
 5 ADMIN active
 6 INSECURE active
 7 STAFF-PRIV active
 ...
 RG20-2# show running-config
 Current configuration:
 !
 version 11.2
 service password-encryption
 !
 hostname RG20-2924M-2
 !
 enable password 7 110E091D
 !
 interface VLAN1
 ip address 172.26.224.17 255.255.240.0
 no ip route-cache
 !
 interface FastEthernet0/1
 switchport mode trunk
 !
 interface FastEthernet0/2
 switchport mode trunk
 !
 interface FastEthernet0/3
 switchport mode trunk
 !
 interface FastEthernet0/4
 switchport mode trunk
 !
 interface FastEthernet0/5
 switchport mode trunk
 !
 interface FastEthernet0/9
 switchport access vlan 4
 !
 interface FastEthernet0/10
 switchport access vlan 4
 !
 ...
 Spanning tree :
 RG20-2# show spanning-tree vlan 4
 Spanning tree 4 is executing the IEEE compatible Spanning Tree protocol
 Bridge Identifier has priority 32768, address 00d0.58f5.3f83
 Configured hello time 2, max age 20, forward delay 15
 Current root has priority 32768, address 00d0.588f.9083
 Root port is 42, cost of root path is 27
 Topology change flag not set, detected flag not set, changes 2565
 Times: hold 1, topology change 35, notification 2
 hello 2, max age 20, forward delay 15
 Timers: hello 0, topology change 0, notification 0

 Interface Fa0/1 (port 13) in Spanning tree 4 is FORWARDING
 Port path cost 19, Port priority 128
 Designated root has priority 32768, address 00d0.588f.9083
 Designated bridge has priority 32768, address 00d0.58f5.3f83
 Designated port is 13, path cost 27
 Timers: message age 0, forward delay 0, hold 0
 BPDU: sent 3504307, received 3203
 ...
 Tables de routage d'un commutateur ATM :
 8540# show atm vc
 Interface VPI VCI Type X-Interface X-VPI X-VCI Encap Status
 ATM0/0/0 0 166 SVC ATM0/0/1 0 49 UP
 ATM0/0/0 0 169 SVC ATM3/0/0 2 211 LANE UP
 ATM0/0/0 0 170 SVC ATM0/1/3 0 138 UP
 ATM0/0/0 0 171 SVC ATM0 0 846 LANE UP
 ATM0/0/0 0 265 SVC ATM1/0/2 0 129 UP
 ...

A.1.2 Configuration IP de base

 Type de messages DHCP (T53) :


 1 DHCPDISCOVER
 2 DHCPOFFER
 3 DHCPREQUEST
 4 DHCPDECLINE
 5 DHCPACK
 6 DHCPNAK
 7 DHCPRELEASE
 Analyse d'une session DHCP :
 pevele# tcpdump -vvv -s 1024 -e port bootps or port bootpc
 gayant05# /etc/init.d/pump stop ; sleep 5 ; /etc/init.d/pump start
 pevele# tcpdump ...
 15:29:27.437993 0:d0:bc:bf:6c:38 0:60:8:71:b9:82 ip 342:
 router-students.priv.eudil.fr.bootps > pevele.eudil.fr.bootps:
 (request) hops:1 xid:0x8382b23e G:router-students.priv.eudil.fr
 ether 0:10:b5:7:34:a3 vend-rfc1048 T53:1
 (ttl 255, id 9180)
 15:29:28.438911 0:60:8:71:b9:82 0:d0:bc:bf:6c:38 ip 359:
 pevele.eudil.fr.bootps > router-students.priv.eudil.fr.bootps:
 (reply) hops:1 xid:0x8382b23e Y:gayant05.priv.eudil.fr
 S:pevele.eudil.fr G:router-students.priv.eudil.fr
 ether 0:10:b5:7:34:a3 file "gayant05 vend-rfc1048 T53:2
 T54:3241163042 T51:93600 T58:46800 T59:81900 SM:255.255.240.0
 DG:router-students.priv.eudil.fr NS:pevele.eudil.fr
 HN:"gayant05" DN:"priv.eudil.fr" T28:2887393279
 (ttl 64, id 28934)
 15:29:28.456249 0:d0:bc:bf:6c:38 0:60:8:71:b9:82 ip 590:
 router-students.priv.eudil.fr.bootps > pevele.eudil.fr.bootps:
 (request) hops:1 xid:0x8382b23e G:router-students.priv.eudil.fr
 ether 0:10:b5:7:34:a3 vend-rfc1048 T57:548
 T55:1.3.6.15.28.12.7.9.42.48.49 HN:"gayant05" T51:43200 T53:3
 T54:3241163042 T50:2887389578
 (ttl 255, id 9184)
 15:29:28.494105 0:60:8:71:b9:82 0:d0:bc:bf:6c:38 ip 347:
 pevele.eudil.fr.bootps > router-students.priv.eudil.fr.bootps:
 (reply) hops:1 xid:0x8382b23e Y:gayant05.priv.eudil.fr
 S:pevele.eudil.fr G:router-students.priv.eudil.fr
 ether 0:10:b5:7:34:a3 file "gayant05 vend-rfc1048 T53:5
 T54:3241163042 T51:43200 SM:255.255.240.0
 DG:router-students.priv.eudil.fr NS:pevele.eudil.fr
 DN:"priv.eudil.fr" T28:2887393279 HN:"gayant05"
 (ttl 64, id 28946)

A.1.3 La communication dans les réseaux locaux

 Capture de paquets ARP :


 gayant05# tcpdump -vvv -s 1024 -e -x arp
 gayant05# ping phinaert07
 gayant05# ping pevele
 gayant05# tcpdump ...
 16:18:33.356560 0:10:b5:7:34:a3 Broadcast arp 42:
 arp who-has phinaert07.priv.eudil.fr tell gayant05
 0001 0800 0604 0001 0010 b507 34a3 ac1a
 118a 0000 0000 0000 ac1a 1166
 Liste de la table ARP :
 gayant05# arp -a
 router-students.priv.eudil.fr (172.26.16.1) at 00:D0:BC:BF:6C:38 [ether] on eth0
 hainaut.priv.eudil.fr (172.26.16.2) at 00:60:08:71:B9:BE [ether] on eth0
 phinaert07.priv.eudil.fr (172.26.17.102) at 00:10:B5:07:36:86 [ether] on eth0
 Configurations d'un LECS :
 8540# show lane default-atm-addresses
 interface ATM0:
 LANE Client: 47.00918100000000D0BA265B01.00D0BA265B02.**
 LANE Server: 47.00918100000000D0BA265B01.00D0BA265B03.**
 LANE Bus: 47.00918100000000D0BA265B01.00D0BA265B04.**
 LANE Config Server: 47.00918100000000D0BA265B01.00D0BA265B05.00
 8540# show lane database EUDIL
 LANE Config Server database table 'EUDIL' bound to interface/s: ATM0
 no default elan
 elan 'NETWORK': un-restricted, elan-id 201
 server 47.00918100000000D0BA265B01.00D0BA265B03.01 (prio 0) active
 elan 'SERVERS': un-restricted
 server 47.00918100000000D0BA265B01.00D0BA265B03.02 (prio 0) active
 elan 'STAFF': un-restricted
 server 47.00918100000000D0BA265B01.00D0BA265B03.03 (prio 0) active
 elan 'STUDENTS': un-restricted, elan-id 202
 server 47.00918100000000D0BA265B01.00D0BA265B03.04 (prio 0) active
 ...
 Liste des LES et BUS :
 8540# show lane server
 LE Server ATM0.1, Elan name: NETWORK, Admin: up, State: operational
 Master/Backup: Master, Type: ethernet, Max Frame Size: 1516
 locally set elan-id: not set
 elan-id obtained from LECS: 201
 ATM address: 47.00918100000000D0BA265B01.00D0BA265B03.01
 LECS used: 47.007900000000000000000000.00A03E000001.00 connected, vcd 517
 control distribute: vcd 554, 12 members, 25685 packets
 proxy/ (ST: Init, Conn, Waiting, Adding, Joined, Operational, Reject, Term)
 lecid ST vcd pkts Hardware Addr ATM Address
 1P O 78 167 0050.5460.ed90 47.00918100000000D0BA265B01.00505460ED90.01
 2P O 131 390 00d0.58f5.445d 47.00918100000000D0BA265B01.00D058F5445D.01
 3P O 141 378 00d0.58fb.5e1d 47.00918100000000D0BA265B01.00D058FB5E1D.01
 4P O 170 393 00d0.58fb.621d 47.00918100000000D0BA265B01.00D058FB621D.01
 5P O 209 660 00d0.58fb.60dd 47.00918100000000D0BA265B01.00D058FB60DD.01
 6P O 357 377 00d0.58fb.6b5d 47.00918100000000D0BA265B01.00D058FB6B5D.01
 7P O 442 19304 00d0.58f5.2b1d 47.00918100000000D0BA265B01.00D058F52B1D.01
 8P O 464 431 00d0.58f5.3e5d 47.00918100000000D0BA265B01.00D058F53E5D.01
 9P O 473 400 00d0.ba11.f59d 47.00918100000000D0BA265B01.00D0BA11F59D.01
 10P O 488 1755 00d0.bcbf.6c38 47.00918100000000D0BA265B01.00D0BCBF6C38.01
 11P O 787 1334 00d0.ba26.5b37 47.00918100000000D0BA265B01.00D0BA265B37.01
 12P O 833 108 00d0.ba26.5b02 47.00918100000000D0BA265B01.00D0BA265B02.01
 ...
 Liste des LEC :
 RG20-1# session 1
 RG20-1# show lane client
 LE Client ATM1.1 ELAN name: NETWORK Admin: up State: operational
 Client ID: 5 LEC up for 11 hours 23 minutes 17 seconds
 ELAN ID: 201
 Join Attempt: 1326
 Last Fail Reason: Fail to set up config VC
 HW Address: 00d0.58fb.60dd Type: ethernet Max Frame Size: 1516 VLANID: 1
 ATM Address: 47.00918100000000D0BA265B01.00D058FB60DD.01

 VCD rxFrames txFrames Type ATM Address
 0 0 0 configure 47.007900000000000000000000.00A03E000001.00
 370 1 667 direct 47.00918100000000D0BA265B01.00D0BA265B03.01
 384 25724 0 distribute 47.00918100000000D0BA265B01.00D0BA265B03.01
 397 0 710 send 47.00918100000000D0BA265B01.00D0BA265B04.01
 409 39459 0 forward 47.00918100000000D0BA265B01.00D0BA265B04.01
 501 2 0 data 47.00918100000000D0BA265B01.00505460ED90.01
 500 54 46 data 47.00918100000000D0BA265B01.00D0BCBF6C38.01
 ...
 Un peu de deverminage (LANE_ARP_REQ,LANE_ARP_RSP) :
 7202# debug lane client all
 pevele# tail -f /var/log/cisco

A.1.4 Le routage entre réseaux locaux

 Exemple des classes d'adresses pour l'EUDIL :


 pevele# sed 's/^[^:]*:[^:]*:\([^:]*\):.*$/\1/' /register/network/vlans
 172.26.224.0/255.255.240.0
 193.48.57.32/255.255.255.224
 193.48.64.0/255.255.255.0
 172.26.16.0/255.255.240.0
 193.48.68.0/255.255.255.128
 172.26.64.0/255.255.240.0
 172.26.32.0/255.255.240.0
 172.26.48.0/255.255.240.0
 193.48.57.192/255.255.255.224
 193.48.65.0/255.255.255.0
 193.48.57.224/255.255.255.224
 193.48.57.160/255.255.255.224
 172.26.80.0/255.255.255.224
 Exemple de la table de routage de portail :
 7202# show ip route connected
 172.26.0.0/16 is variably subnetted, 6 subnets, 2 masks
 C 172.26.224.0/20 is directly connected, ATM2/0.1
 C 172.26.48.0/20 is directly connected, ATM2/0.8
 C 172.26.32.0/20 is directly connected, ATM2/0.7
 C 172.26.16.0/20 is directly connected, ATM2/0.4
 C 172.26.80.0/27 is directly connected, ATM2/0.13
 C 172.26.64.0/20 is directly connected, ATM2/0.6
 193.48.57.0/27 is subnetted, 4 subnets
 C 193.48.57.192 is directly connected, ATM2/0.9
 C 193.48.57.224 is directly connected, ATM2/0.11
 C 193.48.57.160 is directly connected, ATM2/0.12
 C 193.48.57.32 is directly connected, ATM2/0.2
 C 193.48.65.0/24 is directly connected, ATM2/0.10
 C 193.48.64.0/24 is directly connected, ATM2/0.3
 193.48.68.0/25 is subnetted, 1 subnets
 C 193.48.68.0 is directly connected, ATM2/0.5
 C 192.168.1.0/24 is directly connected, ATM2/0.101
 C 192.168.2.0/24 is directly connected, ATM2/0.102
 C 134.206.0.0/16 is directly connected, FastEthernet1/0
 C 192.168.3.0/24 is directly connected, ATM2/0.103
 7202# show ip route rip
 R 192.168.166.0/24 [120/1] via 172.26.33.63, 00:00:05, ATM2/0.7
 R 195.83.194.0/24 [120/2] via 134.206.3.1, 00:00:04, FastEthernet1/0
 R 192.168.91.0/24 [120/1] via 134.206.3.1, 00:00:04, FastEthernet1/0
 R 193.49.225.0/24 [120/1] via 134.206.3.2, 00:00:08, FastEthernet1/0
 [120/1] via 134.206.3.1, 00:00:04, FastEthernet1/0
 R 192.168.61.0/24 [120/1] via 134.206.3.1, 00:00:04, FastEthernet1/0
 R 192.168.60.0/24 [120/1] via 134.206.3.1, 00:00:04, FastEthernet1/0
 R 192.168.247.0/24 [120/1] via 134.206.3.1, 00:00:04, FastEthernet1/0
 R 192.168.246.0/24 [120/1] via 134.206.3.1, 00:00:04, FastEthernet1/0
 ...
 RG20-7202# show ip route static
 S* 0.0.0.0/0 [1/0] via 134.206.3.2
 Exemple de la table de routage d'artois :
 artois# route
 Kernel IP routing table
 Destination Gateway Genmask Flags Metric Ref Use Iface
 193.48.57.32 * 255.255.255.224 U 0 0 0 eth0
 192.168.0.0 * 255.255.255.0 U 0 0 0 tap0
 172.26.16.0 * 255.255.240.0 U 0 0 0 eth1
 default router-servers. 0.0.0.0 UG 0 0 0 eth0
 default router-students 0.0.0.0 UG 1 0 0 eth1
 Exemple de la table de routage d'une machine avec vmware :
 avalon# route
 Kernel IP routing table
 Destination Gateway Genmask Flags Metric Ref Use Iface
 193.48.64.0 * 255.255.255.0 U 0 0 0 eth0
 192.168.230.0 * 255.255.255.0 U 0 0 0 vmnet1
 default * 0.0.0.0 U 0 0 0 eth0

A.1.5 Programmation réseau

 Montrer les appels systèmes avec :


 $ strace nc -l -p 4000
 ...
 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
 bind(3, {sin_family=AF_INET, sin_port=htons(4000),
 sin_addr=inet_addr("0.0.0.0")}}, 16) = 0
 listen(3, 1) =0
 rt_sigaction(SIGALRM, {SIG_IGN}, {SIG_DFL}, 8) = 0
 alarm(0) =0
 accept(3,
 Montrer le fonctionnement d'un serveur TCP :
 # strace -f /usr/sbin/ftpd -s -p 2121
 # strace ftp localhost 2121
 Montrer le fonctionnement d'un serveur UDP :
 # strace -f nc -u -l -p 4000
 ...
 socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
 bind(3, {sin_family=AF_INET, sin_port=htons(4000), sin_addr=inet_addr("0.0.0.0")}}, 16) = 0
 rt_sigaction(SIGALRM, {SIG_IGN}, {SIG_DFL}, 8) = 0
 alarm(0) =0
 recvfrom(3, ...
 ... {sin_family=AF_INET, sin_port=htons(4000),
 sin_addr=inet_addr("127.0.0.1")}}, [16]) = 0
 select(16, [0 3], NULL, NULL, NULL) = 1 (in [3])
 read(3, "\n", 8192) =1
 write(1, "\n", 1) =1
 ...
 # strace nc -u localhost 4000
 socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
 rt_sigaction(SIGALRM, {SIG_IGN}, {SIG_DFL}, 8) = 0
 alarm(0) =0
 connect(3, {sin_family=AF_INET, sin_port=htons(4000),
 sin_addr=inet_addr("127.0.0.1")}}, 16) = 0
 rt_sigaction(SIGALRM, {SIG_IGN}, {SIG_IGN}, 8) = 0
 alarm(0) =0
 select(16, [0 3], NULL, NULL, NULL) = 1 (in [0])
 read(0, "\n", 8192) =1
 write(3, "\n", 1) =1
 ...
 Exemple de fichier /etc/inetd.conf.
 #
 # <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
 #
 #:INTERNAL: Internal services
 #
 echo stream tcp nowait root internal
 echo dgram udp wait root internal
 chargen stream tcp nowait root internal
 chargen dgram udp wait root internal
 discard stream tcp nowait root internal
 discard dgram udp wait root internal
 daytime stream tcp nowait root internal
 daytime dgram udp wait root internal
 time stream tcp nowait root internal
 time dgram udp wait root internal

 #:STANDARD: These are standard services.
 #
 telnet stream tcp nowait telnetd.telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd
 ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/wu-ftpd -l
 telnet stream tcp nowait telnetd.telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd

 #:BSD: Shell, login, exec and talk are BSD protocols.
 #
 shell stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rshd
 login stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rlogind
 exec stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rexecd
 talk dgram udp wait root.tty /usr/sbin/tcpd /usr/sbin/kotalkd
 ntalk dgram udp wait root.tty /usr/sbin/tcpd /usr/sbin/ktalkd

A.1.6 Protocoles TCP/IP

 Montrer les ICMP 8 et 0 de demande et de réponse d'écho :


 gayant05# ping gayant06
 PING gayant06.priv.eudil.fr (172.26.17.139): 56 data bytes
 64 bytes from 172.26.17.139: icmp_seq=0 ttl=255 time=2.0 ms
 64 bytes from 172.26.17.139: icmp_seq=1 ttl=255 time=1.3 ms
 64 bytes from 172.26.17.139: icmp_seq=2 ttl=255 time=1.5 ms
 gayant05# tcpdump -e -x -s 128 icmp
 tcpdump: listening on eth0
 14:22:05.046558 0:10:b5:7:34:a3 0:10:b5:7:34:9c ip 98:
 gayant05 > gayant06.priv.eudil.fr: icmp: echo request
 4500 0054 b534 0000 4001 4a2b ac1a 118a
 ac1a 118b 0800 49fe cc0e 0000 fd01 083a
 f1b3 0000 0809 0a0b 0c0d 0e0f 1011 1213
 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
 3435 3637
 14:22:05.047075 0:10:b5:7:34:9c 0:10:b5:7:34:a3 ip 98:
 gayant06.priv.eudil.fr > gayant05: icmp: echo reply
 4500 0054 b138 0000 ff01 8f26 ac1a 118b
 ac1a 118a 0000 51fe cc0e 0000 fd01 083a
 f1b3 0000 0809 0a0b 0c0d 0e0f 1011 1213
 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
 3435 3637
 ...
 Montrer les ICMP 5 de modification de route :
 gayant05# route add -host gayant06 gw router-students
 gayant05# ping gayant06
 PING gayant06.priv.eudil.fr (172.26.17.139): 56 data bytes
 64 bytes from 172.26.17.139: icmp_seq=0 ttl=255 time=1.7 ms
 64 bytes from 172.26.17.139: icmp_seq=1 ttl=255 time=2.0 ms
 64 bytes from 172.26.17.139: icmp_seq=2 ttl=255 time=1.7 ms
 ...
 gayant05# tcpdump -e -x -s 128 icmp
 tcpdump: listening on eth0
 14:28:50.976445 0:10:b5:7:34:a3 0:d0:bc:bf:6c:38 ip 98:
 gayant05 > gayant06.priv.eudil.fr: icmp: echo request
 4500 0054 faa1 0000 4001 04be ac1a 118a
 ac1a 118b 0800 44ca 060f 0000 9203 083a
 19e6 0e00 0809 0a0b 0c0d 0e0f 1011 1213
 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
 3435 3637
 14:28:50.977596 0:d0:bc:bf:6c:38 0:10:b5:7:34:a3 ip 70:
 router-students.priv.eudil.fr > gayant05: icmp:
 redirect gayant06.priv.eudil.fr to net gayant06.priv.eudil.fr
 4500 0038 a817 0000 ff01 99ed ac1a 1001
 ac1a 118a 0500 ea80 ac1a 118b 4500 0054
 faa1 0000 3f01 05be ac1a 118a ac1a 118b
 0800 44ca 060f 0000
 14:28:50.978087 0:10:b5:7:34:9c 0:10:b5:7:34:a3 ip 98:
 gayant06.priv.eudil.fr > gayant05: icmp: echo reply
 4500 0054 b18c 0000 ff01 8ed2 ac1a 118b
 ac1a 118a 0000 4cca 060f 0000 9203 083a
 19e6 0e00 0809 0a0b 0c0d 0e0f 1011 1213
 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
 3435 3637
 ...
 Montrer les paquets ICMP 11 de datagramme trop vieux, les paquets UDP de TTL croissants
et le paquet ICMP 3 (destination inaccessible) :
 pevele# traceroute -q 1 ftp.jussieu.fr
 traceroute to nephtys.lip6.fr (195.83.118.1), 30 hops max, 38 byte packets
 1 router-servers.eudil.fr (193.48.57.33) 2.108 ms
 2 cisco1.univ-lille1.fr (134.206.3.2) 3.811 ms
 ...
 11 nephtys.lip6.fr (195.83.118.1) 35.629 ms
 pevele# tcpdump -e -x -s 128 \( icmp and dst host pevele \) or \
 \( udp and dst host ftp.jussieu.fr \)
 14:32:37.503746 0:60:8:71:b9:82 0:d0:bc:bf:6c:38 ip 52:
 pevele.eudil.fr.51131 > nephtys.lip6.fr.33435: udp 10 [ttl 1]
 4500 0026 c7bc 0000 0111 be63 c130 3922
 c353 7601 c7bb 829b 0012 98dc 0101 7504
 083a 63af 0700
 14:32:37.504901 0:d0:bc:bf:6c:38 0:60:8:71:b9:82 ip 70:
 router-servers.eudil.fr > pevele.eudil.fr: icmp:
 time exceeded in-transit [tos 0xc0]
 45c0 0038 aa3e 0000 ff01 1c22 c130 3921
 c130 3922 0b00 11ba 0000 0000 4500 0026
 c7bc 0000 0111 be63 c130 3922 c353 7601
 c7bb 829b 0012 98dc
 14:32:37.507148 0:60:8:71:b9:82 0:d0:bc:bf:6c:38 ip 52:
 pevele.eudil.fr.51131 > nephtys.lip6.fr.33436: udp 10
 4500 0026 c7bd 0000 0211 bd62 c130 3922
 c353 7601 c7bb 829c 0012 0acd 0202 7504
 083a f0bc 0700
 14:32:37.510803 0:d0:bc:bf:6c:38 0:60:8:71:b9:82 ip 70:
 cisco1.univ-lille1.fr > pevele.eudil.fr: icmp:
 time exceeded in-transit [tos 0xc0]
 45c0 0038 5202 0000 fe01 e5df 86ce 0302
 c130 3922 0b00 9fc8 0000 0000 4500 0026
 c7bd 0000 0111 be62 c130 3922 c353 7601
 c7bb 829c 0012 0acd
 ...
 16:23:02.449608 0:60:8:71:b9:82 0:d0:bc:bf:6c:38 ip 52:
 pevele.eudil.fr.52994 > nephtys.lip6.fr.33445: udp 10
 4500 0026 cf0d 0000 0b11 ad12 c130 3922
 c353 7601 cf02 82a5 0012 eb3a 0b0b 561e
 083a 1fdc 0600
 16:23:02.483371 0:d0:bc:bf:6c:38 0:60:8:71:b9:82 ip 80:
 nephtys.lip6.fr > pevele.eudil.fr: icmp:
 nephtys.lip6.fr udp port 33445 unreachable [tos 0xc0]
 45c0 0042 a24b 0000 3601 ae08 c353 7601
 c130 3922 0303 30c8 0000 0000 4500 0026
 cf0d 0000 0111 b712 c130 3922 c353 7601
 cf02 82a5 0012 eb3a 0b0b 561e 083a 1fdc
 0600
 Description du protocole UDP :
 $ cat /etc/services | grep udp
 echo 7/udp
 discard 9/udp sink null
 daytime 13/udp
 ...
 time 37/udp timserver
 ...
 bootps 67/udp
 bootpc 68/udp
 tftp 69/udp
 $ echo | nc -u pevele.eudil.fr 13
 Tue Nov 7 14:38:56 2000
 $ netstat -A inet -u -a
 udp 0 0 *:bootps *:*
 udp 0 0 *:domain *:*
 udp 0 0 *:ntp *:*
 udp 0 0 *:netbios-dgm *:*
 udp 0 0 *:netbios-ns *:*
 udp 0 0 *:tftp *:*
 udp 0 0 *:talk *:*
 udp 0 0 *:ntalk *:*
 udp 0 0 *:time *:*
 udp 0 0 *:daytime *:*
 udp 0 0 *:discard *:*
 udp 0 0 *:chargen *:*
 udp 0 0 *:echo *:*
 udp 0 0 *:sunrpc *:*
 udp 0 0 *:syslog *:*
 ...
 Montrer la perte de paquets avec les commandes :
 $ nc -u -l -p 4000 | ( sleep 10 ; cat ) > /tmp/fich1
 ...
 $ nc -u localhost 4000 < /vmlinuz
 ...
 $ ls -l /tmp/fich1 /vmlinuz
 -rw-r--r-- 1 root root 69581 Nov 7 14:43 /tmp/fich1
 -rw-r--r-- 1 root root 716749 Oct 18 17:14 /vmlinuz
 Description du protocole TCP :
 $ cat /etc/services | grep tcp
 ...
 ftp-data 20/tcp
 ftp 21/tcp
 ssh 22/tcp # SSH Remote Login Protocol
 telnet 23/tcp
 smtp 25/tcp mail
 time 37/tcp timserver
 ...
 gopher 70/tcp # Internet Gopher
 finger 79/tcp
 www 80/tcp http # WorldWideWeb HTTP
 ...
 $ nc pevele 21
 220-Welcome, archive user @193.48.64.39 !
 220-
 220-The local time is: Tue Nov 7 14:51:25 2000
 220-
 220-This is an experimental FTP server. If have any unusual problems,
 220-please report them via e-mail to <root@pevele.eudil.fr>.
 220-
 220-If you do have problems, please try using a dash (-) as the first
 220-character of your password -- this will turn off the continuation
 220-messages that may be confusing your ftp client.
 220-
 220 pevele.eudil.fr FTP server (Version wu-2.6.0(1) Fri Jun 23 08:07:11 CEST 2000) ready.
 quit
 221 Goodbye.
 $ netstat -A inet -t -a -p
 ...
 tcp *:ssh *:* LISTEN -
 tcp *:telnet *:* LISTEN -
 tcp *:smtp *:* LISTEN -
 tcp 193.48.64.39:33785 artois.eudil.fr:3128 ESTABLISHED 502/netscape
 tcp 193.48.64.39:33782 artois.eudil.fr:3128 ESTABLISHED 502/netscape
 tcp 193.48.64.39:33414 pevele.eudil.fr:ssh ESTABLISHED 2204/ssh
 tcp 193.48.64.39:33275 pevele.eudil.fr:ssh ESTABLISHED 1743/ssh
 ...
 Mode connecté :
 $ netstat -A inet -t
 Active Internet connections (w/o servers)
 Proto Recv-Q Send-Q Local Address Foreign Address State
 tcp 0 94 pevele.eudil.fr:smtp 62.161.186.124:1325 ESTABLISHED
 tcp 0 49 pevele.eudil.fr:1384 sofrer-nat.clients:smtp ESTABLISHED
 tcp 0 0 pevele.eudil.fr:smtp 62.161.186.124:1317 TIME_WAIT
 tcp 0 0 pevele.eudil.fr:smtp kipper02.priv.eudi:4510 TIME_WAIT
 tcp 0 58400 pevele.eudil.f:ftp-data ttmdy070188.montro:2582 ESTABLISHEDs
 tcp 0 0 pevele.eudil.fr:smtp 62.161.186.124:1311 TIME_WAIT
 tcp 0 0 pevele.eudil.fr:pop3 phinaert03.priv.eu:2920 TIME_WAIT
 tcp 0 0 pevele.eudil.fr:ssh goto.priv.eudil.fr:866 ESTABLISHED
 tcp 0 77 pevele.eudil.fr:ftp ttmdy070188.montro:2566 ESTABLISHED
 tcp 0 0 pevele.eudil.fr:smtp 207.94.47.202:3362 FIN_WAIT2
 tcp 0 1 pevele.eudil.fr:1031 212.37.207.51:auth LAST_ACK
 tcp 0 0 pevele.eudi:netbios-ssn corse.eudil.fr:61739 ESTABLISHED
 ...
 Montrer la non perte de paquets avec les commandes :
 $ nc -l -p 4000 | ( sleep 10 ; cat ) > /tmp/fich1
 ...
 $ nc localhost 4000 < /vmlinuz
 ...
 $ ls -l /tmp/fich1 /vmlinuz
 -rw-r--r-- 1 root root 716749 Nov 7 15:28 /tmp/fich1
 -rw-r--r-- 1 root root 716749 Oct 18 17:14 /vmlinuz
 Montrer la phase de connexion TCP :
 gayant05# nc pevele 21
 ...
 gayant05# tcpdump -e -x -s 128 host pevele and port 21
 15:31:57.189984 0:d0:bc:bf:6c:38 0:60:8:71:b9:82 ip 74:
 weppes.priv.eudil.fr.2137 > pevele.eudil.fr.ftp:
 S 3611621681:3611621681(0) win 32120
 <mss 1460,sackOK,timestamp 110933944 0,nop,wscale 0>
 (DF) [tos 0x10]
 4510 003c 94a3 4000 3f06 f097 ac1a 1004
 c130 3922 0859 0015 d744 f931 0000 0000
 a002 7d78 7ce4 0000 0204 05b4 0402 080a
 069c b7b8 0000 0000 0103 0300
 15:31:57.190068 0:60:8:71:b9:82 0:d0:bc:bf:6c:38 ip 74:
 pevele.eudil.fr.ftp > weppes.priv.eudil.fr.2137:
 S 3640171901:3640171901(0) ack 3611621682 win 32120
 <mss 1460,sackOK,timestamp 190083705 110933944,nop,wscale 0>
 (DF)
 4500 003c 60c3 4000 4006 2388 c130 3922
 ac1a 1004 0015 0859 d8f8 9d7d d744 f932
 a012 7d78 888f 0000 0204 05b4 0402 080a
 0b54 7279 069c b7b8 0103 0300
 15:31:57.192459 0:d0:bc:bf:6c:38 0:60:8:71:b9:82 ip 66:
 weppes.priv.eudil.fr.2137 > pevele.eudil.fr.ftp:
 . ack 1 win 32120 <nop,nop,timestamp 110933945 190083705>
 (DF) [tos 0x10]
 4510 0034 94a5 4000 3f06 f09d ac1a 1004
 c130 3922 0859 0015 d744 f932 d8f8 9d7e
 8010 7d78 b753 0000 0101 080a 069c b7b9
 0b54 72791

A.2 Programmation en Bourne Shell

A.2.1 Serveur Web en Bourne Shell


#!/bin/sh
#
# Exemple de serveur HTTP en shell
#

#
# Quelques constantes
#

NC=/usr/bin/nc
PORT=8080
TTY_PREFIXE=/dev/tty
PTY_PREFIXE=/dev/pty
TTY_NUMERO=q3
REPERTOIRE=${HOME}/Scripts/Web

#
# Boucle principale
# (ecoute sur le port, traitement de la requete, envoi du fichier)
#

while true ; do
#
# On ecoute sur le cote maitre du terminal virtuel
#
${NC} -l -p ${PORT} 4<>${PTY_PREFIXE}${TTY_NUMERO} >&4 2>&4 <&4 &
PID=$!
#
# On lance un sous-shell sur le cote esclave
#
(
stty -echo igncr
#
# Lecture de la requete HTTP
#
read requete
#
# Lecture des entetes (mises a la poubelle)
#
while read line ; do
if [ -z "${line}" ] ; then break ; fi
done
#
# Analyse de la requete
#
set -- ${requete}
commande=$1 ; file=$2 ; protocole=$3
#
# Reponse a la requete
#
if [ "${commande}" != "GET" -o ! -f "${REPERTOIRE}/${file}" ] ; then
echo "${protocole} 400 erreur"
echo
echo "Erreur !!"
else
echo "${protocole} 200 OK"
echo "Content-type: text/html"
echo
cat "${REPERTOIRE}/${file}"
fi
) 4<>${TTY_PREFIXE}${TTY_NUMERO} >&4 2>&4 <&4
#
# On stoppe l'ecoute
#
kill ${PID}
sleep 2
done

A.2.2 Exemple de page Web


<html>
<head>
<title>Serveur web de demonstration</title>
</head>

Voici deux p't liens :

<dl>
<dt>
<a href="/fichier1">Premier fichier</a>
<dt>
<a href="/fichier2">Second fichier</a>
</dl>
<p align=right>
Serveur Script
</p>
</body>
</html>

A.3 Sources pour RPC

A.3.1 Makefile pour le serveur et le client RPC


#
# Generation d'un client et d'un serveur RPC de demonstration
# (simple addition et soustraction d'entiers).
#

# Quelques constantes liees au projet

CLIENT_OBJS=calc_client.o calc_clnt.o calc_xdr.o


SERVER_OBJS=calc_server.o calc_svc.o calc_xdr.o

# Message pour la marche a suivre

all:
@echo -e "\
Tapez d'abord make generate pour obtenir le fichier d'inclusion .h et\n\
les fichiers C. Modifiez les programmes calc_client.c et calc_server.c\n\
puis lancez la compilation par make compile."

# Generation des fichiers C par rpcgen

generate: calc.x
rpcgen -a -C $^
# Copie des fichiers modifies a la main sur leurs modeles

copy:
cp calc_client_modified.c calc_client.c
cp calc_server_modified.c calc_server.c

# Compilation des programmes C

compile: client server

client: ${CLIENT_OBJS} calc.h


gcc -o client ${CLIENT_OBJS}

server: ${SERVER_OBJS} calc.h


gcc -o server ${SERVER_OBJS}

# Regle de nettoyage

clean:
rm -f client server *.o calc.h calc_svc.c calc_clnt.c calc_xdr.c
rm -f calc_client.c calc_server.c

A.3.2 Définition des RPC


/********************************************************************/
/** Fichier de definition de RPC d'addition et de soustraction **/
/********************************************************************/

/** Quelques constantes **/

#define PROGRAM_NUMBER 19992000


#define VERSION_NUMBER 1

/** Structures des parametres des procedures **/

struct operandes {
int x;
int y;
};

/** Definition des RPC **/

program CALC_PROG {
version CALC_VERSION {
int ADD(operandes) = 1;
int SUB(operandes) = 2;
} = VERSION_NUMBER;
} = PROGRAM_NUMBER;

A.3.3 Fichier C du serveur


/*
* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
*/

#include "calc.h"

int *
add_1_svc(operandes *argp, struct svc_req *rqstp)
{

static int result;

/* AJOUT DE CODE : implantation de l'addition */


result=argp->x+argp->y;
/* FIN D'AJOUT DE CODE */
return(&result);
}

int *
sub_1_svc(operandes *argp, struct svc_req *rqstp)
{

static int result;

/* AJOUT DE CODE : implantation de la soustraction */


result=argp->x-argp->y;
/* FIN D'AJOUT DE CODE */

return(&result);
}

A.3.4 Fichier C du client


/*
* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
*/

#include "calc.h"

void
/** MODIFICATION DE CODE : ajout des operandes en parametre **/
calc_prog_1( char* host, int x, int y )
/** FIN DE MODIFICATION DE CODE **/
{
CLIENT *clnt;
int *result_1;
operandes add_1_arg;
int *result_2;
operandes sub_1_arg;
clnt = clnt_create(host, CALC_PROG, CALC_VERSION, "udp");
if (clnt == NULL) {
clnt_pcreateerror(host);
exit(1);
}
/** AJOUT DE CODE : initialisation du parametre de la RPC **/
add_1_arg.x = x ; add_1_arg.y = y ;
/** FIN D'AJOUT DE CODE **/
result_1 = add_1(&add_1_arg, clnt);
if (result_1 == NULL) {
clnt_perror(clnt, "call failed:");
}
/** AJOUT DE CODE : affichage du resultat de la RPC **/
printf("%d + %d = %d\n",add_1_arg.x,add_1_arg.y,*result_1);
/** FIN D'AJOUT DE CODE **/
/** AJOUT DE CODE : initialisation du parametre de la RPC **/
sub_1_arg.x = x ; sub_1_arg.y = y ;
/** FIN D'AJOUT DE CODE **/
result_2 = sub_1(&sub_1_arg, clnt);
if (result_2 == NULL) {
clnt_perror(clnt, "call failed:");
}
/** AJOUT DE CODE : affichage du resultat de la RPC **/
printf("%d - %d = %d\n",sub_1_arg.x,sub_1_arg.y,*result_2);
/** FIN D'AJOUT DE CODE **/
clnt_destroy( clnt );
}

main( int argc, char* argv[] )


{
char *host;
/** AJOUT DE CODE : variables pour les operandes **/
int x,y;
/** FIN D'AJOUT DE CODE **/

/** MODIFICATION DE CODE : nouvelle syntaxe **/


if(argc < 4) {
printf("usage: %s server_host op1 op2\n", argv[0]);
/** FIN DE MODIFICATION DE CODE **/
exit(1);
}
host = argv[1];
/** MODIFICATION DE CODE : recuperation et utilisation des operandes **/
x = atoi(argv[2]);
y = atoi(argv[3]);
calc_prog_1( host, x, y );
/** FIN DE MODIFICATION DE CODE **/
}

You might also like