9.6. Paquetes y enrutamiento¶
Una dirección IP indica para quién es un mensaje. El mecanismo que realmente lo entrega se llama enrutamiento, y es el proceso salto a salto mediante el cual un paquete viaja desde la red local de un emisor hasta la red local de un receptor, posiblemente muy lejana.
9.6.1. Un paquete, en pocas palabras¶
Un paquete es la unidad de trabajo de la capa IP – un fragmento de bytes con una pequeña cabecera y una carga útil. La cabecera tiene dos campos que importan para el enrutamiento:
La dirección IP de origen (de dónde vino el paquete).
La dirección IP de destino (a dónde va).
La carga útil es lo que sea que la capa de transporte le haya pedido a la capa de red que entregue. La cabecera del paquete también incluye un contador de tiempo de vida, una suma de comprobación sobre la cabecera y unas pocas banderas de control. Ninguna de esas cosas las toca directamente el código Python de la cámara.
Los paquetes no prometen nada más que «lo intentamos» – pueden perderse, duplicarse o entregarse en desorden. La fiabilidad y el orden son problemas que resuelve la capa de transporte de arriba; la capa de red simplemente hace lo posible por reenviar cada paquete hacia su destino.
9.6.2. Salto a salto¶
El paquete sale de la cámara y llega al primer dispositivo que no se encuentra en el segmento local de la cámara: la pasarela predeterminada. (La página anterior mencionaba que DHCP le entrega a la cámara la dirección de la pasarela cuando la red se establece.) Ese dispositivo es un router – una caja cuyo trabajo es recibir paquetes, mirar su destino y reenviarlos.
Un paquete de la cámara al destino salta entre routers, cada uno un paso más cerca.¶
El router tiene una tabla de enrutamiento – una lista de «para los destinos que coincidan con este patrón, envía el paquete por esta interfaz». Para los destinos en la misma red que la cámara, la entrada dice «envíalo de vuelta por el cable por el que llegó». Para los destinos en la internet más amplia, la entrada dice «envíalo al router ascendente». Para patrones conocidos de destinos (una VPN corporativa, la red de un socio comercial específico, un enlace satelital), el router puede tener una entrada más específica que anula la predeterminada.
El router ascendente hace lo mismo. Y el siguiente. Y el siguiente. Cada salto tiene la misma forma: recibir el paquete, buscar el destino en la tabla, enviarlo por la interfaz correcta. Finalmente el paquete llega a un router que está en el mismo segmento local que la IP de destino. Ese router realiza el salto final, el destino recibe el paquete y el viaje termina.
9.6.3. Los extremos no conocen la ruta¶
Una cámara que envía un paquete a un servidor remoto no sabe cómo llegará el paquete allí. Solo conoce la IP de destino y la dirección de su propia pasarela predeterminada. Todo lo que hay en medio – qué routers, qué fibras, qué cables submarinos – es algo que deciden los routers a lo largo del camino a medida que avanzan, basándose en sus propias tablas. Los routers mismos solo conocen a sus vecinos inmediatos y la dirección aproximada de los destinos comunes; ningún dispositivo individual en internet tiene un mapa completo de ella.
Esa descentralización es la razón por la que la red sigue funcionando cuando fallan caminos individuales. Un cable cortado en algún punto del medio se convierte en un evento de re-enrutamiento en unos pocos routers; los extremos nunca lo notan. También es la razón por la que un paquete de una cámara en Tokio a un servidor en Dublín puede tener éxito sin que ninguno de los dos lados sepa qué países hay en medio.
9.6.4. Qué significa esto para un script de Python¶
El trabajo de la cámara en la capa de red se reduce a:
Tener una dirección IP.
Conocer la dirección de la pasarela predeterminada (DHCP la rellena automáticamente).
Entregar los paquetes salientes, dirigidos a cualquier IP, a esa pasarela y confiar en el resto del camino.
Un script nunca elige una ruta, nunca nombra un salto intermedio y nunca ve los routers del medio. Escribe la IP de destino en el paquete y la capa de red se hace cargo. Desde un script de Python todo el enrutamiento es solo una propiedad de la red a la que se ha unido la cámara – «la pasarela envía los paquetes a algún lugar útil para mí».
La capa de transporte que viene a continuación asume que el enrutamiento simplemente funciona, y construye la fiabilidad, el orden y el direccionamiento de programa a programa sobre eso.