Bagaimana cara mengetahui MTU apa yang sedang digunakan di Windows XP

21

Saya menderita masalah yang sangat aneh di mana saya secara acak mendapatkan kesalahan "Sambungan ke server diatur ulang" ketika mencoba mengakses halaman web (Kesalahan HTTP 12031 menurut alat diagnostik jaringan Windows) - ini terjadi terlepas dari apakah halaman web Saya mencoba mengakses di internet eksternal atau bahkan jika itu dari contoh Apache lokal yang berjalan di localhost. Ini mempengaruhi semua komputer di jaringan lokal kami (Ethernet, bukan nirkabel), yang semuanya menjalankan Windows XP.

Telah disarankan kepada saya bahwa mungkin ada hubungannya dengan MTU yang digunakan pada lalu lintas jaringan. Jika saya melakukan Tes Ping untuk mengetahui paket terbesar yang dapat melalui unfragmented, saya dapat melakukan ping localhost dengan paket 1492 bytes (+28 bytes untuk header?) Dan saya bisa ping router kami dengan paket 1462 bytes (yaitu 1490 byte saat Anda menyertakan header 28 byte). Jika saya mencoba dan melakukan ping sesuatu di luar seperti Google, saya tidak bisa mendapatkan lebih dari 1430 (yaitu 1458 dengan header).

Saya telah mencoba mengikuti berbagai rangkaian instruksi untuk memperbarui Windows XP Registry dengan pengaturan MTU ini, memperbarui HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{AdapterID}\MTU. Saya sudah mencoba tiada akhir dari nilai-nilai alternatif: nilai yang paling jelas tampaknya adalah 1490, tetapi saya juga telah mencoba 1462, 1458, 1430, dll., Dll. tampaknya bekerja selama beberapa menit (sulit untuk memastikan karena itu selalu acak daripada konsisten) tetapi tidak pernah berlangsung lama.

Awalnya, ketika saya mencoba nilai 1430, setelah beberapa menit bekerja dengan baik, hasil Uji Ping akan berkurang 28 byte - tiba-tiba saya menemukan bahwa saya hanya bisa mendapatkan paket 1402 byte melalui Google. Jika saya memperbarui pengaturan registri MTU ke 1402, ketika saya reboot dan menunggu beberapa menit, maka akan menjadi 1374, kemudian 1346, dll. Komputer lain di jaringan tetap tidak terpengaruh (masih pada 1430) dan menghapus pengaturan MTU dari registri akan mengembalikan hal-hal normal (dan masih rusak).

Hal yang saya temukan paling sulit dalam mendiagnosis semua ini adalah sangat sulit untuk mengetahui apakah saya bermain dengan pengaturan registri yang benar. Jadi itu yang paling sederhana, pertanyaan saya adalah: Bagaimana saya bisa tahu apa pengaturan MTU yang coba digunakan Windows?

Juga, jika ada yang punya ide bagaimana mengatakan mengapa MTU terus menurun hingga 28, itu akan berguna juga (misalnya apakah ada file log Windows di suatu tempat di mana ia akan mencatat sesuatu pada titik di mana nilainya berubah?)

Akhirnya, jika ada yang bisa memberi tahu saya secara pasti bagaimana cara memberitahu pengaturan MTU apa yang harus saya coba gunakan, itu akan luar biasa!

andygeers
sumber
FWIW, pada akhirnya itu adalah saluran telepon yang cerdik yang menjadi masalah. Ketika saya memasang telepon di sana tidak ada nada panggil.
andygeers

Jawaban:

58

Untuk Windows 7, Windows Vista dan Windows XP, MTU untuk berbagai antarmuka tersedia dari Windows itu sendiri netsh.

Windows 7, Windows Vista

Untuk menampilkan MTU saat ini di Windows 7 atau Windows Vista, dari prompt perintah:

C:\Users\Ian>netsh interface ipv6 show subinterfaces

       MTU  MediaSenseState   Bytes In  Bytes Out  Interface
----------  ---------------  ---------  ---------  -------------
      1280                1   24321220    6455865  Local Area Connection
