Vous êtes sur la page 1sur 51

Les sockets

Master RSSI/Réseaux et Systèmes Répartis


1ème année (Semestre 2)
UDL-SBA

Dr BOUAMAMA Samah

2016/2017
PLAN
• Socket
• Définitions
• Propriétés
• Les modes de connexion
• Implémentation
• sockets en mode connecté
• sockets en mode non connecté
• Travaux pratiques
Définition
• Le terme “ socket ” désigne à la fois une bibliothèque
d’interface réseau et l’extrémité d’un canal de communication
(point de communication) par lequel un processus peut
émettre ou recevoir des données.
• Ce point de communication est représenté par une variable
entière, similaire à un descripteur de fichier.
Définition

• L’interface socket est un ensemble de primitives qui permettent


de gérer l’échange de données entre processus, que ces
processus soient exécutés ou non sur la même machine.
• La bibliothèque socket masque l’interface et les mécanismes de
la couche transport : un appel socket se traduit par plusieurs
requêtes transport
Définition
• socket : (interface) mécanisme de communication permettant d’utiliser l’interface de transport
(TCP(fiable)-UDP(service non fiable)). Elle est créée par l’application et contrôlée par le système.
• Introduit dans Unix dans les années 80 ; standard aujourd’hui
• Principe de fonctionnement : 3 phases - illustration ci-dessous avec TCP
• 1) le serveur crée une "socket serveur" pour accueillir les clients (associée à un port) et se met
en attente

• 2) le client se connecte à la socket serveur ; deux sockets sont alors crées : une "socket client",
côté client, et une "socket service client" côté serveur. Ces sockets sont connectées entre elles

• 3) Le client et le serveur communiquent par les sockets. L’interface (analogie) est celle des
fichiers (read, write).
• La socket serveur peut accepter de nouvelles connexions
Rôle des sockets

 Connexion à une machine distante


 Envoi/Réception de données
 Fermeture d’une connexion
 Attachement à un port
 Acceptation d’une demande de connexion à un port local
 Attente de demandes de connexion
Propriétés
Sockets / OSI
Propriétés
• Modèle client / serveur et sockets

Application Application
CLIENT SERVEUR

SOCKETS SOCKETS

Protocole Transport Protocole Transport

Protocole Réseau Protocole Réseau

couches physiques et couches physiques et


liaison de données liaison de données
Les modes de connexion

• Le mode connecté correspond au protocole TCP. Le protocole établit une


connexion virtuelle et se charge alors de maintenir l'intégrité de la
communication et de gérer les erreurs de transmission.
• Le mode non connecté correspond au protocole UDP. Ce protocole fait l'envoi
au mieux ("best effort"). C'est à l'application de maintenir la qualité de la
transmission. UDP est une "couche mince" au-dessus de IP.
Les modes de connexion
• TCP
• Garantie d’arrivée dans l’ordre de paquets de données
• Fiabilité de transmission
• Lenteur des transmissions (http par exemple)
• Vu comme un «service téléphonique»
• UDP
• Arrivée dans le bon ordre non garantie
• Non fiabilité des transmissions
• Rapidité des transmissions
• Applications audio/vidéo
• Vu comme un «service postal»
Principes de base
• Chaque machine crée une socket,
• Chaque socket sera associée à un port de sa machine hôte,
• Les deux sockets seront explicitement connectées si on utilise un protocole en
mode connecté …,
• Chaque machine lit et/ou écrit dans sa socket,
• Les données vont d’une socket à une autre à travers le réseau,
• Une fois terminé chaque machine ferme sa socket.
Notion de port
• Un service est rendu par un programme serveur sur une machine. Ce service est accessible à
travers un réseau TCP/IP par un port. Un port est identifié par un entier (16 bits).
• Les ports numérotés de 0 à 511 sont les "well known ports" de l'architecture TCP/IP. Ils donnent
accès aux services standard de l'interconnexion: transfert de fichiers (FTP port 21), terminal
(Telnet port 23), courrier (SMTP port 25),serveur web (HTTP port 80)
• De 512 à 1023, on trouve les services Unix.
• Au delà, (1024 ...) ce sont les ports "utilisateurs" disponibles pour placer un service applicatif
quelconque.
sockets en mode connecté
SERVEUR :
• Crée une socket
• Associe une adresse socket (adresse Internet et numéro de port)
• Se met à l’écoute des connexions entrantes ;
• Pour chaque connexion entrante:
o Accepte la connexion (une nouvelle socket est créée avec les mêmes
caractéristiques que la socket d’origine, ce qui permet de lancer un
thread ou un processus fils pour gérer cette connexion).
o Lit et/ou écrit sur la nouvelle socket
o Ferme la nouvelle socket
sockets en mode connecté
CLIENT :
• Crée une socket
• Se connecte au serveur en donnant l’adresse socket
distante (adresse Internet du serveur et numéro de port du
service). Le système d'exploitation attribue pour cette
connexion automatiquement un numéro de port local au
client
• Lit et/ou écrit sur la socket
• Ferme la socket
sockets en mode connecté
sockets en mode connecté (java.net)
CLIENT SERVEUR "serv"
ServerSocket(PORT)

