Trouvez l'adresse IP du top 1 dans le chemin de réception du noyau Linux

Dans le travail réel, j'ai finalement rencontré de vraies questions d'entrevue:

  • Question d'algorithme: une liste chaînée non ordonnée contenant un grand nombre de nœuds, sachant qu'elle contient plusieurs éléments répétés, trouvez celle avec les temps les plus répétés, et donnez la complexité temporelle. Par exemple, 20-1-2-3-5-7-3-20-12-3, l'élément répétitif a 3 3s, et la réponse à 2 20s est évidemment 3.

Lors de l'analyse du trafic, de la détection et de la protection DDoS et du nettoyage du trafic, une exigence très courante est de "rechercher les N premiers", et les algorithmes associés peuvent être décrits comme beaucoup de sueur:

  • Trier
  • Tas maximum
  • LRU
  • Compteur Bitmap

Il existe de nombreux algorithmes théoriques, mais dans le combat réel, divers problèmes d'ingénierie seront toujours rencontrés. Par exemple, la surcharge de verrouillage des opérations simultanées est inévitable. Par conséquent, concevoir un appareil au lieu de concevoir un algorithme est une idée naturelle.

Il convient également de noter que la détection d'un trafic anormal est une opération floue, qui ne nécessite pas nécessairement de calculs précis et d'appariement précis. Il suffit de localiser l'anomalie. Par conséquent, il existe une autre façon de penser d'utiliser la structure de données percpu pour tolérer lors de la lecture des données Perte de précision, échange de précision pour efficacité.

Voici deux méthodes auxquelles j'ai pensé en quittant le travail. Trouver le top 1 est très approprié, et le top N peut être trouvé légèrement. Ces deux méthodes sont très simples et transparentes à mettre en œuvre.

Méthode 1: liste chaînée multi-hachage (l'idée de filtre de floraison)

Deux (ou plus) tables de hachage avec des algorithmes de hachage différents sont liées à la structure de l'adresse IP et au nombre par compartiment:
Insérez la description de l'image ici

La structure des données est la suivante:

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];

en fonctionnement:

  • Entrée IP: calculez hash1 et hash2 par adresse IP (source ou cible, selon la configuration), liez respectivement à la liste correspondante et incrémentez le nombre de compartiments.

  • Le minuteur expire ou conntrack est détruit: supprimez la structure IP correspondante et décrémentez le nombre de compartiments.

détection anormale:

  • Il y a deux tables de hachage en même temps qu'un nombre de compartiments dépasse le compteur moyen β \ betaβ fois, et la différence entre les deux plus grands compteurs de compartiment ne dépasse pasα \ alphaα , considéré comme anormal:

    L max> β L moyenne L_ {max}> \ beta L_ {moyenne} Lm a x>β Lm e un n

    La longueur moyenne est calculée comme suit:

    L moyenne = Σ n = 0 N buckets - 1 L n - L max N buckets - 1 L_ {mean} = \ dfrac {\ Sigma_ {n = 0} ^ {N_ {buckets} -1} {Ln} -L_ { max}} {N_ {buckets} -1} Lm e un n=Nb u c k e t s-1Σn = 0Nb u c k e t s- 1L n-Lm a x

  • Traverse le début de la liste des deux plus grands compteurs γ \ gammaéléments γ (γ \ gammaγ est deux fois la longueur moyenne), et la plus grande intersection répétée des deux listes chaînées est prise. C'est l'adresse IP anormale. Leetcode 349:https://leetcode-cn.com/problems/intersection-of-two-arrays/

Évaluation:

  • L'entrée IP nécessite une opération de calcul de hachage, une complexité de temps O (1).

  • La structure IP est insérée dans la liste liée du seau de hachage, complexité temporelle O (1). (Peut-être que le spinlock est cher et peut être optimisé par percpu)

  • Détection d'anomalie faisant bouillir le compteur de seaux maximum de deux tables de hachage (le seau est fixe), complexité temporelle O (1).

  • Traverser deux listes liées Erreur d'analyse KaTeX: Séquence de contrôle non définie: \ gama à la position 1: éléments \ ̲g̲a̲m̲a̲ , complexité temporelle O (n), en supposant que l'algorithme de hachage est uniforme, L signifie L_ {moyenne}Lm e un nEst très petit.

Méthode 2: Le compteur de hachage (également l'idée du filtre de floraison)
divise l'adresse IP en 8 bits, chaque 8 bits équivaut à 256 compteurs et deux compteurs de hachage sont définis en même temps:
Insérez la description de l'image ici

La structure des données est la suivante:

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]

