多くの 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 冊
負荷分散とは負荷分散(英語名は Load Balance)とは、複数のサーバーを対称的に構成したサー...
[[187416]] Huxiu 注: この記事は、4 月 3 日に The New Yorker ...
<!-- /* Style Definitions */ p.MsoNormal, li.M...
近年、人工知能は大手企業の重要な研究分野となり、「政府活動報告」にも記載されるようになりました。これ...
[[283217]] [51CTO.com クイック翻訳] 著名なベンチャーキャピタリスト、マーク...
[[330426]]ビッグデータダイジェスト制作出典: towarddatascience著者: ...
今日は対称暗号化アルゴリズムの重要な問題についてお話ししましょう。暗号化の基本的な概念に精通していな...
近年、画像生成、特にテキストから画像への生成の分野で大きな進歩が遂げられており、アイデアをテキストで...
最近、国家発展改革委員会と財政部は、新技術と新事業の発展を奨励するために、5905-5925MHz周...
Charles Araujo 氏は、著名な業界アナリストであり、デジタル エンタープライズの国際的に...
急速に進化する今日のテクノロジーの世界では、「人工知能」、「機械学習」、「アルゴリズム」などの用語が...
近年、多くの物事の成功はテクノロジーの進歩によるものと言えます。その一つは、気候変動のリスクから地球...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...