ลดความเข้ากันได้ของเบราว์เซอร์การบีบอัดและข้อได้เปรียบเหนือ GZIP


91

อัปเดต 10 กุมภาพันธ์ 2555:

zOompf ได้ทำการวิจัยอย่างละเอียดเกี่ยวกับหัวข้อนี้ที่นี่แล้ว มันสำคัญกว่าการค้นพบใด ๆ ด้านล่าง


อัพเดท 11 กันยายน 2553:

มีการสร้างแพลตฟอร์มการทดสอบสำหรับสิ่งนี้ที่นี่




คำจำกัดความ HTTP 1.1 ของ GZIP และ DEFLATE (zlib) สำหรับข้อมูลพื้นฐาน:

"" Gzip "คือรูปแบบ gzip และ" deflate "คือรูปแบบ zlibซึ่งน่าจะเรียกรูปแบบที่สองว่า" zlib "แทนเพื่อหลีกเลี่ยงความสับสนกับรูปแบบข้อมูลที่บีบอัดแบบ raw deflate ในขณะที่ HTTP 1.1 RFC 2616 ชี้อย่างถูกต้อง ข้อมูลจำเพาะ zlib ใน RFC 1950 สำหรับการเข้ารหัสการถ่ายโอน 'deflate' มีรายงานเกี่ยวกับเซิร์ฟเวอร์และเบราว์เซอร์ที่สร้างหรือคาดว่าข้อมูลดิบไม่ถูกต้องตามข้อกำหนดเกี่ยวกับการยุบตัวใน RFC 1951 โดยเฉพาะอย่างยิ่งผลิตภัณฑ์ของ Microsoftดังนั้นถึงแม้ว่า 'deflate' โอนการเข้ารหัสโดยใช้รูปแบบ zlib จะเป็นแนวทางที่มีประสิทธิภาพมากขึ้น ( และในความเป็นจริงแล้ว รูปแบบ zlib ได้รับการออกแบบมาเพื่ออะไร) การใช้การเข้ารหัสการถ่ายโอน 'gzip' น่าจะเชื่อถือได้มากกว่าเนื่องจากการเลือกชื่อที่ไม่ดีในส่วนของผู้เขียน HTTP 1.1 "(ที่มา: http://www.gzip.org/zlib/zlib_faq.html )

ดังนั้นคำถามของฉัน: ถ้าฉันส่งข้อมูล RAW deflate ด้วย NO zlib wrapper (หรือ gzip สำหรับเรื่องนั้น) จะมีเบราว์เซอร์ที่ทันสมัย ​​(เช่น IE6 ขึ้นไป FF Chrome Safari ฯลฯ ) ที่ไม่สามารถเข้าใจ Raw deflate บีบอัดข้อมูล (สมมติว่าส่วนหัวคำขอ HTTP "Accept-Encoding" มี "deflate")?

Deflate ข้อมูลจะมีขนาดเล็กกว่า GZIP เพียงไม่กี่ไบต์

หากเบราว์เซอร์เหล่านี้สามารถถอดรหัสข้อมูลได้สำเร็จจะมีข้อเสียอะไรบ้างในการส่ง RAW deflate แทน zlib



อัพเดท 11 กันยายน 2553:

มีการสร้างแพลตฟอร์มการทดสอบสำหรับสิ่งนี้ที่นี่


1
คุณช่วยขยายความได้ไหมว่าทำไม System.IO.Compression.DeflateStream ถึงห่วยเมื่อเทียบกับ zlib.net Google ไม่ได้แสดงให้ฉันเห็นมากนักที่เกี่ยวข้องยกเว้นว่ามีคนพูดถึง "ไม่มีอัตราส่วนการบีบอัดที่ดีเป็นพิเศษ"
Joel Mueller

ใช่แล้วอัตราส่วนการบีบอัดสำหรับทั้งวิธี gzip และ deflate ของ. net ดูเหมือนจะไม่ใกล้เคียงกับที่ควรจะเป็น อย่างไรก็ตามฉันยังไม่ได้ทำการวัดประสิทธิภาพความเร็วระหว่างสอง (zlib.net เทียบกับ. net แบบดั้งเดิม)
David Murdoch

ทำไมคุณไม่บันทึกผลการทดสอบของคุณ
Gumbo

1
ฉันได้เข้าไปดูใน System.IO.Compression lib และดูเหมือนว่าจะใช้โครงสร้างแบบคงที่ / กำหนดไว้ล่วงหน้าดังนั้นการบีบอัดจึงไม่ได้รับการปรับให้เหมาะสมกับสตรีมเฉพาะ ควรเป็นวิธีที่เร็วที่สุด แต่จะให้อัตราส่วนการบีบอัดที่ไม่ดี
Brady Moritz

2
@JoelMueller สิ่งนี้อาจอธิบายได้: virtualdub.org/blog/pivot/entry.php?id=335
Nayuki

คำตอบ:


37

อัปเดต: เบราว์เซอร์ลดการสนับสนุนสำหรับการยุบดิบ zOompf ได้ทำการวิจัยอย่างละเอียดเกี่ยวกับหัวข้อนี้ที่นี่แล้ว น่าเสียดายที่ดูเหมือนว่าการยุบตัวดิบไม่ปลอดภัยที่จะใช้


ตรวจสอบhttp://www.vervestudios.co/projects/compression-tests/resultsสำหรับผลลัพธ์เพิ่มเติม

นี่คือเบราว์เซอร์ที่ผ่านการทดสอบ:

/*  Browser                       DEFLATE      ZLIB     */
    XP Internet Explorer 6        PASS         FAIL
    XP Internet Explorer 7        PASS         FAIL
    XP Internet Explorer 8        PASS         FAIL
    Vista Internet Explorer 8     PASS         FAIL
    XP Firefox 3.6.*              PASS         PASS
    XP Firefox 3.5.3              PASS         PASS
    XP Firefox 3.0.14             PASS         PASS
    Win 7 Firefox 3.6.*           PASS         PASS
    Vista Firefox 3.6.*           PASS         PASS
    Vista Firefox 3.5.3           PASS         PASS
    XP Safari 3                   PASS         PASS
    XP Safari 4                   PASS         PASS     
    XP Chrome 3.0.195.27          PASS         PASS
    XP Opera 9                    PASS         PASS
    XP Opera 10                   PASS         PASS
    XP Sea Monkey 1.1.8           PASS         PASS
    Android 1.6 Browser (v4)*     N/A          N/A
    OS-X Safari 4                 PASS         PASS
    OS X Chrome 7.0.517.44        PASS         PASS
    OS X Opera 10.63              PASS         PASS
    iPhone 3.1 Safari             PASS         PASS

* Android ส่งส่วนหัวคำขอ HTTP "Accept-Encoding: gzip" ไม่อนุญาตให้ยุบ


ฉันสรุปได้ว่าเราสามารถส่งDEFLATE ดิบได้ตลอดเวลา (เมื่อส่วนหัวของคำขอ HTTP "ยอมรับการเข้ารหัส" มี "deflate") และเบราว์เซอร์จะสามารถตีความข้อมูลที่เข้ารหัสได้อย่างถูกต้อง คนนี้สามารถพิสูจน์ได้ว่าผิดหรือไม่?

หมายเหตุ: การใช้งาน DEFLATE (System.IO.Compression.DeflateStream) ของ. NET เป็น DEFLATE แบบดิบ มันก็ห่วยด้วย โปรดใช้zlib.netสำหรับความต้องการการยุบ . NET ทั้งหมดของคุณ


1
คุณสามารถเจาะจงมากขึ้นเกี่ยวกับการใช้ zlib.net สำหรับการยุบหรือไม่? มันตรงกับแผนภูมิด้านบนอย่างไรโดยที่มันบอกว่า raw deflate ใช้งานได้ แต่ zlib ไม่ได้อยู่ใน XP IE บางกรณี
David Eison

Android รองรับการบีบอัดที่ยุบตั้งแต่ API 9 โปรดดูที่: developer.android.com/reference/java/util/zip/…สำหรับข้อมูลเพิ่มเติม
Stuart Blackler

1
@DavidMurdoch ผลเพียงมีสติจากการทดสอบของคุณดูเหมือนว่าจะไม่เคยใช้ยุบ , vervestudios.co/projects/compression-tests/resultsผมคิดว่าคำตอบนี้ควรได้รับการแก้ไขเพื่อสะท้อนให้เห็นว่า
แซม Saffron

ใช่ฉันเห็นด้วย กำลังอัปเดตทันที
David Murdoch

6

เบราว์เซอร์ Android 1.6 (v4) ล้มเหลวทั้งการทดสอบ zlib และการยุบตัวบนหน้าเว็บของคุณ ฉันได้เพิ่มลงในรายการของคุณแล้ว


ขอบคุณ! เบราว์เซอร์ของ Android ส่งการเข้ารหัสเนื้อหาอะไร
David Murdoch

มันส่ง 'Accept-Encoding: gzip'
Josef Pfleger

1

ไม่ใช่กรณีที่การAddOutputFilterByType DEFLATEใช้ mod_deflate ส่งโดย gzip โดยค่าเริ่มต้นหรือไม่?


1
เฮ้พอลฉันรู้สึกเหมือนกำลังคุยกับคนดัง ... คุณอยู่ทุกที่ :-) อย่างไรก็ตามAddOutputFilertByType DEFLATEgzips การตอบสนองแทนที่จะยุบโดยค่าเริ่มต้น (เท่าที่ฉันรู้) Gzipคือdeflate+ ส่วนหัว 10 ไบต์ + ส่วนท้าย 8 ไบต์ - ซึ่งหมายความว่าGzipจะมีขนาดใหญ่กว่าเสมอdeflate... แล้วทำไมเราจึงควรใช้ gzip? (ดูen.wikipedia.org/wiki/Gzip#File_formatสำหรับการแจกแจงรายละเอียดว่า gzip ทำมาจากอะไร) จากที่กล่าวมาฉันไม่แน่ใจว่าจะตั้งค่าdeflateเป็นวิธีการบีบอัดที่ต้องการใน Apache ได้อย่างไร
David Murdoch

-1

เท่าที่ฉันรู้ใช่ - ค่อนข้างมากคุณ "สามารถส่ง DEFLATE แบบดิบได้เสมอและทุกอย่างจะโอเค" ... ไม่มี "เสมอไป" แต่ส่วนใหญ่แล้ว หากไม่เป็นเช่นนั้นนี่เป็นปัญหาของเบราว์เซอร์


ฉันพยายามค้นหากรณีที่การยุบดิบล้มเหลว ตามข้อกำหนดควรล้มเหลวในทุกเบราว์เซอร์
David Murdoch

วัตถุดิบdeflate(เช่นไม่zlibส่วนหัวที่ไม่ทั้งหมด) จะทำงานในIE7ถ้าencoding:gzipและ (ทดสอบเฉพาะใน v24 โครเมี่ยม) encoding:deflateในโครเมี่ยม
Scotty.NET
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.