स्थानांतरण-एन्कोडिंग: gzip बनाम सामग्री-एन्कोडिंग: gzip


98

जब यह करना है तो मामलों की वर्तमान स्थिति क्या है

Transfer-Encoding: gzip

या ए

Content-Encoding: gzip

जब मैं उदाहरण के लिए सीमित बैंडविड्थ के साथ ग्राहकों को एक संपीड़ित प्रतिक्रिया को स्वीकार करने की इच्छा को संकेत देने की अनुमति देना चाहता हूं और सर्वर को अंतिम रूप से यह कहना है कि संपीड़ित करना है या नहीं

यदि आप इसे संपीड़न का ध्यान रखते हैं, तो बाद में अपाचे के mod_deflate और IIS करते हैं। संपीड़ित होने के लिए सामग्री के आकार के आधार पर, यह अतिरिक्त काम करेगाTransfer-Encoding: chunked

इसमें एक भी शामिल होगा Vary: Accept-Encoding, जो पहले से ही समस्या पर संकेत देता है। Content-Encodingइकाई का हिस्सा प्रतीत होता है, इसलिए Content-Encodingमात्राओं को इकाई के परिवर्तन से बदलना, यानी एक अलगAccept-Encoding मतलब है हेडर का मतलब है जैसे कि कैश अन्यथा समान इकाई के अपने कैश्ड संस्करण का उपयोग नहीं कर सकता है।

क्या इस पर कोई निश्चित उत्तर है कि मैं चूक गया हूं (और यह संदेश में कुछ अपाचे समाचार समूह में एक लंबे धागे में दफन नहीं है)?

मेरी वर्तमान धारणा है:

  • ट्रांसफर-एन्कोडिंग वास्तव में वही करने का सही तरीका होगा जो मौजूदा सर्वर और क्लाइंट इनकंटेशन द्वारा कंटेंट-एनकोडिंग के साथ किया जाता है।
  • कंटेंट-एनकोडिंग, इसके अर्थ निहितार्थों के कारण, कुछ मुद्दों को उठाता है (सर्वर को क्या करना चाहिए ETag जब यह पारदर्शी रूप से प्रतिक्रिया को संकुचित ?)
  • कारण चिकन'एन'ग है: ब्राउजर इसका समर्थन नहीं करते क्योंकि सर्वर ऐसा नहीं करते क्योंकि ब्राउज़र नहीं करते

इसलिए मैं मान रहा हूं कि सही तरीका एक होगा Transfer-Encoding: gzip(या, अगर मैं इसके अलावा शरीर को काट दूं, तो यह बन जाएगा Transfer-Encoding: gzip, chunked )। और छूने का कोई कारण नहीं VaryयाETag उस मामले में किसी अन्य हेडर किसी क्योंकि यह एक परिवहन-स्तर की बात है।

अभी के लिए मैं 'हॉप-दर-हॉप-नेस' के बारे में बहुत ज्यादा परवाह नहीं करता Transfer-Encoding, ऐसा कुछ जो दूसरों को पहले और सबसे महत्वपूर्ण के बारे में चिंतित लगता है, क्योंकि प्रॉक्सी क्लाइंट को असम्पीडित और अग्रेषित कर सकते हैं। हालाँकि, समरूपता इसे आगे-आगे (-संकुचित) कर सकती है, यदि मूल अनुरोध में उचित Accept-Encodingशीर्ष लेख है, जो सभी ब्राउज़रों के मामले में मुझे पता है कि एक दिया गया है।

Btw, यह मुद्दा कम से कम एक दशक पुराना है, उदाहरण के लिए देखें https://bugzilla.mozilla.org/show_bug.cgi?id=68517

इस पर किसी भी स्पष्टीकरण की सराहना की जाएगी। दोनों को मानक-अनुरूप माना जाता है और व्यावहारिक माना जाता है। उदाहरण के लिए, HTTP क्लाइंट लाइब्रेरी केवल पारदर्शी "सामग्री-एन्कोडिंग" का समर्थन करती है जो व्यावहारिकता के खिलाफ एक तर्क होगा।


