2008-10-02 8 views
12

मेरे सर्वर ऐप के लिए, मुझे यह जांचना होगा कि क्या हमारी ब्लैकलिस्ट में आईपी पता है या नहीं।आप आईपी पते की तुलना कैसे करेंगे?

आईपी पते की तुलना करने का सबसे प्रभावी तरीका क्या है? आईपी ​​पते को पूर्णांक में परिवर्तित करना और उन्हें कुशलता से तुलना करना?

+1

अपने काली सूची है डेटाबेस में, स्मृति में लोड की गई एक फ़ाइल, क्या? –

+1

इससे कोई फ़र्क नहीं पड़ता कि ब्लैकलिस्ट कहां स्थित है। इसकी अभी भी सीपीयू की तुलना की जाएगी। लेकिन अगर आपको लगता है कि मुझे अपने प्रश्न में इसका जिक्र करना चाहिए, तो कृपया मुझे बताएं कि ब्लैकलिस्ट का स्थान महत्वपूर्ण क्यों है। – MrValdez

+1

@MrValdez: डिस्क से ब्लैकलिस्ट लाने का समय उस समय से अधिक हो जाएगा जब तक उसकी सभी प्रविष्टियों को int से स्ट्रिंग या इसके विपरीत में परिवर्तित नहीं किया जा सके। – MSalters

उत्तर

27

कि आप किस भाषा का प्रयोग कर रहे हैं, लेकिन एक आईपी पता आमतौर पर एक 32-बिट अहस्ताक्षरित पूर्णांक के रूप में संग्रहीत किया जाता है, कम से कम नेटवर्क परत में काफी तेजी से उनकी तुलना की जाए निर्भर करता है। यहां तक ​​कि यदि यह नहीं है, तब तक जब तक आप एक उच्च प्रदर्शन पैकेट स्विचिंग एप्लिकेशन डिज़ाइन नहीं कर रहे हैं, तो यह प्रदर्शन बाधा होने की संभावना नहीं है। समयपूर्व अनुकूलन से बचें - अपने प्रोग्राम को टेस्टेबिलिटी और स्केलेबिलिटी के लिए डिज़ाइन करें और यदि आपके पास प्रदर्शन समस्याएं हैं तो आप यह देखने के लिए प्रोफाइलर का उपयोग कर सकते हैं कि बाधाएं कहां हैं।

संपादित करें: स्पष्ट करने के लिए, IPv4 पतों के रूप में 32-बिट पूर्णांक जमा हो जाती है, के साथ साथ एक नेटमास्क (जो आईपी पते तुलना के लिए आवश्यक नहीं है)। यदि आप नए और वर्तमान में अधिक दुर्लभ आईपीवी 6 का उपयोग कर रहे हैं, तो पते 128 बिट लंबे होंगे।

+0

"वर्तमान में अधिक दुर्लभ" शायद 9.5 साल बाद अपडेट की आवश्यकता है? – MichaelChirico

4

हाँ मैं ने पाया है कि कुशल होने के लिए, यह हालांकि एक लंबा हो जाएगा, और निश्चित रूप से आप पूर्णांक के रूप में सूचकांक काली सूची में डाल आईपी किया है। जब तक आप 128 बिट IPv6 पतों के साथ काम शुरू -

7

32-बिट पूर्णांक जाने का रास्ता है।

3

PeerGuardian जैसे उपकरण जो एक काली सूची में आईपी के लिए ड्राइवर के स्तर पर भेजे टीसीपी/आईपी कनेक्शन की अनुमति नहीं देता का उपयोग करें। बेहद सुरक्षित, कोई कोड आवश्यक नहीं है (तर्कसंगत: अत्यधिक सुरक्षित, क्योंकि कोई कोड आवश्यक नहीं है)।

1

आप एक स्ट्रिंग के रूप आईपी पते प्राप्त करते हैं, एक स्ट्रिंग के साथ उसकी तुलना परिवर्तित प्रतिनिधित्व पूर्णांक

तुलना में अधिक कुशल हो सकता है, लेकिन मैं प्रोफ़ाइल चाहते हैं दोनों समाधान, निश्चित होने के लिए अगर कुछ मिलीसेकंड (नैनोसेकंड अगर !) इस ऑपरेशन पर कोई फर्क नहीं पड़ता ;-)

2

क्या आपके पास दक्षता के साथ मौजूदा समस्या है?

यदि ऐसा है तो हर तरह से कोड (या छद्म कोड) पोस्ट करें और हम लाश पर चुन सकते हैं।

यदि नहीं तो मैं एक क्रमबद्ध सूची में प्रविष्टियों को संग्रहीत करने और अपने पर्यावरण के मौजूदा Sort() और Find() का उपयोग करके कुछ आसान करने का सुझाव देना चाहूंगा।

5

आपका मतलब है कि यदि आपको इसे टेक्स्ट स्ट्रिंग के रूप में तुलना करना चाहिए या int int में int को परिवर्तित करना चाहिए और int के रूप में तुलना करना चाहिए?

यह आमतौर पर इस तरह के लुकअप में बाधा नहीं है। आप बस दोनों विधियों को लागू करने का प्रयास कर सकते हैं और देख सकते हैं कि कौन सा तेजी से चलता है।

