Tại sao nên sử dụng deflate thay vì gzip cho các tệp văn bản được cung cấp bởi Apache?


215

Những ưu điểm nào mang lại cho phương thức này đối với các tệp html, css và javascript được cung cấp bởi máy chủ LAMP. Có những lựa chọn thay thế tốt hơn?

Máy chủ cung cấp thông tin cho một ứng dụng bản đồ bằng Json, do đó, một khối lượng lớn các tệp nhỏ.

Xem thêm Có bất kỳ hit hiệu suất nào liên quan đến việc chọn gzip trên deflate để nén http không?


đã chuyển các câu trả lời được chấp nhận ... sự đồng thuận hiện tại là hai thành một có lợi cho gzip
Ken

1
mod_deflate dành cho Apache 2, mod_gzip dành cho Apache 1.3.
XUÂN

Câu trả lời:


315

Tại sao nên sử dụng deflate thay vì gzip cho các tệp văn bản được cung cấp bởi Apache?

Câu trả lời đơn giản là không .


RFC 2616 định nghĩa giảm phát là:

deflate Định dạng "zlib" được định nghĩa trong RFC 1950 kết hợp với cơ chế nén "deflate" được mô tả trong RFC 1951

Định dạng zlib được định nghĩa trong RFC 1950 là:

     0   1
     +---+---+
     |CMF|FLG|   (more-->)
     +---+---+

       0   1   2   3
     +---+---+---+---+
     |     DICTID    |   (more-->)
     +---+---+---+---+

     +=====================+---+---+---+---+
     |...compressed data...|    ADLER32    |
     +=====================+---+---+---+---+

Vì vậy, một vài tiêu đề và tổng kiểm tra ADLER32

RFC 2616 định nghĩa gzip là:

gzip Một định dạng mã hóa được tạo bởi chương trình nén tệp "gzip" (GNU zip) như được mô tả trong RFC 1952 [25]. Định dạng này là mã hóa Lempel-Ziv (LZ77) với CRC 32 bit.

RFC 1952 định nghĩa dữ liệu nén là:

Định dạng hiện sử dụng phương pháp nén DEFLATE nhưng có thể dễ dàng mở rộng để sử dụng các phương pháp nén khác.

CRC-32 chậm hơn ADLER32

So với kiểm tra dự phòng theo chu kỳ có cùng độ dài, nó giao dịch độ tin cậy cho tốc độ (ưu tiên kiểm tra sau).

Vì vậy, ... chúng ta có 2 cơ chế nén sử dụng cùng một thuật toán để nén, nhưng một thuật toán khác nhau cho các tiêu đề và tổng kiểm tra.

Bây giờ, các gói TCP cơ bản đã khá đáng tin cậy , vì vậy vấn đề ở đây không phải là Adler 32 vs CRC-32 mà GZIP sử dụng.


Hóa ra nhiều trình duyệt trong những năm qua đã thực hiện một thuật toán khử lỗi không chính xác. Thay vì mong đợi tiêu đề zlib trong RFC 1950, họ chỉ đơn giản mong đợi tải trọng nén. Tương tự các máy chủ web khác nhau đã mắc lỗi tương tự.

Vì vậy, qua nhiều năm, các trình duyệt bắt đầu thực hiện logic mờ khử lỗi , họ cố gắng kiểm tra tiêu đề zlib và tổng kiểm tra, nếu thất bại, họ cố gắng tải trọng.

Kết quả của việc có logic phức tạp như thế là nó thường bị hỏng. Verve Studio có phần kiểm tra đóng góp của người dùng cho thấy tình hình tồi tệ như thế nào.

Ví dụ: deflate hoạt động trong Safari 4.0 nhưng bị hỏng trong Safari 5.1, nó cũng luôn có vấn đề trên IE.


Vì vậy, điều tốt nhất cần làm là tránh xì hơi hoàn toàn, việc tăng tốc độ nhỏ (do adler 32) không đáng để mạo hiểm với tải trọng bị hỏng.


Không nên có một tiêu chuẩn mới kết hợp adler32 với gzip?
Pacerier

1
@Sam Saffron, điều này có nghĩa là nếu trình duyệt web không có trong ảnh, tôi có thể sử dụng def def over gzip? Chẳng hạn, nếu tôi sẽ tải một tệp nén lên máy chủ FTP của mình.
Xegara

