Pour les gens exceptionnellement curieux (et curieusement exceptionnels), voici une description de ce à quoi les paquets ressemblent. Il y a plusieurs outils pour regarder ces paquets entrer et sortir de votre machine Linux. Le plus commun est `tcpdump' (qui comprend plus que le protocole TCP de nos jours), mais il en existe un plus joli: `ethereal'. De tels programmes sont appelés des `renifleurs de paquets'.
Le début de chaque paquet indique où il va, d'où il vient, le type du paquet, et d'autres détails administratifs. Cette partie est appelée l'`en-tête' du paquet. Le reste du paquet qui contient les données à transmettre, est appelée le `corps' du paquet.
Ainsi, tout paquet IP commence par un `en-tête IP' longue d'au moins 20 octets. Cela ressemble à ça (le diagramme a été honteusement copié à partir de la RFC 791):
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type de Service| Longueur Totale |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Temps de vie | Protocole | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Adresse de la Source |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Adresse de la Destination |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Remplissage |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Les champs importants sont le protocole, qui indique si c'est un paquet TCP (numéro 6), un paquet UDP (numéro 17) ou autre, l'adresse IP source, et l'adresse IP de destination.
Maintenant, si le champ protocole indique que c'est un paquet TCP, alors un en-tête TCP suivra immédiatement cet en-tête IP. L'en-tête TCP est aussi long de 20 octets au moins:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Port Source | Port Destination |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Numéro de Séquence |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Numéro d'Acquittement |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Réservé |R|C|S|S|Y|I| Fenêtre |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Pointeur Urgent |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Remplissage |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Données |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Les champs les plus importants sont ici le port source, et destination, qui disent à quel service le paquet est destiné (d'où il vient, dans le cas de paquets de réponses). Les numéros de séquence et d'acquittement sont utilisés pour garder les paquets dans l'ordre, et pour dire à l'autre bout quels paquets ont été reçus. Les labels ACK, SYN, RST et FIN sont des bits utilisés pour négocier l'ouverture (SYN), l'acquittement (ACK) et la fermeture (RST ou FIN) des connexions.
À la suite de cet en-tête vient le message réel que l'application a envoyé (le corps du paquet). La taille d'un paquet IP normal est au maximum de 1500 octets. Ce qui veut dire que la place maximum réservée aux données est 1460 octets (20 octets pour l'en-tête IP, et 20 autres pour l'en-tête TCP). Soit, plus de 97%.