Implémentation complète du protocole TFTP (Trivial File Transfer Protocol) en C, incluant les extensions bigfile (RFC 2347) et fenêtre glissante windowsize (RFC 7440).
Ce projet a été réalisé par Stéphane Talab et Mathis Piault en Licence 3 Informatique (UFR des Sciences) dans le cadre de la SAÉ Réseau et Système 2026 — "Concevoir un protocole de communication entre un serveur et des clients".
L'objectif était d'implémenter TFTP from scratch en C, sans bibliothèque réseau tierce, en couvrant cinq étapes progressives :
| Étape | Contenu | Rendu |
|---|---|---|
| 1 | Client TFTP (RRQ / WRQ, timeouts, retransmissions) | 29 janvier |
| 2 | Serveur simple (RRQ / WRQ, gestion d'erreurs, interopérabilité) | 29 janvier |
| 3 | Serveur multi-clients — thread par client et select() |
19 février |
| 4 | Extension bigfile + rédaction d'un RFC |
11 mars |
| 5 (bonus) | Option windowsize (RFC 7440) |
11 mars |
.
├── client.c # Client TFTP (RRQ / WRQ + options)
├── SERVEUR/
│ ├── serveur_thread.c # Serveur multithreadé — un thread par client
│ └── serveur_select.c # Serveur monothreadé — multiplexage select()
├── tftp.h # Structures de paquets et constantes RFC
└── bin/ # Binaires compilés (généré à la compilation)
Les deux versions serveur ont été développées et comparées. Le serveur thread alloue un thread POSIX par connexion entrante avec mutex sur les accès fichiers concurrents. Le serveur select gère toutes les connexions dans une boucle d'événements unique, sans contention mémoire.
mkdir -p bin
gcc -o bin/client client.c -I. -lpthread
gcc -o bin/serveur_thread SERVEUR/serveur_thread.c -I. -lpthread
gcc -o bin/serveur_select SERVEUR/serveur_select.c -I. -lpthread./bin/serveur_thread 6969
./bin/serveur_select 6969./bin/client <ip> <port> <get|put> <fichier> [windowsize]Envoie plusieurs blocs avant d'attendre un ACK, ce qui réduit la latence sur les transferts longs.
# Transférer un fichier avec une fenêtre de 64 blocs
./bin/client 127.0.0.1 6969 put grosfichier.bin 64L'option est négociée à la requête initiale. Si le serveur ne la supporte pas, le client bascule automatiquement sur le mode bloc-par-bloc standard.
TFTP standard (RFC 1350) limite les transferts à ~32 Mo via des numéros de blocs sur 16 bits. L'option bigfile lève cette contrainte.
# Générer un fichier de test de 500 Mo
dd if=/dev/urandom of=grosfichier.bin bs=1M count=500
# Envoyer
./bin/client 127.0.0.1 6969 put grosfichier.bin
# Récupérer
./bin/client 127.0.0.1 6969 get grosfichier.binL'option est négociée automatiquement par le client via un OACK serveur. En l'absence de réponse OACK, le client reste en mode 16 bits standard.
- RFC 1350 — The TFTP Protocol (revision 2)
- RFC 2347 — TFTP Option Extension
- RFC 7440 — TFTP Windowsize Option
- Beej's Guide — select() — référence pour le serveur monothreadé