एक टीसीपी स्ट्रीम में पैकेट आकार


10

मैं नेटवर्क ट्रैफ़िक हूं और प्रत्येक टीसीपी सत्र को अनुरोधों और प्रतिक्रियाओं की एक श्रृंखला में विभाजित करना चाहता हूं (प्रोटोकॉल जो मैं उस तरह से काम कर रहा हूं जैसे HTTP या एसएसएल)।

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

पैकेट 1 - अनुरोध "प्राप्त करें ..."

पैकेट 2 - प्रतिक्रिया, आकार 1434

पैकेट 3 - प्रतिक्रिया, आकार 1434

पैकेट 4 - प्रतिक्रिया, आकार 1434

पैकेट 5 - प्रतिक्रिया, आकार 500

जो कि मुझे अधिकांश सत्रों में मिलता है, हालांकि कम से कम एक बार मैंने देखा कि जो दिखता था

पैकेट 1 - अनुरोध "प्राप्त करें ..."

पैकेट 2 - प्रतिक्रिया, आकार 1434

पैकेट 3 - प्रतिक्रिया, आकार 1080

पैकेट 4 - प्रतिक्रिया, आकार 1434

पैकेट 5 - प्रतिक्रिया, आकार 500

यहाँ कोई पैकेट नहीं, ऑर्डर पैकेट बाहर या सर्वर पर कोई असाधारण देरी नहीं।

मैं जानना चाहता हूं - यह क्या कारण हो सकता है और यह कब होगा? मेरी धारणा कितनी गलत है?

अपडेट करें

मैंने यहाँ एक उदाहरण pcap फ़ाइल रखी

अद्यतन २

tsharkप्रासंगिक क्षेत्रों के साथ एक डंप सहित ...

$ tshark -r http_1082.pcap -T fields -e frame.number -e frame.len \
    -e ip.src -e ip.dst -e tcp.flags.push -e http.request.method \
    -e http.request.uri -e http.response.code | head -n 47
1     66      192.168.1.103    206.33.49.126    0            
2     62      206.33.49.126    192.168.1.103    0            
3     64      192.168.1.103    206.33.49.126    0            
4     411     192.168.1.103    206.33.49.126    1    GET    /money/.element/script/3.0/video/xmp/xmp_playlistapi.js    
5     54      206.33.49.126    192.168.1.103    0            
6     1434    206.33.49.126    192.168.1.103    0            
7     1434    206.33.49.126    192.168.1.103    0            
8     64      192.168.1.103    206.33.49.126    0            
9     1434    206.33.49.126    192.168.1.103    0            
10    1434    206.33.49.126    192.168.1.103    0            
11    1434    206.33.49.126    192.168.1.103    0            
12    64      192.168.1.103    206.33.49.126    0            
13    1434    206.33.49.126    192.168.1.103    0            
14    1434    206.33.49.126    192.168.1.103    0            
15    1434    206.33.49.126    192.168.1.103    0            
16    1434    206.33.49.126    192.168.1.103    0            
17    64      192.168.1.103    206.33.49.126    0            
18    1434    206.33.49.126    192.168.1.103    0            
19    1434    206.33.49.126    192.168.1.103    0            
20    1434    206.33.49.126    192.168.1.103    0            
21    1434    206.33.49.126    192.168.1.103    0            
22    1434    206.33.49.126    192.168.1.103    0            
23    64      192.168.1.103    206.33.49.126    0            
24    1434    206.33.49.126    192.168.1.103    0            
25    1434    206.33.49.126    192.168.1.103    0            
26    1434    206.33.49.126    192.168.1.103    0            
27    1434    206.33.49.126    192.168.1.103    0            
28    1434    206.33.49.126    192.168.1.103    0            
29    1434    206.33.49.126    192.168.1.103    0            
30    64      192.168.1.103    206.33.49.126    0            
31    1434    206.33.49.126    192.168.1.103    0            
32    1434    206.33.49.126    192.168.1.103    0            
33    1434    206.33.49.126    192.168.1.103    0            
34    1082    206.33.49.126    192.168.1.103    1     <------ Packet in question        
35    1434    206.33.49.126    192.168.1.103    0            
36    1434    206.33.49.126    192.168.1.103    0            
37    1434    206.33.49.126    192.168.1.103    0            
38    64      192.168.1.103    206.33.49.126    0            
39    1434    206.33.49.126    192.168.1.103    0            
40    1434    206.33.49.126    192.168.1.103    0            
41    1434    206.33.49.126    192.168.1.103    0            
42    1434    206.33.49.126    192.168.1.103    0            
43    1434    206.33.49.126    192.168.1.103    0            
44    1434    206.33.49.126    192.168.1.103    0            
45    1434    206.33.49.126    192.168.1.103    0            
46    626     206.33.49.126    192.168.1.103    1            200
47    64      192.168.1.103    206.33.49.126    0 

