Prise (réseau logicielle).

Besoin

Fournir une API de communication entre applications distantes préservant la sémantique des opérations sur des fichiers (open, read, write, close).

Analyse

Les socket représente un point de connexion sur :

  • une machine
  • une application sur cette machine

Conception

Type de socket Famille de protocole Client Serveur Client et serveur
PF_INET PF_UNIX PF_NS AppleTalk Création Connexion au serveur Association à une adresse Création Configuration de la file d'écoute Attente d'une connexion cliente Lecture Ecriture
Connecté (SOCK_STREAM) TCP O socket connect N/A socket bind listen accept read write
Non connecté (SOCK_DGRAM) UDP O socket N/A bind socket bind N/A N/A recvfrom sendto
Brut IP
Famille d'adresses AF_INET (adresse IP + port) AF_UNIX (nom arborescence Unix) AF_NS

L'utilisation de sockets implique typiquement les opérations suivantes :

  1. Création de la socket (socket) en mode :
    • connecté (TCP typiquement)
      • passif (serveur) : Accepter et attendre les connexions ;
      • actif (client) : Contacter l'application distante et s'y connecter
    • non connecté (UDP typiquement)
  2. Communication établie (bind, listen, connect ou accept)
  3. Echange de données (read/write ou sendto/recvfrom).
    • Pour éviter une lecture bloquant infiniment en attente de données ou de fermeture de socket, on peut fixer un temps d'expiration de la tentative de lecture (l'option Berkeley SO_TIMEOUT, en millisecondes).
    • Pour éviter trop de lourdeur des échanges, les paquets sont bufferisés et envoyés que lorsque les accusés réception des n paquets précédents ont été reçus (système de "fenêtres" ou algorithme de John Nagle : envoi du paquet 11 quand réception de l'accusé du paquet 1 si la fenêtre est de taille 10 par exemple). Ce système peut être contourné pour des applications "temps réel" désirant des accusés réception immédiats pour chaque envoi (via l'option Berkeley TCP_NODELAY), par exemple un client de serveur X Unix recevant les mouvement d'une souris.
  4. Fermeture de la communication (close ou shutdown)
    1. Envoi de TCP Finish (<FIN>)
    2. L'autre partie confirme (<ACK><FIN>). Sans confirmation au bout d'un temps moyen de réponse constaté (ou valeur de l'option Berkekey SO_LINGER), la socket fermante émet un TCP Abort (<RST>) et ferme unilatéralement.
    3. La socket fermante reconfirme (<ACK>)

Implémentation

En Java l'API des socket se trouve dans le package java.net. Une fois les sockets établies, c'est l'API des entrées-sorties (java.io) qui prend le relai pour l'écriture et lecture de données.

Un exemple (simplifié) de client TCP en Java est :

int port = 8000;
java.net.Socket socket = new java.net.Socket ("serverhost", serverPort);

java.io.PrintWriter out = new java.io.PrintWriter (socket.getOutputStream(), true);
java.io.PrintWriter in = new java.io.BufferedReader (new java.io.InputStreamReader (socket.getInputStream()));

out.println ("Requête");
String reponse = in.readLine();
out.close();
in.close();

socket.close();

Un exemple (simplifié) de serveur TCP en Java est :

int port = 8000;
java.net.ServetSocket server = new java.net.ServerSocket (serverPort);
java.net.Socket client = server.accept();

java.io.PrintWriter out = new java.io.PrintWriter (client.getOutputStream(), true);
java.io.PrintWriter in = new java.io.BufferedReader (new java.io.InputStreamReader (client.getInputStream()));
String requete = in
.readLine();
out.println ("Réponse");
out.close();
in.close();

client.close();
server.close();

Exemples

Des exemples d'API de sockets sont :

  • Berkeley
  • Java (java.net)

Notes

  • Apparues avec BSD 4.1 (1982).
  • Des API concurrentes moins répandues sont Streams, XTI, etc.
  • On peut trouver l'association d'un nom de port et sa valeur numérique
    • Sous Windows
      • XP dans C:\windows\system32\drivers\etc\services
      • NT/2000 dans C:\winnt\system32\drivers\etc\services
      • 9x/ME dans C:\windows\services
    • Sous Unix dans le fichier /etc/services avec éventuellement des alias (les protocoles spécifiés doivent exister dans /etc/protocols). Par exemple :
      ftp 21/tcp
      domain 53/tcp nameserver
      domain 53/udp nameserver
      tftp 69/udp

Voir

  • Unix Network Programming de Richard Stevens (Addison-Wesley)
  • Internetworking with TCP/IP Vol. 1, 3ème Edition de Douglas Corner (Prentice Hall)
  • Internetworking with TCP/IP Vol. 3 de Douglas Corner (Prentice Hall)
  • TCP/IP Illustrated de Richard Stevens (Addison Wesley)
  • JavaSoft The Java Tutorial - Custom Networking : All About Sockets