خوارزمية لفرز الاستجابة في تكوين Robin Robin DNS

StackOverflow https://stackoverflow.com/questions/2039418

  •  19-09-2019
  •  | 
  •  

سؤال

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

دعنا نأخذ الردود التالية.

أولا.

$ dig google.com A

; <<>> DiG 9.6.0-APPLE-P2 <<>> google.com A
;; ...

;; ANSWER SECTION:
google.com.  201 IN A 74.125.39.106
google.com.  201 IN A 74.125.39.105
google.com.  201 IN A 74.125.39.147
google.com.  201 IN A 74.125.39.104
google.com.  201 IN A 74.125.39.103
google.com.  201 IN A 74.125.39.99

;; ...

ثانيا.

$ dig google.com A

; <<>> DiG 9.6.0-APPLE-P2 <<>> google.com A
;; ...

;; ANSWER SECTION:
google.com.  119 IN A 74.125.39.147
google.com.  119 IN A 74.125.39.104
google.com.  119 IN A 74.125.39.103
google.com.  119 IN A 74.125.39.99
google.com.  119 IN A 74.125.39.106
google.com.  119 IN A 74.125.39.105

;; ...

انهم متساوون باستثناء حقيقة ANSWER يحتوي القسم على سجلات DNS بترتيب مختلف. أحتاج إلى تطبيق خوارزمية الفرز لتطبيع قسم الإجابة.

لقد اكتشفت بالفعل إصدارا أوليا من الخوارزمية، لكن أكثر ما أضيف اختبارات أكثر اكتشفت حالات غير مكشوفة. على سبيل المثال، في الاستجابة التالية يجب أن يتم الاحتفاظ بترتيب السجل الأول دون تغيير.

$ dig www.google.com A

; <<>> DiG 9.6.0-APPLE-P2 <<>> www.google.com A
;; ...

;; ANSWER SECTION:
www.google.com.  603039 IN CNAME www.l.google.com.
www.l.google.com. 78 IN A 74.125.39.105
www.l.google.com. 78 IN A 74.125.39.104
www.l.google.com. 78 IN A 74.125.39.147
www.l.google.com. 78 IN A 74.125.39.106
www.l.google.com. 78 IN A 74.125.39.99
www.l.google.com. 78 IN A 74.125.39.103

;; ...

هل هناك أي نوع من التنفيذ / المرجع الحالي الذي يمكنني قراءته من أجل استخراج خوارزمية مناسبة؟

تحديث: بعض التوضيح لسؤالي الأصلي. لا أحتاج إلى مكتبة للحصول على سجلات DNS، لقد حصلت عليهوبعد أحتاج إلى العثور على خوارزمية فعالة لفرز قسم الإجابة في استجابة.

أيضا، ضع في اعتبارك أن السؤال لا يقتصر على سؤال. قد يكون استعلام DNS الأصلي استعلام NS أو استعلام CNAME أو ما تريده.

أنا أستخدم Ruby، لكن هذا غير مناسب للسؤال نفسه.

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

المحلول

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

أوصي بالتعادل :: مرتبة :: صفيف :: كسول إذا كنت تستخدم بيرل.

نصائح أخرى

يجب أن تكون هناك مكتبة متوفرة لمعظم لغات البرمجة للحصول على قائمة عناوين IP للحصول على اسم مضيف معين. سيكون شيئا مثل GetHostByname الذي سيعود مجموعة من عناوين IP التي يمكنك فرزها مثل أي صفيف قياسي. في PHP إنها GetHostBynamel، في Ruby It's Socket :: GetHostByName.

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

  1. الحصول على قائمة عناوين IP.
  2. تحويل عناوين IP إلى التمثيل الصحيحة.
  3. فرز عناوين IP عن طريق التمثيل الصحيحة.
  4. ربح.

يمكنك الرجاء شرح لماذا تحتاج إلى فرزها؟

عموما ترتيب سجلات DNS داخل كل قسم من الحزمة غير ذي صلة. ولا يضمن أن اثنين من الاستفسارات المتعاقبة ستعيد نفس المجموعة الفرعية من السجلات المحتملة.

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