الطلبات الصغيرة تعمل، والتنزيلات الكبيرة تتعطل، فيقترح أحدهم ضبط MSS. هذا الاقتراح صحيح بما يكفي لأن يستحق التجربة بالترتيب الصحيح، وخاطئ بما يكفي ليضيّع عليك بعد الظهر إن طبقته على العَمى. الفحوص الثلاثة أدناه تفصل بين مشكلة حقيقية في حجم TCP، ومشكلة في UDP، واكتشاف path-MTU معطوب، وضبط لا يرى أصلًا المصافحة التي يفترض أن يعيد كتابتها.

ابدأ من شكل العطل

لعطل الحجم بصمة: يتأسس الاتصال وينجح التحقق والردود الصغيرة، ثم يتوقف النقل بلا نهاية بمجرد أن يحتاج مقطعًا بحجم كامل. الصفحات التي تحمّل النص ولا تُكمل الصورة أبدًا هي العطل نفسه على نطاق أصغر. أما إن لم يتصل أي شيء مطلقًا، فالمشكلة أبكر في المسار ولن يفيد الضبط شيئًا. لا يستطيع الضبط إصلاح مصافحة لم تصل قط.

توجد هذه البصمة لأن المصافحة هي موضع الاتفاق على حجم المقطع. يعلن كل طرف حجم مقطع أقصى كخيار TCP، ويحترم المرسلون إعلان الطرف الآخر. إن لم يقدر المسار على حمل مقطع بهذا الحجم، ظهر العطل لاحقًا حين يحاول المرسل واحدًا أخيرًا.

أبقِ النقل في الحسبان أثناء قراءة تلك الأعراض. الضبط إعادة كتابة لخيار TCP، لذا فمكالمة صوت أو فيديو تتعطل تحت النفق نفسه ليست مشكلة MSS ولن يتحسن حالها بضبطه. دوّن نوع النقل قبل أن تمس خيار TCP.

سعّر المسار ثم قارنه بالنفق

رقمان يهمان ويختلطان كثيرًا. path-MTU هو أكبر حزمة يحملها المسار دون تجزئة، وMSS المعلن في IPv4 هو تلك القيمة ناقص 40 بايتًا لترويسات IP وTCP، أو ناقص 60 في IPv6. تستهلك تغليفة النفق جزءًا من الميزانية قبل أن تبدأ الحزمة الداخلية أصلًا.

ping -M do -s 1400 198.51.100.20
tracepath 198.51.100.20

أمر ping مع بت منع التجزئة يخبرك هل تنجو حزمة بحجم الحمولة ذلك؛ عدّل الحجم حتى يفشل فتكون قد وجدت حد المسار تجريبيًا. يبلّغ خرج tracepath عن MTU المكتشف على طول الطريق، وهو أسرع حين ينجح وأقل موثوقية حين ترشّح قفزة وسيطة الاستكشافات.

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

ضع الضبط حيث تمر المصافحة

يعمل الضبط بإعادة كتابة خيار MSS في حزم SYN وSYN-ACK أثناء عبورها البوابة. إن كانت القاعدة على واجهة لا يعبرها أحد الاتجاهين أبدًا، اكتمل التفاوض كما هو وبقي العطل، ولهذا يحسم الموضع النتيجة أكثر من القيمة.

SymptomWhat it points toNext check
Handshake completes, large transfer stallsSegment size larger than the path can carryPath MTU against the tunnel's effective MTU
Nothing connects, small or largeRouting, firewall or keying failureNot MSS; look at the tunnel state
Only UDP applications stallDatagram size or a dropped ICMP errorPlatform-specific UDP handling, not clamping
Fixed after reconnect, returns laterClamp applied to one direction or one interfaceRule placement and the handshake path

الاتجاه هو النصف الآخر. ضبط اتجاه واحد يصلح نصف التدفقات ويترك الباقي فاشلًا على نحو يبدو متقطعًا، فطبّقه على اتجاهي المرور المُمرَّر. الشكل الكلاسيكي في لينكس لواجهة نفق قاعدة mangle تطابق حزم SYN:

iptables -t mangle -A FORWARD -o tun0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

لاحظ ما يفعله --clamp-mss-to-pmtu فعليًا: يستمد القيمة من MTU الخاص بالمسار، وهو ليس دائمًا ميزانية الحمولة الحقيقية للنفق. على نفق قائم على المسار حيث يختلف المسار الداخلي عن المسار الخارجي، تكون قيمة صريحة محسوبة في الفحص السابق أكثر قابلية للتوقع من قيمة تلقائية.

تحقق باتصال جديد وأبقِ التغذية الراجعة حية

يحتفظ الاتصال القائم بـMSS الذي تفاوض عليه، لذا فالاختبار على الجلسة نفسها لا يثبت شيئًا. افتح اتصالًا جديدًا بعد التغيير واقرأ القيمة المتفاوض عليها مباشرة بدل استنتاجها من نقل يصادف أنه يكتمل.

ss -tin dst 198.51.100.20
iptables -t mangle -S | grep TCPMSS

الأمر الأول يبلّغ عن MSS للمقبس إلى جانب حالة الازدحام، وهو أسرع تأكيد على أن الضبط سرى. والثاني يؤكد أن القاعدة التي تظن أنك أضفتها هي القاعدة الموجودة، في الجدول الذي وُضعت فيه.

ثم احمِ الآلية التي لم تصلحها. يعتمد اكتشاف path-MTU على وصول رسائل ICMP fragmentation-needed إلى المرسل، لذا فجدار ناري يسقطها سيظل يقطع النقل الكبير حتى مع ضبط صحيح في مكانه. اسمح بتلك الرسائل لمسار النفق، أو اقبل أن الضبط يعوّض عن سياسة اخترتها.

أخيرًا قاوم إغراء التعامل مع الضبط كمقبض ضبط. فهو يقيّد حجم المقطع، ما يكلف الإنتاجية على مسارات لم تحتجه قط. تطبيقه بعد الفحوص الثلاثة إصلاح مستهدف؛ وتطبيقه أولًا تغيير يخفي العطل الأصلي ويضيف متغيرًا ثانيًا إلى كل اختبار لاحق. تلك المقايضة تستحق أن تُتخذ عن قصد لا افتراضيًا.

دوّن path-MTU الذي قسته، وعبء النفق الذي طرحته، والقاعدة التي أضفتها، وMSS الذي رأيته بعدها. أربعة أرقام تجعل الحادثة التالية مراجعة سريعة بدل تحقيق.

مقالات ذات صلة