आईपी एड्रेस लुकअप के साथ वास्तविक समस्या आमतौर पर कुशल प्रश्न पूछ रही है, इस तथ्य का लाभ उठाते हुए कि आप आईपी पते से निपट रहे हैं और केवल यादृच्छिक संख्या नहीं। इसे पूरा करने के लिए आप LC trie और शायद this article

स्पष्ट रूप से यह आपकी रुचि लेना चाहिए यदि आपकी ब्लैकलिस्ट में हजारों या लाखों प्रविष्टियां हैं। यदि इसमें केवल 10-20 प्रविष्टियां हैं तो एक रैखिक खोज को प्राथमिकता दी जानी चाहिए और वास्तव में अधिक दिलचस्प सवाल टेक्स्ट तुलनात्मक तुलना बनाम पूर्णांक तुलना है।

2

इंटीजर तुलना स्ट्रिंग तुलना की तुलना में बहुत तेज है।

आप एक हल कर सूची में पूर्णांकों की दुकान, तो आप उन्हें तेजी से एक अवर्गीकृत सूची की तुलना में पा सकते हैं।

3

मैं यह कर दिया है और मैं इसे परीक्षण किया है, एक अहस्ताक्षरित int (32 बिट) का उपयोग करते हुए सबसे तेज - मैं यह सोचते कर रहा हूँ कि आप स्ट्रिंग प्रतिनिधित्व करने के लिए इस तुलना कर रहे हैं।

एक और बात यह है कि आप मदद कर सकता है जब तालिका बनाने, अतीत में मैं 2 colums लिया है है: LowIP और HighIP; इस तरह से मैं 1 रिकॉर्ड प्रविष्टि के साथ आईपी के पूरे श्रेणियों को ब्लैकलिस्ट करने में सक्षम हूं और अभी भी आईपी की सीमा में जांच करके अच्छा प्रदर्शन प्राप्त कर रहा हूं।

3

मुझे एक बार विरासत कोड मिला जहां सोचा जो आईपी पते को 4 int के रूप में संग्रहीत करता था, वास्तव में अच्छी बात थी, सिवाय इसके कि उन्होंने अपना पूरा समय int में/से बदल दिया।

उन्हें डेटाबेस में तारों के रूप में रखना बहुत आसान था, और इसे केवल एक ही अनुक्रमणिका की आवश्यकता थी। आप आश्चर्यचकित होंगे कि एसक्यूएल सर्वर पूर्णांक के 4 कॉलम के विपरीत तारों को कैसे अनुक्रमणित कर सकता है। लेकिन यह आईपी सूची ब्लैकलिस्टिंग के लिए नहीं थी। एक डेटाबेस दौर यात्रा बहुत महंगा है।

एक डेटाबेस overkill है, उन्हें स्मृति में एक शब्दकोश में स्टोर है, लेकिन यह सिर्फ एक अनुमान है, क्योंकि हम पता नहीं कितने आप तुलना करने की आवश्यकता है। चूंकि अधिकांश हैशकोड 32-बिट int हैं, और आईपीवी 4 पते 32 बिट हैं, आईपी एड्रेस स्वयं ही एक अच्छा हैशकोड हो सकता है।

लेकिन जैसा कि अन्य इंगित करते हैं, सबसे अच्छा विकल्प आपके सर्वर पर लोड को कम करने और विशेष हार्डवेयर खरीदने के लिए हो सकता है। हो सकता है कि आप हाल ही में स्मृति में आईपी की ब्लैकलिस्टेड रखें और समय-समय पर राउटर में नया प्रकाशित करें।

आप एक एक रूटर के अंदर कुछ सॉफ्टवेयर बनाने की कोशिश कर रहे हैं, तो आप अपने डेटा संरचनाओं किताब की मछली और एक बी-वृक्ष की तरह कुछ बनाने की आवश्यकता होगी।

+1

एक और (स्ट्रिंग) के साथ एक खराब प्रतिनिधित्व (4 इंच) की तुलना करना वास्तव में एक उचित तुलना नहीं है। – MSalters

+1

यह केआईएसएस सिद्धांत की अचूक प्रतिक्रिया थी, और एक आईपी पता संग्रहित करना एक स्ट्रिंग के रूप में हाथ के उद्देश्य के लिए पर्याप्त था। –

3

रैडिक्स या पैट्रिकिया ट्री इसके लिए इष्टतम संरचना है।

बाहर चेक प्रवाह के उपकरणों के लिए सी स्रोत: http://www.splintered.net/sw/flow-tools/

मैं पहले इस साल पर काम किया।

+0

प्रवाह-उपकरण साइट काफी अच्छी है!वहां कई अच्छे लिंक हैं, उदाहरण के लिए, यह: http://www.splintered.net/sw/flow-tools/SECURITY धन्यवाद! –

5
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; 
    } 

यदि मैं आपको सही ढंग से समझता हूं तो यह दो आईपी पते की तुलना करने के लिए कोड है, क्या आप यह चाहते हैं? आप आगे की तरह ऐसी बातें कर सकते हैं ...

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

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

क्योंकि आप पता बाइट्स मिल गया ... आप ऐसा तो मुझे उत्तर प्रदेश वोट लेकिन वोट नहीं दें करें मुझे नकारात्मक