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}")