سؤال

بالنسبة لتطبيق الخادم الخاص بي، أحتاج إلى التحقق مما إذا كان عنوان IP مدرجًا في قائمتنا السوداء.

ما هي الطريقة الأكثر فعالية لمقارنة عناوين IP؟هل تحويل عنوان IP إلى عدد صحيح ومقارنتها فعال؟

هل كانت مفيدة؟

المحلول

ويعتمد ما اللغة التي تستخدمها، ولكن يتم تخزين عنوان IP عادة كعدد غير موقعة 32 بت، على الأقل في طبقة الشبكة، مما يجعل مقارنات سريعة جدا. حتى لو لم تكن كذلك، إلا إذا كنت تصميم عالية الأداء تطبيق علبة تبديل انه ليس من المرجح أن يكون عنق الزجاجة الأداء. تجنب الأمثل من السابق لأوانه - تصميم البرنامج لقابلية الاختبار وتطويره وإذا كان لديك مشاكل في الأداء ثم يمكنك استخدام التعريف لنرى أين هي الاختناقات

وتحرير: لتوضيح، يتم تخزين عناوين IPv4 أنها أعداد صحيحة 32-بت، بالإضافة إلى قناع الشبكة (التي ليست ضرورية لإجراء مقارنات عنوان IP). إذا كنت تستخدم أحدث وحاليا ب IPv6 أكثر نادرة، ثم عناوين سيكون 128 بت طويلة.

نصائح أخرى

والأعداد الصحيحة 32 بت هي وسيلة للذهاب - حتى يمكنك البدء في التعامل مع عناوين IPv6 128 بت

تقصد أنه إذا كان يجب عليك مقارنتها كسلسلة نصية أو تحويل int إلى int ومقارنتها كـ int؟

وهذا ليس عادة عنق الزجاجة في هذا النوع من عمليات البحث.يمكنك فقط محاولة تنفيذ كلتا الطريقتين ومعرفة أيهما يعمل بشكل أسرع.

عادةً ما تكون المشكلة الحقيقية في البحث عن عنوان IP هي إجراء استعلامات فعالة، مع الاستفادة من حقيقة أنك تتعامل مع عناوين IP وليس فقط أرقام عشوائية.لإنجاز هذا يمكنك البحث محاولة إل سي و ربما هذا المقال

من الواضح أن هذا يجب أن يثير اهتمامك فقط إذا كانت قائمتك السوداء تحتوي على عشرات الآلاف أو الملايين من الإدخالات.إذا كان يحتوي على 10 إلى 20 إدخالًا فقط، فيجب تفضيل البحث الخطي، والسؤال الأكثر إثارة للاهتمام هو المقارنة النصية مقابل مقارنة الأعداد الصحيحة.

static public bool IsEqual(string ToCompare,
                                      string CompareAgainst)
  {

     return IPAddressToLongBackwards(ToCompare)==IPAddressToLongBackwards(CompareAgainst);
  }

static private uint IPAddressToLongBackwards(string IPAddr)
  {
     System.Net.IPAddress oIP=System.Net.IPAddress.Parse(IPAddr);
     byte[] byteIP=oIP.GetAddressBytes();


     uint ip=(uint)byteIP[0]<<24;
     ip+=(uint)byteIP[1]<<16;
     ip+=(uint)byteIP[2]<<8;
     ip+=(uint)byteIP[3];

     return ip;
  }

إذا كنت فهمت بشكل صحيح، وهذا هو رمز للمقارنة بين عناوين IP اثنين. هل تريد هذا؟ يمكنك كذلك يفعل مثل هذه الاشياء مثل:

static public bool IsGreater(string ToCompare,
                               string CompareAgainst)
  {

     return IPAddressToLongBackwards(ToCompare)>
        IPAddressToLongBackwards(CompareAgainst);
  }

ولأنك حصلت على بايت عنوان.

نعم لقد وجدت أن لتكون فعالة، وسوف تكون طويلة رغم ذلك، وبالطبع كان لديك لمؤشر القائمة السوداء المتكاملة في شكل عدد صحيح.

