多くの IT 企業では、アルゴリズムは面接で非常に重要な部分を占めていますが、実際の仕事でアルゴリズムに遭遇することはほとんどなく、あまり実用的ではないと不満を言う人も多くいます。弊社が面接でよく使う質問について解説します。最下層では非常にシンプルなアルゴリズムが使われていますが、実際の業務では比較的見やすいシナリオである、大規模なブラックリストIPマッチングについて解説します。同時に、セキュリティ ゲートウェイで開発した例を使用して検証を行います。
問題とシナリオ 質問: IP セグメントのリストは膨大にあり、特定の IP がそれらのいずれかに属しているかどうかをすばやく確認する必要があります。 これは実際にはよくある問題です。当社のセキュリティ ゲートウェイを例にとると、少なくとも次のシナリオで必要になります。 シナリオ 1: 単純なブラックリストとホワイトリストのマッチング ゲートウェイの場合、ブラックリストとホワイトリストのマッチングは基本的な機能です。
シナリオ2: 実際のIPアドレスを取得する 実際の IP アドレスを取得することは、トラフィックのソース パスが異なる可能性があるため、一部の Web サイトにとっては非常に厄介な問題です。
同様の参考として、nginx の real ip 関数を参照できます。原理も比較的単純です。「set_real_ip_from 192.168.1.0/24;」のようなステートメントを通じて内部 IP リストを設定できます。このように、XFF ヘッダーを処理するときに、後ろから前に向かって検索し、再帰モードで、内部 IP ではない最初の値、つまり実際の IP を見つけます。これでこの記事の質問に戻ります。 シナリオ 3: トラフィックのラベル付け この部分の機能は、バックエンドのビジネスモジュールによって実装されることが多いです。製品を開発する際には、リクエストが来たときに何らかの自動アノテーションを行って、バックエンドの負担を軽減したいと考えています。より便利なものは次のとおりです。
上記のシナリオは、比較的簡単に遭遇する大規模な IP セグメント リストを照合するいくつかのアプリケーション シナリオについて説明しています。 2. アルゴリズムの説明 アルゴリズム 1: ハッシュマップ ほとんどの人の最初の反応は、ハッシュマップを使用して一致させることですが、これは理論的には可能です (ネットワーク セグメントを独立した IP に分割する) が、基本的には使用できません。
したがって、ハッシュマップ方式はクエリには効率的ですが、実装レベルでは実現可能ではありません。 アルゴリズム2: ネットワークセグメントリストの順次マッチング 現在、ほとんどのオープンソース実装がこの方式を採用していることがわかります。たとえば、シナリオの段落で説明した nginx の 2 つの機能モジュールは、accss モジュールと realip モジュールにあります。これらは、設定を cidr リストとして保存し、それらを 1 つずつ照合します。別の実装は、openresty の lua-resty-iputils モジュールです。このコードはより直感的に見えます。
オープンソース実装は、ほとんどの単純なシナリオを処理するのに十分ですが、その後のテストでは、IP セグメントの数が増えると、パフォーマンスがまだ不足していることが示されています。 アルゴリズム3: 二分探索 実際のアルゴリズムは非常にシンプルで、バイナリ検索を使用するだけです。これらの IP セグメントが互いに隣接していないと仮定して、図に示すように、Java に似たバイナリ検索を使用します。 隣接していない 4 つの IP セグメント A、B、C、D があるとします。各セグメントは、開始 IP の整数表現と終了 IP の整数表現の 2 つの数値に変換できます。たとえば、0.0.0.0/24 は [0, 255] に変換できます。このように、4 つのネットワーク セグメントは 8 つの数字に変換され、並べ替えることができます。ネットワーク セグメントは互いに隣接していないため、図に示すように、1 つの IP セグメントが別の IP セグメントに接続されている必要があります。このマッチングアルゴリズムはよりシンプルになります:
したがって、アルゴリズム全体は非常にシンプルですが、ネットワーク セグメントが互いに隣接していないことを前提としているため、見落とされがちです。以下は簡単な説明です。 任意の 2 つのネットワーク セグメント A と B には、次の 3 つの関係があります。
上の図は、任意の 2 つのネットワーク セグメントを示しています。
それで:
したがって、元データがある程度前処理されていれば、バイナリ検索は安全かつ効果的な方法です。 3. テストデータ 最近はかなり多くの携帯電話が発売されているので、私たちもその傾向を追ってスコアを計算してみます。
テスト1: ベンチマークテスト
テスト2: 10,000個のブラックリスト + ハッシュマップ
テスト 3: 10,000 個のブラックリスト + lua-resty-utils モジュールの順次検索
テスト4: 10,000個のブラックリスト + バイナリ検索
テスト データから、バイナリ検索はハッシュに基づくパフォーマンスに近いパフォーマンスを、メモリ消費量を大幅に削減しながら達成できることがわかります。一方、単純な順次トラバーサルでは、パフォーマンスが桁違いに低下します。 [この記事は51CTOコラム「千安科技」のオリジナル記事です。転載についてはWeChatパブリックアカウント(bigsec)を通じて原作者にご連絡ください] この著者の他の記事を読むにはここをクリックしてください |
<<: 高校の授業に人工知能が進出。全国40校がこの教材を導入
>>: 機械学習とデータサイエンスに関する必読の無料オンライン電子書籍 10 冊
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
検出が難しい機械の故障は最もコストがかかるため、経験豊富な修理技術者の需要が高まっています。今日、多...
報道によると、権威ある調査機関ガートナーは本日発表したホワイトペーパーで、投資家による人工知能(AI...
この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...
分析会社シミラーウェブが9月8日に発表した最新データによると、人工知能チャットロボット「ChatGP...
デジタル経済時代の新たな生産力として、コンピューティングパワーは質の高い経済社会の発展を支える重要な...
[51CTO.com からのオリジナル記事] 運用と保守の発展を振り返ると、スクリプト、ツール、プラ...
[[187452]]現在、人工知能はますます人気が高まっている分野となっています。普通のプログラマー...
必要なのは2枚の写真だけで、追加のデータを測定する必要はありません——ディンディン、完全な 3D ク...
ビッグデータダイジェスト制作ロシアとウクライナの紛争が始まると、カディロフ・ジュニアはチェチェンの首...
今週、チップスタートアップのCerebrasは、100億を超えるパラメータを持つNLP(自然言語処理...