El enfoque de unión a la red tomas de dispositivos en Linux

  
                  

1. causa de la causa de

cosa es que voy a utilizar dos módem CDMA para ampliar el ancho de banda punto a punto de conexión, y la esperanza de lograr el equilibrio de carga entre los dos módem. Pero, por desgracia, dispositivo de acceso de China Unicom no es compatible con Multilink PPP. Por lo tanto, no hay manera, no tenía más remedio que aplicar el balanceo de carga. Manera de lograr el equilibrio de carga hay varios, una forma de administración de la red mediante iproute2 para completar el balanceo de carga a nivel de paquete, que se implementa en el nivel del núcleo. Pero no quiero que todo lo relacionado al núcleo para completar, yo quiero ser capaz de controlar su propio tráfico en cada módem. Entonces, ¿cómo debería hacerlo?

2. Soluciones

En primer lugar, creo que la forma es crear dos tomas de corriente, cada toma se une entonces a una dirección IP local, creo que esto va datos sobre las causas enviados desde el dispositivo de red es la dirección IP unido se encuentra. Sin embargo, esta idea resultó ser errónea. Porque cada vez antes de enviar un paquete, el núcleo debe determinar la tabla de enrutamiento para enviar paquetes a partir del cual la interfaz de red. Una vez que se encuentra una entrada de la tabla de enrutamiento adecuado, la entrada de la tabla de la ruta indicada en los paquetes de interfaz de red enviados. Por lo tanto, hay un problema, debido a que la tabla de enrutamiento es una memoria caché, por lo que después se envía cada paquete, la interfaz para enviar paquetes de datos tendrá una mayor probabilidad de ser seleccionado kernel nuevo. En el peor de los casos, provocará un módem ocupado, pero el otro módem y " fracasos y ". Esto es claramente contrario a mi intención original. Los resultados mostraron que, después de enviar unos pocos cientos de KB de datos en un módem, por el otro todavía sólo envió decenas B. Parece, siendo ese el caso! Antes de seguir las ideas anteriores, sorprendió a la práctica un poco cada vez que se envía paquetes, tablas de enrutamiento se ajustan en primer lugar. Ajuste de la tabla de enrutamiento es muy fácil de hacer. Pero para ello es también un poco demasiado, así que esta es mi idea también abandonada. Ni siquiera probar la viabilidad de este método, pero es teóricamente factible. Por otra parte, en el método descrito en el nivel de equilibrio de carga de enrutamiento de Internet si eso se consigue porque, pero, al igual que él, no he tenido hasta el fondo. Después de repetidos intentos fallidos, puse el "UNIX Network Programming" mudado, las partes relacionadas UDP y hace que la pantalla de nuevo. Sólo se encuentra un posible papel de lugar: Puede configurar un conjunto de opciones de interfaz a través de setsockopt (): SO_DONTROUTE, pero un poco más ambiguo el papel de opciones. retorno vago y ambiguo, de hecho me probé, el resultado aún no es suficiente por una razón desconocida. Por lo tanto, tuve que volver Linux en sí mismo, una gran cantidad del hombre contra el poderoso manual de lecturas. Cuando veo socket (7), cuando de repente vi una manera de darse a un conjunto de opciones de interfaz: SO_BINDTODEVICE. Literalmente, esta opción debe ser lo que quiera el. resultados de las pruebas posteriores demuestran que es cierto. La opción Descripción socket sigue socket (7) en :. SO_BINDTODEVICE Enlazar esta toma para un dispositivo en particular como " eth0 ", como se especifica en el nombre de interfaz pasado Si el nombre es una cadena vacía o la longitud de la opción es cero , la unión se retira el dispositivo de toma de corriente. la opción pasado es un nulo de longitud variable cadena terminada en nombre de la interfaz con el tamaño máximo de IFNAMSIZ. Si un socket está enlazado a una interfaz, sólo los paquetes recibido de esa interfaz particular son procesados ​​por el zócalo. tenga en cuenta que esto sólo funciona para algunos tipos de conectores, en particular los zócalos AF_INET. no es compatible con los conectores de paquetes (utilice el enlace normal (8) allí). aquí, fue copiado directamente sobre. Sin embargo, el último que se unen (8) debe estar mal, debe quedar claro que se unen (2) hijo. Tanto si se trata, no es Voy a arreglar las cosas. El centro de este pasaje significa: cuando la toma de corriente está unido a una interfaz de red específica después del paquete se aplicará sólo desde el dispositivo de procesamiento de interfaz. Por lo tanto, si el conector está enviando paquetes de la misma? Ya sea que sólo emitirá desde la interfaz de red que? Terrible es que no hay nada que decir. Pero no importa, vamos a conocer la prueba. En un primer momento, supongo que puede tener este aspecto: char * dev = " ppp0 "; int sock1 = socket (AF_INET, SOCK_DGRAM, 0); setsockopt (sock1, SOL_SOCKET, SO_BINDTODEVICE, dev, sizeof (dev)), sin embargo, la práctica demuestra una vez más que estaba equivocado. Pero no puedo evitarlo, las instrucciones de socket en (7) se escribe tan oscuro, no veo indicios de ser perdonados. Sin embargo, no es Google en la mano, este pequeño problema que no tengo nada que temer? Así google, y pronto se encontró la clave del problema: En Linux, el equipo de red se realiza mediante ifreq estructura de referencia. En netdevice (7) descrito en la siguiente estructura: struct ifreq {char ifr_name [IFNAMSIZ]; /* Nombre de la interfaz * /union {sockaddrifr_addr struct; struct sockaddrifr_dstaddr; struct sockaddrifr_broadaddr; struct sockaddrifr_netmask; struct sockaddrifr_hwaddr; ifr_flags cortos; int ifr_ifindex; int ifr_metric; int ifr_mtu; struct ifmapifr_map; Char ifr_slave [IFNAMSIZ]; Char ifr_newname [IFNAMSIZ]; char * ifr_data;};}; aquí, sólo necesito ifr_name miembros de este dominio es suficiente. Este código se modifica en lo siguiente: struct ifreq if_ppp0; struct ifreq if_ppp1; strncpy (if_ppp0.ifr_name, " ppp0 ", IFNAMSIZ); strncpy (if_ppp1.ifr_name, " ppp1 ", IFNAMSIZ); sock1 = socket (AF_INET, SOCK_DGRAM , 0); sock2 = socket (AF_INET, SOCK_DGRAM, 0), si (setsockopt (sock1, SOL_SOCKET, SO_BINDTODEVICE, (char *) &if_ppp0, sizeof (if_ppp0)) /* error de manipulación * /} if (setsockopt (sock2 , SOL_SOCKET, SO_BINDTODEVICE, (char *) &if_ppp1, sizeof (if_ppp1)) /* manejo de errores * /} entonces, la porción de cuerpo del programa, cada transmisión de un paquete en sock1, también en sock2 transmitir un paquete de datos, y ningún programa de acción para recibir datos. Dado que el tamaño de todos los paquetes de datos son iguales. por lo tanto la cantidad de datos que se espera para ser enviado sobre la interfaz de red debe ser casi dos peces. fuertemente a los resultados de la prueba apoya esta conjetura: después de ejecutar el programa desde hace algún tiempo, enviado de la cantidad de datos interfaz ppp0 es 702kb La cantidad de datos enviados en 8Array5KB interfaz ppp1. Aunque sigue habiendo una diferencia de 200 KB casi, pero en cualquier caso, en comparación con la situación original ha mejorado mucho. En cuanto a por qué hay una brecha entre 200KB, los autores también encuentran un .www causa. 3. it165.net más opciones de conector SO_BINDTODEVICE para la conclusión, el autor después de la plena leer el hombre, llegó a las siguientes conclusiones: (1) para sockets TCP, UDP, tomas de conector directo, puede SO_BINDTODEVICE opciones de conector después de unir el conector a una enlaces de interfaz de red especificados, todos los paquetes a través de sólo la interfaz de red socket transceptor especificado; (2) para la toma de tipo de paquete, Bunengtongguo unido a un SO_BINDTODEVICE red específica interfaz, sino a través de bind (2) para unirse con una interfaz de red específica, una estructura de dirección de conector utilizado para la sockaddr_ll struct, esta estructura es una estructura de dirección de capa de enlace de dirección de socket, independiente del dispositivo de red específico. Por ejemplo, la estructura de dirección puede ser usado para representar dispositivo PPP, el dispositivo también puede ser usado para representar la ethernet.
(3) opción de socket SO_BINDTODEVICE sólo está disponible para los sistemas Linux. Si desea escribir programas que se ejecutan en plataformas múltiples Caozuoxitong, no puede depender de enchufes SO_BINDTODEVICE se unen para completar dispositivo específico. Sin embargo, los autores no probaron el socket TCP y sockets RAW. Para conector de paquetes, la conclusión anterior es creíble, porque leí el código fuente de dhcpd encontrado de conector de paquetes está de hecho unido a la interfaz de red especificado por bind (2) de.

Copyright © Conocimiento de Windows All Rights Reserved