4294967295                1          0    1060111  Loopback Pseudo-Interface 1
      1280                5          0          0  isatap.newland.com
      1280                5          0          0  6TO4 Adapter

Dan untuk antarmuka IPv4:

C:\Users\Ian>netsh interface ipv4 show subinterfaces

       MTU  MediaSenseState   Bytes In  Bytes Out  Interface
----------  ---------------  ---------  ---------  -------------
      1500                1  146289608   29200474  Local Area Connection
4294967295                1          0      54933  Loopback Pseudo-Interface 1

Catatan: Dalam contoh ini antarmuka IPv6 Sambungan Area Lokal saya memiliki MTU yang sangat rendah (1280) karena saya menggunakan layanan terowongan untuk mendapatkan konektivitas IPv6 .

Anda juga dapat mengubah MTU Anda (Windows 7, Windows Vista). Dari prompt perintah yang ditinggikan :

>netsh interface ipv4 set subinterface "Local Area Connection" mtu=1492 store=persistent
Ok.

Diuji dengan Windows 7 Paket Layanan 1

Windows XP

The netshsintaks untuk Windows XP sedikit berbeda:

C:\Users\Ian>netsh interface ip show interface

Index:                                  1
User-friendly Name:                     Loopback
Type:                                   Loopback
MTU:                                    32767
Physical Address:                       

Index:                                  2
User-friendly Name:                     Local Area Connection
Type:                                   Etherenet
MTU:                                    1500
Physical Address:                       00-03-FF-D9-28-B7

Catatan: Windows XP mengharuskan layanan Routing dan Remote Access dimulai sebelum Anda dapat melihat detail tentang antarmuka (termasuk MTU):

C:\Users\Ian>net start remoteaccesss

Windows XP tidak menyediakan cara untuk mengubah pengaturan MTU dari dalam netsh. Untuk itu Anda bisa:

Diuji dengan Windows XP Paket Layanan 3

Lihat juga


Diskusi singkat tentang apa MTU itu, dari mana 28 byte berasal.

Kartu jaringan Anda (Ethernet) memiliki ukuran paket maksimum 1,500 bytes:

+---------+
| 1500    |
| byte    |
| payload |
|         |
|         |
|         |
+---------+

Bagian IP dari TCP / IP membutuhkan header 20 byte (12 byte bendera, 4 byte untuk alamat IP sumber, 4 byte untuk alamat IP tujuan). Dengan demikian semakin sedikit ruang yang tersedia dalam paket:

+------------------------+
| 12 bytes control flags | \
| 4 byte from address    | |- IP header: 20 bytes
| 4 byte to address      | /
|------------------------|
| 1480 byte payload      |
|                        |
|                        |
|                        |
+------------------------+

Sekarang paket ICMP (ping) memiliki header 8-byte (1 byte type, 1 byte code, 2 byte checksum, 4 byte data tambahan):

+------------------------+
| 12 bytes control flags | \
| 4 byte from address    | |
| 4 byte to address      | |- IP and ICMP header: 28 bytes
|------------------------| |
| 8 byte ICMP header     | /
|------------------------|
| 1472 byte payload      |
|                        |
|                        |
|                        |
+------------------------+

Di situlah "hilang" 28 byte - itu ukuran header yang diperlukan untuk mengirim paket ping.

Saat Anda mengirim paket ping, Anda dapat menentukan berapa banyak data payload tambahan yang ingin Anda sertakan. Dalam hal ini, jika Anda memasukkan semua 1472 byte:

>ping -l 1472 obsidian

Kemudian paket ethernet yang dihasilkan akan penuh ke insang. Setiap byte terakhir dari paket 1500 byte akan diisi:

+------------------------+
| 12 bytes control flags | \
| 4 byte from address    | |
| 4 byte to address      | |- IP and ICMP header: 28 bytes
|------------------------| |
| 8 byte ICMP header     | /
|------------------------|
|........................|
|........................|
|. 1472 bytes of junk....|
|........................|
|........................|
|........................|
|........................|
+------------------------+