Socket(ip,PORT) Nouvelle socket et


.accept()
éventuellement nouveau thread
ici...
in = new BufferedReader(
in = new BufferedReader(...( new InputStreamReader(
socket.getInputStream())) cxion.getInputStream()))
out = new PrintWriter(…( out = new PrintWriter(
socket.getOutputStream())) new BufferedOutputStream(
cxion.getOutputStream()))

out.println(…);out.flush() Transfert in.readLine();


in.readLine(); de out.println(…);out.flush()
données
socket.close() cxion.close()

Implémentation des algorithmes Client/Serveur en mode connecté


sockets en mode connecté
• class ServerSocket : (coté serveur)
• Constructeur :
• ServerSocket(int port) : creation d’une socket TCP connectée sur le port spécifié de la
machine hôte.
• Méthodes :
• close() : ferme la socket.
• Socket accept() : écoute la socket et attend une requête de connection, retourne une nouvelle
socket sur laquelle écouter le nouveau client (et lui seul)
sockets en mode connecté
• class OutputStream :
• Méthodes :
• write(…) : écrit dans le flux.
• close() : ferme flux.
• class InputStream :
• Méthodes :
• read(…) : lit le flux.
• close() : ferme le flux
sockets en mode non connecté
• CLIENT (émetteur) :
• Crée une socket
• Associe une adresse socket (opération qui n’est nécessaire que si le Processus va recevoir des données)
• Lit et/ou écrit sur la socket
• SERVEUR (récepteur) :
• Crée une socket
• Associe une adresse socket
• Lit et/ou écrit sur la socket
sockets en mode non connecté
sockets en mode non connecté (java.net)

CLIENT SERVEUR

DatagramSocket () DatagramSocket (port)

DatagramPacket(..) DatagramPacket (...)

sock.send()
sock.receive()
: appel pouvant être
DatagramPacket (...) bloquant
: appel non bloquant
DatagramPacket(..)
sock.send ()
sock.receive()

Implémentation des algorithmes


Client/Serveur en mode non connecté
sockets en mode non connecté
 Sockets UDP en Java (une démarche possible) :
 class DatagramSocket : (coté client et coté serveur)
Constructeur :
 DatagramSocket() : creation d’une socket UDP, libre
Méthodes :
 close() : ferme la socket.
 receive(DatagramPacket p) :reçoit un « DatagramPacket » de cette socket.
 send(DatagramPacket p):envoit un « DatagramPacket » sur cette socket.
sockets en mode non connecté

• class DatagramPacket :
• Constructeur :
• DatagramPacket(byte[ ] buf, int length,InetAddress address, int port) :creation d’un packet à
destination d’une machine et d’un port spécifiés
Gestion des ports (adresses) en Java

 Classe InetAdress
 Dans java.net
 Champs
 hostName (exemple : lil.univ-littoral.fr)
 address (32 bits, exemple : 193.49.192.193)
 Pas de constructeur
 3 méthodes statiques
 public static InetAddress InetAddress .getByName(String hote)
 public static InetAddress[] InetAddress .getAllByName(String hote)
 public static InetAddress InetAddress .getLocalHost()

 Classes Socket, SocketServer et SocketImpl


 getInetAddress()
