آموزش پیدا کردن مقدار MTU و Payload Size

مقدمه

پیدا کردن مقدار بهینه 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 منهای اندازه هدرهای مربوطه است. برای مثال:

تنظیمات 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 در سیستم‌عامل‌های مختلف، می‌توانید از دستورات زیر استفاده کنید:

مطمئن شوید که مقدار 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>

در این دستور:

شما می‌توانید اندازه‌های مختلف را امتحان کنید تا اندازه حداکثری را پیدا کنید.

برای مثال:

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

این اسکریپت موارد زیر را انجام می‌دهد:

  1. آدرس یا نام میزبان مقصد (مثلاً google.com) را مشخص می‌کند.
  2. حداکثر اندازه MTU را تعریف می‌کند (مثلاً 1500 بایت).
  3. حلقه‌ای را اجرا می‌کند که از بزرگترین اندازه بسته ممکن شروع شده و به تدریج کاهش می‌یابد.
  4. هر اندازه بسته را با دستور ping و گزینه‌های -s و -M do تست می‌کند.
  5. اگر دستور ping موفقیت‌آمیز باشد، نتیجه را به عنوان "Success" با اندازه MTU نمایش می‌دهد.
  6. اگر دستور ping ناموفق باشد، نتیجه را به عنوان "Fail" با اندازه MTU نمایش می‌دهد.

برای اجرای این اسکریپت، ابتدا آن را در یک فایل با نام دلخواه (مثلاً check_mtu.sh) ذخیره کنید و سپس آن را اجرایی کنید:

chmod +x check_mtu.sh
./check_mtu.sh

این اسکریپت به شما کمک می‌کند تا حداکثر اندازه بسته‌ای که می‌تواند بدون Fragment شدن به مقصد برسد را پیدا کنید.

روش‌های دیگر

روش‌های دیگری نیز برای پیدا کردن مقدار بهینه MTU وجود دارد، از جمله استفاده از ابزارهای خاص شبکه یا تنظیمات دستی در سیستم‌عامل‌ها. همچنین می‌توانید از ابزارهای آنلاین و اسکریپت‌های آماده استفاده کنید.

نتیجه‌گیری

یافتن مقدار مناسب MTU برای شبکه شما می‌تواند به بهبود عملکرد و کاهش مشکلات مرتبط با قطعه‌بندی بسته‌ها کمک کند. حتماً پس از اعمال تنظیمات، عملکرد شبکه خود را بررسی کنید تا از تاثیر مثبت آن اطمینان حاصل کنید.

  1. ورود به صفحه فارسی