Pour les gens exceptionnellement curieux (et curieusement exceptionnels), voici une description de ce à quoi les paquets ressemblent. Il y a plusieurs outils pour voir quels paquets entrent et sortent de votre machine Linux. Le plus courant est `tcpdump' (qui comprend de nos jours d'autres protocoles en plus de TCP), mais il en existe un plus agréable : `ethereal'. De tels programmes sont appelés des `renifleurs de paquets' (`packet sniffers').
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é le `corps' du paquet.
Ainsi, tout paquet IP commence par un `en-tête IP' long d'au moins 20 octets. Il ressemble à ceci (le diagramme a été honteusement copié à partir de la RFC 791) :
.-------+-------+---------------+-------------------------------.
|Version| IHL |Type de Service| Longueur Totale |
|-------+-------+---------------+-------------------------------|
| Identification |Fanions| Décalage du Fragment |
|---------------+---------------+-------------------------------|
| Durée de vie | Protocole | Somme de Contrôle d'En-Tête |
|---------------+---------------+-------------------------------|
| Adresse de la Source |
|---------------------------------------------------------------|
| Adresse de la Destination |
`---------------------------------------------------------------'
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 de 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 :
.-------------------------------+-------------------------------.
| Port Source | Port Destination |
|-------------------------------+-------------------------------|
| Numéro de Séquence |
|---------------------------------------------------------------|
| Numéro d'Acquittement |
|-------------------+-+-+-+-+-+-+-------------------------------|
|Décalage| |U|A|P|R|S|F| |
| des | Réservé |R|C|S|S|Y|I| Fenêtre |
|Données | |G|K|H|T|N|N| |
|--------+----------+-+-+-+-+-+-+-------------------------------|
| Somme de Contrôle | Pointeur Urgent |
`---------------------------------------------------------------'
Les champs les plus importants sont ici les ports 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%.