مقدمه
یکی از چالش های مهم که در انتقال ترافیک بین اینترفیس ها و یا در هنگام تانل زدن اتفاق میافتد موضوع MTU بوده بطوری که انتقال ترافیک های بزرگ مانند http با مشکل مواجه شده اما در انتقال ترافیک هایی مانند icmp (توسط دستور Ping) مشکلی وجود ندارد. در ادامه به تعاریف مربوط به MTU و MSS خواهیم پرداخت و نحوه تغییر آن در سیستم عامل و روتر و سوییچ ارائه خواهد شد.
تعریف MTU
MTU مخفف عبارت Maximum Transmission Unit بوده که به زبان ساده اندازه بزرگترین واحد داده پروتکل (PDU) است که لایه شبکه می تواند در یک تراکنش ارتباطی انتقال دهد. در واقع حداکثر میزان بیتی از داده که می توانیم در یک بسته ارسال کنیم را MTU می گویند.
برای انتقال اطلاعات در سیستم های ارتباطی شبکه آنها را به بسته هایی تقسیم میکنند که توسط این بسته ها اطلاعات به مقصد ارسال و یا دریافت میگردد. این بسته ها با توجه به زیرساخت مخابراتی حجم های متفاوتی میتوانند داشته باشند به عنوان مثال در پروتکل Ethernet به صورت پیش فرض اندازه هر بسته ۱۵۰۰ بایت میباشد. این عدد در اکثر سیستم عامل ها و تجهیزات شبکه (لایه ۳ و بالاتر) حتی در مودم ADSL شما قابل تنظیم میباشد. نکته مهم و قابل توجه اینکه در بعضی موارد ، وقتی از روتر سیسکو به عنوان PPPOE Dialer استفاده میشود و برای مثال ترافیک Internet بر روی ارتباط PPPOE ، جهت دسترسی به اینترنت NAT میشود ، مشاهده میشود که صفحات یا باز نمیشوند، یا به کندی و نصفه باز میشوند ، که مشکل از تنظیمات مربوط به MTU و TCP MSS است .
در مورد PPPoE حداکثر MTU قابل تصور عدد ۱۴۹۲ میباشد. دلیل این امر آن است که بسته های اطلاعاتی در نهایت پس از رسیدن به مرکز مخابراتی باید از بستر Ethernet عبور کند و اطلاعات آدرس MAC(۶ بایت) و Protocol-ID PPP به میزان ۲ بایت نیز به آن اضافه میشود که نتیجه ۱۴۹۲+۸=۱۵۰۰ میشود.
در عمل چه اتفاقی در حال رخ دادن است؟
در عمل ممکن است بدلیل نوع خاص مسیر دهی بسته های اطلاعاتی و عبور اطلاعات از بستر های مختلف این ۸ بایت اضافه در چند نقطه از مسیر چندین بار به بسته شما اضافه شده و در نهایت بسته اطلاعاتی شما بجای ۱۵۰۰ بایت به سایزی مثلا ۱۵۱۸ بایت برسد که عملا انتقال آن از طریق مسیر Ethernet غیر ممکن بوده و باعث بروز پدیده تکه شدن بسته های اطلاعاتی میگردد. امروزه سرویس دهنده های اینترنت معمولا خود راسا این عدد را در مسیر به مقدار صحیح تغییر میدهند اما اگر به هر دلیل این پروسه دچار اختلال گردد شما مجبور به اصلاح دستی این پارامتر خواهید بود.
پس در بهترین حالت با تنظیم MTU مودم بر روی عدد ۱۴۹۲ میتوانیم انتظار یک ارتباط استاندارد داشته باشید.
برای درک عمیقتر به معرفی انواع مهمی مانند Interface MTU ، IP MTU ، TCP MSS و تفاوت های آنها میپردازیم:
به اشکال زیر دقت نمایید. با یک نگاه میتوانید تفاوت های ساختاری مربوط به انواع MTU را درک نمایید. توضیحات مربوطه نیز در ادامه آمده است.
Layer 2 Interface MTU – Frame size – Data Link layer PDU
Layer 3 IP MTU – datagram size – Network layer PDU
Layer 4 MSS – segment size – Transport Layer PDU
Interface MTU: هر اینترفیسی در تجهیزات شبکه عنصری به نام Interface MTU دارد که حداکثر اندازه مجاز بسته های ارسالی از آن اینترفیس را مشخص می کند. این مقدار بدون درنظر گرفتن سربار (Header) لایه 2 می باشد شود. مقدار MTU برای هر پروتکل و هر رسانه انتقال می تواند متفاوت باشد. برای مثال در ادامه به چند نمونه از مقادیر MTU در فناوری های مختلف اشاره شده است:
- شبکه اترنت (Ethernet) برابر با 1500 بایت
- شبکه Fiber Channel (FC) برابر با 2148 بایت
- شبکه سریال (Serial) برابر با 1500 بایت
- شبکه Frame Relay برابر با 4470 بایت
- شبکه ATM برابر با 4470 بایت
- شبکه 4 Mbps Token Ring برابر با 4464 بایت
- شبکه 16 Mbps Token Ring برابر با 17914 بایت
- شبکه IEEE 802.3/802.2 برابر با 1492 بایت
- شبکه PPPoE (WAN Miniport) برابر با 1480
دستور زیر در سیستم عامل سیسکو برای تعیین MTU اینترفیس بکار میرود:
R1(config)#interface GigabitEthernet0/1
R1(config-if)#mtu 1400
Internet Protocol MTU (IP MTU) : در واقع حداکثر اندازه بسته هایی که در لایه IP قرار میگیرند را تعیین می کند. در ترافیک های IP بین Inteface MTU و IP MTU تفاوتی دیده نمی شود. نکته قابل توجه این است اگر مقدار Interface MTU را تغییر دهیم مقدار IP MTU به صورت خودکار به همان مقدار مشخص شده برای Interface MTU تغییر خواهد کرد. به عنوان نمونه اگر مقدار Interface MTU و IP MTU که در حالت پیش فرض 1500 بایت بوده و ما عدد Interface MTU را به مقدار جدیدی به عنوان مثال 1440 بایت تغییر دهیم آنگاه مقدار IP MTU نیز به صورت خودکار به 1440 بایت تغییر خواهد کرد. در این حالت بست ها یا drop و یا دربهترین حالت fragment (بخش بندی) خواهند شد تا به اندازه کافی برای عبور از حداکثر ظرفیت Interface MTU کوچک شوند. لازم به ذکر است اگر مقدار IP MTU با Interface MTU متفاوت باشد، بسته های ارسالی بر اساس کمترین مقدار MTU ارسال خواهند گردید. بسته هایی که توسط مبدا fragment می شوند باید بتوانند در سمت گیرنده مجدد Reassemble شوند.
پس به بیانی دیگر IP MTU تنها روی بسته های IP تاثر خواهد گذاشت در حالیکه Interface MTU بر روی کل فریم اترنت تاثیر دارد.
برای تغییر IP MTU در سیستم عامل سیسکو از دستور ip mtu استفاده می کنیم. به عنوان مثال برای تغییر این پارامتر بر روی اینترفیس اترنت از دستور زیر استفاده میکنیم. برای دیگر اینترفیس ها مانند tunnel نیز از همین دستور استفاده خواهیم کرد.
R1(config)#interface GigabitEthernet0/1
R1(config-if)#ip mtu 1400
TCP MSS : به حداکثر مقدار داده واقعی (Payload) که توسط پروتکل لایه 4 یا همان TCP قابل بسته بندی و ارسال می باشد اطلاق میشود. همانطور که در شکل زیر مشخص است مقدار MSS بدون در نظر گرفتن هدر لایه های 2، 3 و 4 می باشد. بنابر این اندازه مقدار MSS از MTU کوچکتر است تا بتوان آدرس بسته و بقیه اطلاعات اضافی در مورد بسته را در آن قرار داد. پس پارامتر های MTU و MSS در هر حال به هم وابسته هستند.
روش محاسبه MSS
مکانیزم تعیین MSS در پروسه دست تکانی 3 مرحله ای یا همان 3way Hand Shaking در پروتکل TCP مشخص می گردد. هر کدام از طرفین مقدار MSS را به طرف مقابل اعلام می کنند. لذا هر طرف ارتباط با توجه به مقدار MSS اعلام شده از سمت مقابل Payload خود را در نظر گرفته و داده های لایه برنامه کاربردی را به تکه های کوچکتر تقسیم میکند. لازم به ذکر است که این پروسه به صورت توافقی نیست و صرفا به طرف مقابل اعلام می گردد. بمنظور تعیین مقدار MSS در شبکه اترنت (با علم به حداکثر مقدار MTU که معادل 1500 بایت است) با کسر اندازه بایتی هدر لایه 3 و 4، مقدار MSS برابر با 1460 بایت حاصل می شود.
(MTU=1500 Byte)-((IP Header= 20 Byte) + (TCP Header= 20 Byte)) = 1460 Byte Payload
تنظیم مقدار TCP MSS با پیامهای ICMP به فرستنده بسته میفهماند که تا چه مقدار میتواند سایز سگمنت TCP را در نظر بگیرد پس به خاطر داشته باشیم در فایروال کلا ICMP را بلاک نکنیم که مشکلساز خواهد بود.
نکته مهمی که وجود دارد این است که برای محاسبه MSS باید از MTU محاسبه شده در فرمول اول استفاده کنیم نه MTU کلی سیستم برای مثال در سیستمی که MTU 1500 تانل GRE داریم که 24 بایت هدر دارد پس
IP MTU = 1500-24 =1476
در اینجا برای محاسبه MSS باید از فرمول زیر استفاده کرد:
TCP MSS= 1476(IP MTU of GRE) – 20 (IP header) – 20 (TCP header) = 1436
اشاره ای عمیقتر در خصوص MTU:
ما در هر دستگاهی سه نوع ترافیک داریم:
۱. ترافیکی که به مقصد دستگاهی است و در اینجا چون ترافیک توسط cpu دستگاهی hit میشود صرف نظر از مقداری که در اینترفیس mtu تنظیم میشود میتواند تا سایزی معادل 1998 بایت داشته باشد. (مثلا زمانی که خود دستگاه را ping میکنیم)
۲. ترافیکی در دستگاهی forward میشود که وابسته به MTU سیستم و medium انتقالی یا همان اینترفیس دارد.
۳. ترافیکی که از منبع دستگاهی است و رویکرد معادل شماره ۲ دارد و البته تنها MTU یک اینترفیس را مد نظر خواهد داشت که همان egress interface خواهد بود.
حالا زمانی که بسته ای بزرگتر از مقدار mtu اینترفیس وارد روتر میشود وابسته به اینکه کدامیک از سه مورد بالا است رفتار متفاوتی وابسته به پلتفرم و تنظیمات اتخاذ میشود. پیش فرض کل اندازه فریم ارسالی در دستگاه سیسکو (در صورتی که قرار بر این است که forward شود) نباید بیشتر از 1518 بایت باشد چون احتمالا discard میشود اگر فریمی که وارد میشود بر روی fib تجهیز match شود و egress interface دارای mtu کمتر از packet total size داشته باشد روتر مجبور به fragmentation میشود مادامی که df برابر با 0 باشد.
پیشنهاد میشود system mtu and Jumbo بر روی مقادیر مناسب براساس سرویس و نیاز شبکه تنظیم گردد و هر اینترفیس براساس مدیا و احتمالا header خودش مقدار مناسب IP MTU روی آن تنظیم گردد.
با توجه به عکس های بالا و مفاهیمی که تا اینجا ارائه شد، هر پروتکلی که header به بسته اضافه میکند در نهایت مقدار payload را کاهش میدهد برای اینکه مقدر mtu از مقدار قابل forward بر روی مدیوم بیشتر نشود و fragmentation اتفاق نیفتد. نحوه محاسبه IP MTU میشود کل سایز mtu منهای هدر پروتکل ترانزیت و MSS که مربوط به TCP است به ارسال کننده پکت میگوید نهایتا چه مقدار سایز سگمنت داده قابل ارسال است. که برای بدست اوردن مقدار آن مطابق عکس مقدار کل MTU – IP HEADER – TCP header است.