इसके कई कारण हो सकते हैं ... विंडो का आकार बहुत छोटा हो सकता है (हालाँकि आपके मामले में बहुत कम संभावना है), भेजने के लिए पर्याप्त डेटा नहीं हो सकता है (क्या स्क्रिप्ट द्वारा उत्पन्न आउटपुट है?), सॉफ्टवेयर डेटा उत्पन्न कर सकता है? स्पष्ट रूप से इसे फ्लश कर दिया है, इत्यादि
सेंडर स्टीफन

@SanderSteffann, खिड़की का आकार प्रासंगिक नहीं लगता है, ऐक्स काफी नियमित अंतराल पर आते हैं। पूरी प्रतिक्रिया एक जावास्क्रिप्ट है, इसलिए मुझे नहीं लगता कि यह किसी अन्य स्क्रिप्ट द्वारा बनाई गई है।
वडिम

@vadim, क्या आप एक स्क्रीनशॉट या बेहतर पोस्ट कर सकते हैं, 1080 बाइट पेलोड के साथ पेज पर हाइपरलिंक?
माइक पेनिंगटन

@MikePennington - आपके इनपुट के लिए धन्यवाद, मैं कई घंटों में pcap फ़ाइल का लिंक प्रदान करूँगा।
वादिम

@MikePennington - मैंने एक pcap फ़ाइल का लिंक जोड़ा है जो यह प्रदर्शित करता है।
वादिम

जवाबों:


6

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

तो यह इरादा और सामान्य व्यवहार है।



ठीक है, वहाँ था कि मूल RFC में किया जा करने के लिए बनाया गया था और क्या किया था winsock और कुर्सियां
fredpbaker

पेजर को देखने के बाद, यह बहुत कम संभावना नहीं है कि वेबसर्वर ने PS के ओपी के ट्रैफिक पर सेट किया
माइक पेनिंगटन

3

पैकेट का आकार इस बात पर निर्भर करता है कि एप्लिकेशन और / या OS बफ़र्स और नेटवर्क डेटा कैसे भेजता है। यदि आवेदन और / या OS 1080 बाइट्स के बाद डेटा भेजने का निर्णय करता है, तो पैकेट 1080 बाइट्स (प्लस हेडर) होगा। ऐसा करने के कई कारण हो सकते हैं। आपके मामले में आपको वेबसर्वर स्रोत कोड और / या OS नेटवर्क स्टैक में देखना होगा।


मुझे अधिकतम आकार के साथ बहुत सारे पैकेट दिखाई देते हैं और केवल यह एक छोटे आकार के साथ है, इसलिए यह किसी प्रकार का डिफ़ॉल्ट नहीं है। क्या यह एक सर्वर हिचकी हो सकता था - यह एक देरी के लिए कुछ और पर अटक गया था जो कि नेटवर्क स्टैक के लिए यह तय करने के लिए पर्याप्त था कि बफर में क्या था?
वादिम

ज़रूर, कुछ भी हो सकता था। सर्वर और डिबगिंग पर चलने वाले ओएस के बिना बताने का कोई तरीका नहीं है। लेकिन यह IMHO के बारे में चिंतित होने के लिए कुछ भी नहीं है।
सेबेस्टियन विसिंगर

