HTTP GET yöntemi, DNS protokolüyle ilişkili olarak nasıl çalışır?


18

TCP / IP yığınındaki uygulama katmanı protokollerini anlamaya çalışıyorum. Hem HTTP hem de DNS protokolünün üst katmanda kaldığını biliyorum (Uygulama Katmanı). Dolayısıyla, bir tarayıcı bir kaynağa erişmek istediğinde, örneğin HTTP sunucusuna bir istek göndermesi gerekir:

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

HTTP protokolü kurallarına uygun olarak bu istekte bulunurken IP adresini değil sayfa URL'sini kullanır.

URL'yi IP'ye dönüştürmek için DNS isteğinin gerekli olduğunu biliyorum. Benim sorum şu: HTTP DNS protokolünü çağırıyor mu? Benim için imkansız görünüyor, çünkü her ikisi de üst katman protokolleri (DNS, HTTP'ye bir hizmet sağlayamıyor). Aynı şekilde, TCP (daha düşük bir seviyede kalır) bile DNS gibi daha yüksek bir protokolde hizmet isteyemez.

Peki DNS talebi ne zaman olur? Ve kim böyle bir talepte bulunur?


1
Bunlardan hangisinin soruyu cevapladığını açıklığa kavuşturmak için cevaplardan birini kabul edebilir misiniz?
030

Yanıtlar:


38

Tarayıcı bir aracıyla (proxy) konuşmadığı sürece söz konusu HTTP isteği aslında geçerli değildir.

Tarayıcı doğrudan bir web sunucusuyla konuşuyorsa örneğiniz biraz daha aşağıdaki gibi görünecektir:

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

Şimdi, bunu perspektife koymak için OSI modelini düşünün:

OSI modeli

Hareket halinde 3 sistemimiz var:

  • Tarayıcıyı çalıştıran bir istemci
  • Siteye hizmet veren bir web sunucusu
  • Sitenin IP adresini bilen bir DNS sunucusu

İlgili protokoller aşağıdan yukarıya (minimum ilgili OP'ye ayarlanmıştır):

  • IP
  • TCP, UDP
  • HTTP, DNS

HTTP iletişimi TCP protokolü üzerinden yapılır (TCP IP protokolünün üstündedir), bu durumda DNS iletişimi UDP protokolü üzerinden yapılır (UDP ayrıca IP protokolünün üstündedir).

Kısaca iletişim sırası:

  1. İstemci , tarayıcısını çalıştıran, sorar DNS sunucusunu bir için Aiçin rekor www.pippo.itUDP protokolünü kullanarak,.

    1.1. İstemcide, çözümleme kısmını yapan ve tarayıcıyla tekrar konuşan işletim sistemidir --- tarayıcı, gethostbyname () veya daha yeni getaddrinfo () yöntemini çağırarak işletim sistemi aracılığıyla hiçbir zaman doğrudan DNS sunucusuyla konuşmaz . Windows'ta, OS adreslerini giderir sırası olasılıkla gibi bir şey ile tanımlanır bu Linux üzerinde çözme önceliği ile tanımlanır iken,/etc/nsswitch.conf

  2. DNS sunucusu için, cevap vermekte UDP protokolünü kullanarak, istemci varsa, bir kayıt / IP adresiyle

  3. İstemci limanında 80 TCP bağlantısı açar web sunucusu ve aşağıdaki metni yazar:

    HTTP isteği:

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

    Konsolunuzda veya komut isteminizde böyle bir şey yaparak aynı şeyi taklit edebilirsiniz:

    > 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
    

    ardından iki boş satır. İstenen içerik varsa, web sunucusu bunu ekranda yazdırır. Diğer tarafta bir tarayıcı varsa, yanıt metni tarayıcı tarafından ayrıştırılır ve tüm etiketler, bağlantılar, komut dosyaları ve resimler web sayfası dediğimiz şeyde oluşturulur.

Gerçekte bazı ayrıntılar daha vardır, örneğin tarayıcılar zaten bir etki alanını ziyaret ettiyseniz IP adreslerini önbelleğe alabilir, böylece DNS çözümlemesi gereksiz hale gelir. Ayrıca, modern tarayıcılar, tarama işleminizi hızlandırmak için gerçekten ihtiyacınız olmadan ( DNS önceden getirme ) çözümlemeyi yapmaya çalışabilir .

Ayrıca, bilgisayarınızda bir hostsdosyada statik kayıtlar olabilir . Bir kayıt istekle eşleşirse, önce yerel statik giriş kullanılır ve hiçbir DNS sunucusuyla bağlantı kurulmaz. Bu yapılandırılabilir ve her zaman doğru olmayabilir, ancak aşina olduğum işletim sistemlerinde varsayılan değerdir.


4
@trikly: 'Ana Bilgisayar' başlığı bunun içindir. Bu olmadan her IP adresi için yalnızca bir web siteniz olabilir. Bu, HTTP / 1.0 ve HTTP / 1.1 arasındaki önemli bir farktır. Neyse ki HTTP / 1.0 tarayıcıları nadirdir - ancak bunlara hitap etmek istiyorsanız, her site için farklı bir IP adresine ihtiyacınız vardır (yine de aynı sunucuda barındırılabilirler).
AE

1
@AE Teşekkürler. Sanırım sorumu belirsiz buldum ve bu yüzden Hrvoje ne dediğimi anlamadı. (URL yerine alan adı söylemeliydim). Hala anladığına sevindim.
trlkly

1
" Bu doğru HTTP isteği değil " diyorsunuz ve bu çoğunlukla doğru, ancak ima ettiğinizden daha yakın: " HTTP'nin gelecekteki sürümlerindeki tüm isteklerde absoluteURI'lara geçişe izin vermek için, tüm HTTP / 1.1 sunucuları istekleri ". (RFC 2616 §5.1.2) Bu GET http://www.pippo.it/hello.htm HTTP/1.1, olağandışı bir durum olduğunda geçerli bir talep olacaktır. Ayrıca bir HTTP proxy'sine geçerli ve olağan bir istek de olur.
wfaulk

1
gethostbyname()biraz modası geçmiş. Bir daha iyi kullanmak getaddrinfo()...
glglgl

1
@Unku maalesef hayır çünkü SSH diğer ucun SSH protokolünü konuştuğunu varsayar, telnet düz metin protokolüdür ve SSL / TLS kullanmadığı sürece POP3, IMAP gibi diğer düz protokollerle konuşmak için kullanılabilir. telnet oturumunu sslwrap veya benzeri bir yardımcıyla sarmanız gerekir.
Hrvoje Špoljar

12

HTTP, bir IP protokolü olan TCP üzerinden taşınır. Bir HTTP isteği yapmak için tarayıcının bir TCP bağlantısı açması ve bunu yapması için hedef IP adresine (yani sunucunun IP adresi) ihtiyacı vardır. To çözmek sunucunun ana bilgisayar adını, bir DNS isteği (genellikle DNS bir program adından da çözünürlük işlevlerini çağırdığında kendisi işletim sistemi tarafından gönderilen talep sorunu böylece vardır, ancak hiçbir şey önler DNS kendiliğinden DNS isteklerini göndermesini bir program sunucu). Bağlantı kurulduktan sonra, istenen kaynağın yolunu içeren HTTP isteğini ve sunucunun ana bilgisayar adını içeren bir Ana Bilgisayar alanını (ör Host: www.pippo.it.) Gönderebilir . Hostname yok değil istek hattı üzerinde gitmek (aslında olacağınıGET /hello.htm HTTP/1.1), isteğin bir HTTP proxy'sine gönderilmesi haricinde (ve bu durumda, örneğin protokol bölümü dahil olmak üzere tam URL mevcuttur GET http://www.pippo.it/hello.htm HTTP/1.1),


Teşekkürler, şimdi daha net, ama tamamen değil. Tarayıcının bir DNS isteği yayınlaması gerektiğini yazıyorsunuz. Tamam, ancak IP'yi DNS sunucusundan aldıktan sonra nasıl kullanıyor? Yani, böyle bir IP HTTP isteğinde görünmüyor. Bu yüzden HTTP isteğini vermeden önce bir adım daha var ve bağlantının açılması olduğunu düşünüyorum. Bu nokta bana çok açık değil ... Bir kez daha teşekkürler!
Giancarlo Perlo

5
Aslında, IP'nin HTTP isteğinin aktarıldığı TCP bağlantısını açmak için gereklidir. Aslında, hem istemcinin hem de sunucunun IP adresi, bağlantının TÜM paketleriyle birlikte gönderilir. Bunun nasıl çalıştığını öğrenmenin en iyi yolu muhtemelen bir paket yakalama aracı yüklemek (Wireshark mükemmel bir çoklu platform ve açık kaynaklı bir araçtır), basit bir HTTP isteği yakalamak, ağ etkinliğinin geri kalanından filtrelemek ve tüm paketler tel üzerinden gönderildi. TCP bağlantısından önce de DNS isteğini görebilmeniz gerekir.
Ale

1
Yakınlaştırılmış istekler, tam URL'yi GET satırına yerleştirmek yerine Ana Bilgisayar üstbilgisini kullanıyor olmalıdır.
OrangeDog

1
@OrangeDog: Hayır, tam tersine. RFC 7230 (bölüm 5.3.2) açıkça bir proxy isteğinde bulunan bir istemcinin istek satırında mutlak bir URI kullanması GEREKİR. ( Yine de istek satırından bilgileri kopyalayan bir Ana Bilgisayar başlığı olmalıdır ; bölüm 5.4).
hmakholm Monica

8

Prosedür şu şekildedir:

  1. Kullanıcı (siz) tarayıcıya aşağıdaki gibi bir URL verir: http://www.pippo.it/hello.htm
  2. Tarayıcı bunu üç parçaya ayırır:

    • Protokol http
    • Hostadı www.pippo.it
    • URL yolu /hello.htm

    (daha karmaşık bir URL'nin başka bölümleri de olabilir, şimdilik bu olasılığı görmezden geleceğim)

  3. Tarayıcı bir IP bağlantısı oluşturmak için bir IP adresine ihtiyaç duyduğunu bilir. Bir IP adresi almak için DNS kullanması gerekir (adresi önbelleğe alınmadıkça).

    1. Tarayıcı işletim sisteminden bir DNS sunucusunun IP adresini ister; varsayalım 8.8.8.8.
    2. Tarayıcı aşağıdaki çok katmanlı bağlantıyı oluşturur:

      • IP katmanı: bağlan 8.8.8.8
      • UDP katmanı: hedef bağlantı noktası 53 için paket ayarla
      • DNS katmanı: Aana bilgisayar adı için bir kayıt için bir DNS isteği oluşturwww.pippo.it

      Tabii ki, örneğin ilgili paketlerin tam biçimi hakkında birçok ayrıntıyı atlıyorum.

    3. Tarayıcı, IP adresini veren bir DNS yanıtı alır (IP'nin üstünde katmanlı UDP'nin üstünde vb.) www.pippo.it, Diyelim ki10.11.12.13
  4. Tarayıcı, bir TCP bağlantısı oluşturmak için bir bağlantı noktası numarasına ihtiyaç duyduğunu bilir. Bir bağlantı noktası numarası elde etmek için http, iç tablosundaki protokolü arar ve 80 numaralı bağlantı noktasını kullanması gerektiğini öğrenir.
  5. Tarayıcı aşağıdaki çok katmanlı bağlantıyı oluşturur:

    • IP katmanı: bağlan 10.11.12.13
    • TCP katmanı: paketleri hedef bağlantı noktası 80'e ayarla
    • HTTP katmanı: /hello.htmana bilgisayardaki URL için bir HTTP isteği oluşturun www.pippo.it(çünkü adresindeki bilgisayar 10.11.12.13birkaç alan barındırıyor olabilir, bu nedenle hangisinin istendiğini bilmesi gerekir)

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

    Tabii ki TCP el sıkışma ve bunun gibi tüm ayrıntıları atlıyorum.

  6. Tarayıcı, içeriğinin içeriğini içeren bir HTTP yanıtı (IP'nin üstüne katmanlı vb. Üzerine katmanlı) alır. hello.htm

Ve iyi bir ölçü için, tarayıcının şimdi bu yanıtın içeriğini incelediğini ve gerekli ek kaynakları tanımladığını söyleyeceğim: görüntüler, CSS, Javascript, vb. Sonra bu tür her kaynak için bu işlemi tekrarlar.


4
3. Adım gerçekten uygulamanın kendisinin yaptığı bir şey değildir. Uygulama , işletim sisteminden adresi çözmesini istemek getaddrinfoveya gethostbynameistemek gibi bir şey kullanır . Ayrıca, işletim sistemi, yalnızca DNS'yi değil, adları aramak için genellikle birden çok mekanizma kullanır. (Genellikle DNS'ye ek olarak en azından anasistemler dosyası.)
Håkan Lindqvist

Teşekkürler! Gerçekten etkileyici ve ayrıntılı bir cevap ve çok kullanışlı!
Giancarlo Perlo

Bu en iyi cevap.
Xin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.