หลักการทำงานของเว็บ
ทุกครั้งที่คุณเปิดเบราว์เซอร์ พิมพ์ URL และกด Enter คุณจะเห็นหน้าเว็บที่สวยงามปรากฏขึ้นบนหน้าจอของคุณ แต่คุณรู้หรือไม่ว่าเกิดอะไรขึ้นเบื้องหลังการกระทำง่ายๆ เหล่านี้
โดยปกติ เบราว์เซอร์ของคุณจะเป็นไคลเอนต์ หลังจากที่คุณพิมพ์ URL แล้ว ระบบจะใช้ส่วนของโฮสต์ของ URL และส่งไปยัง Domain Name Server (DNS) เพื่อรับที่อยู่ IP ของโฮสต์ จากนั้นจะเชื่อมต่อกับที่อยู่ IP และขอให้ตั้งค่าการเชื่อมต่อ TCP เบราว์เซอร์ส่งคำขอ HTTP ผ่านการเชื่อมต่อ เซิร์ฟเวอร์จัดการและตอบกลับด้วยการตอบสนอง HTTP ที่มีเนื้อหาที่ประกอบเป็นหน้าเว็บ สุดท้าย เบราว์เซอร์จะแสดงเนื้อหาของหน้าเว็บและยกเลิกการเชื่อมต่อจากเซิร์ฟเวอร์
รูปที่ 1 ขั้นตอนของผู้ใช้เข้าชมเว็บไซต์
เว็บเซิร์ฟเวอร์หรือที่เรียกว่าเซิร์ฟเวอร์ HTTP ใช้โปรโตคอล HTTP เพื่อสื่อสารกับไคลเอนต์ เว็บเบราว์เซอร์ทั้งหมดถือเป็นไคลเอนต์ได้
เราสามารถแบ่งหลักการทำงานของเว็บออกเป็นขั้นตอนต่อไปนี้:
- ลูกค้าใช้โปรโตคอล TCP/IP เพื่อเชื่อมต่อกับเซิร์ฟเวอร์
- ลูกค้าส่งแพ็คเกจคำขอ HTTP ไปยังเซิร์ฟเวอร์
- เซิร์ฟเวอร์ส่งคืนแพ็คเกจการตอบสนอง HTTP ไปยังไคลเอนต์ หากทรัพยากรที่ร้องขอมีสคริปต์แบบไดนามิก เซิร์ฟเวอร์จะเรียกกลไกจัดการสคริปต์ก่อน
- ไคลเอ็นต์ยกเลิกการเชื่อมต่อจากเซิร์ฟเวอร์ เริ่มแสดงผล HTML
นี่เป็นเวิร์กโฟลว์ที่เรียบง่ายของกิจการ HTTP – โปรดสังเกตว่าเซิร์ฟเวอร์ปิดการเชื่อมต่อหลังจากส่งข้อมูลไปยังไคลเอนต์ จากนั้นรอคำขอครั้งต่อไป
ความละเอียด URL และ DNS
เราใช้ URL เพื่อเข้าถึงหน้าเว็บเสมอ แต่คุณรู้หรือไม่ว่า URL ทำงานอย่างไร
ชื่อเต็มของ URL คือ Uniform Resource Locator ใช้สำหรับอธิบายแหล่งข้อมูลบนอินเทอร์เน็ตและรูปแบบพื้นฐานมีดังนี้
scheme://host[:port#]/path/.../[?query-string][#anchor]
scheme assign underlying protocol (such as HTTP, HTTPS, FTP)
host IP or domain name of HTTP server
port# default port is 80, and it can be omitted in this case.
If you want to use other ports, you must specify which port. For example,
http://www.cnblogs.com:8080/
path resources path
query-string data are sent to server
anchor anchor
DNS เป็นตัวย่อของระบบชื่อโดเมน เป็นระบบการตั้งชื่อสำหรับบริการเครือข่ายคอมพิวเตอร์ และแปลงชื่อโดเมนเป็นที่อยู่ IP จริง เช่นเดียวกับนักแปล
รูปที่ 2 หลักการทำงานของ DNS
เพื่อให้เข้าใจหลักการทำงานของมันมากขึ้น มาดูขั้นตอนการแก้ปัญหา DNS โดยละเอียดดังนี้
- หลังจากพิมพ์ชื่อโดเมน
www.qq.com
ในเบราว์เซอร์ ระบบปฏิบัติการจะตรวจสอบว่ามีความสัมพันธ์ในการแมปในไฟล์ของโฮสต์สำหรับชื่อโดเมนนี้หรือไม่ หากเป็นเช่นนั้น แสดงว่าการแก้ไขชื่อโดเมนเสร็จสมบูรณ์ - หากไม่มีความสัมพันธ์ในการแมปในไฟล์ของโฮสต์ ระบบปฏิบัติการจะตรวจสอบว่ามีแคชใน DNS หรือไม่ หากเป็นเช่นนั้น แสดงว่าการแก้ไขชื่อโดเมนเสร็จสมบูรณ์
- หากไม่มีความสัมพันธ์ในการแมปทั้งในโฮสต์และแคช DNS ระบบปฏิบัติการจะค้นหาเซิร์ฟเวอร์การแก้ปัญหา DNS แรกในการตั้งค่า TCP/IP ของคุณ ซึ่งน่าจะเป็นเซิร์ฟเวอร์ DNS ในเครื่องของคุณ เมื่อเซิร์ฟเวอร์ DNS ภายในได้รับการสอบถาม ถ้าชื่อโดเมนที่คุณต้องการสืบค้นมีอยู่ภายในการกำหนดค่าท้องถิ่นของทรัพยากรในภูมิภาค ชื่อโดเมนนั้นจะส่งกลับผลลัพธ์ไปยังไคลเอนต์ ความละเอียด DNS นี้เชื่อถือได้
- ถ้าเซิร์ฟเวอร์ DNS ภายในเครื่องไม่มีชื่อโดเมนแต่มีความสัมพันธ์ในการแมปอยู่ในแคช เซิร์ฟเวอร์ DNS ภายในเครื่องจะส่งผลลัพธ์นี้กลับไปยังไคลเอ็นต์ ความละเอียด DNS นี้ไม่มีสิทธิ์
- หากเซิร์ฟเวอร์ DNS ในพื้นที่ไม่สามารถแก้ไขชื่อโดเมนนี้ด้วยการกำหนดค่าทรัพยากรภูมิภาคหรือแคช จะดำเนินการในขั้นตอนต่อไป ซึ่งขึ้นอยู่กับการตั้งค่าของเซิร์ฟเวอร์ DNS ในเครื่อง – หากเซิร์ฟเวอร์ DNS ในเครื่องไม่เปิดใช้งานการส่งต่อ มันจะกำหนดเส้นทางคำขอไปยังเซิร์ฟเวอร์ DNS รูท จากนั้นส่งคืนที่อยู่ IP ของเซิร์ฟเวอร์ DNS ระดับบนสุดซึ่งอาจทราบชื่อโดเมน
.com
ในกรณีนี้ หากเซิร์ฟเวอร์ DNS ระดับบนสุดแรกไม่รู้จักชื่อโดเมน คำขอนั้นจะเปลี่ยนเส้นทางไปยังเซิร์ฟเวอร์ DNS ระดับบนสุดถัดไปจนกว่าจะถึงเซิร์ฟเวอร์ที่รู้จักชื่อโดเมน จากนั้นเซิร์ฟเวอร์ DNS ระดับบนสุดจะถามเซิร์ฟเวอร์ DNS ระดับถัดไปสำหรับที่อยู่ IP ที่สอดคล้องกับwww.qq.com
. – หากเซิร์ฟเวอร์ DNS ในพื้นที่เปิดใช้งานการส่งต่อ จะส่งคำขอไปยังเซิร์ฟเวอร์ DNS ระดับบน หากเซิร์ฟเวอร์ DNS ระดับบนไม่รู้จักชื่อโดเมนด้วย คำขอจะมีการเปลี่ยนเส้นทางไปยังระดับที่สูงกว่าจนกว่าจะถึงเซิร์ฟเวอร์ DNS ที่รู้จักชื่อโดเมนในที่สุด
ไม่ว่าเซิร์ฟเวอร์ DNS ในเครื่องจะเปิดใช้งานการส่งต่อหรือไม่ก็ตาม ที่อยู่ IP ของชื่อโดเมนจะส่งคืนไปยังเซิร์ฟเวอร์ DNS ในเครื่องเสมอ และเซิร์ฟเวอร์ DNS ในเครื่องจะส่งกลับไปยังไคลเอ็นต์
รูปที่ 3.3 เวิร์กโฟลว์การแก้ปัญหา DNS
Recursive query process
ก็หมายความว่าผู้สอบถามเปลี่ยนแปลงกระบวนการ ผู้สอบถามจะไม่เปลี่ยนแปลงในIterative query
กระบวนการ
ตอนนี้เราทราบแล้วว่าไคลเอนต์ได้รับที่อยู่ IP ดังนั้นเบราว์เซอร์จึงสื่อสารกับเซิร์ฟเวอร์ผ่านที่อยู่ IP
โปรโตคอล HTTP
โปรโตคอล HTTP เป็นส่วนหลักของบริการเว็บ สิ่งสำคัญคือต้องรู้ว่าโปรโตคอล HTTP คืออะไร ก่อนที่คุณจะเข้าใจว่าเว็บทำงานอย่างไร
HTTP เป็นโปรโตคอลที่ใช้อำนวยความสะดวกในการสื่อสารระหว่างเบราว์เซอร์และเว็บเซิร์ฟเวอร์ มันขึ้นอยู่กับโปรโตคอล TCP และมักจะใช้พอร์ต 80 ที่ด้านข้างของเว็บเซิร์ฟเวอร์ เป็นโปรโตคอลที่ใช้รูปแบบการตอบกลับคำขอ -clients ส่งคำขอและเซิร์ฟเวอร์ตอบสนอง ตามโปรโตคอล HTTP ลูกค้าจะตั้งค่าการเชื่อมต่อใหม่และส่งคำขอ HTTP ไปยังเซิร์ฟเวอร์เสมอ เซิร์ฟเวอร์ไม่สามารถเชื่อมต่อกับไคลเอนต์ในเชิงรุก หรือสร้างการเชื่อมต่อการโทรกลับ การเชื่อมต่อระหว่างไคลเอนต์และเซิร์ฟเวอร์สามารถปิดได้ทั้งสองด้าน ตัวอย่างเช่น คุณสามารถยกเลิกคำขอดาวน์โหลดและการเชื่อมต่อ HTTP และเบราว์เซอร์ของคุณจะยกเลิกการเชื่อมต่อจากเซิร์ฟเวอร์ก่อนที่คุณจะดาวน์โหลดเสร็จ
โปรโตคอล HTTP เป็นแบบไร้สัญชาติ ซึ่งหมายความว่าเซิร์ฟเวอร์ไม่มีความคิดเกี่ยวกับความสัมพันธ์ระหว่างการเชื่อมต่อทั้งสองแม้ว่าทั้งสองจะมาจากไคลเอนต์เดียวกัน เพื่อแก้ปัญหานี้ เว็บแอปพลิเคชันใช้คุกกี้เพื่อรักษาสถานะของการเชื่อมต่อ
เนื่องจากโปรโตคอล HTTP ใช้โปรโตคอล TCP การโจมตี TCP ทั้งหมดจึงส่งผลต่อการสื่อสาร HTTP ในเซิร์ฟเวอร์ของคุณ ตัวอย่างของการโจมตีดังกล่าว ได้แก่ การโจมตี SYN Flood, การโจมตี DoS และ DDoS
แพ็คเกจคำขอ HTTP (ข้อมูลเบราว์เซอร์)
แพ็คเกจคำขอทั้งหมดมีสามส่วน: บรรทัดคำขอ ส่วนหัวของคำขอ และเนื้อหา มีบรรทัดว่างหนึ่งบรรทัดระหว่างส่วนหัวและเนื้อหา
GET /domains/example/ HTTP/1.1 // request line: request method, URL, protocol and its version
Host:www.iana.org // domain name
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 // browser information
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 // mime that clients can accept
Accept-Encoding:gzip,deflate,sdch // stream compression
Accept-Charset:UTF-8,*;q=0.5 // character set in client side
// blank line
// body, request resource arguments (for example, arguments in POST)
เราใช้ fiddler เพื่อรับข้อมูลคำขอต่อไปนี้
รูปที่ 4 ข้อมูลของคำขอ GET ที่จับได้โดย fiddler
เราจะเห็นว่า GET ไม่มีเนื้อหาคำขอ ซึ่งต่างจาก POST ซึ่งมี
มีหลายวิธีที่คุณสามารถใช้เพื่อสื่อสารกับเซิร์ฟเวอร์ใน HTTP; GET, POST, PUT และ DELETE เป็นวิธีการพื้นฐาน 4 วิธีที่เรามักใช้ URL แสดงถึงทรัพยากรบนเครือข่าย ดังนั้น 4 เมธอดนี้จึงกำหนดคิวรี เปลี่ยนแปลง เพิ่ม และลบการดำเนินการที่สามารถดำเนินการกับทรัพยากรเหล่านี้ได้ GET และ POST มักใช้ใน HTTP GET สามารถผนวกพารามิเตอร์การสืบค้นเข้ากับ URL โดยใช้?
เพื่อแยก URL และพารามิเตอร์ และ&
ระหว่างอาร์กิวเมนต์ เช่น EditPosts.aspx?name=test1&id=123456
. POST ใส่ข้อมูลในเนื้อหาคำขอ เนื่องจาก URL ใช้การจำกัดความยาวผ่านเบราว์เซอร์ ดังนั้น POST สามารถส่งข้อมูลได้มากกว่า GET นอกจากนี้ เมื่อเราส่งชื่อผู้ใช้และรหัสผ่าน เราไม่ต้องการให้ข้อมูลประเภทนี้ปรากฏใน URL ดังนั้นเราจึงใช้ POST เพื่อซ่อนไม่ให้เปิดเผย
แพ็คเกจตอบกลับ HTTP (ข้อมูลเซิร์ฟเวอร์)
มาดูกันว่าข้อมูลใดบ้างที่อยู่ในแพ็คเกจการตอบกลับ
HTTP/1.1 200 OK // status line
Server: nginx/1.0.8 // web server software and its version in the server machine
Date:Date: Tue, 30 Oct 2012 04:14:25 GMT // responded time
Content-Type: text/html // responded data type
Transfer-Encoding: chunked // it means data were sent in fragments
Connection: keep-alive // keep connection
Content-Length: 90 // length of body
// blank line
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"... // message body
บรรทัดแรกเรียกว่าบรรทัดสถานะ โดยจะระบุเวอร์ชัน HTTP รหัสสถานะ และข้อความสถานะ
รหัสสถานะแจ้งสถานะการตอบกลับของเซิร์ฟเวอร์ HTTP ให้ลูกค้าทราบ ใน HTTP/1.1 มีการกำหนดรหัสสถานะ 5 ประเภท:
- 1xx Informational
- 2xx Success
- 3xx Redirection
- 4xx Client Error
- 5xx Server Error
มาดูตัวอย่างเพิ่มเติมเกี่ยวกับแพ็คเกจการตอบกลับ 200 หมายถึงเซิร์ฟเวอร์ตอบกลับอย่างถูกต้อง 302 หมายถึงการเปลี่ยนเส้นทาง
รูปที่ 6 ข้อมูลทั้งหมดสำหรับการเยี่ยมชมเว็บไซต์
HTTP เป็นสถานะไร้สัญชาติและการเชื่อมต่อ: Keep-alive
คำว่าไร้สัญชาติไม่ได้หมายความว่าเซิร์ฟเวอร์ไม่มีความสามารถในการเชื่อมต่อ หมายความว่าเซิร์ฟเวอร์ไม่รู้จักความสัมพันธ์ใดๆ ระหว่างสองคำขอ
ใน HTTP/1.1 Keep-alive จะถูกใช้โดยค่าเริ่มต้น หากลูกค้ามีคำขอเพิ่มเติม พวกเขาจะใช้การเชื่อมต่อเดียวกันสำหรับพวกเขา
ขอให้สังเกตว่า Keep-alive ไม่สามารถรักษาการเชื่อมต่อได้ตลอดไป แอปพลิเคชันที่ทำงานในเซิร์ฟเวอร์เป็นตัวกำหนดขีดจำกัดในการคงการเชื่อมต่อไว้ และในกรณีส่วนใหญ่ คุณสามารถกำหนดค่าขีดจำกัดนี้ได้
ตัวอย่าง
รูปที่ 7 แพ็คเกจทั้งหมดสำหรับเปิดหน้าเว็บเดียว
เราสามารถเห็นกระบวนการสื่อสารทั้งหมดระหว่างไคลเอนต์และเซิร์ฟเวอร์จากภาพด้านบน คุณอาจสังเกตเห็นว่ามีไฟล์ทรัพยากรจำนวนมากในรายการ ไฟล์เหล่านี้เรียกว่าไฟล์สแตติก และ Go มีวิธีการประมวลผลเฉพาะสำหรับไฟล์เหล่านี้
นี่เป็นหน้าที่ที่สำคัญที่สุดของเบราว์เซอร์: เพื่อขอ URL และดึงข้อมูลจากเว็บเซิร์ฟเวอร์ จากนั้นแสดง HTML หากพบไฟล์บางไฟล์ใน DOM เช่น ไฟล์ CSS หรือ JS เบราว์เซอร์จะขอทรัพยากรเหล่านี้จากเซิร์ฟเวอร์อีกครั้งจนกว่าทรัพยากรทั้งหมดจะแสดงบนหน้าจอของคุณ
การลดเวลาขอ HTTP เป็นวิธีหนึ่งในการปรับปรุงความเร็วในการโหลดหน้าเว็บ ด้วยการลดจำนวนไฟล์ CSS และ JS ที่ต้องโหลด ทั้งคำขอเวลาแฝงและความกดดันบนเว็บเซิร์ฟเวอร์ของคุณจะลดลงพร้อมกัน