Вы находитесь на странице: 1из 61

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=2 n -1 ;

o

ensuite max est fixé à 1023 ;

o

après 16 essais la trame est jetée.

1.1.2 Exemple de fonctionnement

essais la trame est jetée. 1.1.2 Exemple de fonctionnement 1.1.3 Bits de brouillage  Décalage dans

1.1.3 Bits de brouillage

Décalage dans la détection de collision :

brouillage  Décalage dans la détection de collision :  Décalage temporel maximal : 2× t

Décalage temporel maximal : 2× t propagation .

Ce décalage est la tranche de temps d'Ethernet.

Calcul de la taille maximal du câble :

o

vitesse du signal v propagation =200.000 km/s ;

o

taille minimale la trame T=64 octets ;

o

o

o

débit du médium d=10 Mbit/s ;

longueur maximale du câble l ;

équation reliant les termes :

T

2

l

v propagation

d

o

o

longueur maximale du médium l=v propag × T/2d.

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

Adresse de diffusion

préfixe

constructeur

00:00:1B

Novell

10:00:5A

IBM

08:00:09

Hewlett Packard

AA:00:00,03,04

Digital

ff:ff:ff:ff:ff:ff

1.1.5 Format de la trame

Digital 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

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

Les ponts (couche liaison) :

 Les ponts (couche liaison) :  Les routeurs (couche réseau)  Les convertisseurs (couches supérieures)

Les routeurs (couche réseau)

ponts (couche liaison) :  Les routeurs (couche réseau)  Les convertisseurs (couches supérieures) o TCP/IP

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
Un réseau local à diffusion :
o
Vers des réseaux segmentés :
 Étapes de l'évolution des réseaux : o Un réseau local à diffusion : o Vers

o Le but, la commutation totale:

o Le but, la commutation totale:  Trois méthodes de relais : o Cut Through (Fast

Trois méthodes de relais :

o

Cut Through (Fast Forward) ;

o

Store and Forward ;

o

Fragment Free (64 octets).

Techniques de commutation :

Fragment Free (64 octets).  Techniques de commutation : 1.2.3 Le Spanning Tree  Liens redondants

1.2.3 Le Spanning Tree

Liens redondants pour la robustesse :

Free (64 octets).  Techniques de commutation : 1.2.3 Le Spanning Tree  Liens redondants pour

Eviter les doublons dans les réseaux

 Eviter les doublons dans les réseaux  mais surtout éviter les boucles.  Principe de

mais surtout éviter les boucles.

dans les réseaux  mais surtout éviter les boucles.  Principe de fonctionnement du Spanning Tree

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
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
o Par segment, élection d'un élément priviligié : o Les port non marqués sont désactivés
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) :

réseaux virtuels  Concept de réseaux virtuels (VLAN) :  Encapsulation des trames (ISL) ou ajout

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 :

1.2.6 Structure de la cellule ATM  Format de la trame :  Identification des circuits

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

Des tables au niveau de chaque commutateur :

 Des tables au niveau de chaque commutateur :  Cellules livrées dans l'ordre (perte possible)

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

Deux types de commutateurs :

(perte possible)  Deux types de commutateurs : 1.3 Configuration IP 1.3.1 Hypothése de travail 

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

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

protocoles d'Internet Les protocoles liés à Internet 1.3.3 L'adressage IP  Au moins une adresse par

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 :

période fixée ; o assigner toujours la même adresse, si possible.  Dialogue entre serveurs et

1.3.6

Paquet DHCP

1.3.6 Paquet DHCP 1.5 Le routage entre réseaux locaux 1.4.1 Principe de la résolution d'adresse 

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 :

!".  Cache des réponses ARP récentes.  Format du paquet ARP :  Exemple de

Exemple de dialogue ARP :

1.4.3 Classical IP sur ATM  Pas de diffusion possible sur ATM.  Solution :

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 :

Résolution d'adresse MAC :

 Résolution d'adresse MAC :  Envoi d'un paquet unicast :

Envoi d'un paquet unicast :

 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

Routage entre ELAN :

 Routage entre ELAN : 1.5 Le routage entre réseaux locaux 1.5.1 Les classes d'adresses IP

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 :

; o soit 8 sous-réseaux de 32 machines : 1.5.3 Principes du routage IP Communication entre

1.5.3 Principes du routage IP

Communication entre machines non directement connectées

IP Communication entre machines non directement connectées  Nombre de répéteurs limité.  Diffusion

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

 Solution : des tables de routage. 1.5.4 Exemple de table de routage Table de routage

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

de route par défaut Table de routage de soleil.uvsq.fr réseau cible routeur 193.51.24.0 193.51.24.1

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

nat : réécriture de l'adresse source, 1.5.8 Exemple de routage de sous-réseaux Table de routage de

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

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

TCP/IP 2.1 Protocole réseau IP 2.1.1 Format des paquets IP  Type de service : 

Type de service :

IP 2.1.1 Format des paquets IP  Type de service :  Protocoles : ICMP(1), UDP(17),

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

Options IP :

Protocoles : ICMP(1), UDP(17), TCP(6).  Options IP :  Exemples d'options : o routage strict

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 :

des paquets :  Découpage à l'identique :  Puis modification de l'entête : Paquet Lg.
des paquets :  Découpage à l'identique :  Puis modification de l'entête : Paquet Lg.

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 :

 Véhicule les erreurs réseau.  Format général :  Types de message : Type Description

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

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
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

(-) programmation complexe 2.3.3 Format des datagrammes 2.3.4 Exemple de datagramme 2.4 Protocole de transport TCP

2.3.4 Exemple de datagramme

(-) 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.3 Format des datagrammes 2.4.4 Options TCP  L'option No operation o format de l'option :

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

: aligner sur des mots.  L'option maximum segment o format de l'option : o rôle
o format de l'option : o rôle : donne la taille maximum d'un segment TCP
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 :

 L'option window scale o format de l'option : o rôle : multiplicateur de la fenêtre

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.
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.
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.
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

o Retransmettre après un délai :

o Retransmettre après un délai :  Efficacité due au fenétrage :  Une connexion concertée

Efficacité due au fenétrage :

o Retransmettre après un délai :  Efficacité due au fenétrage :  Une connexion concertée

Une connexion concertée :

 Une déconnexion concertée : 2.4.6 Adaptabilité  Fenêtre mobile (la cible décide).  Calcul

Une déconnexion concertée :

 Une déconnexion concertée : 2.4.6 Adaptabilité  Fenêtre mobile (la cible décide).  Calcul d'un

2.4.6 Adaptabilité

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

Calcul d'un temps moyen aller-retour :

Temporisateurs constamment adaptés :

- 0
-
0

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 :

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

connexions (liste de cookies). 2.4.8 Exemple de datagramme 3 Programmation réseau : les sockets 3.1 Généralité

3 Programmation réseau : 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 :

(OSI) ; o  Schéma des couches logicielles :  Représentation gros-boutiste des données : 

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

: pas de tampon en sortie. 3.3.1 Schéma de principe 3.3.2 Primitives pour le serveur 

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

pour le mode non connecté 3.4.1 Schéma de principe 3.4.2 Primitives de communication  Envoi d'un

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);

o

retourne le nombre d'octets envoyés ;

o

le message est contenu dans message ;

o

la longueur du message est size ;

o

l'adresse cible est dans address ;

o

le 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 {

*p_name;

**p_aliases; /* liste des surnoms */

int p_proto;