قم بإجراء اكتشاف مسار MTU دون الاعتماد على أخطاء ICMP، والتي لا يتم تسليمها غالبًا.
يقوم هذا البرنامج باكتشاف MTU لمسار طبقة الحزم كما هو موضح في RFC 4821، وهي طريقة أكثر موثوقية لاكتشاف حجم MTU في وجود ثقوب سوداء لـ ICMP.
في حين أن اتصالات TCP تقوم تلقائيًا بضبط حجم MTU بمرور الوقت اعتمادًا على مؤشرات مختلفة (أداء الشبكة، وفقدان الحزمة، ورسائل خطأ ICMP، ...)، فإن هذا ليس هو الحال بالنسبة للبروتوكولات ذات الاتصال الأقل.
عندما يكون الأداء ضروريًا، فإن الإنتاجية وتجزئة الحزمة وموثوقية المسار هي ثلاثة مؤشرات رئيسية يجب تحليلها من أجل تحسين أداء التدفق. نظرًا لأن موثوقية المسار لا تعتمد علينا دائمًا، فيجب علينا أن نسعى جاهدين لزيادة الإنتاجية إلى أقصى حد مع عدم إجراء تجزئة الحزمة ، مما قد يؤدي إلى انخفاض الأداء بشدة [1] .
اعتمد الاقتراح الأصلي الخاص بـ Path MTU Discovery على حزم ICMP Fragmentation Needed
ليتم تسليمها عندما تكون حزمة IPv4 مع مجموعة حقول "عدم التجزئة" كبيرة جدًا بحيث لا يمكن نشرها. لسوء الحظ، بعض أجهزة التوجيه لا تولد هذا النوع من الأخطاء ولكنها تختار تجاهل الحزم الكبيرة بصمت بدلاً من ذلك. ليس لدى العميل طريقة لتحديد سبب فقدان الحزمة.
نظرًا لأن جميع المضيفين مفوضون بدعم استعلامات ICMP_ECHO، فيمكننا استغلال حقيقة أن رسائل ICMP تقبل كمية عشوائية من البيانات وترسل حزمًا مختلفة الحجم إلى الخادم الخاص بنا. إذا قمنا بتشغيل الحقل "عدم التجزئة" في حزمة IPv4 واستمعنا للرد، فإننا في الواقع ننتظر ACK (في شكل حزمة ICMP_ECHOREPLY) يؤكد أن حجم وحدة الإرسال الكبرى هذا صالح.
الآن علينا فقط إجراء بحث ثنائي فيما يتعلق بحجم الحزم للعثور على الحد الأقصى لحجم MTU الذي يدعمه هذا المسار.
عندما تكون في وضع ICMP، يتم إنشاء بعض طلبات ICMP_ECHO ذات أحجام مختلفة.
ICMP Fragmentation Needed
)، فسيتم الإعلان عن أن حجم وحدة الإرسال الكبرى هذا غير صالح ويتم خفض الحد.الشرط الوحيد لوضع ICMP هو أن المضيف يجب أن يكون قادرًا على الرد على رسائل ping.
تنطبق نفس الخوارزمية على حزم UDP، لكنك تحتاج إلى تشغيل خادم ( udp_server.py ) على مضيفك المتلقي لتتمكن من إرسال رسائل الإقرار.
يجب أن يعمل هذا البرنامج بشكل جيد على معظم توزيعات Linux وOSX.
gcc -Wall -Wextra mtu_discovery.c mtu.c -o plpmtu
لا ينبغي أن يبلغ عن التحذيرات/الأخطاء. إذا كان الأمر كذلك، يرجى فتح قضية.
إذا كنت تريد التشغيل في وضع ICMP، فاكتب:
sudo ./plpmtu -p icmp -s <server-ipaddr>
إذا كنت تريد تشغيل وضع UDP بدلاً من ذلك:
sudo ./plpmtu -p udp -s <server-ipaddr:port>
حقوق المسؤول مطلوبة من أجل استخدام مآخذ التوصيل الأولية.
محدد | وصف |
---|---|
-ص {icmp/udp} | حدد الوضع الذي تريد التشغيل فيه. |
-s <addr[:port]> | تحديد عنوان الخادم. إذا كنت تعمل في وضع UDP، فيجب عليك أيضًا تحديد منفذ الوجهة عن طريق إلحاق ':port' (على سبيل المثال -s 8.8.8.8:12345 ) |
-l <addr:port> | خياري. حدد العنوان الذي سيتم ربطه () ؛ المستخدمة في وضع UDP؛ قد تتم إزالتها. |
-t <مهلة> | خياري. حدد الحد الأقصى للوقت لانتظار الرد من الخادم، الافتراضي هو ثانية واحدة؛ يتم التعبير عن الوقت بالمللي ثانية. |
-r <الحد الأقصى للطلبات> | خياري. حدد الحد الأقصى لعدد المحاولات الفاشلة اللازمة لإعلان أن حجم وحدة الإرسال الكبرى غير صالح، الافتراضي هو 3 محاولات. |
sudo ./plpmtu -p icmp -s 184.12.26.131
قم بإجراء اكتشاف MTU (وضع ICMP) باستخدام 184.12.26.131.
sudo ./plpmtu -p udp -s 184.12.26.131:24000 -t 1500 -r 5
قم بإجراء اكتشاف MTU (وضع UDP) باستخدام 184.12.26.131 على المنفذ 24000. إذا لم يتم تلقي استجابة خلال 1.5 ثانية لمدة 5 مرات متتالية، فقم بتقليل عتبة MTU.