Bagaimana cara kerja metode HTTP GET dalam kaitannya dengan protokol DNS?

17

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?

Giancarlo Perlo
sumber
1
Bisakah Anda menerima salah satu jawaban untuk mengklarifikasi jawaban mana dari pertanyaan ini?
030

Jawaban:

38

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:

GET /hello.htm HTTP/1.1
Host: www.pippo.it

Sekarang, untuk menempatkan ini dalam perspektif, pertimbangkan model OSI:

Model OSI

Kami memiliki 3 sistem dalam aksi:

  • Seorang klien yang menjalankan browser
  • Sebuah web server yang melayani situs
  • Sebuah DNS server mengetahui alamat IP dari situs

Protokol yang terlibat adalah, dari bawah ke atas (set relevan minimum untuk OP):

  • AKU P
  • TCP, UDP
  • HTTP, DNS

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:

  1. The klien , menjalankan browser, meminta DNS server untuk Arekor www.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

  2. The DNS Server , menggunakan protokol UDP, merespon dengan klien dengan catatan alamat / IP, jika ada

  3. The client membuka koneksi TCP pada port 80 dari server web dan menulis teks berikut:

    Permintaan HTTP:

    GET /hello.htm HTTP/1.1
    Host: www.pippo.it
    

    Anda bisa meniru hal yang sama dengan melakukan sesuatu seperti ini di konsol atau command prompt Anda:

    > telnet www.pippo.it 80
    Trying 195.128.235.49...
    Connected to www.pippo.it.
    Escape character is '^]'.
    GET /hello.htm HTTP/1.1
    Host: www.pippo.it
    

    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 hostsfile. 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.

Hrvoje Špoljar
sumber
4
@trikly: itulah gunanya tajuk 'Host'. Tanpanya, Anda hanya dapat memiliki satu situs web per alamat IP. Ini adalah perbedaan utama antara HTTP / 1.0 dan HTTP / 1.1. Untungnya, browser HTTP / 1.0 sudah langka sekarang - tetapi jika Anda ingin melayani mereka, maka Anda memerlukan alamat IP yang berbeda untuk setiap situs (mereka masih dapat di-host di server yang sama).
AE
1
@ A, terima kasih. Saya pikir saya tidak jelas dalam pertanyaan saya, dan itulah sebabnya Hrvoje tidak mengerti apa yang saya katakan. (Saya seharusnya mengatakan domain daripada URL). Aku senang kamu masih mengerti.
trlkly
1
Anda mengatakan " Ini bukan permintaan HTTP yang benar ", dan itu sebagian besar benar, tetapi lebih dekat dari yang Anda maksudkan: " Untuk memungkinkan transisi ke absoluteURIs dalam semua permintaan di versi HTTP mendatang, semua server HTTP / 1.1 HARUS menerima formulir absoluteURI di permintaan ". (RFC 2616 §5.1.2) Jadi, itu GET http://www.pippo.it/hello.htm HTTP/1.1akan menjadi permintaan yang valid, jika tidak biasa. Itu juga akan menjadi permintaan yang valid dan biasa ke proxy HTTP.
wfaulk
1
gethostbyname()agak ketinggalan jaman. Satu akan lebih baik menggunakan getaddrinfo()...
glglgl
1
@Utku sayangnya tidak ada karena SSH menganggap ujung yang lain berbicara protokol SSH sementara telnet adalah protokol teks biasa dan dapat digunakan untuk berbicara dengan protokol biasa lainnya seperti katakanlah POP3, IMAP selama mereka tidak menggunakan SSL / TLS dalam hal ini Anda perlu membungkus sesi telnet dengan pembantu seperti sslwrap atau yang serupa.
Hrvoje Špoljar
12

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, misalnya GET http://www.pippo.it/hello.htm HTTP/1.1),

