วิธี HTTP GET ทำงานอย่างไรที่เกี่ยวข้องกับโปรโตคอล DNS


17

ฉันพยายามทำความเข้าใจโปรโตคอลของชั้นแอปพลิเคชันในสแต็ก TCP / IP ฉันรู้ว่าโปรโตคอล HTTP และ DNS ยังคงอยู่ที่ชั้นบนสุด (Application Layer) ดังนั้นเมื่อเบราว์เซอร์ต้องการเข้าถึงทรัพยากรก็จะต้องส่งคำขอไปยังเซิร์ฟเวอร์ HTTP เช่น:

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

การร้องขอนี้ทำตามกฎของโปรโตคอล HTTP นั้นจะใช้ URL ของหน้าไม่ใช่ที่อยู่ IP

ฉันรู้ว่าคำขอ DNS จำเป็นต้องแปลง URL เป็น IP ดังนั้นคำถามของฉันคือ: HTTP เรียกใช้โปรโตคอล DNS หรือไม่ ดูเหมือนว่าเป็นไปไม่ได้สำหรับฉันเนื่องจากทั้งสองเป็นโปรโตคอลระดับบนสุด (ดังนั้น DNS จึงไม่สามารถให้บริการกับ HTTP) ในทำนองเดียวกันแม้ TCP (ซึ่งอยู่ในระดับที่ต่ำกว่า) ไม่สามารถขอบริการที่โปรโตคอลระดับสูงกว่าเช่น DNS

ดังนั้นคำขอ DNS จะเกิดขึ้นเมื่อใด และใครเป็นผู้ดำเนินการตามคำขอ


1
คุณสามารถยอมรับคำตอบข้อใดข้อหนึ่งเพื่อชี้แจงว่าคำตอบใดจากคำถามเหล่านี้
030

คำตอบ:


38

คำขอ HTTP ที่เป็นปัญหานั้นไม่ถูกต้องเว้นแต่ว่าเบราว์เซอร์กำลังพูดถึงตัวกลาง (พร็อกซี)

ตัวอย่างของคุณจะมีลักษณะดังต่อไปนี้หากเบราว์เซอร์กำลังพูดคุยกับเว็บเซิร์ฟเวอร์โดยตรง:

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

ทีนี้เพื่อให้เข้าใจในมุมมองนี้ให้พิจารณาโมเดล OSI

รูปแบบ OSI

เรามี 3 ระบบในการดำเนินการ:

  • ลูกค้าเรียกใช้เบราว์เซอร์
  • เว็บเซิร์ฟเวอร์ที่ให้บริการเว็บไซต์
  • เซิร์ฟเวอร์ DNS ที่รู้ที่อยู่ IP ของเว็บไซต์

โปรโตคอลที่เกี่ยวข้องคือจากล่างขึ้นบน (ตั้งค่าขั้นต่ำที่เกี่ยวข้องเป็น OP):

  • IP
  • TCP, UDP
  • HTTP, DNS

การสื่อสาร HTTP นั้นทำผ่านโปรโตคอล TCP (TCP อยู่ด้านบนของโปรโตคอล IP) ในขณะที่การสื่อสาร DNS ในกรณีนี้จะทำผ่านโปรโตคอล UDP (UDP ยังอยู่ด้านบนของโปรโตคอล IP)

นี่คือลำดับการสื่อสารสั้น ๆ :

  1. ลูกค้าวิ่งเบราว์เซอร์ถามDNS เซิร์ฟเวอร์สำหรับAการบันทึกสำหรับwww.pippo.itใช้โปรโตคอล UDP

    1.1 กับลูกค้าที่เป็นระบบปฏิบัติการที่ไม่เป็นส่วนหนึ่งของการแก้ปัญหาและการเจรจากลับไปเบราว์เซอร์เบราว์เซอร์ --- ไม่เคยพูดถึงเซิร์ฟเวอร์ DNS โดยตรงแทนที่จะผ่านระบบปฏิบัติการโดยเรียกgethostbyname ()หรือใหม่กว่าgetaddrinfo () บน Windows ลำดับที่ระบบปฏิบัติการแก้ไขที่อยู่มีแนวโน้มที่จะถูกกำหนดโดยบางสิ่งเช่นนี้ในขณะที่บน Linux ลำดับความสำคัญในการแก้ไขจะถูกกำหนดโดย/etc/nsswitch.conf

  2. DNS เซิร์ฟเวอร์โดยใช้โปรโตคอล UDP, ตอบสนองต่อลูกค้าที่มีการบันทึก / ที่อยู่ IP ถ้ามันมีอยู่

  3. ลูกค้าเปิดการเชื่อมต่อ TCP พอร์ต 80 ของเว็บเซิร์ฟเวอร์และเขียนข้อความต่อไปนี้:

    คำขอ HTTP:

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

    คุณสามารถเลียนแบบสิ่งเดียวกันโดยทำสิ่งนี้ในคอนโซลหรือพร้อมท์คำสั่งของคุณ:

    > 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
    

    ตามด้วยสองบรรทัดว่าง หากมีเนื้อหาที่ร้องขอเว็บเซิร์ฟเวอร์จะพิมพ์ลงบนหน้าจอ หากมีเบราว์เซอร์อยู่อีกด้านหนึ่งข้อความตอบกลับจะถูกแยกวิเคราะห์โดยเบราว์เซอร์และแท็กลิงก์สคริปต์และรูปภาพทั้งหมดจะแสดงในสิ่งที่เราเรียกว่าหน้าเว็บ