Classe Socket (1)

 Constructeurs
 public Socket(String hote, int port) throws
UnknownHostException, IOException
 public Socket(InetAddress hote, int port) throws IOException
 public Socket(String hote, int port, InetAddress adrLocale, int
portLocal) throws IOException
 public Socket(InetAddress hote, int port, InetAddress
adrLocale, int portLocal) throws IOException
 public Socket()
 protected Socket(SocketImpl impl)
Classe Socket (2)

 Information
 public InetAddress getInetAddress()
 public int getPort()
 public int getLocalPort()
 public InetAddress getLocalAddress()
 Envoi/Réception de données
 public InputStream getInputStream() throws IOException
 public OutputStream getOutputStream() throws IOException
 Fermeture
 public void close() throws IOException
Classe Socket (3)

 Options
 TCP_NODELAY
 Donnée expédiée aussitôt que possible quelque soit leur taille
 Méthodes setTcpNoDelay (boolean valid) et getTcpNoDelay() : (true) 1
 SO_LINGER
 Attente ou non avant de fermer une socket au cas où il reste des données à
envoyer
 Méthodes setSoLinger (boolean valid, int secondes) et getSoLinger() : 128s
Classe Socket (4)

 SO_TIMEOUT
 Déclenchement d’exception si le délai spécifié est dépassé lors
de la réception de données
 Méthodes setSoTimeout (int ms) et getSoTimeout() : 4102ms

 Exceptions
 SocketException
 BindException : port déjà utilisé ou le programme n’a pas le
droit de l’utiliser
 ConnectException : hôte occupé ou aucun processus n’écoute sur
le port
 NoRouteToHostException : dépassement de temps
Classe ServerSocket (1)

 Rôle : standardiste
 Gestion d’une connexion
 Création d’un nouvel objet ServerSocket affecté à un
port : constructeur ServerSocket
 Attente de connexions (bloquant) : accept()
 Echange d’informations : getInputStream() et
getOutputStream()
 Clôture de la connexion par le client ou le serveur :
close()
 Nouvelle attente
Classe ServerSocket (2)

 Constructeurs
 public ServerSocket(int port) throws IOException,
BindException
 public ServerSocket(int port, int taillefile) throws IOException,
BindException
 public ServerSocket(int port, int taillefile, InetAddress
adresseAttache) throws IOException
 protected ServerSocket()
 Prise en compte et clôture d’une connexion
 public Socket accept() throws IOException
 public void close() throws IOException
Classe ServerSocket (3)

 Information
 public InetAddress getInetAddress()
 public int getLocalPort()
 Options
 SO_TIMEOUT
 Doit être initialisé avant accept
 Méthodes setSoTimeout (int ms) et getSoTimeout()
Sockets UDP point-à-point
 Pas de différence de classe entre le client et le serveur
 Deux classes Java dans java.net
 DatagramPacket
 DatagramSocket
 DatagramPacket
 Assemblage des données en partance en datagrammes
 Extraction des données des datagrammes reçus
 DatagramSocket
 Envoi et réception des datagrammes UDP (objets DatagramPacket)
Classe DatagramPacket (1)
 Constructeurs
 DatagramPacket destiné à la réception de données
 publicDatagramPacket(byte tampon[], int longueur)
 Réception des données dans tampon
 Longueur maximale : 65 507 octets
 Java remplit les champs de DatagramPacket : adresse IP de la machine distante et le numéro
de port concerné
 DatagramPacket destiné à l’envoi de données
 publicDatagramPacket(byte tampon[], int longueur, InetAddress ia, int port)
 Conseil : utiliser getBytes() de la classe String pour transformer des chaînes de caractères
en tableaux d’octets
Classe DatagramPacket (2)

 Information (suite)
 public byte[] getData()
 Tableau d’octets du datagramme
 Caractères ASCII : String s=new String(dp.getData(), 0, 0, dp.getLength());
 Caractères non ASCII : ByteArrayInputStream b=new
ByteArrayInputStream(dp.getData(), 0, 0, dp.getLength());
 public InetAddress getLength()
 Taille en octets du datagramme
