Siapa yang sebenarnya "berulang" dalam pencarian DNS rekursif?

16

Saya mencoba memahami perbedaan antara pencarian DNS berulang dan berulang. Pada dasarnya, saya menganggap iteratif seperti memanggil department store untuk mencari produk, dan ketika mereka tidak memilikinya, mereka memberi Anda nomor cabang lain yang akan dihubungi dan kemudian Anda menelepon cabang lainnya sendiri. Versus rekursif, yang seperti menelepon department store, dan ketika mereka tidak memiliki apa yang Anda cari, mereka memanggil cabang lain atas nama Anda mencari produk. Masalahnya, saya mendapatkan pandangan yang bertentangan tentang ini ketika datang ke DNS. Ketika saya memikirkan rekursif, saya memikirkan sesuatu yang terlihat seperti ini: teks alternatif

Tetapi ketika membaca artikel di web, dan bahkan melakukan pencarian gambar Google untuk DNS rekursif , saya melihat jauh lebih banyak contoh yang terlihat seperti ini: teks alternatif

Bagi saya, contoh kedua ini terlihat lebih iteratif daripada rekursif, karena masing-masing "server DNS lain" memberi tahu "server DNS pilihan" alamat mesin berikutnya untuk dicari, daripada mencarinya atas nama yang disukai Server DNS. Satu-satunya elemen rekursif yang saya lihat adalah bahwa server DNS pilihan melakukan pencarian atas nama klien DNS, tetapi mulai sekarang, itu terlihat berulang-ulang.

Jadi saya kira pertanyaan saya adalah, apakah pencarian DNS "rekursif" benar-benar hanya berarti rekursif dalam arti server DNS yang disukai melakukan sesuatu atas nama klien, tetapi benar-benar iteratif sejak saat ini? Mayoritas hasil yang saya lihat dalam pencarian gambar Google membuat saya percaya ini, yang kemudian menimbulkan pertanyaan, apakah gambar pertama dalam posting ini benar-benar salah?

Bryce Thomas
sumber
Lihatlah podcast Ask Mr DNS, menghibur, informatif, dan mereka telah mengelola DNS sejak 1989, menulis atau menulis bersama setiap buku DNS O'Reily, dll. Ask-mrdns.com Pelajari lebih banyak daripada yang ingin Anda ketahui.
Ronald Pottol

Jawaban:

16

Paragraf terakhir Anda benar.

Bendera "Recursion Desired" (RD) yang dikirim oleh klien di header permintaan DNS (lihat RFC 1035) meminta server "tolong beri saya jawaban lengkap untuk pertanyaan ini".

Server itu daripada yang berulang meminta rantai nama server untuk jawaban yang benar. Pertanyaan-pertanyaan itu seharusnya tidak memiliki set bit RD.

Pada akhirnya respons server rekursif akan memiliki set flag "Recursion Available" (RA), yang menunjukkan bahwa jawabannya memang sepenuhnya dijawab. Sebaliknya server yang otoritatif tidak akan mengatur tanda RA.

IMHO, ini pilihan terminologi yang buruk.

Untuk apa nilainya, diagram pertama yang Anda temukan pada dasarnya salah. Root server tidak melakukan query ke server lain, mereka hanya mengeluarkan referensi ke server lain.

Alnitak
sumber
4

Sejauh yang saya mengerti, "pencarian rekursif" semata-mata dari pandangan querier asli. Jadi, jika ia meminta server DNS dan mendapatkan jawaban yang sepenuhnya teratasi, maka itu adalah "permintaan rekursif". Jika server itu pada gilirannya melakukan pencarian rekursif atau berulang, yah, bukan sesuatu yang harus diperhatikan oleh si querier asli.

Vatine
sumber
1

Yang pertama dari dua diagram dalam pertanyaan Anda salah. Root server tidak mengirim permintaan ke server lain. Jika root server benar-benar meneruskan permintaan seperti yang ditunjukkan pada diagram itu, sistem DNS akan jauh lebih rentan terhadap serangan DoS daripada yang sebenarnya.

Diagram kedua sebagian besar benar tetapi terlalu sederhana untuk menunjukkan kepada Anda sifat rekursif pencarian. Diagram ini masih cukup rinci meskipun kita dapat menunjukkan di mana rekursi terjadi.

Server DNS di sebelah nomor 12yang dilambangkan Preferred DNS serveradalah tempat rekursi terjadi. Istilah Server DNS yang dipilih bukan terminologi standar. Server itu biasanya disebut cursor DNS recursor atau singkatan dari itu.