2
संबंधित: stackapps.com/questions/916/…
Jo Liss

बस इसी में भाग गया। PHP 5.3 पर कर्ल समझ में नहीं आता है Transfer-Encoding:gzip, हालांकि कमांड लाइन कर्ल करता है। सुरक्षित पक्ष पर होने के लिए, दोनों को भेजें, जब तक कि आप chunked और gzip का संयोजन नहीं कर रहे हैं।
सेवा अलेक्सेयेव

1
@SevaAlekseyev दोनों भेजना बहुत गलत होगा - क्लाइंट दो बार डिकम्प्रेस करने की कोशिश कर सकते हैं
जोशुआ वाइज

यह कुछ ऐसा है जिसने मुझे हमेशा के लिए छोड़ दिया है, यह भी ( प्रश्न मैंने पूछा ) ... प्रति प्रश्न के उत्तर में से एक है कि @ जॉयलिस ने उद्धृत किया है, अनुरोध / प्रतिक्रिया निकायों को संपीड़ित करने के लिए एक पूरी तरह से तार्किक, शब्दार्थ सुसंगत और मानक-अनुरूप तरीका है ... और मूल रूप से कोई क्लाइंट / सर्वर इसका उपयोग या समर्थन नहीं करता है। 🤦🏻i
डैन

जवाबों:


35

रॉय टी। फील्डिंग को उद्धृत करते हुए , RFC 2616 के लेखकों में से एक:

