Conceptos básicos del desarrollo de la pila de protocolos de red de Linux——Puente de red br0

1. El concepto de puente

      En pocas palabras, el puente consiste en "conectar" varias interfaces de red en una máquina. Como resultado, los paquetes recibidos por un puerto de red se copiarán a otros puertos de red y se enviarán. Para que los paquetes entre puertos de red puedan reenviarse entre sí.

     Un conmutador es un dispositivo que tiene varios puertos de red y estos puertos de red están puenteados. Por lo tanto, varios hosts conectados al conmutador pueden comunicarse entre sí a través del reenvío de paquetes del conmutador.

     Como se muestra a continuación: el mensaje enviado por el host A se envía al puerto eth0 del conmutador S1. Dado que eth0 está conectado con eth1 y eth2, el mensaje se copia a eth1 y eth2, se envía y luego lo recibe el host B y el conmutador S2. .llegar. S2 reenviará el mensaje a los hosts C y D.

El conmutador no altera los datos del mensaje       durante el proceso de reenvío del mensaje , sino que solo los copia tal como están. Sin embargo, el puente no se implementa en la capa física, sino en la capa de enlace de datos. El conmutador puede comprender los paquetes en la capa de enlace de datos, por lo que el puente no es simplemente un reenvío de paquetes.

     El conmutador se preocupará por la información de la dirección Mac (incluidas la dirección de origen y la dirección de destino) completada en el encabezado de la capa de enlace de datos del mensaje para comprender dónde se encuentra el host representado por cada dirección Mac (qué puerto de red del conmutador está conectado). . Al reenviar paquetes, el conmutador solo necesita reenviarlos a un puerto de red específico, evitando así interacciones de red innecesarias. Este es el "aprendizaje de direcciones" del conmutador. Sin embargo, si el conmutador encuentra una dirección que no ha aprendido, no sabrá desde qué puerto de red se debe reenviar el mensaje y tendrá que reenviar el mensaje a todos los puertos de la red (excepto al puerto de red que recibe el mensaje).

      Por ejemplo, el host C envía un paquete al host A y el paquete llega al puerto de red eth2 del conmutador S1. Suponiendo que S1 acaba de comenzar y aún no ha aprendido ninguna dirección, reenviará el paquete a eth0 y eth1. Al mismo tiempo, S1 registrará "El host C está conectado a través del puerto de red eth2" según la dirección Mac de origen del mensaje. Entonces, cuando el host A envía un mensaje a C, S1 solo necesita reenviar el mensaje al puerto de red eth2. Cuando el host D envía un mensaje a C, suponiendo que el conmutador S2 reenvía el mensaje al puerto de red eth2 de S1 (de hecho, S2 probablemente no hará esto debido al aprendizaje de la dirección), entonces S1 descartará directamente el mensaje sin realizar el reenvío ( porque el host C está conectado desde eth2).

     Sin embargo, la topología de la red no puede cambiar nunca. Supongamos que cambiamos el host B y el host C. Cuando el host C envía un mensaje (sin importar a quién se envíe), el puerto eth1 del conmutador S1 recibe el mensaje, por lo que el conmutador S1 actualizará la dirección que aprendió y reemplazará la " " original. El host C está conectado a través del puerto de red eth2" se cambia a "El host C está conectado a través del puerto de red eth1".

     Pero ¿qué pasa si el host C nunca envía mensajes? S1 siempre pensará que "el host C está conectado a través del puerto de red eth2", por lo que reenviará todos los paquetes enviados por otros hosts a C desde eth2 y los paquetes se perderán. Por lo tanto, el aprendizaje de direcciones del conmutador debe tener una política de tiempo de espera (envejecimiento FDB). Para el conmutador S1, si ha pasado una cierta cantidad de tiempo desde el último mensaje recibido del host C (el valor predeterminado es 5 minutos), entonces S1 debe olvidar que "el host C está conectado a través del puerto de red eth2". De esta manera, los paquetes enviados al host C se reenviarán a todos los puertos de la red y los paquetes reenviados desde eth1 serán recibidos por el host C.