استخدم أداة مثل PeerGuardian الذي يرفض اتصالات TCP / IP واردة على مستوى السائق إلى الشرطة العراقية على القائمة السوداء. آمنة للغاية، أي رمز المطلوب (يمكن القول: آمنة للغاية، <م> لأن أي رمز المطلوبة).

ولقد فعلت هذا ولقد اختبرت ذلك، وذلك باستخدام عدد صحيح غير موقعة (32 بت) هو الأسرع - أفترض أنك مقارنة هذا إلى تمثيل سلسلة

وشيء آخر يمكن أن تساعدك وعند إنشاء الجدول، في الماضي لقد كان 2 colums: LowIP وHighIP. بهذه الطريقة لقد كنت قادرا على القائمة السوداء نطاقات كاملة من وIP مع دخول 1 سجل ولا يزال الحصول على الأداء الجيد عن طريق فحص لIP في النطاق.

كود

وأنا مرة واحدة ورثت حيث شخص ما <م> يعتقد أن تخزين عناوين IP كما كان 4 كثافة أمر جيد حقا، إلا أنها تنفق كل وقتهم تحويل إلى / من لكثافة العمليات.

وابقائها كسلاسل في قاعدة البيانات كان أسهل بكثير، وأنه يحتاج فقط مؤشر واحد. كنت سأشعر بالدهشة جيدا كيف ملقم SQL سلاسل مؤشر يمكن بدلا من 4 أعمدة من الأعداد الصحيحة. ولكن هذه القائمة IP لم يكن لالسوداء. قاعدة بيانات ذهابا وإيابا مكلفة جدا.

إذا كانت قاعدة بيانات مبالغة، وتخزينها في القاموس في الذاكرة، ولكن هذا مجرد تخمين منذ لدينا أي فكرة كم كنت في حاجة إلى المقارنة. وبما أن معظم hashcodes هي 32 بت عدد صحيح، ووعناوين IPv4 هي 32 بت، عنوان IP نفسه قد يكون مجرد شفرة التجزئة جيدة.

ولكن كما يشير آخرون إلى أن أفضل خيار قد يكون لتقليل الحمل على الخادم الخاص بك وشراء الأجهزة المتخصصة. ربما عليك أن تبقي على القائمة السوداء مؤخرا لIP في الذاكرة ونشر واحد جديد لجهاز التوجيه بشكل دوري.

إذا كنت واحدة تحاول أن تجعل بعض البرامج داخل جهاز توجيه، ثم ستحتاج لصيد السمك من كتابك هياكل البيانات وإنشاء ما يشبه ب شجرة.

وهذا الرقم الأساسي أو PATRICIA حاكموا هو الهيكل الأمثل لذلك.

وتحقق من مصدر C لتدفق الأدوات: http://www.splintered.net/sw/flow-tools/

ولقد عملت على هذا منذ سنوات.

هل لديك مشكلة القائمة مع الكفاءة؟

وإذا كان الأمر كذلك ثم بكل الوسائل الرد على رمز (أو شبه كود) ويمكننا اختيار في الجثة.

إذا لم يكن ثم أود أن أقترح محاولة شيء بسيط مثل تخزين إدخالات في قائمة فرزها واستخدام Sort() القائمة بيئتك وFind().

والمقارنات صحيح هي أسرع بكثير من مقارنات السلسلة.

إذا قمت بتخزين الأعداد الصحيحة في قائمة فرزها، يمكنك العثور عليها بشكل أسرع مما كان عليه في قائمة لم يتم فرزها.

وإذا كنت تتلقى عنوان IP كسلسلة، ومقارنتها إلى سلسلة قد يكون أكثر فعالية من تحويلها إلى عدد صحيح تمثيل

ولكن فما استقاموا لكم فاستقيموا الشخصية على حد سواء الحلول لتكون على يقين، إذا أجزاء قليلة من الثانية (نانو ثانية!) تسير ليهم في هذه العملية؛ -)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top