2012-06-13 15 views
6

मैं कोडप्लेक्स संस्करण 1.1 से c# webserver के साथ काम कर रहा हूं। मैंने स्वीकृति-रेंज हेडर लागू किए हैं और यह काम करता है। लेकिन जब मैं wireshark (संस्करण /trunk-1.4 से 1.4.1 (SVN रेव 34476)) का उपयोग यातायात को पकड़ने के लिए, मैं निम्न देखें:एचटीपी रेंज हेडर अनुरोध पूरी फ़ाइल

GET /movies/i_am_legend%20dvd/main.m4v HTTP/1.1 
Host: 10.100.1.199:8081 
Accept: */* 
Range: bytes=0-1 
Accept-Encoding: identity 
Connection: keep-alive 
User-Agent: AppleCoreMedia/1.0.0.9B206 (iPad; U; CPU OS 5_1_1 like Mac OS X; nl_nl) 
X-Playback-Session-Id: 9CED81CC-BFAE-4CF6-A477-0EA62B2C652F 

HTTP/1.1 206 PartialContent 
Content-Range: bytes 0-1/652965648 
Accept-Ranges: bytes 
ETag: "0daA8D4/wgt4MFvxdNIPLw==" 
Date: Wed, 13 Jun 2012 09:10:18 GMT 
Content-Length: 2 
Content-Type: video/x-m4v 
Server: Tiny WebServer 
Connection: keep-alive 

.. << 2 bytes data 

GET /movies/i_am_legend%20dvd/main.m4v HTTP/1.1 
Host: 10.100.1.199:8081 
Accept: */* 
Range: bytes=0-652965647 
Accept-Encoding: identity 
Connection: keep-alive 
User-Agent: AppleCoreMedia/1.0.0.9B206 (iPad; U; CPU OS 5_1_1 like Mac OS X; nl_nl) 
X-Playback-Session-Id: 9CED81CC-BFAE-4CF6-A477-0EA62B2C652F 

HTTP/1.1 206 PartialContent 
Content-Range: bytes 0-652965647/652965648 
Accept-Ranges: bytes 
ETag: "0daA8D4/wgt4MFvxdNIPLw==" 
Date: Wed, 13 Jun 2012 09:10:18 GMT 
Content-Length: 652965648 
Content-Type: video/x-m4v 
Server: Tiny WebServer 
Connection: keep-alive 

वेबसर्वर पूरे फाइल भेजने की कोशिश करेंगे (> 600MB), वायरशर्क दिखाता है कि पूरी बातचीत 159774 बाइट्स है। मैं आईआईएस के साथ एक ही काम करते हैं अगर मैं इसी तरह के हेडर प्राप्त

GET /ipod/main.m4v HTTP/1.1 
Host: 10.100.1.199 
User-Agent: AppleCoreMedia/1.0.0.9B206 (iPad; U; CPU OS 5_1_1 like Mac OS X; nl_nl) 
Accept: */* 
Range: bytes=0-1 
Accept-Encoding: identity 
X-Playback-Session-Id: C5BBF91D-78AB-42BA-ACE0-D74AB9D845CE 
Connection: keep-alive 

HTTP/1.1 206 Partial Content 
Content-Type: video/x-m4v 
Last-Modified: Mon, 11 Jun 2012 10:33:41 GMT 
Accept-Ranges: bytes 
ETag: "7243cabbd47cd1:0" 
Server: Microsoft-IIS/7.5 
X-Powered-By: ASP.NET 
Date: Wed, 13 Jun 2012 09:21:03 GMT 
Content-Length: 2 
Content-Range: bytes 0-1/652965648 

.. << 2 bytes of data 

GET /ipod/main.m4v HTTP/1.1 
Host: 10.100.1.199 
User-Agent: AppleCoreMedia/1.0.0.9B206 (iPad; U; CPU OS 5_1_1 like Mac OS X; nl_nl) 
Accept: */* 
Range: bytes=0-652965647 
Accept-Encoding: identity 
X-Playback-Session-Id: C5BBF91D-78AB-42BA-ACE0-D74AB9D845CE 
Connection: keep-alive 

HTTP/1.1 206 Partial Content 
Content-Type: video/x-m4v 
Last-Modified: Mon, 11 Jun 2012 10:33:41 GMT 
Accept-Ranges: bytes 
ETag: "7243cabbd47cd1:0" 
Server: Microsoft-IIS/7.5 
X-Powered-By: ASP.NET 
Date: Wed, 13 Jun 2012 09:21:03 GMT 
Content-Length: 652965648 
Content-Range: bytes 0-652965647/652965648 