2. Implementación del puente Linux

       El kernel de Linux admite el puente de puertos de red (actualmente solo se admiten interfaces Ethernet). Sin embargo, a diferencia de un simple conmutador, un conmutador es sólo un dispositivo de Capa 2 que reenvía o descarta los paquetes recibidos. Un interruptor pequeño solo requiere un chip de conmutación y no requiere una CPU. La máquina que ejecuta el kernel de Linux es en sí misma un host y puede ser el destino de los paquetes de red. Además de reenviar y descartar los paquetes que recibe, también puede enviarlos a la capa superior (capa de red) de la pila de protocolos de red, siendo así digeridos por sí mismo.

      El kernel de Linux implementa el puente a través de un dispositivo puente virtual. Este dispositivo virtual puede vincular varios dispositivos de interfaz Ethernet para unirlos.

      El dispositivo puente br0 está vinculado a eth0 y eth1. Para la capa superior de la pila de protocolos de red , solo br0 es visible, porque el puente se implementa en la capa de enlace de datos y la capa superior no necesita preocuparse por los detalles del puente. Entonces, el mensaje que debe ser enviado por la capa superior de la pila de protocolos se envía a br0, y el código de procesamiento del dispositivo puente determina si el mensaje debe reenviarse a eth0 o eth1, o ambos; por el contrario, el mensaje recibido de eth0 o eth1 El paquete se envía al código de procesamiento del puente, donde se determina si el paquete debe reenviarse, descartarse o enviarse a la capa superior de la pila de protocolos.

     A veces, eth0 y eth1 también se pueden utilizar como dirección de origen o dirección de destino del mensaje, participando directamente en el envío y recepción del mensaje (evitando así el puente de red).

3. Funciones del puente

       En resumen, los dos puntos más importantes para la implementación de un puente de red son:

1. Aprendizaje MAC

      Aprendiendo la dirección MAC. Inicialmente, el puente no tiene ninguna correspondencia entre la dirección y el puerto. Cuando envía datos, todavía tiene que ser como un HUB, pero cada vez que envía un dato, le importará cuál puerto del que proviene la MAC de origen del paquete de datos.Debido al aprendizaje, se establece una tabla de comparación dirección-puerto (tabla CAM).

2. Reenvío de mensajes

     Cada vez que se envía un paquete de datos, el puente extraerá su dirección MAC de destino y averiguará a qué puerto se envía el paquete de datos a partir de su propia tabla de comparación de direcciones y puertos (tabla CAM).

4. Configuración del puente

      Usar un puente de red en Linux es muy sencillo, sólo necesitas hacer dos cosas para configurarlo. La primera es activar la opción de compilación CONFIG_BRIDGE o CONDIG_BRIDGE_MODULE en el kernel compilado; la segunda es instalar la herramienta brctl. El primer paso es habilitar la pila de protocolos del kernel para que admita el puente y el segundo paso es instalar herramientas de espacio de usuario y configurar el puente mediante una serie de llamadas ioctl. Se utilizará un ejemplo relativamente simple a lo largo del texto siguiente para facilitar el análisis del código.

     La máquina Linux tiene 4 tarjetas de red, a saber, eth0 ~ eth4, de las cuales eth0 se usa para conectarse a la red externa, mientras que eth1, eth2 y eth3 están conectadas a una PC para configurar el puente de red. Solo necesita usar el siguiente comando para completar la configuración del puente

Brctl addbr br0 (cree un puente de red br0 y cree una tarjeta de red virtual br0 en el kernel de Linux)

Brctl addif br0 eth1

brctl addif br0 eth2

Brctl addif br0 eth3 (agregue las interfaces eth1, eth2 y eth3 al puente br0 respectivamente)

      Entre ellos, br0 sirve como puente y dispositivo de red virtual. Puede usarse como puerto de administración del puente o como puerta de enlace de la LAN conectada al puente. La situación específica depende de sus necesidades. Para utilizar la interfaz br0, debe asignarle una dirección IP . Para un funcionamiento normal, las direcciones IP de PC1, PC2, PC3 y br0 se asignan en el mismo segmento de red.

Supongo que te gusta

Origin blog.csdn.net/buhuidage/article/details/128450844
Recomendado
Clasificación