2.4. Interface avec la couche transport

Comme la couche transport est gérée au niveau du noyau de la machine, une application qui souhaite envoyer un message via cette couche doit déléguer ces opérations à l’OS. En général, ce dernier fournit des structures de données logicielles appelés “sockets” qui jouent le rôle d’interface entre les applications et le réseau. Chaque socket représente une connexion TCP ou une communication UDP, et des appels système sont disponibles pour interagir avec ces sockets.

Les sockets TCP et les sockets UDP ne s’utiliseront pas de la même manière, ce qui est logique au vu des différences de service de ces deux protocoles. Ainsi, les sockets TCP (mode flux/stream) fonctionneront en mode connecté, avec ouverture et fermeture de connexion. L’adresse de destination ne doit être spécifié que lors de l’appel système de connexion (ouverture de la connexion). A l’inverse, les sockets UDP (mode datagrammme) fonctionnent en mode non connecté, et l’adresse du destinataire doit être indiquée pour chaque envoi d’information. Des bibliothèques permettant d’exploiter les sockets sont disponibles pour la plupart des langages de programmation.

Pour en savoir plus sur les sockets, vous pouvez consulter la partie exercices du livre Computer Networking

Voici un exemple de programme Python implémentant une communication client/serveur via TCP :

# echo-server.py

import socket

HOST = "127.0.0.1"  # Standard loopback interface address (localhost)
PORT = 12345  # Port to listen on (non-privileged ports are > 1023)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT)) # The server process asks the OS to use the specified IP/port 
    s.listen() # The server starts to wait for connexion requests from clients
    conn, addr = s.accept() # Upon request receival
    with conn:
        print(f"Connected by {addr}")
        while True:
            data = conn.recv(1024) # Read 1024 bytes on socket
            if not data:
                break
            conn.sendall(data) # Send data back to client

# echo-client.py

import socket

HOST = "127.0.0.1"  # The server's hostname or IP address
PORT = 12345  # The port used by the server

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT)) # A client directly sends a connexion request to the server
    s.sendall(b"Hello, world") # Sends message to the server
    data = s.recv(1024) # Receives data from the server

print(f"Received {data!r}")