2010-02-08 15 views
10

में tcpdump के साथ काम करना मैं 2.6.9-55.ELsmp, x86_64 चला रहे एक लिनक्स बॉक्स चला रहा हूं।टीसीपी को सी में विंडो प्राप्त करना और लिनक्स

rwnd = 1024; 
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&rwnd, sizeof(rwnd)); 

कोड खंड के ऊपर ग्राहक कार्यक्रम है कि एक सर्वर से डेटा प्राप्त में है:

मैं टीसीपी स्थापित करने के लिए कोशिश कर रहा हूँ setsockopt() सी मैं निम्नलिखित की कोशिश का उपयोग कर समारोह का उपयोग करके खिड़की प्राप्त । जब मैं कार्यक्रम प्राप्त करते हैं और tcpdump उत्पादन निरीक्षण करने के लिए शुरू, मैं इतना की तरह खिड़की बातचीत पर ध्यान दें:

11:34:40.257755 IP clientReceiver.42464 > serverSender.8991: 
S 1742042788:1742042788(0) win 5840 
<mss 1460,sackOK,timestamp 1688222886 0,nop,wscale 2> 

हम देखते हैं कि क्लाइंट प्रोग्राम तथ्य एक खिड़की है कि मैं क्या क्लाइंट प्रोग्राम में निर्धारित किया है से अलग बातचीत कर रहा है। हालांकि, मैं स्टीवन के पाठ ("टीसीपी/आईपी इलस्ट्रेटेड, वॉल्यूम 1") की व्याख्या कैसे कर सकता हूं, धारा 20.4, मेरा मानना ​​है कि आप धारा 20.4 में दूसरे ब्लॉक उद्धरण में संदर्भित करते हैं जो मैं सेटोकॉप्ट() कॉल का उपयोग करके करता हूं (ऊपर देखें)।

मैं समझना चाहता हूं कि मैं कहां गलत हो गया हूं।

शायद स्टीवन कह रहे हैं कि मेरी व्याख्या गलत है। उस स्थिति में, क्या आप मुझे बफर आकार प्राप्त करने के सही तरीके से इंगित कर सकते हैं? मेरे भ्रम के सबूत के रूप में, मैं लिनक्स टीसीपी सॉकेट मैन पेज को http://linux.die.net/man/7/tcp पर देखता हूं (SO_RCFBUF पर टिप्पणी देखें)।

मुझे इस कहानी में क्या याद आ रही है? मैं प्राप्त बफर आकार को नियंत्रित कैसे करूं (और यह tcpdump आउटपुट में दिखाया गया है)? कृपया ध्यान दें कि मैं यहां सॉकेट विकल्प SO_RCFBUF की एक सेटिंग का संकेत देता हूं - मैं समझता हूं कि एसईएन में विंडो वार्ता में क्या दिखाया गया है।

किसी भी इनपुट की सराहना की जाती है।

उत्तर

8

तुम भी उपयोग करने के लिए TCP_WINDOW_CLAMP

rcvbuf = 2048; 
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)& rcvbuf, sizeof(rcvbuf)); 
clamp = 1024; 
setsockopt(sock, SOL_SOCKET, TCP_WINDOW_CLAMP, (char *)& clamp, sizeof(clamp)); 

नोट rcvbuf दो बार क्लैंप है की जरूरत है, इसे और अधिक हो सकता है। आप इसे ऑटोट्यून कर सकते हैं, विंडो क्लैंप अभी भी काम करेगा। यह पोर्टेबल नहीं है।

+1

में कितना लंबित डेटा है, यह भी ध्यान दें कि न्यूनतम क्लैंप न्यूनतम आरसीवीबीयूएफ (आमतौर पर 4096 - तक न्यूनतम क्लैंप आमतौर पर 2048) तक सीमित है। – caf

+0

मैंने इसे चेक किया, और संख्याएं न्यूनतम सेटटेबल CLAMP मान resp के लिए वास्तव में 256 और (इस प्रकार) 128 हैं। TCP_WINDOW_CLAMP के मामले में tcp.c :: setockopt() से कोड देखें, और sock.h :: # SOCK_MIN_RCVBUF 256 को परिभाषित करें।सभी को धन्यवाद। चीयर्स! – Sonny

4

सॉकेट कनेक्ट करने से पहले प्राप्त बफर आकार को कम किया जा सकता है - आप इसे किसी भी समय बढ़ा सकते हैं। कनेक्ट() के सापेक्ष आप किस क्रम को सॉकोपट() कहते हैं?

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद। मैं कनेक्ट() से पहले सेटॉकॉप() को कॉल करता हूं। – Sonny

-6

टीसीपी के लिए, आरवीएनडी मूल्य आरईवी के दौरान पारित किया जाना है।

recv (सॉक, buf, rwnd, 0);

यह 1024 बाइट प्राप्त करेगा।

+0

हाय, आपकी प्रतिक्रिया के लिए धन्यवाद। मुझे पता है कि यह recv() कॉल एप्लिकेशन के लिए है - यानी, यह वह दर है जिस पर एप्लिकेशन बाइट स्ट्रीम का उपभोग करता है। दूसरे शब्दों में, मुझे विश्वास नहीं है कि यह प्राप्तकर्ता विंडो है जो ने पीयर द्वारा शुरुआत में टीसीपी द्वारा पर बातचीत की थी। – Sonny

+0

यह एक एप्लिकेशन बफर आकार है, न कि प्राप्त विंडो। प्राप्त खिड़की सॉकेट द्वारा निर्धारित बफर आकार को निर्धारित करती है कि – EJP

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