Classe DatagramSocket (1)

 Constructeurs
 DatagramSocket utilisé par le client
 public DatagramSocket() throws SocketException
 Ports de destination et de partance spécifiés dans le datagramme (objet
DatagramPacket)
 DatagramSocket utilisé par le serveur
 public DatagramSocket(int port) throws SocketException
 Remarque : les ports TCP et leurs équivalents UDP ne sont pas liés i.e. un
même numéro de port peut être associé à la fois à une socket TCP et une
socket UDP sans provoquer aucun problème de conflit
 DatagramSocket utilisé par le serveur multi-adresse
 public DatagramSocket(int port, InetAdress ia) throws SocketException
Classe DatagramSocket (2)

 Emission/Réception de datagrammes
 public void send(DatagramPacket dp) throws IOException
 public void receive(DatagramPacket dp) throws IOException
 Information
 public int getLocalPort()
Numéro de port (anonyme et assigné par le système) sur lequel la socket courante
écoute
 Fermeture
 public void close()
 Option : SO_TIMEOUT
 public void setSoTimeout(int timeout) throws SocketException
Sockets multi-points

 Communication multi-points : on s’adresse à un groupe qu’on peut intégrer et


quitter à sa guise
 Exemples : visio-conférence, radio, télévision, etc.
 Multi-points = compromis
 Multi-diffusions
 Point-à-point
 Caractéristiques
 Efficace car données dupliquées au moment opportun
 Basée sur l’utilisation de routeurs multi-point
 Applications
 Jeu réseau multi-utilisateurs, SGF distribués, calcul parallèle & distribué, etc.
Adresses et groupes multi-points (1)
 Adresse multi-points
 Référence un groupe d’hôtes (groupe multi-points)
 Rangée dans la classe D
 Groupe multi-points
 Plusieurs hôtes Internet partageant la même adresse multi-points
 Libre adhésion ou départ au/du groupe
 lnternet Assigned Number Autority (IANA) est responsable de
l’affectation des adresses mutli-points
 Il en existe 80
 Exemple : AUDIONEWS.MCAST.NET --> 224.0.1.7 - Actualité audio
transmise en multi-points
Adresses et groupes multi-points (2)
 Liste exhaustive dans :
http://www.iana.org/assignments/multicast-addresses
 Il existe des routeurs multi-points (mrouteurs)
 Datagramme multi-points
TTL En-tête IP En-tête UDP Charge utile

1 octet
4 octets 4 octets 2 octets 2 octets 2 octets 2 octets
...
Contrôle pour fiabilité
Longueur
Port destinataire
Port expéditeur
Hôte destinataire
Hôte expéditeur
Time-To-Live (TTL)

 Définition
 Portée d’un datagramme i.e. nombre de routeurs maximum par
lesquels un datagramme transite avant sa suppression
 Réseau local : TTL=1, Région : TTL=16, Monde entier : TTL=127
 Utilisation
 TTL décrémentée à chaque passage dans un routeur
 TTL=0 : datagramme supprimé
Mise en œuvre des sockets multi-point

 Classe java.net.MulticastSocket
 Dérivée de la classe java.net.DatagramSocket
 Constructeurs
 public MulticastSocket() throws SocketException
 Port assigné par le système
 getLocalPort() : renvoie le numéro du port
 public MulticastSocket(int port) throws
SocketException
Communication avec un groupe multi-point (1)

 Opérations possibles
 Adhésion à un groupe
 Echanger (Emettre/Recevoir) des données avec les
membres d’un groupe
 Quitter un groupe
 Méthodes
 public void joinGroup(InetAddress adrmultipt) throws
SocketException
 public void leaveGroup(InetAddress adrmultipt)
throws SocketException
Communication avec un groupe multi-point (2)

 Public synchronized void send(DatagramPacket dp,


byte ttl) throws IOException, SocketException
 public void setInterface(InetAddress interface)
throws SocketException
 public InetAddress getInterface() throws
SocketException
 Non autorisé avec les applets!
courrier entrant (POP3 port 110),
transfert de fichiers sécurisé (SFTP port 115),
courrier entrant (IMAP3 port 220),
authentification (LDAP, port 389),
serveur web sécurisé (HTTPS port 443),
accès à la base de données Mysql (port 3306)

Vous aimerez peut-être aussi