Ketika melihat lalu lintas jaringan itu memang terlihat berulang. Rekursi sepenuhnya internal ke kursor DNS. Jika Anda melihat implementasi dari DNS recursor Anda akan menemukan beberapa struktur rekursif dalam bagaimana permintaan ditangani.

Rekursi mungkin mudah dikenali jika implementasi menggunakan utas per permintaan dan pencarian diimplementasikan menggunakan panggilan fungsi rekursif. Tetapi desain yang lebih efisien tidak menggunakan utas per permintaan dan rekursi itu justru ditemukan di dalam struktur data yang digunakan oleh kursor DNS.

Alasan rekursi diperlukan adalah karena bagaimana referensi antara server DNS otoritatif diimplementasikan. Ini paling baik diilustrasikan dengan sebuah contoh. Dalam diagram Anda melihat server DNS otoritatif untuk microsoft.comtitik ke server DNS otoritatif untuk example.microsoft.com. Ini dilakukan dengan menggunakan NScatatan yang menunjuk ke nama host. Jadi misalnya server otoritatif untuk microsoft.combisa memberi tahu DNS recursor yang ms.example.netotoritatif untuk example.microsoft.com.

Pada saat itu DNS recursor harus menyelesaikannya ms.example.netsebelum dapat melanjutkan dengan resolusi example.microsoft.com.

Untuk menyelesaikan satu nama host, yang pertama harus menyelesaikan nama host yang berbeda. Itu adalah rekursi. Agar hal ini tidak menyebabkan rekursi tak terbatas, DNS memiliki catatan lem yang dikirim bersama dengan NScatatan dalam kasus-kasus tertentu.

kasperd
sumber
Ada banyak kesalahan dalam hal ini. Penggunaan istilah "rekursi" tidak ada hubungannya dengan apakah "panggilan fungsi rekursif" digunakan - jawaban Vatine lebih dekat - rekursi hanyalah nama (yang dipilih dengan buruk) ketika klien meminta server untuk jawaban yang lengkap dan diselesaikan . Mekanisme yang digunakan oleh apa yang disebut "server rekursif" sebenarnya disebut iterasi . Juga, rekam catatan dan bukan untuk mencegah "rekursi tak terbatas" - mereka ada di sana untuk mencegah masalah "ayam dan telur" tentang bagaimana Anda menemukan alamat server nama jika server tersebut berada dalam ruang domain yang didelegasikan .
Alnitak
@Alnitak Resolusi DNS pada dasarnya bersifat rekursif. Algoritma rekursif apa pun dapat diubah menjadi sesuatu yang berulang dengan mengubah tumpukan eksekusi menjadi struktur data yang berbeda. Kemungkinan itu sudah disebutkan dalam jawaban saya. Dan masalah ketergantungan siklik yang Anda sebutkan bukanlah sesuatu yang berbeda dari rekursi tak terbatas. Keduanya benar-benar sama. Jika Anda menerapkan algoritma rekursif naif tanpa memperhatikan bahwa tugas yang mendasari menderita ketergantungan siklik, hasilnya akan menjadi rekursi tak terbatas.
kasperd
@Alnitak Anda tidak dapat menyingkirkan tumpukan rekursi dan melakukan resolusi DNS secara iteratif hanya melacak sejumlah nama DNS yang konstan pada suatu waktu. Anda dapat mewakili tumpukan rekursi dengan struktur data yang tampak berbeda, tetapi tetap bersifat rekursif. Dimungkinkan untuk mengkonfigurasi nama domain dengan cara yang akan menjaga kedalaman rekursi menjadi hanya satu. Tetapi tidak semua nama domain dikonfigurasi dengan cara itu.
kasperd
Saya mengutip RFC 1034 - "" Dua pendekatan umum untuk menangani masalah ini adalah "rekursif", di mana server pertama mengejar permintaan untuk klien di server lain, dan "berulang", di mana server merujuk klien ke yang lain server dan memungkinkan klien mengejar kueri . "" Ini tidak ada hubungannya dengan "tumpukan" atau "struktur data".
Alnitak
@Alnitak Paragraf itu merujuk pada jenis rekursi yang berbeda dari jawaban saya. Rekursi yang disebutkan dalam jawaban saya adalah (sebagaimana dinyatakan dengan jelas dalam jawaban saya) internal ke satu server DNS tertentu. Jika Anda benar-benar mencoba menerapkan rekursi DNS dengan cara yang sepenuhnya iteratif, itu tidak akan pernah berhasil. Segera setelah Anda mendapatkan balasan dengan catatan NS tanpa lem yang terkait, Anda harus mencari alamat IP dari nama host yang ditunjukkan oleh catatan NS sebelum Anda dapat melanjutkan dengan resolusi asli.
kasperd