मैं चिंतित नहीं हूं, यह सिर्फ अजीब लग रहा था और मैं यह पता लगाना चाहता था कि क्या इससे ज्यादा है।
वादिम

1
यदि आपके पास PSH (पुश) बिट के लिए 1080 पैकेट टीसीपी हेडर में वायरशर्क लुक है। यह एप्लिकेशन स्टैक कह रहा है कि यह डेटा अभी भेजें।
fredpbaker

1
ऊपर देखें, ज्यादातर मामलों में इसकी टीसीपी स्टैक
fredpbaker

1

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

कभी-कभी चलने वाले ऐप्स की मात्रा ओएस को तेज करने की मांग कर सकती है (बफर में अब तक जो कुछ भी है उसे भेजें) बफर को संतृप्त करने के बजाय।

शायद, आप हमें उस परिदृश्य के बारे में अधिक जानकारी दे सकते हैं जिसके साथ आप काम कर रहे थे (उदाहरण: सर्वर ओएस, इस पर चलने वाले ऐप)।


0

मूल रूप से समस्या यह है कि टीसीपी कार्यान्वयन यह नहीं जानता है कि आवेदन आगे क्या करने जा रहा है। जब सर्वर एप्लिकेशन राइट का एक क्रम बनाता है तो स्टैक को यह नहीं पता होता है कि जो राइट उसे अभी तक प्राप्त हुआ है वह पूरे सीक्वेंस हैं या उसका केवल एक हिस्सा हैं।

अधिकांश समय सर्वर अनुप्रयोग बफर को तेज लिखता है, जबकि नेटवर्क स्टैक इसे खाली करने में सक्षम होता है। तो बफर भरा हुआ है और पूर्ण आकार के पैकेट बाहर आते हैं।

लेकिन कभी-कभी कुछ और सर्वर एप्लिकेशन को धीमा कर देता है। शायद एक अतिभारित डिस्क सरणी या कुछ और पर पढ़े गए डिस्क का इंतजार कर रहा है। तो बफर खाली हो जाता है और नेटवर्क स्टैक को एक छोटे पैकेट (अधिक ओवरहेड) को भेजने या डेटा के लिए इंतजार करने के बीच चयन करना पड़ता है जो कभी नहीं आ सकता है (देरी को जोड़ना)।


0

यदि आप फ्रेम 34 को देखते हैं, तो आप देखेंगे कि सर्वर ने 32kB बफर ट्रांसमिट कर दिया है और PSH बिट सेट है। यदि आप 82 को देखते हैं, तो आप पिछले PSH बिट से समान, 32 kB देखेंगे। पैकेट 52 में PSH बिट है भले ही प्रतिक्रिया की 2kB से कम हो।

PSH बिट आमतौर पर एक नेटवर्क के लिए लिखे गए अनुप्रयोग PDU के अंतिम खंड के लिए एक टीसीपी स्टैक द्वारा निर्धारित किया जाता है। इसलिए एप्लिकेशन एक 32kB बफर का उपयोग करता है और जब बहुत अधिक डेटा होता है, तो इसे एक समय में टीसीपी सॉकेट 32kB पर लिखते हैं। जब फ्रेम में 51-52 की तुलना में कम डेटा होता है, तो यह इसलिए है क्योंकि एप्लिकेशन ने उस रिकॉर्ड को पहले प्रतिक्रिया में लिखा था और यह केवल 1820 बाइट्स था।

ध्यान दें कि जिस एप्लिकेशन को मैं संदर्भित करता हूं वह वास्तव में सर्वर एप्लिकेशन ही नहीं, बल्कि कुछ मध्यवर्ती सॉफ़्टवेयर जैसे कि जावा वर्चुअल मशीन (जेवीएम) या जो भी हो। यह डेटा सामग्री से स्पष्ट नहीं है कि 1820 बाइट पीडीयू को क्यों भेजा गया था, शायद एक 32kB बफर उस समय उपलब्ध नहीं था?

मुद्दा यह है कि इससे कोई फर्क नहीं पड़ता, कोई ठोस प्रदर्शन जुर्माना नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.