ในความเป็นจริงมีรายละเอียดเพิ่มเติมบางอย่างเช่นเบราว์เซอร์อาจแคชที่อยู่ IP หากคุณเข้าชมบางโดเมนแล้วดังนั้นการแก้ไข DNS จึงไม่จำเป็น นอกจากนี้เบราว์เซอร์สมัยใหม่อาจพยายามแก้ไขปัญหาก่อนที่คุณต้องการ ( การดึงข้อมูล DNS ล่วงหน้า ) เพื่อเร่งความเร็วในการเรียกดูของคุณ

นอกจากนี้คอมพิวเตอร์ของคุณอาจมีระเบียนคงที่ในhostsไฟล์ หากบันทึกตรงกับคำขอรายการคงที่ภายในเครื่องจะถูกนำมาใช้ก่อนและจะไม่มีการติดต่อกับเซิร์ฟเวอร์ DNS นี่คือการกำหนดค่าและไม่จำเป็นต้องเป็นจริง แต่มันเป็นค่าเริ่มต้นในระบบปฏิบัติการที่ฉันคุ้นเคย


4
@trikly: นั่นคือสิ่งที่ส่วนหัว 'โฮสต์' มีไว้สำหรับ คุณสามารถมีเว็บไซต์ได้เพียงหนึ่งเว็บไซต์ต่อที่อยู่ IP หนึ่งแห่ง นี่คือข้อแตกต่างที่สำคัญระหว่าง HTTP / 1.0 และ HTTP / 1.1 โชคดีที่เบราว์เซอร์ HTTP / 1.0 นั้นหายากในตอนนี้ แต่ถ้าคุณต้องการรองรับพวกมันคุณต้องใช้ที่อยู่ IP ที่แตกต่างกันสำหรับแต่ละไซต์ (พวกเขายังสามารถโฮสต์บนเซิร์ฟเวอร์เดียวกันได้)
AE

1
@AE ขอบคุณ ฉันคิดว่าฉันไม่ชัดเจนในคำถามของฉันและนั่นเป็นเหตุผลที่ Hrvoje ไม่เข้าใจสิ่งที่ฉันพูด (ฉันควรจะพูดโดเมนมากกว่า URL) ฉันดีใจที่คุณยังคงเข้าใจ
trlkly

1
คุณพูดว่า " นี่ไม่ถูกต้องคำขอ HTTP " และส่วนใหญ่เป็นจริง แต่มันใกล้กว่าที่คุณบอกเป็นนัย: " เพื่ออนุญาตให้เปลี่ยนเป็นสัมบูรณ์ในคำขอทั้งหมดใน HTTP รุ่นในอนาคตเซิร์ฟเวอร์ HTTP / 1.1 ทั้งหมดต้องยอมรับฟอร์ม AbsolURI ใน คำขอ " (RFC 2616 §5.1.2) ดังนั้นGET http://www.pippo.it/hello.htm HTTP/1.1จะถูกต้องหากคำขอผิดปกติ มันจะเป็นคำขอที่ถูกต้องและปกติไปยังพร็อกซี HTTP
wfaulk

1
gethostbyname()ค่อนข้างล้าสมัย จะดีกว่าใช้getaddrinfo()...
glglgl

1
@Utku น่าเสียดายที่ไม่มีเพราะ SSH สันนิษฐานว่าอีกฝ่ายพูดโปรโตคอล SSH ในขณะที่ telnet เป็นโปรโตคอลข้อความธรรมดาและสามารถใช้พูดคุยกับโปรโตคอลธรรมดาอื่น ๆ เช่นพูด POP3, IMAP ตราบใดที่พวกเขาไม่ได้ใช้ SSL / TLS ในกรณีนี้คุณ จะต้องตัดเซสชัน telnet ด้วยผู้ช่วยเช่น sslwrap หรือสิ่งที่คล้ายกัน
Hrvoje Špoljar

