สารบัญ
ในการสัมภาษณ์ด้านเทคนิคหรืออย่างอื่น คำถามที่ถามบ่อยคือจะเกิดอะไรขึ้นเมื่อคุณพิมพ์ URL ลงในเบราว์เซอร์ จะเกิดอะไรขึ้นเบื้องหลังเมื่อคุณท่องเว็บไซต์? วงจรชีวิตการเชื่อมต่อ HTTP โดยทั่วไปเกี่ยวข้องกับอะไร ฉันจะตอบคำถามเหล่านี้อย่างสุดความสามารถ
ก่อนที่จะดำดิ่งลงสู่กระบวนการเชื่อมต่อ เรามาดูโมเดล OSI พื้นฐานกันก่อน (โมเดล Open Systems Interconnection) โมเดล OSI เป็นโมเดลเชิงแนวคิดที่สร้างมาตรฐานการสื่อสารระหว่างสองระบบ - ระบบหนึ่งที่คำขอเกิดขึ้น (ไคลเอ็นต์) และอีกระบบหนึ่งที่ตอบสนองคำขอและส่งการตอบกลับ (เซิร์ฟเวอร์) ตารางด้านล่างแสดงคุณลักษณะที่สำคัญบางประการของแต่ละเลเยอร์
เลขที่ | ชั้น | ฮาร์ดแวร์ | การทำงาน | โปรโตคอล/แอป | เพิ่มเติม |
---|---|---|---|---|---|
7 | แอปพลิเคชัน | เซิร์ฟเวอร์/พีซี | แอพพลิเคชั่น, ส่วนต่อประสานกับผู้ใช้ | HTTP, SMTP, DNS | ส่วนหัว L7 |
6 | การนำเสนอ | เซิร์ฟเวอร์/พีซี | จัดการการเข้ารหัสและการเปลี่ยนแปลงไวยากรณ์ | เจเพ็ก, MP3 | ส่วนหัว L6 |
5 | การประชุม | เซิร์ฟเวอร์/พีซี | การรับรองความถูกต้อง สิทธิ์ เซสชัน | SCP, กำหนดการระบบปฏิบัติการ | ส่วนหัว L5 |
4 | ขนส่ง | ไฟร์วอลล์ | การส่งมอบแบบครบวงจร การควบคุมข้อผิดพลาด | TCP, UDP | ส่วนหัว L4 |
3 | เครือข่าย | เราเตอร์ | การกำหนดที่อยู่เครือข่าย การกำหนดเส้นทาง การสลับ | ไอพี | ส่วนหัว L3 |
2 | ลิงค์ข้อมูล | สวิตช์ | Addr ทางกายภาพ การตรวจจับข้อผิดพลาด การไหล | อีเธอร์เน็ต, เฟรมรีเลย์ | L2 เฮดเดอร์/รถพ่วง |
1 | ทางกายภาพ | สายเคเบิ้ล | บิตที่ถ่ายโอนผ่านเครือข่ายฟิสิคัล | การประเมินผลกระทบสิ่งแวดล้อม/TIA | ส่วนหัว L1 |
ทันทีที่คุณพิมพ์ URL ลงในเบราว์เซอร์และกดปุ่ม Enter/return เบราว์เซอร์ (หรือไคลเอ็นต์ใดๆ สำหรับเรื่องนั้น) จะแยกวิเคราะห์ URL [1] เพื่อแยกส่วนประกอบที่สำคัญออกมา URL ตัวอย่างได้รับด้านล่าง:
https://www.google.com/search?q=cats
ที่นี่เราแค่ค้นหาแมวบน Google จาก URL ข้างต้น https://
คือโปรโตคอล, google.com
คือโฮสต์บน www
(อินเทอร์เน็ต), /search
คือพารามิเตอร์เส้นทาง และ ?q=cats
คือพารามิเตอร์สตริงการสืบค้น ซึ่งแสดงว่าเรากำลังค้นหา Google สำหรับแมว [ 2].
ขณะนี้เนื่องจากเบราว์เซอร์มีความรู้เกี่ยวกับโฮสต์ที่พยายามเข้าถึง ในกรณีนี้คือ google.com
ก็จะพยายามรับที่อยู่ IP ที่เกี่ยวข้อง โดเมนเช่น ' .com' หรือ ' .org' ถูกสร้างขึ้นเพื่อให้เราจดจำได้ง่าย แต่สำหรับเบราว์เซอร์ที่จะส่งคำขอจริงเพื่อบอกว่า google.com นั้นจำเป็นต้องมีที่อยู่ IP ของโฮสต์ การแก้ไข DNS ช่วยให้เราได้รับข้อมูลที่อยู่ IP สำหรับชื่อโดเมนที่กำหนด DNS อยู่บน Application layer (L7) จากตารางด้านบน
ขั้นตอนในการแก้ไข DNS:
$ ipconfig /displaydns
บน windows หรือ $ log stream --predicate 'process == "mDNSResponder"' --info
บน mac/linux.com
, .org
ฯลฯ เป็นชื่อโดเมนระดับบนสุด ชื่อ TLD จะส่งคืนที่อยู่ IP ของเซิร์ฟเวอร์ชื่อที่มีสิทธิ์$ dig google.com
; << >> DiG 9.10.6 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14345
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 9
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 180 IN A 172.217.164.174
;; AUTHORITY SECTION:
google.com. 60552 IN NS ns1.google.com.
google.com. 60552 IN NS ns2.google.com.
google.com. 60552 IN NS ns3.google.com.
google.com. 60552 IN NS ns4.google.com.
;; ADDITIONAL SECTION:
ns1.google.com. 60438 IN A 216.239.32.10
ns1.google.com. 58273 IN AAAA 2001:4860:4802:32::a
ns2.google.com. 60438 IN A 216.239.34.10
ns2.google.com. 131763 IN AAAA 2001:4860:4802:34::a
ns3.google.com. 163770 IN A 216.239.36.10
ns3.google.com. 60541 IN AAAA 2001:4860:4802:36::a
ns4.google.com. 75597 IN A 216.239.38.10
ns4.google.com. 60541 IN AAAA 2001:4860:4802:38::a
;; Query time: 13 msec
;; SERVER: 10.4.4.10#53(10.4.4.10)
;; WHEN: Mon Jun 24 12:20:50 PDT 2019
;; MSG SIZE rcvd: 303
ในแต่ละเลเยอร์ของโมเดล OSI ข้อมูลจะถูกเรียกว่าเป็น PDU (Packet Data Unit) ดังนั้นข้อมูลที่เลเยอร์แอปพลิเคชันจึงเรียกว่า L7 PDU โดยที่ข้อมูลที่เลเยอร์เครือข่ายเรียกว่า L3 PDU ในแต่ละเลเยอร์ จะมีการเพิ่มส่วนหัวของเลเยอร์ที่สอดคล้องกัน ส่วนหัวนำหน้าเนื้อหาและมีที่อยู่และข้อมูลอื่น ๆ ที่จำเป็นสำหรับการไปถึงจุดหมายปลายทางที่ตั้งใจไว้ ในทางกลับกันข้อมูลจะถูกส่งจากชั้นบนสุดลงล่าง ส่วนหัว L4, L3 และ L2 แสดงอยู่ด้านล่าง:
ก่อนที่แพ็กเก็ตจะถูกส่งไปยังอินเทอร์เน็ตเพื่อเข้าถึงเซิร์ฟเวอร์โดเมนของ Google ในที่สุด แพ็กเก็ตนั้นจะต้องถูกกำหนดเส้นทางผ่านเราเตอร์ก่อน เมื่อใดก็ตามที่อุปกรณ์จำเป็นต้องเชื่อมต่อกับอุปกรณ์อื่น (ในกรณีนี้คือเราเตอร์ในเครื่อง) อุปกรณ์จะต้องมีที่อยู่ MAC (ที่อยู่ฮาร์ดแวร์) ของอุปกรณ์นั้น แต่เครื่องท้องถิ่นรู้ได้อย่างไรว่าเราเตอร์เป็นเส้นทางเริ่มต้น ข้อมูลนี้ได้มาผ่านเส้นทางเริ่มต้นที่ตั้งค่าตามอินเทอร์เฟซภายในเครื่องท้องถิ่น คุณสามารถตรวจสอบเส้นทางเริ่มต้นได้โดยใช้คำสั่ง $ ifconfig
ที่อยู่ IP ใช้เพื่อค้นหาอุปกรณ์บนเครือข่าย ในขณะที่ที่อยู่ MAC ใช้เพื่อระบุอุปกรณ์จริง โปรโตคอล ARP ใช้เพื่อรับที่อยู่ MAC ของอุปกรณ์ โดยให้ความรู้เกี่ยวกับที่อยู่ IP ที่นี่เราจะถือว่าเครื่องที่ร้องขอได้รับที่อยู่ IP แล้ว (ทั้งแบบคงที่หรือผ่านโปรโตคอล DHCP)
ARP อยู่บนดาต้าลิงค์เลเยอร์ของโมเดล OSI ในกรณีนี้ เว็บเบราว์เซอร์ที่ทำงานบนเครื่องท้องถิ่นจะเชื่อมต่อกับเราเตอร์ซึ่งเป็นประตูสู่อินเทอร์เน็ต
arp -a
แพ็กเก็ตจะถูกส่งไปยังเส้นทางเริ่มต้น หากคุณไม่ได้กำหนดเส้นทางเริ่มต้น เส้นทางเหล่านั้นจะถูกส่งไปยังเราเตอร์ คุณสามารถตรวจสอบเส้นทางเริ่มต้นได้โดยใช้คำสั่ง
route get default | grep gateway
หรือ netstat -rn
บน mac/linux หรือ ipconfig
บน windows
เช่น หากคุณอยู่บนเครือข่าย 192.168.10.0/24 และพยายามเข้าถึงเครือข่าย Google ที่ 172.217.164.174/24 เช่น เมื่อแพ็กเก็ตมาที่เราเตอร์ เราเตอร์จะตรวจสอบตารางเส้นทางและตัดสินใจว่าจะกำหนดเส้นทางการรับส่งข้อมูลไปที่อย่างไร ถึงเครือข่ายปลายทาง โดยจะส่งแพ็กเก็ตไปยังเกตเวย์ที่ระบุเพื่อไปยังปลายทาง 172.217.164.174/24
การเชื่อมต่อระหว่างไคลเอนต์และเซิร์ฟเวอร์ ในกรณีนี้เครื่องท้องถิ่นของคุณไปยังเซิร์ฟเวอร์ของ Google ใช้เวลากระโดดหลายครั้ง การกระโดดแต่ละครั้งโดยพื้นฐานแล้วจะเป็นเราเตอร์ตามเส้นทางไปยังปลายทาง เราเตอร์ที่นี่ช่วยส่งคำขอจากเครือข่ายหนึ่งไปยังอีกเครือข่ายหนึ่ง อุปกรณ์ทุกชิ้นที่อยู่ระหว่างทางมีที่อยู่ MAC (ที่อยู่ฮาร์ดแวร์) ซึ่งมีเอกลักษณ์เฉพาะตัวทั่วโลก
ขณะนี้เครื่องท้องถิ่นสร้างคำขอด้วยส่วนหัว L7 (HTTP), ส่วนหัว L4 (TCP), ส่วนหัว L3 (IP), ส่วนหัว L2 (ARP, ที่อยู่ MAC), ตัวอย่าง L2 (ลำดับการตรวจสอบเฟรม) และข้อมูลจริง เมื่อเราเตอร์ได้รับแพ็กเก็ต มันจะแยกส่วน ปรับเปลี่ยนส่วนหัว/ส่วนท้าย L2 และห่อหุ้มแพ็กเก็ตอีกครั้ง
ตอนนี้เราเตอร์ได้รับมันและเริ่มถอดรหัส มองเข้าไปในส่วนหัว L2 และดูว่า Mac ปลายทางมีไว้สำหรับตัวมันเอง ตอนนี้จะลบส่วนหัว L2 และดูที่ส่วนหัว L3 และเข้าใจว่าคำขอนี้ไม่ได้มีไว้สำหรับตัวมันเอง แต่สำหรับเซิร์ฟเวอร์ของ Google จากนั้นเราเตอร์จะลดค่า TTL ซึ่งอยู่ภายในส่วนหัว L3 ตอนนี้เราเตอร์จะดูตารางเส้นทางสำหรับเส้นทางที่เป็นไปได้ทั้งหมดที่เราเตอร์อื่นๆ จะโฆษณาไปยังเราเตอร์นี้ (ผ่าน RIP หรือ IGP) เกี่ยวกับวิธีการไปยังปลายทาง เราเตอร์ตัวหนึ่งจะทำ ARP เพื่อรับที่อยู่ MAC ของเราเตอร์ฮอปถัดไป หากไม่มีที่อยู่ MAC ในแคช
เราเตอร์ยังเพิ่ม CRC ซึ่งจะไปยังตัวอย่าง L2 สิ่งนี้ช่วยให้เราเตอร์ตัวถัดไปทราบว่าไม่มีปัญหาในเส้นทางเกิดขึ้นซึ่งทำให้แพ็กเก็ตเสียหายข้ามสาย ถ้ามันเสียหาย มันจะดรอปเฟรม
ในกรณีนี้ เราเตอร์ได้แก้ไขส่วนหัว L2 และตัวอย่าง L2 แต่ไม่ได้สัมผัสกับส่วนหัว L3 ดังนั้นจึงไม่มีส่วนหัวอยู่ด้านบน
หมายเลขพอร์ตต้นทาง จะเป็นหมายเลขพอร์ตชั่วคราวและหมายเลขพอร์ตปลายทางจะเป็น 80
TCP - บริการสั่งซื้อที่เชื่อถือได้และเหมือนกัน สิ่งแรกที่เครื่องท้องถิ่นจะทำคือสร้างการจับมือสามทางกับเซิร์ฟเวอร์ Google ทันทีเนื่องจากรู้เส้นทางไปยังเซิร์ฟเวอร์ การสร้างการเชื่อมต่อช่วยในการสรุปตัวแปรสถานะบางอย่าง เช่น ขนาด MSS, หมายเลขลำดับเริ่มต้น, ประเภท ACK, ขนาดบัฟเฟอร์ ฯลฯ
ในกรณีนี้แหล่งที่มาและพอร์ตปลายทางในส่วนหัว TCP คือ 16 บิตดังนั้น 2^16 คือ 65535 พอร์ตต้นทางใช้เพื่อระบุแอปพลิเคชันไคลเอ็นต์ในขณะที่พอร์ตปลายทางใช้เพื่อระบุบริการหรือปีศาจที่ทำงานบนเว็บเซิร์ฟเวอร์
ไคลเอนต์ (เว็บเบราว์เซอร์) เลือกพอร์ตใด ๆ จาก 49152 - 65535 เพื่อให้แน่ใจว่าไม่มีแอปพลิเคชัน 2 ตัวที่ใช้พอร์ตเดียวกัน ที่อยู่พอร์ตพร้อมกับที่อยู่ IP เรียกว่าเป็นซ็อกเก็ต TCP พอร์ตปลายทางคือพอร์ต 80 ในแพ็กเก็ต IP
เริ่มต้นการสื่อสาร:
ด้วยสามขั้นตอนข้างต้น TCP handshake จะประสบความสำเร็จระหว่างไคลเอนต์และเซิร์ฟเวอร์ และทั้งสองได้ตกลงตามกฎทั่วไปสำหรับการถ่ายโอนข้อมูลแล้ว
หลังจากการแฮนด์เชค TCP การแฮนด์เชค TLS จะเกิดขึ้นหากคุณเชื่อมต่อกับเว็บไซต์ที่ปลอดภัย ด้วยการจับมือ TLS ลูกค้าและเซิร์ฟเวอร์ยอมรับข้อกำหนดทั่วไปของการสื่อสารที่ปลอดภัย
จากนี้ไป เซสชัน TLS จะส่งข้อมูลแอปพลิเคชัน (HTTP) ที่เข้ารหัสด้วยคีย์สมมาตรที่ตกลงกันไว้
เซิร์ฟเวอร์ประมวลผลคำขอและส่งการตอบกลับที่เหมาะสม เมื่อคำขอมาถึงเซิร์ฟเวอร์บนพอร์ต 80 (HTTP) หรือพอร์ต 443 (HTTPS) เว็บเซิร์ฟเวอร์เช่น Apache หรือ Nginx จะรับฟังพอร์ต 443 จะจัดการการเชื่อมต่อของคำขอและกำหนดเส้นทางไปยังพอร์ตชั่วคราวอื่นที่บริการเว็บอยู่ วิ่ง.
ไคลเอนต์ HTTP เซิร์ฟเวอร์ หรือพร็อกซีสามารถปิดการเชื่อมต่อการขนส่ง TCP ได้ตลอดเวลา ตัวอย่างเช่น เมื่อไคลเอนต์ตรวจพบว่าการถ่ายโอนข้อมูลสิ้นสุดลงและไม่จำเป็นต้องใช้ช่องทางการเชื่อมต่อแบบเปิดอีกต่อไป ไคลเอนต์จะส่งคำขอปิดการเชื่อมต่อไปยังเซิร์ฟเวอร์ ในครั้งถัดไป ลูกค้าต้องการสื่อสารกับเซิร์ฟเวอร์ จะต้องสร้างการเชื่อมต่อใหม่ระหว่างเครื่องทั้งสองเครื่อง
[1] | มาตรฐาน URL |
[2] | ส่วนประกอบหรือ URL |