Wireshark पता चलता है कि पूरी बातचीत 175,615 बाइट है।

मैंने स्वीकृति-रेंज हेडर पर अधिक जानकारी की खोज की है, और अब तक मुझे केवल यह पता चल सकता है कि सर्वर को अनुरोधित सीमा भेजनी होगी। लेकिन मुझे विश्वास नहीं है कि यह एक समय में एक बड़ी फाइल का अनुरोध करने के लिए एक सीमा अनुरोध का उपयोग करना था।

मेरा वेबसर्वर पूरी फ़ाइल भेजने की कोशिश करता है क्योंकि इस तरह से अनुरोध किया गया है, लेकिन मुझे इस तरह की बड़ी श्रृंखलाओं के साथ आने वाले नए रेंज अनुरोध दिखाई देते हैं (अनुरोध हेडर से केवल रेंज हेडर कॉपी किया गया है। (@time। ..) wireshark

Range: bytes=2162688-652965647 (@ time == 1.646204) 
Range: bytes=4980736-652965647 (@ time == 2.754322) 
Range: bytes=6356992-652965647 (@ time == 2.922479) 

के समय this मैं कोशिश की है पढ़ने के बाद एक छोटी रेंज जब भी मैं पूरी फ़ाइल के लिए रेंज अनुरोध प्राप्त भेजने के लिए है। लेकिन तब यह बिल्कुल काम नहीं करता।

मैं जानना चाहता हूं:

  1. पूरी फ़ाइल के लिए रेंज अनुरोध आईओएस में बग के कुछ प्रकार है (और साथ 4.3.3 के साथ देखा जाता है) मैं Range: bytes=0-1 अपेक्षा की होगी और Range: bytes=0-65535/652965648
  2. तरह पुनरावृत्ति कुछ के बाद मैं किसी भी तरह शान से इस बड़े से इनकार कर सकते हैं है अनुरोध करें और अनुरोध करें कि मैं एक बार में अधिकतम आकार दे सकता हूं? (मुझे यह आरएफसी में नहीं मिला)
  3. क्या आईआईएस कुछ निश्चित बाइट्स के बाद इस अनुरोध को निरस्त कर रहा है?

संपादित: नंबर 3 के लिए: आईआईएस नहीं लेकिन ब्राउज़र बस निरस्त (और समापन) कनेक्शन लगता है। उसके बाद एक नया अनुरोध कर रहा है। मैं कल्पना नहीं कर सकता कि रेंज अनुरोध पूरी फ़ाइल या फ़ाइल के बड़े हिस्सों का अनुरोध करने के लिए था।

संपादित करें: आईओएस 7 में ऐसा लगता है। पहला रेंज अनुरोध अभी भी वही है (बाइट 0-1)। इसके बाद, मुझे ऊपर वर्णित 2 या 3 रेंज अनुरोध दिखाई देते हैं, जहां अंतिम अनुरोध लंबी अवधि के लिए बाइट्स को स्थानांतरित करता रहता है। हालांकि अभी भी कई अनुरोध किए गए हैं। बाइट्स = 0-1 और तरह पुनरावृत्ति कुछ के बाद:

+2

मैं [समान व्यवहार देख रहा हूं] (http://stackoverflow.com/questions/12637728/http-byte-range-protocol-client-behaviour-on-ipad-iphone), और मेरे लिए ऐसा लगता है आईपैड/आईफोन मुद्दा। – mindas

+0

@ मिन्दास वास्तव में आप एक ही चीज़ का सामना कर रहे हैं। मेरे द्वारा उपयोग किए जाने वाले वेबसर्वर की संरचना के कारण, मेरे पास अधिक विकल्प नहीं है और सीमा अनुरोध को संभालने से रोकने के लिए अपवाद को फिर से फेंकने की आवश्यकता है। सौभाग्य से मेरे पास एक ही समय में केवल 1 क्लाइंट कनेक्शन है (लेकिन यह 2 या 3 के साथ भी काम करता है)। मुझे आशा है कि आपको कुछ उपयोगी उत्तर मिलेगा। –

+1

हम अपने परीक्षण में जो देखते हैं वह है सफारी पहले दो बाइट्स (रेंज 0-1) के लिए पूछता है, फिर यह पूरी फाइल के लिए पूछता है और तुरंत कनेक्शन बंद कर देता है, फिर यह * फाइल के पिछले कुछ सौ किलोबाइट * के लिए पूछता है (जो मुझे संदेह है कि इसमें महत्वपूर्ण मेटाडाटा शामिल है। क्रोम वैसे ही वही काम करता है), और उसके बाद यह फ़ाइल को छोटे हिस्सों में शुरू होने से शुरू करने के लिए कहता है। मुझे संदेह है कि वीडियो प्रारूप के आधार पर सटीक पैटर्न अलग-अलग होगा। –

उत्तर

3
  1. पूरी फ़ाइल के लिए रेंज अनुरोध आईओएस में बग के कुछ प्रकार है (और साथ 4.3.3 के साथ देखा जाता है) मैं अपेक्षा की होगी रेंज है रेंज: बाइट्स = 0-65535/652965648

मैं नहीं जानता कि क्या यह एक बग है। हालांकि, मैं एक मीडिया प्लेयर के लिए एक अनुरोध में पूरी फाइल का अनुरोध करने के कारणों के बारे में सोच सकता हूं। इस तरह मीडिया प्लेयर को डेटा स्ट्रीम मिल जाता है, जिससे यह सभी डेटा को शुरू से ही समाप्त करने के लिए पढ़ सकता है।

जैसे ही मीडिया प्लेयर ने स्ट्रीम से पर्याप्त डेटा पढ़ा है, यह मीडिया फ़ाइल खेलना शुरू कर सकता है। यह तब चुनता है कि मीडिया बजाने के दौरान पृष्ठभूमि में कितना डेटा बफर होगा। इसके लिए कई अलग-अलग दृष्टिकोण हो सकते हैं:

  • उत्सुकता से पूरी मीडिया फ़ाइल को बफर करें। यह एक अच्छी रणनीति है जब बैंडविड्थ सस्ता है (उपयोगकर्ता डेटा हस्तांतरण के लिए फ्लैट दर का भुगतान नहीं कर रहा है या भुगतान नहीं कर रहा है)। यह माना जाता है कि उपयोगकर्ता पूरी मीडिया फ़ाइल को देखना/सुनना चाहेगा।

  • लगी बफर केवल लापरवाही से बचने के लिए पर्याप्त है। बैंडविड्थ महंगा है (उपयोगकर्ता बाइट द्वारा भुगतान कर रहा है) यह एक अच्छी रणनीति है।

    एक आदर्श सेटअप में, मीडिया प्लेयर को वास्तविक समय में मीडिया खेलने के दौरान स्ट्रीम से डेटा को डीकोड करने की आवश्यकता नहीं होती है। हालांकि, यह आवश्यक होगा कि अंतर्निहित नेटवर्क चैनल हर समय आवश्यक गति से सुपर स्थिर और हस्तांतरण डेटा होगा।

    यह मामला नहीं है, और इसलिए मीडिया प्लेयर आगे कुछ सेकंड या मिनट बफर करना चुनता है।

यह ध्यान रखें कि जो कुछ भी रणनीति चुन लिया जाता है यह अभी भी मतलब हो सकता है मीडिया प्लेयर एक अनुरोध में पूरे संसाधन का अनुरोध करने के लिए महत्वपूर्ण है।

  • कनेक्शन (किसी भी कारण से) निरस्त किया गया है:

    हालांकि, सीमा अनुरोध जब मीडिया प्लेयर के लिए महत्वपूर्ण हैं।

  • उपयोगकर्ता मीडिया में आगे बढ़ता है। (उदाहरण के लिए, देखना चाहता है कि मूवी में 10 मिनट क्या है)

मीडिया प्लेयर तब मूल रूप से खोला गया डेटा स्ट्रीम बंद कर सकता है और वांछित स्थिति के लिए एक रेंज अनुरोध भेज सकता है।

  1. मैं किसी भी तरह शान से इस बड़े अनुरोध को अस्वीकार और बता अनुरोध किया है कि मैं एक अधिकतम आकार एक ही बार में वितरित कर सकते हैं कर सकते हैं?

नहीं, आप नहीं कर सकते। रेंज अनुरोध क्लाइंट/ब्राउज़र द्वारा शुरू किए जाते हैं और एक सर्वर ने कहा है कि यह रेंज अनुरोधों का समर्थन करता है (Accept-Ranges शीर्षलेख के माध्यम से) को ग्राहक का पालन करना होगा और अनुरोध की गई सीमा के साथ जवाब देना चाहिए।

हालांकि आप क्या कर सकते हैं Transfer-Encoding: chunked शीर्षलेख के साथ डेटा भेजने के लिए। यह आपके सर्वर को यह नियंत्रित करने में सक्षम करेगा कि डेटा के कितने बड़े भाग प्रेषित होंगे। हालांकि, यह अभी भी एक ही HTTP कनेक्शन पर किया गया है।

+1

व्यापक प्रतिक्रिया के लिए धन्यवाद। मैं इसे उत्तर के रूप में चिह्नित करूंगा। –