असंगत तरीके से मक्खी पर सामग्री-एन्कोडिंग बदलना (न तो "कभी नहीं" और न ही "हमेशा) उस सामग्री के बारे में बाद के अनुरोधों के लिए असंभव बनाता है (जैसे, PUT या सशर्त GET) को सही तरीके से संभाला जाना। यह, ज़ाहिर है, क्यों प्रदर्शन कर रहा है। ऑन-द-फ्लाई कंटेंट-एन्कोडिंग एक बेवकूफी भरा विचार है, और मैंने बिना ट्रांसफ़ॉर्म-इन-फ्लाई एन्कोडिंग करने के उचित तरीके के रूप में HTTP पर Transfer-Encoding को क्यों जोड़ा।

स्रोत: https://issues.apache.org/bugzilla/show_bug.cgi?id=39727#c31

दूसरे शब्दों में: सामग्री-एन्कोडिंग को ऑन-द-फ्लाई न करें , इसके बजाय ट्रांसफ़र-एन्कोडिंग का उपयोग करें!

संपादित करें: यह है कि जब तक आप ग्राहकों के लिए gzipped सामग्री की सेवा नहीं करना चाहते हैं, जो केवल सामग्री-एन्कोडिंग को समझते हैं । जो, दुर्भाग्य से, उनमें से अधिकांश प्रतीत होता है। लेकिन ध्यान रखें कि आप कल्पना के दायरे को छोड़ देते हैं और ऐसे मुद्दों में भाग सकते हैं जैसे कि क्षेत्ररक्षण के साथ-साथ अन्य का भी उल्लेख किया जाता है, जैसे जब कैशिंग प्रॉक्सी शामिल होते हैं।


3
इसलिए अगर मुझे यह सही लगता है: 1. सामग्री-एन्कोडिंग सार में सर्वर पर सामग्री एन्कोडिंग को संदर्भित करता है, अर्थात सामग्री लगातार सर्वर द्वारा निर्दिष्ट एन्कोडिंग में सेवा की जाएगी। 2. ट्रांसफर-एन्कोडिंग उस एन्कोडिंग को संदर्भित करता है जिसे सर्वर ने इस उदाहरण में उपयोगकर्ता एजेंट को वितरित करने के लिए उपयोग करने का निर्णय लिया, अर्थात इस प्रतिक्रिया में। बस यह सुनिश्चित करना कि मैं आपके उत्तर का गलत अर्थ नहीं निकाल रहा हूँ।
डॉट स्लैश हैक

30
@KemHeyndels अधिकार के बारे में। दूसरा तरीका रखें: ऐनक के अनुसार, ट्रांसफ़र-एन्कोडिंग एक शुद्ध ट्रांसपोर्ट लेयर डिटेल है , यानी एक मध्यवर्ती प्रॉक्सी उस स्तर पर gzip कम्प्रेशन को पूर्ववत करने के लिए स्वतंत्र है, जबकि कंटेंट-एनकोडिंग एक व्यवसायिक लेयर प्रॉपर्टी है , जो एक प्रॉक्सी नहीं होगी अन्य परिवर्तनों (ETags आदि) के अलावा बदलने की अनुमति दी गई है। हालाँकि वास्तविकता के अनुसार , टीई को आमतौर पर संपीड़न के लिए उपयोग नहीं किया जाता है, और कई सर्वर / क्लाइंट इसे बॉक्स से बाहर भी समर्थन नहीं करते हैं, जबकि सीई का इस्तेमाल कमोबेश उसी तरह किया जाता है जिस तरह से TE का उपयोग किया जाना था : परिवहन परत विस्तार के रूप में ।
यूजीन बेरेसोवस्की

1
तो हम रॉय टी। फील्डिंग की सलाह को नजरअंदाज करने के लिए वास्तविकता से बाध्य हैं?
डॉट स्लैश हैक

11
@KemHeyndels आप आदर्शवाद से बाहर जाने के लिए बाध्य हैं और सबसे पहले सभी ओपन-सोर्स HTTP क्लाइंट / बैंकिंग कार्यान्वयनों में TE सपोर्ट जोड़ें। फिर अपने आप को हर उस कंपनी में नियोजित करवाएं जिसमें क्लोज्ड सोर्स HTTP इंप्लीमेंटेशन हो (मुझे लगता है कि यह केवल वैसे भी माइक्रोसॉफ्ट है) और वहां भी फीचर जोड़ें। उसके बाद, वास्तविकता और कल्पना का मेल होगा। ;) (और HTTP 2.0 जारी किया गया है, जिससे समस्या वैसे भी दूर हो जाएगी)
यूजीन बेरेसोव्स्की

10
यह संकेत करते हुए कि आप ट्रांसफर-एन्कोडिंग का समर्थन करते हैं, फिर भी यह स्पष्ट नहीं होता है कि आप ट्रांसफर-एन्कोडिंग पर gzip का समर्थन करते हैं, ताकि आप कुछ भी न खरीदें। इंडिकेशन को दूसरे तरीके से किया जाता है : कोई भी क्लाइंट जो ट्रांसफर-एन्कोडिंग के माध्यम से gzip कर सकता है, वह सर्वर को सेटिंग द्वारा बताएगा TE: gzip। और फिर आपका सर्वर ट्रांसफर-एन्कोडिंग मार्ग पर जाना चाहिए। यदि क्लाइंट केवल कहता है Accept-Encoding: gzip, तो आपको इसे करना होगा Content-Encoding। यदि क्लाइंट अपने अनुरोध में न तो निर्दिष्ट करता है, तो सर्वर को बिल्कुल भी gzip नहीं करना चाहिए।
यूजीन बेर्सेव्स्की

27

