سؤال

أقوم بتشغيل مربع Linux يعمل 2.6.9-55.elsmp، X86_64.

أحاول ضبط نافذة تلقي TCP باستخدام الدالة Setsockopt () باستخدام C. جرب ما يلي:

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

مقطع التعليمات البرمجية أعلاه هو في برنامج عميل يتلقى البيانات من الخادم. عندما أرد البرنامج لتلقي وإخراج 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>

نرى أن برنامج العميل في الواقع يتفاوض في نافذة مختلفة عن ما قمت بتعيينه في برنامج العميل. ومع ذلك، من الطريقة التي يمكنني بها تفسير نص ستيفن ("TCP / IP الموضح، المجلد 1")، أعتقد أنك تؤثر على ما يشير إليه في اقتباس الكتلة الثانية في القسم 20.4 باستخدام مكالمة Setsockopt () التي أستخدمها (انظر أعلاه ).

أود أن أفهم المكان الذي ذهبت فيه خطأ.

ربما تفسير ما هو ستيفنز يقول غير صحيح. في هذه الحالة، هل يمكن أن تشيرني إلى الطريقة الصحيحة لتحديد حجم المخزن المؤقت تلقي؟ كدليل على الارتباك، أحيل صفحة MAN Linux TCP Sockets في http://linux.die.net/man/7/tcp. (انظر التعليق على so_rcfbuf).

ما أنا في عداد المفقودين في هذه القصة؟ كيف يمكنني التحكم في حجم تلقي المخزن المؤقت (ولديه عرضه في إخراج Tcpdump)؟ يرجى ملاحظة أنني تلمح هنا إعداد خيار المقبس SO_RCFBUF - أفهم أن هذا ما يظهر في مفاوضات النافذة في SYN.

أي مدخلات موضع تقدير.

هل كانت مفيدة؟

المحلول

تحتاج أيضا إلى استخدام 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 هو ضعف المشبك، فقد يكون أكثر. يمكنك السماح لها تلقائية، فإن المشبك النافذة ستظل يعمل. هذا غير محمول.

نصائح أخرى

يمكن تخفيض حجم تلقي المخزن المؤقت فقط قبل توصيل المقبس - يمكنك زيادة ذلك في أي وقت. ما هي الترتيب الذي تتصل فيه Sockopt () في النسبي للاتصال ()؟

بالنسبة ل TCP، يتم تمرير قيمة RWND أثناء RecV.

Recv (جورب، بوف، RWND، 0)؛

يجب أن يحصل هذا على 1024 بايت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top