1
Một sự khác biệt rất nhỏ khác là trình bao bọc zlib là sáu byte so với 18 byte cho gzip. Vì vậy, đối với các gói rất nhỏ, có thể có một lợi thế để gửi ít hơn 12 byte. Tuy nhiên, kết luận không thay đổi, đó là do Microsoft đã vặn nó cho mọi người bằng cách hiểu sai ý nghĩa của "def def" trong những gì họ cung cấp trên máy chủ IIS của họ, việc sử dụng định dạng gzip sẽ dễ dàng hơn.
Đánh dấu Adler

Nhưng làm thế nào tải trọng có thể bị phá vỡ, nếu nó được truyền bằng TCP? Toàn bộ ý tưởng của TCP là truyền tải trọng không bị gián đoạn.
dùng1095108

Ngày trả lời này từ năm 2012. Vì vậy, các trình duyệt hiện đại vẫn gặp phải vấn đề về việc triển khai không chính xác các thuật toán khử rung hoặc có an toàn để sử dụng ngay bây giờ không? Đây có phải là một phần của câu trả lời vẫn được cập nhật?
ihebiheb

172

GZip chỉ đơn giản là giảm phát cộng với tổng kiểm tra và tiêu đề / chân trang. Deflate là nhanh hơn , mặc dù, như tôi đã học một cách khó khăn.

đồ thị gzip vs defat


13
Chưa kể rằng zlib không hỗ trợ cho tiện ích mở rộng và ngay cả khi có, lệnh CRC32 trong SSE 4.2 sử dụng đa thức 1EDC6F41 và định dạng gzip sử dụng EDB88320 đa thức - các thuật toán hoàn toàn khác nhau, một cách hiệu quả.
Jack Lloyd

7
Và vì def def nhanh hơn, tại sao SO sử dụng gzip?
David Murdoch

40
Chà, câu trả lời này hóa ra không chính xác ... xem: zoompf.com/blog/2012/02/lose-the-wait-http-compression ... cụ thể khách hàng có 2 cách họ có thể "diễn giải" xì hơi, không tiêu đề / checksumless và với tiêu đề zlib. Việc thực hiện trên các trình duyệt của một def def chính xác là xấu. xì hơi nên tránh.
Sam Saffron

4
@sam Ngoài ra, tôi vừa chạy lại điểm chuẩn và trên chip Intel hiện đại, tôi nhận được gzip 1441/692 và giảm phát 1286/531. Số thứ hai là giải nén, đầu tiên là nén. Vì vậy, deflate vẫn nhanh hơn, làm tiêu chuẩn của bạn hiển thị khác? (Tôi đồng ý rằng nó có thể không hữu ích vì những lý do khác, nhưng câu trả lời là chính xác , giảm phát nhanh hơn ..)
Jeff Atwood

6
@JeffAtwood nhưng câu hỏi không nhanh hơn?
Ken

16

Bạn có khả năng không thể thực sự chọn def def như một tùy chọn. Trái ngược với những gì bạn có thể mong đợi mod_deflate không sử dụng deflate mà là gzip. Vì vậy, trong khi hầu hết các điểm được đưa ra là hợp lệ, có khả năng nó không phù hợp với hầu hết.


4

Tôi nghĩ rằng không có sự khác biệt lớn giữa deflate và gzip, bởi vì gzip về cơ bản chỉ là một tiêu đề bao quanh def def (xem RFCs 1951 và 1952).


3

Lý do chính là việc giảm phát nhanh để mã hóa nhanh hơn gzip và trên một máy chủ bận rộn có thể tạo ra sự khác biệt. Với các trang tĩnh, đó là một câu hỏi khác, vì chúng có thể dễ dàng được nén trước một lần.


có lẽ với gzip bạn không thể bắt đầu truyền tiêu đề cho đến khi bạn thu được, lưu trữ và nén tất cả dữ liệu? (vì bạn cần tổng kiểm tra để tạo tiêu đề)
OJW

8
Trong định dạng gzip, tổng kiểm tra xuất hiện ở phần cuối của tệp, do đó, người ta có thể bắt đầu viết các khối khử phát khi chúng được xử lý mà không phải giữ mọi thứ.
Jack Lloyd