Ale
sumber
Terima kasih, sekarang lebih jelas, tetapi tidak sepenuhnya. Anda menulis bahwa browser harus mengeluarkan permintaan DNS. Oke, tetapi setelah menerima IP dari server DNS, bagaimana cara menggunakannya? Maksudku, IP seperti itu tidak muncul dalam permintaan HTTP. Jadi saya berasumsi masih ada satu langkah lagi sebelum mengeluarkan permintaan HTTP dan saya pikir itu adalah pembukaan koneksi. Poin ini tidak begitu jelas bagi saya ... Terima kasih sekali lagi!
Giancarlo Perlo
5
Memang, IP diperlukan untuk membuka koneksi TCP, di mana permintaan HTTP diangkut. Sebenarnya, alamat IP klien dan server dikirim bersama dengan SEMUA paket koneksi. Cara terbaik untuk mempelajari bagaimana ini bekerja mungkin adalah menginstal alat penangkapan paket (Wireshark adalah multi-platform yang sangat baik dan open source), menangkap permintaan HTTP sederhana, menyaringnya dari sisa aktivitas jaringan, dan melihat bagaimana semua paket dikirim melalui kabel. Anda sebenarnya harus dapat melihat permintaan DNS sebelum koneksi TCP juga.
Ale
1
Permintaan yang diproksi harus menggunakan header Host, bukan menempatkan URL lengkap di baris GET.
OrangeDog
1
@OrangeDog: Tidak, sebaliknya. RFC 7230 (bagian 5.3.2) secara eksplisit mengatakan bahwa klien yang membuat permintaan ke proxy HARUS menggunakan absolut-URI di baris permintaan. (Harus masih menjadi Host header menduplikasi informasi dari garis permintaan; bagian 5.4).
hmakholm tersisa Monica
7

Prosedurnya seperti ini:

  1. Pengguna (Anda) memberi browser URL, seperti http://www.pippo.it/hello.htm
  2. Browser membagi itu menjadi tiga bagian:

    • Protokol http
    • Nama host www.pippo.it
    • Jalur URL /hello.htm

    (URL yang lebih rumit dapat memiliki bagian lain juga, saya akan mengabaikan kemungkinan itu untuk saat ini)

  3. Browser tahu bahwa untuk membuat koneksi IP, diperlukan alamat IP. Untuk mendapatkan alamat IP, perlu menggunakan DNS (kecuali jika alamatnya di-cache).

    1. Browser meminta sistem operasi untuk alamat IP dari server DNS; anggaplah itu didapat 8.8.8.8.
    2. Browser membangun koneksi berlapis-lapis berikut:

      • Lapisan IP: terhubung ke 8.8.8.8
      • Lapisan UDP: setel paket untuk port tujuan 53
      • Lapisan DNS: buat permintaan DNS untuk Acatatan untuk nama hostwww.pippo.it

      Tentu saja saya menghilangkan banyak detail tentang misalnya format persis paket yang terlibat.

    3. Browser menerima respons DNS (berlapis di atas UDP berlapis di atas IP dll.) Yang memberikan alamat IP untuk www.pippo.it, katakanlah itu10.11.12.13
  4. Browser tahu bahwa untuk membuat koneksi TCP, diperlukan nomor port. Untuk mendapatkan nomor port, ia mencari protokol httpdi tabel internal dan mengetahui bahwa ia harus menggunakan port 80.
  5. Browser membangun koneksi berlapis-lapis berikut:

    • Lapisan IP: terhubung ke 10.11.12.13
    • Lapisan TCP: mengatur paket ke port tujuan 80
    • Lapisan HTTP: buat permintaan HTTP untuk URL /hello.htmpada host www.pippo.it(karena komputer di 10.11.12.13mungkin hosting beberapa domain, jadi perlu tahu yang mana yang diinginkan)

      GET /hello.htm HTTP/1.1
      Host: www.pippo.it
      ...
      

    Tentu saja saya menghilangkan semua detail dari jabat tangan TCP dan semacamnya.

  6. Browser menerima respons HTTP (berlapis di atas TCP yang berlapis di atas IP dll.) Yang berisi konten 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.

David Z
sumber
4
Langkah 3 sebenarnya bukan sesuatu yang dilakukan oleh aplikasi itu sendiri. Aplikasi hanya menggunakan sesuatu seperti getaddrinfoatau gethostbynameuntuk 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.)
Håkan Lindqvist
Terima kasih! Ini adalah jawaban yang sangat mengesankan dan terperinci dan juga sangat berguna!
Giancarlo Perlo