سؤال

متابعة من هذا المشنور أنا مهتم بالبحث في نطاقات عنوان IPv6.

ضمن IPv4، سأكون قادرا على تحديد عناوين IP البدء وإنهاء IP المقدم من مزود خدمة الإنترنت واستخدام هذه القيم العددية كعمل حدود البحث بسرعة بحثا عن قاعدة بيانات لمعرفة ما إذا كان أي إدخالات في DB سقطت في هذا النطاق.

كيف ستؤثر هذا بواسطة IPv6؟ هل لا يزال لدى ISP لعناوين IPv6 في النطاقات كما تفعل الآن؟ وكيف يمكنك البحث بكفاءة هذه النطاقات إذا كنت تقوم بتخزين عناوين IPv6 كثبيين في Bigint في خادم SQL Server؟

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

المحلول

إنه غير صحيح لاستخدام عناوين IP (لا iPv4، ولا IPv6) في النطاقات. يتم استخدام الطريقة الصحيحة لجماعة "نطاق" معين من عناوين IP بادئات (Netation CIDR) أو أقنعة (عفا عليها الزمن، صالحة فقط ل IPv4، وتبدد الجنون إذا حاولت استخدام قناع غير متجاور).

في بعض الأحيان سترى شخصا ما (أحيانا حتى التطبيقات، أجهزة التوجيه الرئيسية، إلخ) باستخدام نطاقات IPv4، ولكن هذه مجرد طريقة خاطئة للقيام بذلك.

استخدام التوجيه متعدد الكلور بين المجال (CIDR) سيكون لديك tupleu003CAddress, Prefix> ، حيث العنوان هو عدد صحيح غير موقعة 128 بت، يعد البادئة الصغار (0..128) عددا صحيحا غير موقعة. يروي البادئة عدد البتات الأكثر أهمية من العنوان تمثل عنوان الشبكة، مما يترك البتات الأقل أهمية 128 البادئة لتمثيل مضيف معين في تلك الشبكة.

لذلك، على سبيل المثال، مجموعة IPv6 "من 2620: 0: 860: 2 :: / 64 (Wikimedia.org) يمثل جميع المضيفين من 2620: 0: 860: 2 :: حتى 2620: 0: 860: 2: FFFF: FFFF: FFFF: FFFF.

يجب أن لا تستخدم اثنين من "Bigint" لتخزين هذه القيمة في قاعدة بيانات، ولكن استخدم أي تمثيل أصلي في عمود واحد، إلا إذا كنت ترغب في جعل عمر مطورتك كابوسا. إذا كانت DBMS الخاصة بك لا تدعم أعداد صحيحة هذه كبيرة، بالإضافة إلى استبدال DBMS الخاص بك، أقترح استخدام عمود بيانات ثنائي الحجم ثابت، 16 بايت طويلة.

نصائح أخرى

إن استخدام DBMS مع الدعم المناسب لعناوين IPv6 لن يكون فكرة سيئة. هنا مثال على postgresql، الإصدار 8.3:

mydb=> CREATE TABLE Networks (name TEXT, prefix INET);
CREATE TABLE
mydb=> INSERT INTO Networks VALUES ('Documentation', '2001:DB8::/32');
INSERT 0 1
mydb=> INSERT INTO Networks VALUES ('ULA', 'FC00::/7');
INSERT 0 1
mydb=> INSERT INTO Networks VALUES ('Orchid', '2001:10::/28');
INSERT 0 1

mydb=> SELECT * FROM Networks;
 name      |    prefix     
---------------+---------------
 Documentation | 2001:db8::/32
 ULA           | fc00::/7
 Orchid        | 2001:10::/28
(3 rows)

mydb=> SELECT * FROM Networks WHERE '2001:DB8::dcaf:BAD' << prefix;
 name      |    prefix     
---------------+---------------
 Documentation | 2001:db8::/32
(1 row)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top