सही उपयोग, के रूप में RFC 2616 में परिभाषित किया गया है और वास्तव में जंगली में लागू, ग्राहक एक भेजने के लिए है Accept-Encodingअनुरोध हेडर (ग्राहक से अधिक एन्कोडिंग निर्दिष्ट कर सकता है)। सर्वर तब और केवल तभी क्लाइंट के समर्थित एन्कोडिंग के अनुसार प्रतिक्रिया को एन्कोड कर सकता है (यदि फ़ाइल डेटा पहले से ही उस एन्कोडिंग में संग्रहीत नहीं है), Content-Encodingप्रतिक्रिया हेडर में इंगित करें कि कौन सा एन्कोडिंग का उपयोग किया जा रहा है। क्लाइंट तब Transfer-Encoding(यानी, chunked) के आधार पर सॉकेट से डेटा को पढ़ सकता है और फिर Content-Encoding(यानी: के आधार पर इसे डीकोड कर सकता है)gzip )।

तो, आपके मामले में, ग्राहक एक Accept-Encoding: gzipअनुरोध हेडर भेजेगा , और फिर सर्वर सेक करने का निर्णय ले सकता है (यदि पहले से नहीं है) Content-Encoding: gzipऔर वैकल्पिक रूप से भेजेंTransfer-Encoding: chunked प्रतिक्रिया हैडर ।

और हाँ, Transfer-Encodingहेडर का उपयोग अनुरोधों में किया जा सकता है, लेकिन केवल HTTP 1.1 के लिए, जिसके लिए क्लाइंट और सर्वर कार्यान्वयन chunkedदोनों दिशाओं में एन्कोडिंग का समर्थन करना आवश्यक है ।

ETagविशिष्ट रूप से सर्वर पर संसाधन डेटा की पहचान करता है, न कि डेटा वास्तव में प्रसारित किया जा रहा है। यदि किसी दिए गए URL संसाधन का ETagमान बदल जाता है, तो इसका मतलब है कि उस संसाधन के लिए सर्वर-साइड डेटा बदल गया है।


14
सामग्री-कोडिंग अनुरोध-यूआरआई द्वारा पहचानी जाने वाली इकाई की एक विशेषता है । दूसरे शब्दों में: अलग-अलग की Content-Encodingआवश्यकता होती हैETag यह btw है जो मेरे जवाब में mod_deflate बग का उल्लेख करता है। मुझे आश्चर्य होता है कि यह एप्लिकेशन-स्तरीय विवरण पहली जगह में HTTP मानक में क्यों है। Transfer-Encodingहालांकि, परिवहन स्तर सेटिंग का उपयोग करते समय , बदलने की आवश्यकता नहीं है ETag। सिवाय किसी ने भी ट्रांसफर-एनकाउंटर लागू नहीं किया है।
यूजीन बेरेसोव्स्की

2
सामग्री-एन्कोडिंग "मक्खी पर" एन्कोडिंग के लिए नहीं है। RFC 2616 का कहना है "ट्रांसफर-एनकोडिंग ... सामग्री-कोडिंग से अलग है कि ट्रांसफर-कोडिंग संदेश की एक संपत्ति है, इकाई की नहीं।" ( tools.ietf.org/html/rfc2616#sl-14-14.41) ), और "सामग्री-कोडिंग अनुरोध-यूआरआई द्वारा पहचानी गई इकाई की एक विशेषता है। आमतौर पर, इकाई-निकाय को इस एन्कोडिंग के साथ संग्रहीत किया जाता है" ( टूल्स . ietf.org/html/rfc2616#section-14.11 )। इसलिए मैं वोट देता हूं।
रॉबर्ट

मैंने जो वर्णन किया है, वह " वास्तव में जंगली में लागू किया गया " है, Content-Encodingबनाम की परवाह किए बिना Transfer-Encoding। हां, गज़िप एक संसाधन के हस्तांतरण की संपत्ति होनी चाहिए , अगर ऑन-द-फ्लाई किया जाता है। दूसरी ओर, यदि संसाधन को सर्वर पर संपीड़ित किया जाता है, तो यह संसाधन की सामग्री का एक गुण होना चाहिए , अगर-जैसा भेजा जाता है। लेकिन क्या होना चाहिए और क्या वास्तव में हमेशा एक ही चीज नहीं होती है।
रेमी लेबेउ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.