Para el excepcionalmente curioso (y el curiosamente excepcional), aquí tenemos una descripción del aspecto real de un paquete. Hay varias herramientas que miran qué paquetes están entrando y saliendo de su máquina Linux: el más común es «tcpdump» (que comprende más que TCP actualmente). Estos programas se llaman «esnifadores de paquetes» (packet sniffers).
El principio de cada paquete dice a dónde va, de dónde viene, el tipo de paquete, y otros detalles administrativos. Esta parte se denomina «cabecera del paquete». El resto del paquete, contiene los datos a transmitir en sí, y normalmente sel es llama «cuerpo del paquete».
Por lo tanto, cualquier paquete IP comienza con la «cabecera IP»: de al menos 20 bytes de largo. Parece algo como esto: (este diagrama ha sido robado sin ningún tipo de remordimiento de conciencia del RFC 790):
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Versión| IHL |Tipo de Servic.| Tamaño Total |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identificación |Flags| Desplaz. del Fragmento |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Tiempo de Vida | Protocolo | Checksum de la cabecera |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Dirección de Origen |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Dirección de Destino |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Los campos importantes son el Protocolo, que indica si es un paquete TCP (número 6), UDP (número 17) u otra cosa, la Dirección IP de Origen y la Dirección IP de Destino.
Ahora, si el campo de protocolo dice que es un paquete TCP, entonces a esta cabecera IP le sigue inmediatamente una cabecera TCP: la cabecera TCP también tiene al menos 20 bytes de longitud:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Puerto de Origen | Puerto de Destino |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Número de Secuencia |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Número de Confirmación |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Deplz. | |U|A|P|R|S|F| |
|de los | Reservado |R|C|S|S|Y|I| Ventana |
| Datos | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Puntero de Urgencia |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Los campos más importantes son el puerto de origen y el de destino, que dicen a qué servicio está destinado el paquete (o de cual viene, en el caso de que sea un paquete de respuesta). Los números de secuencia y confirmación (acknowledgement) se utilizan para mantener el orden de los paquetes, y decirle al otro extremos cuántos paquetes se han recibido. Los indicadores (flags) ACK, SYN, RST y FIN (escritos de mayor a menor) son simples bits que se utilizan en la negociación de apertura (SYN) y cierra (RST o FIN) de las conexiones.
Siguiendo a esta cabecera viene el verdadero mensaje que la aplicación envió (el cuerpo del paquete). Un paquete normal puede tener hasta 1500 bytes: esto significa que el mayor espacio que pueden ocupar los datos es de 1460 bytes (20 bytes para la cabecera IP y 20 para la cabecera TCP): alrededor del 97%.