Comment communiquer?
La communication entre ordinateurs est similaire à ce qui est utilisé entre humains.
Lorsque l’on communique, un expediteur envoie un message à un destinataire en utilisant un support. Ils doivent se mettre d’accord sur le langage et sur la manière de décrire le message.
Comment communiquent des applications sur différentes machines?
Les couches réseaux
Comment envoyer des bits entre deux machines reliées par un cable?
On envoie des impulsions électriques et on se met d’accord sur la manière d’encoder/décoder ces impulsions.
Le protocole utilisé consitue la couche 1 (physique) de la pile de communication. Ex: codage MLT-3 transitant sur des cables torsadés avec connecteurs RJ45.
Les couches réseaux
Comment envoyer des messages entre deux machines dans un réseau local?
Chaque machine du réseau possède une adresse. Après avoir envoyé un message sur le réseau local en utilisant la couche 1, chaque machine recevant le message verifie si elle est destinataire du message en comparant l’adresse de destination avec sa propre adresse
Le protocole utilisé consitue la couche 2 (liaison) de la pile de communication. Ex: le protocole Ethernet.
Les couches réseaux
Comment envoyer des messages entres deux machines dans deux réseaux différents?
Une machine particulière (routeur) permet de relier differents réseaux. Un protocole se charge de déterminer une route (un chemin) permettant de relier les 2 machines distantes.
Le protocole utilisé consitue la couche 3 (réseau) de la pile de communication. Ex: le protocole IP (les machines ont une adresse et le protocole se charge au mieux de l’acheminement des packets jusqu’à destination).
Les couches réseaux
- couche 3 (réseau) : Comment envoyer des messages entre deux machines dans deux réseaux différents ?
- couche 2 (laison de données) : Comment envoyer des messages entre deux machines dans un réseau local ?
- couche 1 (physique) : Comment envoyer des bits entre deux machines reliées par un cable ?
Les couches réseaux
Comment communiquent des applications sur différentes machines ?
j’envoie le message dans un packet IP utilisant l’adresse IP de la machine destinataire.
Problem : la machine ne saura pas à quelle application est destiné le message
Les couches réseaux
Comment communiquent des applications sur différentes machines ?
On donne une adresse aux applications et on utilise le protocole de la couche 3 pour envoyer le message, en indiquant en plus l’adresse de l’application à exécuter dans la machine destinataire. Le protocole gère aussi parfois les connections offrant certaines garanties sur la transmission des messages.
Le protocole utilisé consitue la couche 4 (transport) de la pile de communication. Les adresses des applications dans la machine sont appelés des ports. Ex: les protocoles TCP ou UDP.
Les couches réseaux
Conclusion:
Pour communiquer avec une application sur une machine distante, on a besoin de son adresse (IP, port)
.

