مقدمه
پیدا کردن مقدار بهینه MTU (Maximum Transmission Unit) و اندازه Payload در شبکه برای دستیابی به عملکرد بهتر و جلوگیری از شکست بستهها (Packet Fragmentation) اهمیت زیادی دارد. در این راهنما، نحوه انجام این کار را در سیستمعاملها و محیطهای مختلف بررسی خواهیم کرد.
مفاهیم پایه
هدرهای IPv6 و ICMPv6
در پروتکل IPv6، هدر ابتدایی بسته به اندازه ۴۰ بایت است. این هدر شامل اطلاعاتی مانند آدرس مبدا و مقصد، نوع سرویس، برچسب جریان و غیره است. اگر بستههای IPv6 شامل هدرهای افزونه (Extension Headers) باشند، این اندازه میتواند بیشتر شود.
هدر ICMPv6 به اندازه ۸ بایت است که شامل نوع پیام، کد و چکسام است. بنابراین، در مجموع، هدرهای IPv6 و ICMPv6 به همراه هم اندازه ۴۸ بایت را تشکیل میدهند.
هدرهای IPv4 و ICMPv4
در پروتکل IPv4، هدر ابتدایی بسته به اندازه ۲۰ بایت است. این هدر شامل اطلاعاتی مانند آدرسهای IP مبدا و مقصد، طول کل بسته، و دیگر اطلاعات کنترلی است. هدر ICMPv4 نیز به اندازه ۸ بایت است، که شامل نوع پیام، کد، و چکسام است. در نتیجه، مجموع هدرهای IPv4 و ICMPv4 برابر با ۲۸ بایت است.
پیدا کردن MTU و Payload Size
MTU به معنای حداکثر اندازه بسته است که میتواند بدون نیاز به قطعهبندی از طریق یک شبکه ارسال شود. برای جلوگیری از Fragmentation، باید حداکثر Payload Size را پیدا کرد که این مقدار برابر با MTU منهای اندازه هدرهای مربوطه است. برای مثال:
- برای یک شبکه با MTU 1500 بایت و استفاده از IPv4 و ICMPv4:
Payload Size = 1500 - 28 = 1472 بایت - برای یک شبکه با MTU 1500 بایت و استفاده از IPv6 و ICMPv6:
Payload Size = 1500 - 48 = 1452 بایت
تنظیمات IPv6
برای استفاده از IPv6 در شبکه خود و تنظیم مقدار MTU و Payload Size مناسب، باید مراحل زیر را انجام دهید:
۱. فعالسازی IPv6 در سیستمعامل
بسیاری از سیستمعاملها بهطور پیشفرض از IPv6 پشتیبانی میکنند. برای فعالسازی یا تنظیم IPv6، باید به تنظیمات شبکه خود بروید و گزینه IPv6 را فعال کنید. برای مثال، در ویندوز میتوانید به مسیر Control Panel > Network and Sharing Center > Change adapter settings بروید و سپس بر روی آداپتور شبکه خود راستکلیک کرده و به قسمت Properties بروید و گزینه Internet Protocol Version 6 (TCP/IPv6) را فعال کنید.
۲. تنظیم MTU
برای تنظیم MTU در سیستمعاملهای مختلف، میتوانید از دستورات زیر استفاده کنید:
- در لینوکس:
sudo ifconfig eth0 mtu 1500
(جایگزین کردن "eth0" با نام رابط شبکه مناسب) - در ویندوز:
netsh interface ipv6 set subinterface "Interface Name" mtu=1500
- در مک:
sudo ifconfig en0 mtu 1500
(جایگزین کردن "en0" با نام رابط شبکه مناسب)
مطمئن شوید که مقدار MTU مناسب برای شبکه خود را تنظیم کردهاید تا از قطعهبندی بستهها جلوگیری شود.
۳. پیدا کردن Payload Size مناسب
با توجه به اندازه هدرهای IPv6 و ICMPv6 (مجموعاً ۴۸ بایت)، باید مقدار Payload Size را تنظیم کنید تا از حد مجاز MTU عبور نکند. برای مثال، اگر MTU برابر با 1500 بایت باشد، مقدار Payload Size برابر با 1452 بایت خواهد بود. میتوانید این مقدار را با استفاده از دستورات ping
و تنظیم اندازه بسته آزمایش کنید.
استفاده از ping
در لینوکس و MacOS
یکی از روشهای متداول برای یافتن MTU مناسب استفاده از دستور ping
است. این دستور اجازه میدهد تا با ارسال بستههای ICMP به مقصد، حداکثر اندازه بستهای که میتواند بدون قطعهبندی ارسال شود را پیدا کنید.
اسکریپت زیر به طور خودکار MTU مناسب را پیدا میکند:
<!-- Bash Script for Finding MTU -->
#!/bin/bash
MTU=1500
SERVER="8.8.8.8"
PAYLOAD_SIZE=$(($MTU - 48))
while [[ $PAYLOAD_SIZE -gt 0 ]]; do
echo "Testing with payload size: $PAYLOAD_SIZE"
if ping -f -c 1 -s $PAYLOAD_SIZE $SERVER > /dev/null 2>&1; then
echo "Max MTU found: $(($PAYLOAD_SIZE + 48))"
break
else
echo "Failed with payload size: $PAYLOAD_SIZE"
fi
PAYLOAD_SIZE=$(($PAYLOAD_SIZE - 1))
done
در این اسکریپت، ابتدا با MTU پیشفرض 1500 شروع میکنیم و تا زمانی که بستهها بدون خطا ارسال شوند، مقدار Payload را کاهش میدهیم تا MTU بهینه را پیدا کنیم.
استفاده از ping
در ویندوز
در ویندوز میتوانید از دستور ping
با گزینههای مختلف استفاده کنید:
ping -f -l 1452 8.8.8.8
در این دستور، 1452 بایت برای اندازه Payload استفاده شده است. این مقدار برابر با 1500 بایت (اندازه استاندارد MTU) منهای 48 بایت هدرهای IP و ICMP است. در صورت موفقیتآمیز بودن، این عدد را افزایش دهید تا زمانی که به خطا برسید و سپس مقدار بهینه MTU را پیدا کنید.
استفاده از Termux در اندروید
برای یافتن بهترین مقدار MTU از طریق Termux، میتوانید از دستور ping
استفاده کنید. در این محیط، شما میتوانید با استفاده از یک اسکریپت Bash ساده، پروسه یافتن مقدار MTU بهینه را خودکار کنید. در اینجا یک راهنمای گام به گام برای اجرای این فرآیند آورده شده است:
1. نصب ابزارهای مورد نیاز
ابتدا مطمئن شوید که ابزار ping
در Termux نصب است. در اکثر توزیعهای لینوکس این ابزار پیشفرض نصب است، اما برای اطمینان میتوانید آن را بهروزرسانی و نصب کنید:
pkg update
pkg install inetutils
2. استفاده از ping
برای پیدا کردن MTU بهینه
در این مرحله، یک اسکریپت Bash ساده برای آزمایش اندازههای مختلف بسته و پیدا کردن MTU بهینه استفاده میشود.
3. اسکریپت برای پیدا کردن MTU
این اسکریپت به صورت خط به خط اندازهی بسته را کاهش میدهد تا حداکثر اندازهای را که میتواند بدون قطعهبندی ارسال شود، پیدا کند:
<!-- Bash Script for Finding MTU in Termux -->
#!/data/data/com.termux/files/usr/bin/bash
MTU=1500
SERVER="8.8.8.8"
PAYLOAD_SIZE=$(($MTU - 48))
check_mtu() {
ping -f -s $PAYLOAD_SIZE -c 1 $SERVER > /dev/null 2>&1
return $?
}
while [[ $PAYLOAD_SIZE -gt 0 ]]; do
echo "Testing with payload size: $PAYLOAD_SIZE"
if check_mtu; then
echo "Max MTU found: $(($PAYLOAD_SIZE + 48))"
exit 0
else
echo "Failed with payload size: $PAYLOAD_SIZE"
fi
PAYLOAD_SIZE=$(($PAYLOAD_SIZE - 1))
done
echo "Could not find a suitable MTU."
exit 1
4. اجرای اسکریپت
1. یک فایل جدید در Termux ایجاد کنید و اسکریپت بالا را در آن کپی کنید. برای مثال:
nano find_mtu.sh
سپس اسکریپت را در فایل قرار داده و ذخیره کنید.
2. به فایل اجازه اجرای اسکریپت بدهید:
chmod +x find_mtu.sh
3. اسکریپت را اجرا کنید:
./find_mtu.sh
5. تفسیر نتایج
پس از اجرای اسکریپت، مقدار MTU بهینه که میتوانید از آن استفاده کنید بدون اینکه بستهها در مسیر قطعهبندی شوند، به شما نمایش داده خواهد شد. این مقدار را میتوانید در تنظیمات شبکه خود اعمال کنید.
نکته: در شبکههای مختلف، این مقدار ممکن است متفاوت باشد و همچنین ممکن است نیاز به تنظیمات اضافی یا تستهای بیشتری باشد تا مطمئن شوید که این مقدار بهترین عملکرد را برای شما دارد.
پیدا کردن حداکثر واحد انتقال (MTU) در ترمیوکس
برای پیدا کردن حداکثر واحد انتقال (MTU) که منجر به عدم Fragment شدن بستههای شبکه در ترمیوکس (Termux)، میتوانید از ابزار ping
استفاده کنید. این ابزار بهطور پیشفرض در ترمیوکس نصب است.
دستور ping
به شما امکان میدهد تا بستههایی با اندازههای مختلف را به مقصد ارسال کنید تا حداکثر اندازه بستهای که بدون Fragment شدن میتواند انتقال یابد را پیدا کنید. در اینجا یک نمونه دستور که میتوانید استفاده کنید آورده شده است:
ping -s <SIZE> -M do <IP_ADDRESS>
در این دستور:
<SIZE>
اندازه بستهای است که میخواهید ارسال کنید.<IP_ADDRESS>
آدرس مقصد است.
شما میتوانید اندازههای مختلف را امتحان کنید تا اندازه حداکثری را پیدا کنید.
برای مثال:
ping -s 1472 -M do google.com
در این دستور اندازه 1472 بایت استفاده شده است، زیرا اندازه پیشفرض هدر IP و ICMP در مجموع 28 بایت است و مجموع اندازه به 1500 بایت (اندازه پیشفرض MTU برای بسیاری از شبکهها) میرسد.
اگر بسته با اندازه مشخص بدون Fragment شدن انتقال یابد، دستور ping موفقیتآمیز خواهد بود. اگر نه، باید اندازه را کاهش دهید و دوباره امتحان کنید تا حداکثر اندازه صحیح را پیدا کنید.
نوشتن اسکریپت برای تست اتوماتیک اندازههای مختلف بسته
برای نوشتن یک اسکریپت که به طور اتوماتیک اندازههای مختلف بسته را با استفاده از دستور ping
تست کرده و نتایج را نشان دهد، میتوانید از Bash در ترمیوکس استفاده کنید. در اینجا یک نمونه اسکریپت برای انجام این کار آورده شده است:
#!/bin/bash
# IP address or hostname to ping
HOST="google.com"
# Maximum MTU size to test
MAX_MTU=1500
# Initial packet size (excluding IP/ICMP header which is 28 bytes)
PACKET_SIZE=$((MAX_MTU - 28))
# Loop through packet sizes from PACKET_SIZE down to 0
for (( size=PACKET_SIZE; size>=0; size-- ))
do
# Ping the host with the specified packet size and don't fragment
ping -s $size -M do -c 1 $HOST > /dev/null 2>&1
# Check if ping was successful
if [ $? -eq 0 ]; then
echo "Success: MTU size $((size + 28)) bytes"
else
echo "Fail: MTU size $((size + 28)) bytes"
fi
done
این اسکریپت موارد زیر را انجام میدهد:
- آدرس یا نام میزبان مقصد (مثلاً
google.com
) را مشخص میکند. - حداکثر اندازه MTU را تعریف میکند (مثلاً 1500 بایت).
- حلقهای را اجرا میکند که از بزرگترین اندازه بسته ممکن شروع شده و به تدریج کاهش مییابد.
- هر اندازه بسته را با دستور
ping
و گزینههای-s
و-M do
تست میکند. - اگر دستور
ping
موفقیتآمیز باشد، نتیجه را به عنوان "Success" با اندازه MTU نمایش میدهد. - اگر دستور
ping
ناموفق باشد، نتیجه را به عنوان "Fail" با اندازه MTU نمایش میدهد.
برای اجرای این اسکریپت، ابتدا آن را در یک فایل با نام دلخواه (مثلاً check_mtu.sh
) ذخیره کنید و سپس آن را اجرایی کنید:
chmod +x check_mtu.sh
./check_mtu.sh
این اسکریپت به شما کمک میکند تا حداکثر اندازه بستهای که میتواند بدون Fragment شدن به مقصد برسد را پیدا کنید.
روشهای دیگر
روشهای دیگری نیز برای پیدا کردن مقدار بهینه MTU وجود دارد، از جمله استفاده از ابزارهای خاص شبکه یا تنظیمات دستی در سیستمعاملها. همچنین میتوانید از ابزارهای آنلاین و اسکریپتهای آماده استفاده کنید.
نتیجهگیری
یافتن مقدار مناسب MTU برای شبکه شما میتواند به بهبود عملکرد و کاهش مشکلات مرتبط با قطعهبندی بستهها کمک کند. حتماً پس از اعمال تنظیمات، عملکرد شبکه خود را بررسی کنید تا از تاثیر مثبت آن اطمینان حاصل کنید.