บางครั้งเครื่องวัดความคืบหน้าในการดาวน์โหลดที่ซื่อสัตย์บนเบราว์เซอร์ของคุณ (หรือแอปพลิเคชันอื่น ๆ ) ก็แค่โยนมือขึ้นไปบนอากาศและยอมแสดงเวลาดาวน์โหลดที่เหลือ เหตุใดบางครั้งจึงเน้นเวลาในการดาวน์โหลดที่คาดการณ์ไว้และบางครั้งก็ล้มเหลวในการรายงานทั้งหมดพร้อมกัน
เซสชันคำถามและคำตอบของวันนี้มาถึงเราโดยได้รับความอนุเคราะห์จาก SuperUser ซึ่งเป็นแผนกย่อยของ Stack Exchange ซึ่งเป็นการรวมกลุ่มเว็บไซต์ถาม & ตอบโดยชุมชน
คำถาม
ผู้อ่าน SuperUser Coldblackice ต้องการทราบว่าเหตุใดเบราว์เซอร์ของเขาจึงไม่กำจัดสิ่งสกปรกเสมอไป:
ในบางครั้งเมื่อดาวน์โหลดไฟล์ในเว็บเบราว์เซอร์ความคืบหน้าในการดาวน์โหลดจะไม่ "ทราบ" ขนาดทั้งหมดของไฟล์หรือระยะทางในการดาวน์โหลดเพียงแค่แสดงความเร็วในการดาวน์โหลดโดยรวม เป็น“ ไม่ทราบ”
เหตุใดเบราว์เซอร์จึงไม่ทราบขนาดสุดท้ายของไฟล์บางไฟล์ ข้อมูลนี้ได้รับมาจากที่ไหนในตอนแรก?
ที่ไหนจริง?
คำตอบ
ผู้สนับสนุน SuperUser Gronostaj นำเสนอข้อมูลเชิงลึกดังต่อไปนี้:
ในการขอเอกสารจากเว็บเซิร์ฟเวอร์เบราว์เซอร์จะใช้โปรโตคอล HTTP คุณอาจรู้จักชื่อนั้นจากแถบที่อยู่ของคุณ (ตอนนี้อาจซ่อนอยู่ แต่เมื่อคุณคลิกแถบที่อยู่คัดลอก URL และวางลงในโปรแกรมแก้ไขข้อความคุณจะเห็น
http: //ที่จุดเริ่มต้น) เป็นโปรโตคอลแบบข้อความธรรมดาและทำงานดังนี้:ขั้นแรกเบราว์เซอร์ของคุณจะเชื่อมต่อกับเซิร์ฟเวอร์ของเว็บไซต์และส่ง URL ของเอกสารที่ต้องการดาวน์โหลด (หน้าเว็บก็คือเอกสารเช่นกัน) และรายละเอียดบางอย่างเกี่ยวกับเบราว์เซอร์เอง ( ตัวแทนผู้ใช้ ฯลฯ ) ตัวอย่างเช่นในการโหลดหน้าหลักบนไซต์ SuperUser
http://superuser.com/เบราว์เซอร์ของฉันส่งคำขอที่มีลักษณะดังนี้:รับ / HTTP / 1.1 โฮสต์: superuser.com การเชื่อมต่อ: ให้มีชีวิตอยู่ ยอมรับ: text / html, application / xhtml + xml, application / xml; q = 0.9, * / *; q = 0.8 ตัวแทนผู้ใช้: Mozilla / 5.0 (Windows NT 6.1; WOW64) ยอมรับการเข้ารหัส: gzip, deflate, sdch ยอมรับภาษา: pl-PL, pl; q = 0.8, en-US; q = 0.6, en; q = 0.4 คุกกี้: [removed for security] DNT: 1 If-Modified-Since: อังคาร, 09 กรกฎาคม 2013 07:14:17 GMTบรรทัดแรกระบุเอกสารที่เซิร์ฟเวอร์ควรส่งคืน บรรทัดอื่น ๆ เรียกว่าส่วนหัว พวกเขามีลักษณะดังนี้:
ชื่อส่วนหัว: ค่าส่วนหัวบรรทัดเหล่านี้จะส่งข้อมูลเพิ่มเติมที่ช่วยให้เซิร์ฟเวอร์ตัดสินใจว่าจะทำอย่างไร
หากทุกอย่างเรียบร้อยเซิร์ฟเวอร์จะตอบกลับโดยส่งเอกสารที่ร้องขอ การตอบกลับเริ่มต้นด้วยข้อความสถานะตามด้วยส่วนหัวบางส่วน (พร้อมรายละเอียดเกี่ยวกับเอกสาร) และสุดท้ายหากทุกอย่างเรียบร้อยดีเนื้อหาของเอกสาร นี่คือลักษณะการตอบกลับของเซิร์ฟเวอร์ SuperUser สำหรับคำขอของฉัน:
HTTP / 1.1 200 ตกลง การควบคุมแคช: สาธารณะอายุสูงสุด = 60 ประเภทเนื้อหา: text / html; charset = utf-8 Expires: อังคาร, 09 ก.ค. 2013 07:27:20 GMT Last-Modified: อังคาร, 09 ก.ค. 2013 07:26:20 GMT แตกต่างกันไป: * X-Frame-Options: SAMEORIGIN วันที่: อังคาร, 09 ก.ค. 2556 07:26:19 GMT ความยาวเนื้อหา: 139672 <! DOCTYPE html> <html> [...snip...] </html>หลังจากบรรทัดสุดท้ายเซิร์ฟเวอร์ของ SuperUser จะปิดการเชื่อมต่อ
บรรทัดแรก (
HTTP / 1.1 200 ตกลง) ประกอบด้วยไฟล์ รหัสตอบกลับ ในกรณีนี้ก็คือ200 ตกลง. หมายความว่าเซิร์ฟเวอร์จะส่งคืนเอกสารตามที่ร้องขอ เมื่อเซิร์ฟเวอร์ไม่สามารถจัดการได้โค้ดจะเป็นอย่างอื่นคุณอาจเคยเห็น404 ไม่พบและ403 ต้องห้ามเป็นเรื่องธรรมดาเช่นกัน จากนั้นส่วนหัวตามมาเมื่อเบราว์เซอร์พบบรรทัดว่างในการตอบกลับมันจะรู้ว่าทุกสิ่งที่ผ่านมาเป็นเนื้อหาของเอกสารที่ร้องขอ ดังนั้นในกรณีนี้
<! DOCTYPE html>คือบรรทัดแรกของรหัสหน้าแรกของ SuperUser หากฉันกำลังขอเอกสารเพื่อดาวน์โหลดเอกสารนั้นอาจเป็นอักขระที่ไม่เหมาะสมเนื่องจากรูปแบบเอกสารส่วนใหญ่ไม่สามารถอ่านได้หากไม่มีการประมวลผลก่อนกลับไปที่ส่วนหัว สิ่งที่น่าสนใจที่สุดสำหรับเราคืออันสุดท้าย
ความยาวของเนื้อหา. จะแจ้งให้เบราว์เซอร์ทราบจำนวนไบต์ที่ควรคาดหวังหลังจากบรรทัดว่างดังนั้นโดยทั่วไปจะเป็นขนาดเอกสารที่แสดงเป็นไบต์ ส่วนหัวนี้ไม่บังคับและอาจถูกละเว้นโดยเซิร์ฟเวอร์ บางครั้งไม่สามารถคาดเดาขนาดเอกสารได้ (ตัวอย่างเช่นเมื่อเอกสารถูกสร้างขึ้นทันที) บางครั้งโปรแกรมเมอร์ขี้เกียจก็ไม่รวมไว้ (พบได้บ่อยในไซต์ดาวน์โหลดไดรเวอร์) บางครั้งเว็บไซต์จะถูกสร้างขึ้นโดยมือใหม่ที่ไม่รู้ ของส่วนหัวดังกล่าวไม่ว่าจะด้วยเหตุผลใดก็ตามส่วนหัวสามารถหายไปได้ ในกรณีนี้เบราว์เซอร์ไม่ทราบว่าเซิร์ฟเวอร์จะส่งข้อมูลไปเท่าใดจึงแสดงขนาดเอกสารเป็น ไม่ทราบ รอให้เซิร์ฟเวอร์ปิดการเชื่อมต่อ และนั่นคือสาเหตุของขนาดเอกสารที่ไม่รู้จัก