نفقك المنقسم يستثني المشغّل، لا اللعبة
يشغّل المشغّل ملفًا تنفيذيًا آخر للمباراة، وتملك تلك العملية مقابسها الخاصة. اعثر على العملية الحقيقية، وطابق المعرّف الصحيح، ثم اختبر.
تضيف المشغّل إلى قائمة الاستثناءات، فيقفز التنزيل من بطيء إلى سريع، وتبقى المباراة تهبط على خادم بعيد. لا شيء معطّل. المشغّل واللعبة عمليتان بمجموعتين من المقابس، واستثناء إحداهما لا يقول شيئًا عن الأخرى. صار التنزيل أسرع لأن التنزيل كان حركة المشغّل؛ أما المباراة فهي اتصال شخص آخر، فتحه ملف تنفيذي لم تره قاعدتك قط.
مثبّت واحد، عمليات كثيرة
برمجيات الألعاب الحديثة مجموعة صغيرة من العمليات. هناك عميل يسجّل دخولك، ومحدّث يجلب المحتوى، ومشغّل يبدأ اللعبة، وملف تنفيذي للعبة قد يولّد هو نفسه عملية ثانية لمكافحة الغش أو لطبقة المطابقة. ويمكن لكل واحد من هؤلاء أن يحتفظ باتصالاته الخاصة بوجهاته الخاصة.
عادةً ما تسمّي قاعدة الاستثناء واحدة منها. وأي واحدة تسمّي يعتمد كليًا على المعرّف الذي يدعمه عميل VPN، وهذا هو الجزء الذي نادرًا ما يتحقق منه المستخدمون. بعض العملاء يطابق مسار ملف تنفيذي، وبعضهم يطابق معرّف حزمة أو حزمة تطبيق، وبعضهم يطابق اسم عملية يمكن لملفين ثنائيين غير مرتبطين أن يتشاركاه. اقرأ القاعدة قبل أن تقرأ قائمة العمليات، لأن القاعدة تقيّد ما يمكنك التعبير عنه أصلًا.
العَرَض إذن ليس “النفق المنقسم معطّل”. بل هو “القاعدة تغطي عملية ليست العملية التي تحمل الحركة التي تهمّني”، وهي عبارة أضيق بكثير وأقبل للإصلاح بكثير. وبمجرد أن تقولها بهذه الطريقة، تتوقف الخطوة التالية عن كونها تخمينًا.
اعثر على العملية التي تملك اتصال المباراة
ابدأ اللعبة، وادخل مباراة، وانظر من يملك المقابس بدلًا مما هو على الشاشة. على Windows تجيب قائمة العمليات مع استعلام مقابس لكل عملية عن ذلك بأمرين:
Get-Process | Where-Object { $_.ProcessName -match 'launcher|game|client' } | Select-Object Id,ProcessName,Path
Get-NetTCPConnection -State Established | Select-Object OwningProcess,RemoteAddress,RemotePort | Sort-Object OwningProcess
يطبع الأمر الثاني معرّف عملية، لا اسمًا، لذا اربط المخرَجين بالمعرّف. الصف الذي تبحث عنه هو الذي ينتمي عنوانه البعيد إلى خدمة اللعبة، وعملية تملكه هي الملف التنفيذي الذي يجب أن تسمّيه قاعدتك.
على Linux يتطلب السؤال نفسه أمرًا واحدًا لكل نوع مقبس، ويستحق فحص الاثنين، لأن اتصال المباراة قد يكون UDP بينما كل شيء آخر TCP:
ss -tunp state established | grep -i game
ss -tunp | awk 'NR==1 || /udp/'
إذا كانت اللعبة تعمل في حاوية أو طبقة توافق، فقد تكون العملية التي تجدها واجهة وسيطة بدلًا من الملف الثنائي الذي ثبّتته. في هذه الحالة يكون المعرّف المهم هو الذي يراه العميل، وقد يكون مسار الواجهة الوسيطة، ولن يؤثر فيه أي قدر من تحرير الملف الأصلي.
طابق المعرّف الذي يدعمه عميلك
اقرأ وثائق العميل الخاصة بقاعدة الاستثناء قبل إضافة أي شيء. النماذج الثلاثة الشائعة تتصرف بطرق مختلفة، وأحدها فخ.
| Identifier | How it behaves | Failure mode |
|---|---|---|
| Executable path | Matches exactly the file at that path | Breaks when an update moves the binary |
| Process name | Matches any binary with that name | Too broad; catches unrelated software |
| Package or bundle id | Matches a signed application group | May include services you did not intend |
قواعد المسار هي الأدق والأكثر هشاشة. تحديث المشغّل الذي ينقل الملف التنفيذي يترك القاعدة تشير إلى ملف لم يعد يعمل، ويعود العَرَض دون أن يتغير شيء ظاهر. قواعد الحزمة تنجو من ذلك، ويمكنها أيضًا أن تغطي بهدوء عمليات مساعدة لم تفكر فيها قط، وهذا إما مريح وإما مقلق بحسب العملية المساعدة.
أيًا كان ما يدعمه العميل، لا تضف مدخلات لكل ملف تنفيذي تجده. القائمة التي تُجمّع بالتجربة والخطأ حتى تنجح جلسة واحدة لا يمكن مراجعتها، وستراكم بصمت استثناءات لبرمجيات غير مرتبطة. سمِّ العملية التي وجدتها، واكتب الغرض منها.
اختبر على المباراة، لا على تنزيل
سرعة تنزيل المشغّل هي أسوأ اختبار ممكن، لأنها تمرّن بالضبط العملية المستثناة أصلًا. استخدم الشيء الذي كان يفشل، وافحص المسار بدلًا من شاشة أداء اللعبة نفسها:
ip route get 203.0.113.55
Get-NetTCPConnection -State Established | Where-Object RemotePort -eq 27015
يحتاج الأمر الأول إلى العنوان الذي حلّ إليه خادم المباراة، ويمكن أن يقدمه لك سجل اتصالات اللعبة أو عميلك. إذا سمّى المسار الواجهة الفيزيائية، فالقاعدة تعمل. والثاني يظهر ما إذا كانت هناك جلسة أصلًا، وهو ما يفصل بين “مستثنى لكن الخادم متوقف” و“غير مستثنى”.
أبقِ المنطقة وشبكة الوصول ثابتتين أثناء الاختبار. المباراة التي تهبط على مركز بيانات مختلف في كل محاولة تنتج عناوين مختلفة، وستجد نفسك تطارد هدفًا متحركًا بدلًا من التحقق من قاعدة. تشغيلان بالعنوان نفسه يستحقان أكثر من عشرة بعناوين مختلفة.
أعد الفحص بعد التحديث التالي
أي قاعدة قائمة على المسار لها عمر افتراضي يقاس بدورات التصحيح. عندما تتوقف اللعبة عن احترام الاستثناء بعد شهر، فأول شيء تفحصه هو ما إذا كان الملف التنفيذي قد انتقل، والثاني هو ما إذا ظهرت عملية مساعدة جديدة بجانبه.
إن نموذج استثناء التطبيقات الموثق من أحد العملاء مرجع معقول لكيفية وصف هذه القواعد، وإن كانت التفاصيل تختلف بين المنتجات. اقرأ نموذجك، وسجّل المعرّف الذي استخدمته، ودوّن التاريخ. هذا السجل هو ما يحوّل لغزًا إلى إصلاح في خمس دقائق في المرة التالية التي يصدر فيها المشغّل تحديثًا.
إذا كان العميل ببساطة لا يستطيع التعبير عن الحد الذي تحتاجه، فسياسة أوسع معتمدة أفضل من كومة استثناءات غير موثقة. الواسع والمفهوم يتفوق على الضيق والخطأ، خصوصًا حين يكون الإصدار الضيق هو ما يعتقد الجميع أنه مطبّق.