Introduction à la Programmation Réseau


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 et Socket
  • 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?



String inputLine = "";
while ((inputLine = in.readLine()) != null) { // bloquant
      if (inputLine.equals("Bye"))
      {
              out.println("Bye");
              break;
      }
      out.println("You said "+inputLine);
}
out.close();
in.close();
clientSocket.close();

                          

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.