Saya mencoba memahami protokol lapisan aplikasi dalam tumpukan TCP / IP. Saya tahu bahwa protokol HTTP dan DNS tetap berada di lapisan atas (Lapisan Aplikasi). Jadi, ketika browser ingin mengakses sumber daya, ia harus mengirim permintaan ke server HTTP, seperti misalnya:
GET www.pippo.it/hello.htm HTTP/1.1
Membuat permintaan ini mengikuti aturan protokol HTTP, ia menggunakan URL halaman, bukan alamat IP.
Saya tahu bahwa permintaan DNS diperlukan untuk mengonversi URL ke IP. Jadi pertanyaan saya adalah: apakah HTTP memohon protokol DNS? Sepertinya tidak mungkin bagi saya, karena keduanya adalah protokol lapisan atas (sehingga DNS tidak dapat menyediakan layanan untuk HTTP). Dengan cara yang sama bahkan TCP (yang tetap pada level yang lebih rendah) tidak dapat meminta layanan pada protokol tingkat yang lebih tinggi seperti DNS.
Jadi kapan permintaan DNS terjadi? Dan siapa yang melakukan permintaan seperti itu?
sumber
Jawaban:
Permintaan HTTP yang dipermasalahkan sebenarnya tidak valid kecuali browser sedang berbicara dengan perantara (proxy).
Contoh Anda akan terlihat sedikit lebih seperti berikut ini jika browser berbicara dengan server web secara langsung:
Sekarang, untuk menempatkan ini dalam perspektif, pertimbangkan model OSI:
Kami memiliki 3 sistem dalam aksi:
Protokol yang terlibat adalah, dari bawah ke atas (set relevan minimum untuk OP):
Komunikasi HTTP dilakukan melalui protokol TCP (TCP ada di atas protokol IP) sementara komunikasi DNS, dalam hal ini, dilakukan melalui protokol UDP (UDP juga di atas protokol IP).
Berikut ini urutan komunikasi singkatnya:
The klien , menjalankan browser, meminta DNS server untuk
A
rekorwww.pippo.it
, menggunakan protokol UDP.1.1. Pada klien, ini adalah sistem operasi yang melakukan bagian penyelesaian dan berbicara kembali ke browser --- browser tidak pernah berbicara ke server DNS secara langsung, melainkan melalui OS dengan memanggil gethostbyname () atau getaddrinfo yang lebih baru () . Pada Windows, urutan di mana OS menyelesaikan alamat kemungkinan ditentukan oleh sesuatu seperti ini , sedangkan di Linux prioritas penyelesaian ditentukan oleh
/etc/nsswitch.conf
The DNS Server , menggunakan protokol UDP, merespon dengan klien dengan catatan alamat / IP, jika ada
The client membuka koneksi TCP pada port 80 dari server web dan menulis teks berikut:
Permintaan HTTP:
Anda bisa meniru hal yang sama dengan melakukan sesuatu seperti ini di konsol atau command prompt Anda:
diikuti oleh dua baris kosong. Jika konten yang diminta ada, server web akan mencetaknya di layar. Jika ada browser di sisi lain, teks respons akan diuraikan oleh browser, dan semua tag, tautan, skrip, dan gambar disajikan dalam apa yang kita sebut halaman web.
Pada kenyataannya ada beberapa perincian lebih lanjut, misalnya browser dapat menyimpan alamat IP jika Anda sudah mengunjungi beberapa domain, sehingga penyelesaian DNS menjadi tidak perlu. Juga, browser modern dapat mencoba untuk menyelesaikan sebelum Anda benar-benar membutuhkannya ( DNS prefetching ) untuk mempercepat penelusuran Anda.
Selain itu, komputer Anda mungkin memiliki catatan statis dalam
hosts
file. Jika catatan cocok dengan permintaan, entri statis lokal akan digunakan terlebih dahulu dan tidak ada server DNS yang pernah dihubungi. Ini dapat dikonfigurasi, dan belum tentu benar, tetapi ini adalah default pada sistem operasi yang saya kenal.sumber
GET http://www.pippo.it/hello.htm HTTP/1.1
akan menjadi permintaan yang valid, jika tidak biasa. Itu juga akan menjadi permintaan yang valid dan biasa ke proxy HTTP.gethostbyname()
agak ketinggalan jaman. Satu akan lebih baik menggunakangetaddrinfo()
...HTTP diangkut melalui TCP, yang merupakan protokol IP. Untuk membuat permintaan HTTP, browser harus membuka koneksi TCP, dan lakukan untuk itu, diperlukan alamat IP tujuan (yaitu alamat IP server). Untuk mengatasi nama host server, ia harus mengeluarkan permintaan DNS (umumnya permintaan DNS itu sendiri dikirim oleh sistem operasi ketika suatu program memanggil fungsi resolusi namanya; namun, tidak ada yang mencegah program mengirim permintaan DNS dengan sendirinya ke DNS server). Setelah koneksi dibuat, ia dapat mengirim permintaan HTTP-nya, yang berisi lintasan ke sumber daya yang diminta, dan bidang Host dengan nama host server (misalnya,
Host: www.pippo.it
). Nama host tidak masuk pada baris permintaan (itu sebenarnya akan menjadiGET /hello.htm HTTP/1.1
), kecuali ketika permintaan dikirim ke proxy HTTP (dan dalam hal ini, URL lengkap hadir, termasuk bagian protokol, misalnyaGET http://www.pippo.it/hello.htm HTTP/1.1
),sumber
Prosedurnya seperti ini:
http://www.pippo.it/hello.htm
Browser membagi itu menjadi tiga bagian:
http
www.pippo.it
/hello.htm
(URL yang lebih rumit dapat memiliki bagian lain juga, saya akan mengabaikan kemungkinan itu untuk saat ini)
Browser tahu bahwa untuk membuat koneksi IP, diperlukan alamat IP. Untuk mendapatkan alamat IP, perlu menggunakan DNS (kecuali jika alamatnya di-cache).
8.8.8.8
.Browser membangun koneksi berlapis-lapis berikut:
8.8.8.8
A
catatan untuk nama hostwww.pippo.it
Tentu saja saya menghilangkan banyak detail tentang misalnya format persis paket yang terlibat.
www.pippo.it
, katakanlah itu10.11.12.13
http
di tabel internal dan mengetahui bahwa ia harus menggunakan port 80.Browser membangun koneksi berlapis-lapis berikut:
10.11.12.13
Lapisan HTTP: buat permintaan HTTP untuk URL
/hello.htm
pada hostwww.pippo.it
(karena komputer di10.11.12.13
mungkin hosting beberapa domain, jadi perlu tahu yang mana yang diinginkan)Tentu saja saya menghilangkan semua detail dari jabat tangan TCP dan semacamnya.
hello.htm
Dan untuk ukuran yang baik, saya akan menyebutkan bahwa browser sekarang memeriksa konten dari tanggapan itu, dan mengidentifikasi sumber daya tambahan yang diperlukan: gambar, CSS, Javascript, dll. Kemudian mengulangi seluruh proses ini untuk setiap sumber daya tersebut.
sumber
getaddrinfo
ataugethostbyname
untuk meminta OS untuk menyelesaikan alamatnya. Juga, OS biasanya menggunakan beberapa mekanisme untuk mencoba mencari nama, tidak hanya DNS. (Biasanya setidaknya file hosts sebagai tambahan untuk DNS.)