2

mod_deflate yêu cầu ít tài nguyên hơn trên máy chủ của bạn, mặc dù bạn có thể phải trả một khoản tiền phạt nhỏ về số lượng nén.

Nếu bạn đang phục vụ nhiều tệp nhỏ, tôi khuyên bạn nên đo điểm chuẩn và tải thử nghiệm các giải pháp nén và không nén của mình - bạn có thể thấy một số trường hợp cho phép nén sẽ không tiết kiệm.


Đối với bất cứ ai đang tự hỏi, với việc xì hơi các tệp văn bản của tôi sẽ tăng từ 30KB đến 10KB - vì vậy các tệp phải nhỏ hơn nữa để không nhận được bất kỳ khoản tiết kiệm nào. Tôi đoán ít hơn 1KB hoặc một cái gì đó tương tự.
hextech

0

Không nên có bất kỳ sự khác biệt nào trong gzip & def def để giải nén. Gzip chỉ là giảm phát với một vài chục byte tiêu đề bao quanh nó bao gồm cả tổng kiểm tra. Tổng kiểm tra là lý do cho việc nén chậm hơn. Tuy nhiên, khi bạn đang giải nén hàng trăm tập tin, bạn muốn những tổng kiểm tra đó là kiểm tra sự tỉnh táo trong hệ thống tập tin của bạn. Ngoài ra, bạn có thể sử dụng các công cụ dòng lệnh để lấy số liệu thống kê trên tệp. Đối với trang web của chúng tôi, chúng tôi đang giải nén một tấn dữ liệu tĩnh (toàn bộ thư mục mở, 13.000 trò chơi, tự động hoàn thành cho hàng triệu từ khóa, v.v.) và chúng tôi được Alexa xếp hạng nhanh hơn 95% so với tất cả các trang web. Tìm kiếm Faxo. Tuy nhiên, chúng tôi sử dụng một máy chủ web độc quyền phát triển tại nhà. Apache / mod_deflate chỉ không cắt nó. Khi các tệp đó được nén vào hệ thống tệp, bạn không chỉ nhấn vào tệp của mình với kích thước khối hệ thống tệp tối thiểu mà tất cả các chi phí không cần thiết trong việc quản lý tệp trong hệ thống tệp mà máy chủ web có thể quan tâm ít hơn. Mối quan tâm của bạn phải là tổng dung lượng đĩa và thời gian truy cập / giải nén và tốc độ thứ hai để có thể có được dữ liệu này được giải nén. Dấu chân rất quan trọng vì mặc dù dung lượng ổ đĩa rẻ nhưng bạn muốn càng nhiều càng tốt để phù hợp với bộ đệm.


GZip có thể kiểm tra tổng kiểm tra về giải nén, do đó chênh lệch tốc độ cho giải nén.
Seun Osewa

-1

Trên Ubuntu với Apache2 và module deflate đã được cài đặt (mà nó là theo mặc định), bạn có thể bật deflate nén gzip trong hai bước đơn giản:

a2enmod deflate
/etc/init.d/apache2 force-reload

Và bạn đang đi! Tôi tìm thấy các trang tôi phục vụ qua kết nối adsl của tôi được tải nhanh hơn nhiều.

Chỉnh sửa: Theo nhận xét của @ GertvandenBerg, điều này cho phép nén gzip, không phải giảm phát.


6
Ngoại trừ việc cho phép gzip, vì mod_deflate chỉ thực hiện việc nén gzip một cách khó hiểu ...
Gert van den Berg

@GertvandenBerg Tôi đã cập nhật câu trả lời của mình, nhưng đối với bản ghi, gzip bị khử, chỉ với các tiêu đề bổ sung và tổng kiểm tra
Aidan

@aiden yep nhưng tổng kiểm tra có tác động hiệu suất ... (và def def thô không tuân thủ tiêu chuẩn)
Gert van den Berg

-4

nếu tôi nhớ chính xác

  • gzip sẽ nén nhiều hơn một chút so với giảm phát
  • xì hơi hiệu quả hơn

2
gzip được xì hơi với một tiêu đề. Và HTTP 1.1 deflate thực sự là zlib (cũng là một trình bao bọc xung quanh def def)
David Murdoch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.