Jika Anda mencoba mengirim satu byte lagi

>ping -l 1473 obsidian

jaringan harus memecah paket 1501 byte menjadi beberapa paket:

Packet 1 of 2
+------------------------+
| 20 bytes control flags | \
| 4 byte from address    | |
| 4 byte to address      | |- IP and ICMP header: 28 bytes
|------------------------| |
| 8 byte ICMP header     | /
|------------------------|
|........................|
|........................|
|..1472 bytes of payload.|
|........................|
|........................|
|........................|
|........................|
+------------------------+

Packet 2 of 2
+------------------------+
| 20 bytes control flags | \
| 4 byte from address    | |
| 4 byte to address      | |- IP and ICMP header: 28 bytes
|------------------------| |
| 8 byte ICMP header     | /
|------------------------|
|.                       |
| 1 byte of payload      |
|                        |
|                        |
|                        |
|                        |
|                        |
+------------------------+

Fragmentasi ini akan terjadi di belakang layar, idealnya tanpa Anda sadari.

Tapi Anda bisa jahat, dan beri tahu jaringan bahwa paket itu tidak boleh difragmentasi:

>ping -l 1473 -f obsidian

The -f berarti bendera tidak fragmen . Sekarang ketika Anda mencoba mengirim paket yang tidak sesuai pada jaringan Anda mendapatkan kesalahan:

>ping -l 1473 -f obsidian  

Packet needs to be fragmented but DF set.

Paket perlu terfragmentasi, tetapi bendera Jangan Fragmen telah ditetapkan.

Jika di mana saja di sepanjang baris paket perlu terfragmentasi, jaringan sebenarnya mengirim paket ICMP yang memberi tahu Anda bahwa terjadi fragmentasi. Mesin Anda mendapatkan paket ICMP ini, diberi tahu ukuran terbesarnya, dan seharusnya berhenti mengirim paket terlalu besar. Sayangnya sebagian besar firewall memblokir paket ICMP "Path MTU discovery" ini, sehingga mesin Anda tidak pernah menyadari bahwa paket-paket tersebut terfragmentasi (atau lebih buruk: dijatuhkan karena tidak dapat difragmentasi).

Itulah yang menyebabkan web-server tidak berfungsi. Anda bisa mendapatkan respons kecil awal (<1280 byte), tetapi paket yang lebih besar tidak dapat melewati. Dan firewall server web salah konfigurasi, memblokir paket ICMP. Jadi server web tidak menyadari Anda tidak pernah mendapatkan paket itu.

Fragmentasi paket tidak diperbolehkan dalam IPv6, semua orang diharuskan (dengan benar) mengizinkan paket penemuan ICMP mtu.

Ian Boyd
sumber
8

@ian saya tidak begitu yakin bahwa netshsebenarnya menunjukkan MTU yang saat ini digunakan. Pada mesin Windows XP Pro SP3 saya, saya mengeksekusi netsh interface ip show interfacedan melaporkan nilai MTU untuk antarmuka yang relevan sebagai 1500. Saya kemudian menambahkan kunci registri berikut:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnablePMTUDiscovery
    value: 0

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{ID}\MTU 
    value: various (e.g. 1200)

Microsoft mengatakan bahwa pengaturan EnablePMTUDiscoveryke 0 akan mengatur MTU ke 576.

Mengatur MTUentri registri mengatur MTU secara manual. Saya mencoba beberapa nilai untuk MTUentri (reboot setiap kali).

Dalam kedua kasus - menambahkan entri pertama, kemudian entri kedua - netshmasih melaporkan MTU sebagai 1500. Pengujian dengan ping dikonfirmasi (atau setidaknya disarankan) bahwa nilai MTU yang dikonfigurasi dalam registri sebenarnya sedang digunakan.