Couches réseaux et Java
Les Sockets Java offrent une abstraction du réseau au niveau des couches Transport (4) et Réseau (3).
Java introduit donc différentes classes correspondant aux protocoles abstraits : TCP ou UDP. Ainsi que la gestion des adresses IP seules.
Propriétés de la Couche Transport
Besoins des applications
C’est pour répondre aux besoins différents des applications que deux protocoles sont proposés pour la couche transport.
- des applications qui nécessitent un transport fiable des données, mais qui n’ont pas de besoin particulier en ce qui concerne la vitesse de transmission ; (page web, messagerie, jeux vidéox au tour par tour)
- des applications qui nécessitent un transport immédiat des informations, mais qui peuvent se permettre de perdre quelques informations. (streaming vidéo/audio, jeux vidéo multijoueur en temps réel)
La notion de mode connecté
Définition : En mode connecté, la communication entre un client et un serveur est précédée d’une connexion et suivie d’une fermeture :
- Facilite la gestion d’état
- Meilleur contrôle des arrivées/départs de clients
- Uniquement communication unicast
- Plus lent au démarrage
Définition : En mode non connecté, les messages sont envoyés librement :
- Plus facile à mettre en œuvre
- plus rapide au démarrage
TCP et UDP
TCP
: une communication de type téléphone
- Mode connecté : protocole de prise de connexion (lent)
- Sans perte : un message arrive au moins une fois
- Sans duplication : un message arrive au plus une fois
- Ordre respecté : messages délivrés dans l’ordre d’émission
- Avec fragmentation : les messages peuvent être coupés
UDP
: une communication de type courrier
- Mode non connecté : pas de protocole de connexion (plus rapide)
- Avec perte : l’émetteur n’est pas assuré de la délivrance
- Avec duplication : un message peut arriver plus d’une fois
- Ordre non respecté : messages délivrés dans l’ordre d’arrivée
- Sans fragmentation : les messages envoyés ne sont jamais coupés (soit un message arrive entièrement, soit il n’arrive pas)
Mode connecté et connexion
Attention : Il ne faut pas confondre connexion au niveau transport et connexion au niveau applicatif :
- FTP fonctionne en connecté en utilisant TCP
- DNS fonctionne en non-connecté en utilisant UDP
- HTTP fonctionne en non-connecté en utilisant TCP
Les Sockets
Les sockets
Définition : Une Socket est une API (interface logicielle) avec les services du système d’exploitation, qui permet d’exploiter facilement et de manière uniforme les services d’un protocole réseau.
Java défini plusieurs classes de sockets :
- TCP :
ServerSocket
etSocket
- UDP :
DatagramSocket
Sockets et ports
Une Socket possède une adresse local (IP, port)
et une adresse destination (IPdest, portdest)
Attention : Deux sockets peuvent occuper le même port local si elles sont connectées sur des IPs et/ou ports différents.
Il existe deux classes pour gérer les adresses :
InetAddress
: représente une adresse internet (IP/FQDN)SocketAddress
: représente l’adresse d’une socket (IP,port)
InetAddress
: les adresses Internet
La classe InetAddress sert à représenter les adresses internet. Pas de constructeur mais des méthodes statiques
InetAddress me = InetAddress.getByName("bramas.fr");
System.out.println(me.getHostAddress()+" = "+me.getHostName());
// => 104.28.21.83 = bramas.fr
InetAddress g = InetAddress.getByAddress(new byte[] {8,8,8,8});
System.out.println(g.getHostAddress()+" = "+g.getCanonicalHostName());
// => 8.8.8.8 = google-public-dns-a.google.com
InetAddress ici = InetAddress.getLocalHost();
System.out.println(ici.getHostAddress()+" = "+ici.getHostName());
// => 132.227.84.106 = portablebramas.rsr.lip6.fr
InetSocketAddress
: les adresses Internet + port
La classe InetSocketAddress
hérite de SocketAddess
et sert à représenter (IP,port)
. Elle est immuable.
On peut les construire ou les récupèrer de socket existant ou de packets reçus ou émis.
InetSocketAddress serverAddress =
new InetSocketAddress("java-server.bramas.fr", 3015);
Socket socket = new Socket();
socket.connect(serverAddress);
SocketAddress ici = socket.getLocalSocketAddress();
SocketAddress labas = socket.getRemoteSocketAddress();
System.out.println(ici+" => "+labas);
// /132.227.84.106:51186 => java-server.bramas.fr/195.154.164.156:3015
Le Socket TCP
Le Socket UDP
Vers la Programmation Concurrente
Comment maintenir plusieurs connexions TCP?
Runnable task = () -> {
try {
String inputLine = "";
while ((inputLine = in.readLine()) != null) {
if (inputLine.equals("Bye"))
{
out.println("Bye");
break;
}
out.println("You said "+inputLine);
}
out.close();
in.close();
clientSocket.close();
} catch(Exception e) { }
};
new Thread(task).start();
Le lambda utilise les mêmes variables locales mais est exécuté dans un processus distinct. La méthode bloquante (in.readLine()
) bloque uniquement un processus, mais n’empeche pas les nouvelles connexions.