Tiene toda la razón, si tenemos que usar un ciclo de instrucción por bit, entonces 10 Gbps sería inalcanzable. Entonces, lo primero a tener en cuenta es que manejamos una palabra por instrucción de CPU: 64 bits.
Aun así, lo peor que podemos hacer para el rendimiento es que la CPU acceda a todas las palabras de un paquete. Por lo tanto, el enfoque en el manejo de "copia cero" de paquetes. Algunos de esos trucos están en las interfaces mismas: tienen DMA ("Acceso directo a la memoria") para que el chip controlador de Ethernet copie los datos en la RAM; calculan las sumas de comprobación para que la CPU no tenga que acceder a todas las palabras del paquete para hacerlo. Parte de esto está en el diseño de la estructura de datos: tenemos cuidado de alinear los búferes de paquetes para que podamos moverlos cambiando la propiedad de una entrada de la tabla de páginas. Parte de esto es solo una programación cuidadosa para garantizar que se acceda a los paquetes de datos la menor cantidad de veces y, preferiblemente, no se acceda a ellos hasta el programa de aplicación receptor.
Una vez que hayamos hecho todo esto, la siguiente limitación es la sobrecarga de manejar paquetes uno a la vez. Por lo tanto, hay un montón de características de "descarga de segmentación" tanto en el controlador de Ethernet como en el kernel para que podamos manejar grupos de paquetes. Incluso retrasamos la recuperación de datos del controlador de Ethernet para que estos grupos sean más grandes.
Finalmente, tenemos accesos directos a casos especiales, como la llamada sendfile () del núcleo, que es una ruta rápida desde el disco a la red utilizando la mínima cantidad de trabajo.
Incluso podemos enrutar casos especiales (el reenvío de paquetes de una interfaz a otra) utilizando las características de hardware de las tarjetas de interfaz de red y tratando el bus PCI como un bus entre las tarjetas en lugar de involucrar a la CPU. Eso no se puede hacer en los sistemas operativos de propósito general, pero los proveedores como Intel proporcionan bibliotecas de software para implementar tales funciones en sus controladores de Ethernet.
Alejándonos por completo de las CPU, incluso podemos construir enrutadores de propósito especial donde todas las tareas de reenvío ocurren en el hardware. Dado que el bus PCI sería una limitación, ejecutan múltiples buses paralelos; o incluso múltiples buses paralelos a múltiples conjuntos de interruptores de barra transversal paralela. En un extremo del mercado, un pequeño conmutador de Ethernet basado en TCAM sería un ejemplo; En el otro extremo del mercado, el Juniper M40 sería un diseño canónico.
Un conmutador típico comenzará a recibir un paquete, buscará la dirección de destino en la TCAM, adjuntará una etiqueta con el puerto de salida al paquete y luego DMA el paquete aún entrante al controlador del puerto de salida. Tenga en cuenta que si el puerto de salida está congestionado, todo lo que se puede hacer en este simple conmutador es tirar el paquete de entrada. Por lo tanto, los conmutadores simples no son una buena opción para cuando los enlaces cambian de velocidad y es deseable hacer algunas colas. Por supuesto, existen interruptores más sofisticados, por los cuales paga más.
Un enrutador típico recibirá un paquete y lo mantendrá en una cola corta. La dirección IP de destino se buscará en la RAM estática, el paquete se explotará en celdas para reducir la latencia y cada celda se enviará a un interruptor de barra cruzada a la tarjeta de salida. Esa tarjeta volverá a ensamblar las celdas en un paquete y colocará el paquete en la interfaz de salida. La cola en la interfaz de salida puede ser sofisticada.
the packet will then be exploded into cells to reduce latency
?