Encuentre la dirección IP del top 1 en la ruta de recepción del kernel de Linux

En el trabajo real, finalmente encontré algunas preguntas reales de la entrevista:

  • Pregunta de algoritmo: una lista enlazada desordenada que contiene una gran cantidad de nodos, sabiendo que hay múltiples elementos repetidos en ella, encuentra el que tiene más veces repetidas y dale complejidad al tiempo. Por ejemplo, 20-1-2-3-5-7-3-20-12-3, el elemento repetido tiene 3 3 y la respuesta a 2 20 es obviamente 3.

Al realizar análisis de tráfico, detección y protección DDoS y limpieza de tráfico, un requisito muy común es "buscar N superior", y los algoritmos relacionados se pueden describir como mucho sudor:

  • Clasificar
  • Montón máximo
  • LRU
  • Contador de mapa de bits
  • ...

Hay muchos algoritmos teóricos, pero en el combate real siempre se encontrarán varios problemas de ingeniería. Por ejemplo, la sobrecarga de bloqueo de las operaciones simultáneas es inevitable. Por lo tanto, diseñar un dispositivo en lugar de diseñar un algoritmo es una idea natural.

También vale la pena señalar que la detección de tráfico anormal es una operación difusa, que no necesariamente requiere cálculos precisos y una coincidencia precisa. Solo necesita localizar la anormalidad. Por lo tanto, existe otra forma de pensar para usar la estructura de datos percpu para tolerar al leer los datos Pérdida de precisión, intercambiar precisión por eficiencia.

Los siguientes son dos métodos que pensé al salir del trabajo: Encontrar el top 1 es muy adecuado y el top N se puede encontrar ligeramente. Estos dos métodos son muy simples y transparentes de implementar.

Método 1: lista enlazada multi-hash (la idea de un filtro de floración)

Dos (o más) tablas hash con diferentes algoritmos hash están vinculadas a la estructura de la dirección IP y cuentan por depósito:
Inserte la descripción de la imagen aquí

La estructura de datos es la siguiente:

struct bucket {
    
    
    int hash;
    atomic_t count;
    spinlock_t lock;
    struct list_head hlist;
};

struct IP_item {
    
    
    struct list_head list;
    u32 ipaddr;
};

#define HSIZE    8192

struct bucket hlist[2][HSIZE];

operando:

  • Entrada de IP: Calcule hash1 y hash2 por dirección IP (origen o destino, según la configuración), enlace a la lista correspondiente respectivamente e incremente el recuento de depósitos.

  • El temporizador expira o el conntrack se destruye: elimine la estructura de IP correspondiente y disminuya el recuento de depósitos.

detección anormal:

  • Hay dos tablas hash al mismo tiempo que un recuento de cubos excede el contador promedio β \ betaβ veces, y la diferencia entre los dos contadores de cubos más grandes no excedeα \ alphaα , considerado anormal:

    L max> β L significa L_ {max}> \ beta L_ {mean} Lm un x>β Lm ae un n

    La longitud media se calcula de la siguiente manera:

    L media = Σ n = 0 N cubos - 1 L n - L máx. N cubos - 1 L_ {mean} = \ dfrac {\ Sigma_ {n = 0} ^ {N_ {cubos} -1} {Ln} -L_ { max}} {N_ {cubos} -1} Lm ae un n=norteb u c k e t s-1Σn = 0norteb u c k e t s- 1L n-Lm un x

  • Recorre el comienzo de la lista de deseos de los dos contadores más grandes γ \ gammaγ elementos (γ \ gammaγ es el doble de la longitud media) y se toma la mayor intersección repetida de las dos listas enlazadas. Es la dirección IP anormal. Leetcode 349:https://leetcode-cn.com/problems/intersection-of-two-arrays/

Evaluación:

  • La entrada de IP requiere una operación de cálculo de hash, complejidad de tiempo O (1).

  • La estructura de IP se inserta en la lista enlazada de cubos hash, complejidad de tiempo O (1). (Quizás spinlock sea caro y pueda optimizarse mediante percpu)

  • Detección de anomalías que burbujea el contador máximo de cubos de dos tablas hash (el cubo es fijo), complejidad de tiempo O (1)

  • Atravesar dos listas enlazadas Error de análisis de KaTeX: Secuencia de control indefinida: \ gama en la posición 1: elementos \ ̲g̲a̲m̲a,, O (n) complejidad temporal, asumiendo que el algoritmo hash es uniforme, L significa L_ {significa}Lm ae un nEs muy pequeño.

Método 2: el contador de hash (también la idea del filtro de floración)
divide la dirección IP en cada 8 bits, cada 8 bits son 256 contadores y se configuran dos contadores de hash al mismo tiempo:
Inserte la descripción de la imagen aquí

La estructura de datos es la siguiente:

