سؤال

أنا أعمل على برنامج طبقة النقل الزائفة الذي يعمل عبر UDP ، مما يوفر ناقل حركة موثوق به موجه نحو الاتصال ، كبديل لـ TCP. من أجل زيادة كفاءة الشبكة إلى الحد الأقصى ، نقوم بالاستعلام عن MTU لمحول الشبكة "الأفضل" عند التهيئة.

MIB_IFROW row = {0};
row.dwIndex = dwBestIfIndex;

dwRes = GetIfEntry(&row);

البحث عبر الإنترنت ، وجدت أنه يمكنك استخدام أوامر NetSh التالية للاستعلام عن هذه القيمة نفسها ، من موجه الأوامر (وليس API C ++)

netsh interface ipv4 show interfaces
netsh interface ipv4 show subinterfaces

تكمن المشكلة المقلقة في أنه على الرغم من أن ROW.DWMTU قد يتم ضبطه على 1500 ، إلا أن تطفل حركة مرور الشبكة على الكمبيوتر المحمول المرسل يوضح أن حزمنا مجزأة في حزمة بايت 1300. تقارير Netsh أيضا أن MTU هي 1300.

من الواضح أن القيمة التي تم الإبلاغ عنها بواسطة أمر NETSH هي القيم الفعلية المستخدمة. أي شخص يعرف ما هي واجهة برمجة التطبيقات التي يمكنني الاتصال بها للحصول على نفس القيم مثل Netsh؟

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

المحلول

هناك حجم MTU المحلي ومسار MTU (انظر RFC 1191). يمكنك استخدام أوامر مثل

ping -f -l 1464 www.stackoverflow.com
ping -f -l 1465 www.stackoverflow.com

لتحديد مسار mtu. خذ في الاعتبار حجم رأس حزم ICMP ورؤوس IP. نرى مسار MTU الاكتشاف لمحلول API.

محدث: من فضلك لا المزيد من هذه الأسئلة! كان من المثير للاهتمام بالنسبة لي أن أجد الإجابة وأقضي بعض الساعات لهذا الغرض. لكن ... لقد وجدت! لتلقي القيمة الصحيحة لحجم MTU يجب عليك استخدامها GetIpInterfaceTable API الذي يعود PMIB_IPINTERFACE_TABLE الهيكل الذي يحتوي على مجموعة من MIB_IPINTERFACE_ROW الهياكل. MIB_IPINTERFACE_ROW قبعة InterfaceIndex مما يساعدك على تحديد واجهة IP ، فهو نفسه كما هو الحال في وظائف مساعد IP غير المعروفة. تستطيع ايضا استخذام ConvertInterfaceLuidToNameW وظيفة لتلقي من حقل آخر InterfaceLuid اسم الواجهة.

لكن الشيء الأكثر إثارة للاهتمام هو nlmtu مجال

typedef struct _MIB_IPINTERFACE_ROW {
    ADDRESS_FAMILY Family;
    NET_LUID InterfaceLuid;
    NET_IFINDEX InterfaceIndex;
    // ...
    ULONG NlMtu;
    // ...
};

في الوثائق (انظر http://msdn.microsoft.com/en-us/library/AA814496(V=VS.85).aspx) يوصف باسم "حجم طبقة الشبكة mTU ، في البايتات.". نفس النص ولم يعد تجده أيضًا في وثائق مجموعة برنامج التشغيل Windows (انظر http://msdn.microsoft.com/en-us/library/ff559254(vs.85).aspx). هذا الحقل nlmtu هو ما تبحث عنه. جهاز الكمبيوتر الخاص بي على سبيل المثال متصل بالإنترنت من خلال جهاز توجيه DSL و NlMtu ليس 1500 كما لو كان بدون جهاز التوجيه ، ولكن لديه القيمة الصحيحة 1492 بدلاً من ذلك. في حالتك يجب أن يكون 1300.

إذا كان لديك أحد الإصدارات الأخيرة من تثبيت Microsoft SDK ، فستجد في C: Program Files Microsoft SDKS Windows V7.0 samples netds iphelp netinfo الدليل مثال على الاستخدام GetIpInterfaceTable API. فقط قم بتعيين نقطة فرامل على الخط حوالي 270 في Netinfo.c ملف وسترى في InterfaceTable->Table[i].NlMtu القيمة الصحيحة لـ IP MTU من محول الواجهة المقابلة. إذا تحقق في السجل ضمن hkey_local_machine system currentControlset services tcpip parameters interfaces {34407201-997c-41ff-9ebf-1b7d6df92b38} لها قيمة mtu_dward } في حالتي) يجب أن تكون نفس القيمة.

الوظيفة GetIpInterfaceTable موجود بدءًا من Vista ، ولكن كيف يمكنك أن ترى من الاسم PMIB_IPINTERFACE_TABLE تأتي القيم من معلومات MIB الخاصة بمحول TCP (Windows DDK). منذ بضع سنوات ، لم يكن هناك أي مساعد IP DLL على الإطلاق ، وتلقي المعلومات التي تعرض ipconfig.exe على المرء أن يستخدم CreateFile و DeviceIoconTrol لإعطاء مثل هذه المعلومات من برنامج تشغيل TCP TDI (انظر الثوابت مثل L " tcp tcp" TCPIOCTL.H). لذلك ربما يكون من الممكن إعطاء نفس المعلومات على نظام التشغيل Windows XP ، لكنه ليس مهمًا.

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