چرا VPN در انتقالهای بزرگ گیر میکند اما در کوچکها نه
درخواستهای کوچک پاسخ میگیرند اما انتقالهای بزرگ یخ میزنند. پیش از کپی کردن MTU ثابت، حد رابط، حد مسیر و بار اعلامشده TCP را مقایسه کنید.
صفحهای بارگذاری میشود، یک ping موفق میشود و کپی یک فایل هر بار در همان نقطه گیر میکند. این الگو به اندازه بسته اشاره دارد، نه به پهنای باند یا اعتبارنامهها. کپسولهسازی به هر بسته بایت اضافه میکند، بنابراین باری که در مسیر اصلی جا میشد میتواند پس از عبور از تونل از حد فراتر برود. در این گفتگوها سه عدد مختلف MTU نامیده میشوند و اشتباه گرفتن آنها به تنظیمی میرسد که یک برنامه را درست و برنامه دیگر را خراب میکند.
سه عددی که مردم آنها را MTU مینامند
MTU رابط، حد پیکربندیشده برای بسته روی آن پیوند است. MTU مسیر، کوچکترین حد در طول مسیر است و کشف میشود، نه پیکربندی. TCP MSS اندازه باری است که طرف مقابل اعلام میکند میتواند دریافت کند و از دو عدد دیگر مشتق میشود، نه یک حد فیزیکی جداگانه.
یک تونل نمای درونی و بیرونی دارد. بسته بیرونی، بسته کپسولهشده بههمراه سرآیندهایی را که پروتکل نیاز دارد حمل میکند، پس اندازه درونی قابل استفاده کوچکتر از چیزی است که مسیر بیرونی اجازه میدهد. مسیر تا سرور VPN نیز با مسیر سرور تا مقصد متفاوت است.
کشف MTU مسیر به فرستنده اجازه میدهد اندازه کارآمد را بیاموزد، اما به رسیدن بازخورد وابسته است. وقتی دستگاهی میانی پیامهای مرتبط ICMP را فیلتر میکند، فرستنده به ارسال بستههایی ادامه میدهد که هرگز کامل نمیشوند و این همان سیاهچاله کلاسیک است. نشانه وقتی آن را بشناسید متمایز است: دستدادن موفق میشود، نخستین بار با اندازه کامل ناپدید میشود و اتصال در نهایت بازنشانی میشود یا گیر میکند. هیچ چیز در گزارش برنامه شبیه مشکل شبکه نیست.
مسیر را با باری که کنترل میکنید آزمایش کنید
یک آزمون شواهدی درباره یک مسیر و یک اندازه است، نه یک تنظیم توصیهشده. از میزبانی استفاده کنید که پاسخ میدهد و فقط اندازه بار را تغییر دهید.
ping -M do -s 1372 -c 2 203.0.113.20 ping -4 -f -l 1372 vpn.example
فرمان اول یک آزمون لینوکسی با قطعهبندی غیرفعال و باری به اندازه 1372 بایت میفرستد و دومی همان کار را در ویندوز انجام میدهد که بار با -l تعیین میشود. پاسخ یعنی آن اندازه از مسیر جان سالم به در برده است. پیام نیاز به قطعهبندی آموزنده است، در حالی که پایان زمان مبهم است چون میزبان یا دستگاهی میانی ممکن است ICMP را به سادگی دور بریزد.
اندازه را در چند گام پایین بیاورید، نه با جستجوی دودویی تا سطح بایت. شما میکوشید روشن کنید آیا سقفی برای اندازه وجود دارد، نه اینکه برای هر شبکه عددی منتشر کنید. عددی که مییابید برای این مسیر، این پروتکل و این خانواده نشانی معتبر است.
IPv4 و IPv6 به شکل متفاوتی قطعهبندی میشوند، پس نتیجه آزمون یک خانواده درباره دیگری چیزی نمیگوید. همان خانوادهای را آزمایش کنید که برنامه واقعاً استفاده میکند.
مهار MSS فقط به TCP کمک میکند
در TCP، بار مؤثر در هنگام دستدادن مذاکره میشود و مسیریابی در مسیر میتواند آن مقدار را به پایین بازنویسی کند تا هر دو سر قطعههای کوچکتری بفرستند. مهار MSS همین کار را میکند و بدون هیچ تماسی با کلاینت کار میکند.
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu ip link show tun0
قاعده نخست MSS اعلامشده را برای دستدادنهای TCP عبوردادهشده به MTU مسیر مهار میکند و دومی MTU خود رابط تونل را نشان میدهد تا آن را با آنچه مسیر اجازه میدهد مقایسه کنید. مهار کمترین اصلاح مداخلهگر برای برنامه TCP است که پس از دستدادن گیر میکند.
برای UDP هیچ کاری نمیکند. کلاینت صدا یا بازی که دادهنگارهای بزرگ میفرستد تنظیم MSS را کاملاً نادیده میگیرد، چون دستدادنی برای بازنویسی وجود ندارد. اگر برنامه خراب UDP است، بهجای آن گزینههای اندازه بسته خود کلاینت را ببینید. این دو پروتکل به شکل متفاوت خراب میشوند و با ابزارهای متفاوت تعمیر میشوند، به همین دلیل پروتکل باید در جمله نخست تیکت باشد.
OpenVPN گزینههایی مانند tun-mtu، mssfix و تنظیمات مرتبط با قطعهبندی را ارائه میدهد و رفتارشان به نسخه و به اینکه کانال داده AEAD است بستگی دارد. راهنمای نسخهای را که استفاده میکنید بخوانید و هر بار یک گزینه را تغییر دهید.
یک تنظیم پشتیبانیشده را تغییر دهید و هر دو اجرا را تکرار کنید
نمایه اصلی را نگه دارید، یک مقدار پشتیبانیشده را تغییر دهید و هم درخواست کوچکی که کار میکرد و هم انتقال بزرگی که شکست خورد را تکرار کنید. اگر فقط بزرگ تغییر کرد، دنبال اندازه میگشتید. اگر هر دو تغییر کردند، چیز دیگری همراه آن حرکت کرده است.
مقدار کمتر میتواند نشانه را کاهش دهد و در عین حال سرباری بیفزاید، پس کوچکترین عدد ممکن هدف نیست. هدف اندازهای است که مسیر آن را با کمترین هدررفت بهطور مطمئن حمل کند. مقدار، مسیر و نسخه کلاینت را در تیکت یادداشت کنید، چون همان عدد در جای دیگر اعمال شود یک حدس است.
اگر همان نمایه از شبکهای مطمئن دیگر کار میکند، آن تفاوت را در تشخیص نگه دارید، نه اینکه کلاینت را درستشده اعلام کنید. متغیری که تغییر کرد مسیر است و مسیر همان چیزی است که آزمون اندازه گرفت.