en fonctionnement:

  • Entrée IP: Calculez hash1 et hash2 par adresse IP (source ou destination, selon la configuration), incrémentez respectivement les compteurs correspondant à deux compteurs de hachage, et en même temps incrémentez les compteurs correspondant aux bits du groupe de compteurs par octet.

  • Le temporisateur expire ou conntrack est détruit: décrémentez le compteur correspondant.

détection anormale:

  • Il y a deux tables de hachage en même temps qu'un nombre de compartiments dépasse le compteur moyen β \ betaβ fois, et la différence entre les deux plus grands compteurs de compartiment ne dépasse pasα \ alphaα , considéré comme anormal:

    L max> β L moyenne L_ {max}> \ beta L_ {moyenne} Lm a x>β Lm e un n

    La longueur moyenne est calculée comme suit:

    L moyenne = Σ n = 0 N buckets - 1 L n - L max N buckets - 1 L_ {mean} = \ dfrac {\ Sigma_ {n = 0} ^ {N_ {buckets} -1} {Ln} -L_ { max}} {N_ {buckets} -1} Lm e un n=Nb u c k e t s-1Σn = 0Nb u c k e t s- 1L n-Lm a x

  • Prenez le plus grand compteur du groupe de compteurs par octet, indexez-le dans une adresse IP en fonction de sa position et utilisez deux tables de hachage pour vérifier le calcul. Si elle tombe dans le compartiment avec le plus grand compteur en même temps (c'est-à-dire les deux compartiments trouvés dans la première étape), l'adresse épissée est l'adresse anormale, sinon la plus petite suivante est sélectionnée pour continuer.

Ce n'est pas que la probabilité d'épissage de la valeur maximale du groupe de compteurs par octet soit très faible.Nous supposons que l'adresse IP est une distribution uniforme à longue queue.

Évaluation:

  • Il enregistre la maintenance de la liste chaînée de hachage, en particulier l'utilisation de spinlock.

Version optimisée

Vous pouvez ajouter deux autres groupes de compteurs par octet qui se chevauchent pour améliorer la précision. De cette manière, de bas en haut, pour chaque octet, tant que les 4 bits les plus hauts et les 4 bits les plus bas de l'octet suivant peuvent correspondre à l'épissage, la super probabilité est Adresse du haut 1, en plus de l'adresse N du haut:
Insérez la description de l'image ici

L'idée sous-jacente est que, dans des circonstances normales sans éperons, l'adresse IP est suffisamment hachée. Dans des conditions anormales, toute sous-plage de l'adresse IP 32 bits aura des éperons. Si toutes les éperons sont épissées ensemble, il est une adresse IP complète.

Cependant, s'il y a deux adresses IP ou plus avec des niveaux d'inondation équivalents, il sera difficile à détecter, et des permutations et des combinaisons sont nécessaires pour vérifier le calcul. Une façon de gérer cette situation consiste à trier chaque sous-intervalle dans les N premiers, puis à vérifier le calcul.

Pour résumer

Tout le monde me suggère d'utiliser bitmap pour le faire directement, car pour les adresses IPv4, cela consomme 4G d'espace d'adressage. Cependant, je fais cette fonction dans le noyau, la 4G n'est vraiment pas jouable (en fait rien, mais semble toujours inélégante). Le bitmap est une bonne méthode, mais comment peut-il prendre moins de mémoire?

J'ai donc pensé à la méthode de solution floue, c'est-à-dire à la méthode 1. Cette méthode peut échouer dans des cas extrêmes, tels que l'algorithme de hachage est compromis, et le hachage a une distorsion grave, mais il est facile à utiliser dans la plupart des cas. Au cours de l'examen, le spinlock de par seau était toujours une douleur dans mon cœur.

La deuxième méthode est directement basée sur l'idée de bitmap, elle est donc facile à utiliser et n'a pas de verrou. En fait, si vous observez et analysez attentivement ces sous-intervalles de bits fractionnés, vous pouvez encore creuser plus de choses. Ce n'est pas un problème de demander le top N. Cela dit simplement que l'objectif est atteint, et il n'y a pas plus.

BTW, dans les entretiens futurs, ne laissez plus les gens écrire un algorithme de recherche. Vous devriez examiner les problèmes de mise en œuvre du projet, comme comment optimiser la surcharge des verrous pour les opérations simultanées, etc. plus utile que d'écrire un algorithme! La plupart des programmeurs n'écrivent pas du tout de tri rapide dans leur carrière, sauf pour les interviews, mais en tant qu'adulte qui n'écrit pas quelques lignes de code et ne sait pas programmer, je n'ai pas à écrire un top 1 Adresse IP dans le noyau Linux. At-elle été atteinte?


Les chaussures en cuir à Wenzhou, Zhejiang sont mouillées, donc elles ne grossiront pas sous la pluie.

Je suppose que tu aimes

Origine blog.csdn.net/dog250/article/details/114433315
conseillé
Classement