struct bucket {
    
    
    int hash;
    atomic_t count;
};

struct bcounter {
    
    
    atomic_t counter;
};

#define HSIZE    8192

struct bucket hlist[2][HSIZE];
struct bcounter counter[4][256]

operando:

  • Entrada de IP: Calcule hash1 y hash2 por dirección IP (origen o destino, según la configuración), incremente respectivamente los contadores correspondientes a dos contadores hash, y al mismo tiempo incremente los contadores correspondientes a los bits del grupo de contadores por octeto.

  • El temporizador expira o el conntrack se destruye: disminuya el contador correspondiente.

detección anormal:

  • Hay dos tablas hash al mismo tiempo que un recuento de cubos excede el contador promedio β \ betaβ veces, y la diferencia entre los dos contadores de cubos más grandes no excedeα \ alphaα , considerado anormal:

    L max> β L significa L_ {max}> \ beta L_ {mean} Lm un x>β Lm ae un n

    La longitud media se calcula de la siguiente manera:

    L media = Σ n = 0 N cubos - 1 L n - L máx. N cubos - 1 L_ {mean} = \ dfrac {\ Sigma_ {n = 0} ^ {N_ {cubos} -1} {Ln} -L_ { max}} {N_ {cubos} -1} Lm ae un n=norteb u c k e t s-1Σn = 0norteb u c k e t s- 1L n-Lm un x

  • Tome el contador más grande del grupo de contadores por octeto, indexe en una dirección IP según su posición y use dos tablas hash para verificar el cálculo. Si cae en el depósito con el contador más grande al mismo tiempo (es decir, los dos depósitos encontrados en el primer paso), la dirección empalmada es la dirección anormal; de lo contrario, se selecciona el siguiente más pequeño para continuar.

No es que la probabilidad de empalmar el valor máximo del grupo de contadores por octeto sea muy baja. Suponemos que la dirección IP es una distribución uniforme de cola larga.

Evaluación:

  • Guarda el mantenimiento de la lista enlazada hash, especialmente el uso de spinlock.

Versión optimizada

Puede agregar dos grupos de contadores más superpuestos por octeto para mejorar la precisión. De esta manera, de menor a mayor, para cada octeto, siempre que los 4 bits altos y los 4 bits bajos del siguiente octeto puedan corresponder al empalme, la superprobabilidad es top 1 Address, además de la dirección top N:
Inserte la descripción de la imagen aquí

La idea detrás de esto es que en circunstancias normales sin spurs, la dirección IP tiene un hash suficiente. En condiciones anormales, cualquier subrango de la dirección IP de 32 bits tendrá spurs. Si todos los spurs se empalman, es una dirección IP completa.

Sin embargo, si hay dos o más direcciones IP con niveles de inundación equivalentes, será difícil de detectar y se requieren permutaciones y combinaciones para verificar el cálculo. Una forma de lidiar con esta situación es ordenar cada subintervalo en N superior y luego verificar el cálculo.

para resumir

Todo el mundo sugiere que use mapa de bits para hacerlo directamente. Para direcciones IPv4, consume 4G de espacio de direcciones. Sin embargo, hago esta función en el kernel, 4G realmente no se puede reproducir (en realidad nada, pero aún se siente poco elegante). El mapa de bits es un buen método, pero ¿cómo puede ocupar menos memoria?

Así que pensé en el método de solución difusa, es decir, el método 1. Este método puede fallar en casos extremos, como el algoritmo hash está comprometido y el hash tiene una distorsión grave, pero es fácil de usar en la mayoría de los casos. Durante la revisión, el bloqueo de giro por cubo seguía siendo un dolor en mi corazón.

El segundo método se basa directamente en la idea de mapa de bits, por lo que es fácil de usar y no tiene bloqueo. De hecho, si observa y analiza detenidamente estos subintervalos de bits divididos, aún puede desenterrar más cosas. No es un problema preguntar por la N. superior. Simplemente dice que el objetivo se ha logrado y no hay más.

Por cierto, en las próximas entrevistas, no dejes que la gente escriba un algoritmo de búsqueda. Debes examinar los problemas de implementación del proyecto, como cómo optimizar la sobrecarga de los bloqueos para operaciones simultáneas, etc. Escribir un spinlock que sea realmente utilizable es mucho ¡más útil que escribir un algoritmo! La mayoría de los programadores no escriben nada rápido en sus carreras, excepto en las entrevistas, pero como un adulto que no escribe unas pocas líneas de código y no sabe programar, no tengo que escribir un top 1 Dirección IP en el kernel de Linux ¿Se ha logrado?


Los zapatos de cuero en Wenzhou, Zhejiang están mojados, por lo que no engordan con la lluvia.

Supongo que te gusta

Origin blog.csdn.net/dog250/article/details/114433315
Recomendado
Clasificación