2009-10-07 13 views
7

यदि मेरे पास एक बड़ा HTTP पैकेट है जो कई टीसीपी पैकेट में विभाजित हो गया है, तो मैं उन्हें एक ही HTTP पैकेट में कैसे पुनर्निर्माण कर सकता हूं? असल में, जहां पैकेट में मैं यह बताना चाहता हूं कि एक HTTP पैकेट कब शुरू/समाप्त हो रहा है? मुझे टीसीपी हेडर में किसी भी झंडे/फ़ील्ड दिखाई नहीं दे रहे हैं जो HTTP पैकेट की शुरुआत या अंत को दर्शाता है।HTTP पैकेट पुनर्निर्माण

संपादित करें: प्रतिक्रियाओं का पालन करें। यदि टीसीपी धारा का प्रबंधन करता है, तो यह कैसे पता चलता है कि स्ट्रीम कब शुरू होती है और समाप्त होती है? क्या यह सॉकेट खोलने और बंद होने से निर्धारित है? कुछ स्तर पर कुछ प्रोटोकॉल, यह जानने में सक्षम होना चाहिए कि HTTP स्ट्रीम/पैकेट कब शुरू हो गया है और समाप्त हो गया है। यही वह है जिसे मैं जानना चाहता हूं।

जिस स्थिति में मैं हूं, मैं सी # में एक पैकेट स्निफ़ेर का उपयोग कर रहा हूं जो टीसीपी पैकेट में पढ़ता है, और मैं HTTP अनुरोध/प्रतिक्रिया/आदि का पुनर्निर्माण करने में सक्षम होना चाहता हूं। इंटरफ़ेस के माध्यम से जा रहा है जैसे वायरशर्क और कई अन्य स्नीफर्स कैसे प्रबंधित करते हैं। वैकल्पिक रूप से कोई सी # पुस्तकालय है जो आपको HTTP स्ट्रीम में उच्च स्तर पर टैप करने देता है, जिससे मुझे HTTP स्ट्रीम/पैकेट को पुनर्निर्माण करने की बचत होती है?

धन्यवाद।

उत्तर

10

ठीक है मैंने यह काम किया कि यह कैसे करें (डोडी लेकिन यह काम पूरा हो जाता है)।

ईथरनेट, आईपी और टीसीपी हेडर को 'कच्चे' डेटा संदेश के साथ छोड़ना आसान है। संदेश के अंदर देखकर, यह पता लगाना आसान है कि यह पैकेट की शुरुआत में "HTTP/1.1 ..." की तलाश करके HTTP पैकेट की शुरुआत है या नहीं। यह इंगित करता है कि पैकेट एक HTTP स्ट्रीम/बड़ा पैकेट/जो भी हो, की शुरुआत है। आप "सामग्री-लंबाई" फ़ील्ड को पढ़ने के लिए कुछ सरल पार्सिंग भी कर सकते हैं जो संपूर्ण HTTP पैकेट की कुल लंबाई है।

आप लिंक के लिए एक अद्वितीय आईडी बनाने के लिए स्रोत/गंतव्य आईपी & पोर्ट नंबर का भी उपयोग कर सकते हैं। तो हेडर पैकेट प्राप्त करने के बाद, इन 4 चीजों (एसआरसीआईपी, एसआरसीपीओआर, डेस्टिप, डिस्टपोर्ट) पर ध्यान दें। अगली बार जब आप इस पोर्ट/आईपी कॉम्बो से मेल खाते हुए पैकेट प्राप्त करेंगे, तो आप जांच सकते हैं कि यह HTTP पैकेट का अगला भाग है या नहीं। आप अनुक्रम संख्याओं का उपयोग कुछ सत्यापन और शायद अन्य सामान करने के लिए कर सकते हैं, लेकिन आम तौर पर पैकेट क्रम में होते हैं, इसलिए यह ठीक है।मुझे लगता है कि प्रत्येक HTTP स्ट्रीम के लिए एक नया पोर्ट खोला जाता है, इसलिए आपको यादृच्छिक पैकेट नहीं मिलना चाहिए जो स्ट्रीम का हिस्सा नहीं हैं, लेकिन यह त्रुटि के लिए प्रवण क्षेत्र हो सकता है।

वैसे भी, एक बार आपको यह पैकेट प्राप्त हो जाने के बाद, एक बार फिर हेडर को हटा दें और कच्चा संदेश प्राप्त करें। इसे संदेश के पहले से ज्ञात हिस्से में जोड़ें। यदि अब तक प्राप्त कुल संदेश की लंबाई "सामग्री-लंबाई" फ़ील्ड से पढ़ने वाली लंबाई के बराबर है, तो पैकेट पूर्ण हो गया है!