Juga, ketika saya pertama kali mencoba ini pada mesin saya, layanan Routing dan Remote Access dinonaktifkan, jadi saya tidak dapat memulainya menggunakan instruksi Anda. Saya mengaktifkannya dengan masuk ke Panel Kontrol> Alat Adminstratif> Manajemen Komputer> Layanan dan Aplikasi> Layanan. Saya mengubah "Jenis startup" dari Dinonaktifkan ke Manual. Saya kemudian memulai layanan dari dialog itu juga.

Saya juga tidak yakin bahwa KB283165 adalah instruksi yang tepat untuk mengubah MTU. Bukankah instruksi itu hanya relevan ketika menjalankan klien Windows PPPoE? Jika menghubungkan ke internet melalui router yang routernya adalah klien PPPoE (seperti dalam kasus saya), instruksi tersebut tidak akan relevan, bukan?

Instruksi yang saya ikuti, yang membuat saya membuat perubahan di atas ke registri, ada di KB900926: Pengaturan TCP / IP yang disarankan untuk tautan WAN dengan ukuran MTU kurang dari 576 (metode 2 & 3).


Edit oleh @ian

Sepertinya kamu benar. Konfigurasikan untuk 1.200, tetapi netshlaporkan 1500.

masukkan deskripsi gambar di sini

>ping -l 1173 -f obsidian

Packet needs to be fragmented but DF set.

Jadi saya kira jawaban untuk pertanyaan awal adalah bahwa pada Windows XP Anda harus menggunakan trial-and-error dengan flag Don't fragment untuk menemukan paket terbesar yang dapat Anda kirim. Maka Anda memiliki MTU Anda.

JMM
sumber
2

Anda dapat menemukan MTU menggunakan ping dengan pendekatan coba-coba:

ping <address> -f -l nnnn

Ping :

-f: Menentukan bahwa pesan Echo Request dikirim dengan bendera Don't Fragment di header IP yang diatur ke 1. Pesan Echo Request tidak dapat difragmentasi oleh router di jalur menuju tujuan. Parameter ini berguna untuk mengatasi masalah jalur Maximum Transmission Unit (PMTU).

-l Ukuran: Menentukan panjang, dalam byte, bidang Data dalam pesan Permintaan Gema yang dikirim. Standarnya adalah 32. Ukuran maksimum adalah 65.527.

Anda akan mendapatkan pesan "Paket perlu difragmentasi tetapi diset DF" ketika panjangnya terlalu besar.

T. Kaltnekar
sumber
Ini adalah apa yang saya lakukan di atas ketika saya disebut "The Ping Test"
andygeers
1

Lihat AdapterWatch :

AdapterWatch menampilkan informasi bermanfaat tentang adapter jaringan Anda: alamat IP, alamat perangkat keras, server WINS, server DNS, nilai MTU, Jumlah byte yang diterima atau dikirim, Kecepatan transfer saat ini, dan banyak lagi. Selain itu, ini akan menampilkan statistik TCP / IP / UDP / ICMP umum untuk komputer lokal Anda.

harrymc
sumber
1

Microsoft KB314496: Ukuran MTU default untuk topologi jaringan yang berbeda .
Anda seharusnya tidak mencoba bermain dengan konfigurasi MTU dalam pengaturan jaringan normal.

Ada referensi kode VB di sini .
Ada juga alat yang disebut DrTCP :

teks alternatif


Dalam registri,

  • Pergi ke HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards
  • Buka adaptor yang Anda minati
  • Salin ServiceNamestring
  • Cari string itu di HKLM\System; Anda akan mencocokkan satu NetCfgInstanceIdkunci
  • Sedikit di atas itu akan menjadi MaxFrameSizekuncinya (tambang menunjukkan 1514)

Ada juga cara untuk mengubah ini dengan netshperintah.

Juga, periksa konfigurasi Path MTU Discovery Anda .

nik
sumber
Terima kasih untuk itu, tetapi idealnya saya akan lebih diyakinkan jika saya bisa mendapatkan Windows untuk benar-benar memberi tahu saya apa MTU yang sebenarnya digunakan, daripada hanya apa yang Anda harapkan dari standarnya. Mungkin hal ini tidak mungkin meskipun :-(
andygeers