12

HTTP ถูกส่งผ่าน TCP ซึ่งเป็นโปรโตคอล IP ในการสร้างคำขอ HTTP เบราว์เซอร์จะต้องเปิดการเชื่อมต่อ TCP และจำเป็นต้องใช้ที่อยู่ IP ปลายทาง (เช่นที่อยู่ IP ของเซิร์ฟเวอร์) เพื่อแก้ไขชื่อโฮสต์ของเซิร์ฟเวอร์จึงมีการออกคำขอ DNS (โดยทั่วไปแล้วคำขอ DNS จะถูกส่งโดยระบบปฏิบัติการเมื่อโปรแกรมเรียกใช้ฟังก์ชันการจำแนกชื่อ แต่ไม่มีสิ่งใดที่ป้องกันไม่ให้โปรแกรมส่งการร้องขอ DNS ไปยัง DNS เซิร์ฟเวอร์) เมื่อสร้างการเชื่อมต่อแล้วสามารถส่งคำขอ HTTP ซึ่งมีเส้นทางไปยังทรัพยากรที่ร้องขอและฟิลด์โฮสต์ที่มีชื่อโฮสต์ของเซิร์ฟเวอร์ (เช่นHost: www.pippo.it) ชื่อโฮสต์ไม่ได้อยู่ในบรรทัดคำขอ (จริง ๆ แล้วมันจะเป็นGET /hello.htm HTTP/1.1) ยกเว้นเมื่อคำขอถูกส่งไปยังพร็อกซี HTTP (และในกรณีนี้ URL แบบเต็มจะปรากฏขึ้นรวมถึงส่วนโปรโตคอลเช่นGET http://www.pippo.it/hello.htm HTTP/1.1)


ขอบคุณตอนนี้มันชัดเจนกว่า แต่ยังไม่สมบูรณ์ คุณเขียนเบราว์เซอร์นั้นต้องส่งคำขอ DNS ตกลง แต่หลังจากได้รับ IP จากเซิร์ฟเวอร์ DNS แล้วจะใช้งานอย่างไร ฉันหมายความว่า IP ดังกล่าวไม่ปรากฏในคำขอ HTTP ดังนั้นฉันคิดว่ายังมีอีกหนึ่งขั้นตอนก่อนที่จะออกคำขอ HTTP และฉันคิดว่ามันเป็นการเปิดการเชื่อมต่อ จุดนี้ไม่ชัดเจนสำหรับฉัน ... ขอบคุณอีกครั้ง!
Giancarlo Perlo

5
อันที่จริง IP นั้นจำเป็นต้องมีเพื่อเปิดการเชื่อมต่อ TCP ภายในซึ่งมีการส่งคำขอ HTTP จริงๆแล้วที่อยู่ IP ของทั้งลูกค้าและเซิร์ฟเวอร์จะถูกส่งไปพร้อมกับแพ็กเก็ตทั้งหมดของการเชื่อมต่อ วิธีที่ดีที่สุดในการเรียนรู้ว่างานนี้น่าจะติดตั้งเครื่องมือการจับแพ็คเก็ตหรือไม่ (Wireshark เป็นแพลตฟอร์มที่ยอดเยี่ยมหลายแพลตฟอร์มและโอเพ่นซอร์สหนึ่ง) จับการร้องขอ HTTP ที่ง่าย ๆ กรองออกจากกิจกรรมเครือข่ายที่เหลือ แพ็คเก็ตทั้งหมดถูกส่งไปที่สาย คุณควรจะเห็นคำขอ DNS ก่อนการเชื่อมต่อ TCP ด้วยเช่นกัน
Ale

1
คำขอ Proxied ควรใช้ส่วนหัวของโฮสต์โดยไม่ต้องใส่ URL แบบเต็มในบรรทัด GET
OrangeDog

1
@ OrangeDog: ไม่ตรงกันข้าม RFC 7230 (ส่วน 5.3.2) กล่าวอย่างชัดเจนว่าลูกค้าที่ทำการร้องขอไปยังพร็อกซีต้องใช้ URI แบบสัมบูรณ์ในบรรทัดคำขอ (ต้องมียังคงเป็นส่วนหัวของโฮสต์ซ้ำข้อมูลจากสายการร้องขอ; ส่วน 5.4)
hmakholm ออกเดินทางจากโมนิกา

7

ขั้นตอนจะเป็นดังนี้:

  1. ผู้ใช้ (คุณ) ให้ URL แก่เบราว์เซอร์เช่น http://www.pippo.it/hello.htm
  2. เบราว์เซอร์แบ่งออกเป็นสามส่วนดังนี้:

    • มาตรการ http
    • ชื่อโฮสต์ www.pippo.it
    • เส้นทาง URL /hello.htm

    (URL ที่ซับซ้อนมากขึ้นอาจมีส่วนอื่นด้วยฉันจะไม่สนใจความเป็นไปได้ในตอนนี้)

  3. เบราว์เซอร์รู้ดีว่าในการสร้างการเชื่อมต่อ IP นั้นจำเป็นต้องมีที่อยู่ IP ในการรับที่อยู่ IP นั้นจำเป็นต้องใช้ DNS (เว้นแต่จะมีที่อยู่แคชไว้)

    1. เบราว์เซอร์จะถามระบบปฏิบัติการสำหรับที่อยู่ IP ของเซิร์ฟเวอร์ DNS 8.8.8.8คิดว่าจะได้รับ
    2. เบราว์เซอร์สร้างการเชื่อมต่อหลายชั้นต่อไปนี้:

      • ชั้น IP: เชื่อมต่อ 8.8.8.8
      • UDP layer: ตั้งค่าแพ็คเก็ตสำหรับพอร์ตปลายทาง 53
      • DNS layer: สร้างคำขอ DNS สำหรับAระเบียนสำหรับชื่อโฮสต์www.pippo.it

      แน่นอนฉันไม่เห็นรายละเอียดมากมายเช่นรูปแบบที่แน่นอนของแพ็กเก็ตที่เกี่ยวข้อง

    3. เบราว์เซอร์ได้รับการตอบสนอง DNS (เลเยอร์ด้านบนของ UDP ที่อยู่ด้านบนของ IP เป็นต้น) ซึ่งให้ที่อยู่ IP สำหรับwww.pippo.itสมมติว่ามันเป็น10.11.12.13
  4. เบราว์เซอร์รู้ดีว่าในการสร้างการเชื่อมต่อ TCP นั้นจำเป็นต้องมีหมายเลขพอร์ต ในการรับหมายเลขพอร์ตมันจะค้นหาโปรโตคอลhttpในตารางภายในและเรียนรู้ว่าควรใช้พอร์ต 80
  5. เบราว์เซอร์สร้างการเชื่อมต่อหลายชั้นต่อไปนี้:

    • ชั้น IP: เชื่อมต่อ 10.11.12.13
    • TCP layer: ตั้งค่าแพ็คเก็ตเป็นพอร์ตปลายทาง 80
    • HTTP layer: สร้างการร้องขอ HTTP สำหรับ URL /hello.htmบนโฮสต์www.pippo.it(เพราะคอมพิวเตอร์ที่10.11.12.13อาจโฮสต์หลายโดเมนดังนั้นจึงจำเป็นต้องรู้ว่าต้องการอันไหน)

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

    แน่นอนฉันไม่เห็นรายละเอียดทั้งหมดของ TCP handshake และอย่างนั้น

  6. เบราว์เซอร์ได้รับการตอบสนอง HTTP (ชั้นบนสุดของ TCP ชั้นบนสุดของ IP ฯลฯ ) ที่มีเนื้อหาของ hello.htm

และสำหรับการวัดที่ดีฉันจะพูดถึงว่าตอนนี้เบราว์เซอร์ตรวจสอบเนื้อหาของการตอบสนองนั้นและระบุทรัพยากรเพิ่มเติมใด ๆ ที่จำเป็น: รูปภาพ, CSS, Javascript ฯลฯ จากนั้นจะทำซ้ำกระบวนการทั้งหมดนี้สำหรับแต่ละทรัพยากรดังกล่าว


4
ขั้นตอนที่ 3 ไม่ใช่สิ่งที่แอปพลิเคชันทำจริงๆ แอปพลิเคชันใช้สิ่งที่ต้องการgetaddrinfoหรือgethostbynameขอให้ระบบปฏิบัติการแก้ไขที่อยู่ได้ นอกจากนี้โดยทั่วไประบบปฏิบัติการใช้กลไกหลายอย่างเพื่อพยายามค้นหาชื่อไม่ใช่เฉพาะ DNS (โดยปกติอย่างน้อยไฟล์โฮสต์นอกเหนือจาก DNS)
Håkan Lindqvist

ขอบคุณ! มันเป็นคำตอบที่น่าประทับใจและมีรายละเอียดและมีประโยชน์มากเช่นกัน!
Giancarlo Perlo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.