यह विधि स्पष्ट रूप से बड़ी मात्रा में त्रुटियों के लिए प्रवण है, लेकिन मैं इसे करने का एक बेहद मजबूत तरीका नहीं हूं। मैंने सोचा कि अगर मैं भविष्य में किसी और मुद्दे पर आता हूं तो मैं अपने प्रश्न का उत्तर दूंगा! अपने स्नीफिंग के साथ शुभकामनाएँ: डी

+2

सामग्री-लंबाई क्षेत्र निर्धारित नहीं है तो, वहाँ लंबाई भी काम करने के लिए अन्य तरीके हैं। जैसे http://www.httpwatch.com/httpgallery/chunked/ – mike

+2

थोड़ी देर हो सकती है, लेकिन 'सामग्री-लंबाई' शीर्षलेख कुल पैकेट लंबाई निर्दिष्ट नहीं करता है। यह केवल सामग्री के आकार को निर्दिष्ट करता है, इस प्रकार शरीर, जो हेडर के बाद आता है। शीर्षलेख और शरीर को \ r \ n \ r \ n' से अलग किया जाता है। –

7

आपको HTTP अनुरोध सीमा निर्धारित करने के लिए टीसीपी स्तर से किसी भी जानकारी का उपयोग नहीं करना चाहिए। टीसीपी एक विश्वसनीय बाइट स्ट्रीम सेवा प्रदान करता है; आप टीसीपी में किसी भी फ़ील्ड या झंडे को नहीं देख सकते हैं जो इससे मदद करते हैं क्योंकि वे वहां नहीं हैं।

यह निर्धारित करने के लिए कि सीमाएं HTTP अनुरोध में कहां हैं, आपको आरएफसी 2616 का पालन करना चाहिए। सीमाएं अच्छी तरह परिभाषित हैं, और आप उन्हें प्राप्त डेटा को पार्स करके निर्धारित कर सकते हैं।

2

टीसीपी धारा प्रोटोकॉल है, पैकेट प्रोटोकॉल नहीं। एप्लिकेशन लेयर (यानी आप) डेटा की स्ट्रीम प्राप्त करते हैं, न कि पैकेट का गुच्छा। आप बस स्ट्रीम से बाइट्स पढ़ते रहते हैं और आपको अपना पूरा http पेलोड मिल जाएगा, जबकि टीसीपी त्रुटि जांच, resends, आदि नीचे करता है।

4

प्रत्येक टीसीपी पैकेट में, पेलोड डेटा की शुरुआत टीसीपी हेडर के तुरंत बाद होती है, और पेलोड डेटा का अंत आईपी पैकेट का अंत होता है।

टीसीपी हेडर का अंत आसानी से पाया जाता है - Data Offset शीर्षलेख में एक 4-बिट फ़ील्ड है जिसमें 32-बिट शब्दों में शीर्षलेख की लंबाई होती है (इसलिए 8 से लंबाई प्राप्त करने के लिए इसे 4 से गुणा करें। बिट बाइट्स)।

सही क्रम में पेलोड को एक साथ स्ट्रिंग करने के लिए Sequence फ़ील्ड से टीसीपी अनुक्रम संख्या का उपयोग करें। ध्यान दें कि पुन: ट्रांसमिशन के मामले में डुप्लीकेट हो सकते हैं।

1

हमें एक ही समस्या को हल करने पर काम करना पड़ा। हम ओपन सोर्स प्रोजेक्ट में कुछ कोर कार्यक्षमता निकालने में सक्षम थे।

http://code.google.com/p/pcap-reconst/

कृपया इसे बाहर की जाँच और मुझे पता है अगर यह आपकी सहायता करते हैं।

+0

मुझे आपके कोड का उपयोग करने में दिलचस्पी है। स्रोत में बहुत गहराई से खोदने के बिना, क्या आपका प्रोजेक्ट एक संभालता है) 'कंटेंट-एन्कोडिंग' हेडर के आधार पर संपीड़ित डेटा को डिकंप्रेस करता है, बी) 'सामग्री-प्रकार' में 'वर्णसेट' के आधार पर एक सामान्य टेक्स्ट एन्कोडिंग में कनवर्ट करना हेडर और सी) 'ट्रांसफर-एन्कोडिंग' हेडर 'chunked' पर सेट होने पर खंडित एन्कोडिंग से निपटना? –

2

आप Xplico नामित ओपन सोर्स प्रोजेक्ट के कोड का उपयोग कर सकते हैं: http://www.xplico.org

संबंधित मुद्दे