จะบอกได้อย่างไรว่า MTU กำลังใช้งานอะไรใน Windows XP


21

ฉันประสบปัญหาแปลกจริง ๆ ที่ฉันได้รับข้อผิดพลาด "การเชื่อมต่อกับเซิร์ฟเวอร์ถูกรีเซ็ต" แบบสุ่มเมื่อพยายามเข้าถึงหน้าเว็บ (ข้อผิดพลาด HTTP 12031 ตามเครื่องมือวิเคราะห์เครือข่าย Windows) - สิ่งนี้เกิดขึ้นไม่ว่าหน้าเว็บจะเป็นอย่างไร ฉันกำลังพยายามเข้าถึงอยู่บนอินเทอร์เน็ตภายนอกหรือแม้ว่าจะมาจากอินสแตนซ์ Apache ในพื้นที่ที่ทำงานบน localhost มันมีผลกับคอมพิวเตอร์ทุกเครื่องในเครือข่ายท้องถิ่นของเรา (Ethernet ไม่ใช่แบบไร้สาย) ซึ่งทั้งหมดนี้ใช้ Windows XP

มีคนแนะนำฉันว่าอาจใช้ MTU ที่ใช้กับทราฟฟิกเครือข่าย ถ้าฉันทำการทดสอบ Pingเพื่อหาแพ็คเก็ตที่ใหญ่ที่สุดที่สามารถผ่านการแยกส่วนได้ฉันสามารถ ping localhost ด้วยแพ็คเกจ 1492 ไบต์ (+28 ไบต์สำหรับส่วนหัว?) และฉันสามารถ ping เราเตอร์ของเราด้วยแพ็คเกจ 1462 ไบต์ (ซึ่งคือ 1490 ไบต์เมื่อคุณรวมส่วนหัว 28 ไบต์) ถ้าฉันลองทำอะไรบางอย่างที่อยู่ด้านนอกเช่น Google ฉันจะไม่สามารถผ่านอะไรที่ใหญ่กว่า 1430 ได้ (ซึ่งคือ 1458 ด้วยส่วนหัว)

ฉันได้พยายามต่อไปนี้ชุดต่างๆของคำแนะนำในการปรับปรุง Windows XP Registry ด้วยการตั้งค่า MTU HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{AdapterID}\MTUนี้การปรับปรุง ฉันได้ลองใช้ค่าอื่นไม่สิ้นสุด: ค่าที่ถูกต้องชัดเจนที่สุดดูเหมือนจะเป็น 1490 แต่ฉันได้ลอง 1462, 1458, 1430 เป็นต้นเมื่อฉันรีบูตคอมพิวเตอร์เพื่อให้การเปลี่ยนแปลงมีผลดูเหมือนว่าจะใช้งานได้ไม่กี่นาที (ยากที่จะบอกได้อย่างแน่นอนเพราะมันสุ่มเสมอแทนที่จะสอดคล้องกัน) แต่มันก็ไม่นาน

เริ่มแรกเมื่อฉันลองใช้ 1430 เป็นค่าหนึ่งหลังจากทำงานไม่กี่นาทีผลลัพธ์ของการทดสอบ Ping จะลดลง 28 ไบต์ - ทันใดนั้นฉันก็พบว่าฉันจะได้รับแพ็คเกจ 1402 ไบต์ผ่าน Google เท่านั้น หากฉันอัปเดตการตั้งค่ารีจิสทรี MTU เป็น 1402 เมื่อฉันรีบูตและรอสักครู่มันก็จะเป็น 1374 จากนั้น 1346 เป็นต้น ฯลฯ คอมพิวเตอร์อื่น ๆ ในเครือข่ายยังคงไม่ได้รับผลกระทบ (ยังอยู่ที่ 1430) และลบการตั้งค่า MTU จากรีจิสทรีจะคืนค่าสิ่งต่าง ๆ ให้เป็นปกติ (และยังขาดอยู่)

สิ่งที่ฉันพบว่ายากที่สุดในการวินิจฉัยทั้งหมดนี้คือมันยากมากที่จะบอกได้ว่าฉันกำลังเล่นกับการตั้งค่ารีจิสทรีที่ถูกต้องหรือไม่ ดังนั้นที่ง่ายที่สุดคำถามของฉันคือ: ฉันจะบอกได้อย่างไรว่าการตั้งค่า MTU ของ Windows กำลังพยายามใช้งานอย่างไร

นอกจากนี้หากใครมีแนวคิดใดที่จะบอกสาเหตุที่ทำให้ MTU ลดลง 28 จะเป็นประโยชน์เช่นกัน (เช่นมีไฟล์บันทึกของ Windows ที่ใดที่หนึ่งซึ่งจะบันทึกบางสิ่ง ณ จุดที่ค่าเปลี่ยนแปลง)

ในที่สุดถ้าใครสามารถบอกฉันได้อย่างชัดเจนว่าจะบอกได้อย่างไรว่าการตั้งค่า MTU ที่ฉันควรใช้คืออะไรนั่นจะยอดเยี่ยมมาก!


FWIW ในท้ายที่สุดมันเป็นสายโทรศัพท์ที่หลบซึ่งเป็นปัญหา เมื่อฉันเสียบโทรศัพท์ไม่มีเสียงเรียกเข้า
andygeers

คำตอบ:


58

สำหรับ Windows 7, Windows Vista และ Windows XP, MTU สำหรับการเชื่อมต่อต่างๆสามารถใช้ได้จาก Windows netshเองใช้

Windows 7, Windows Vista

วิธีแสดงMTUปัจจุบันบน Windows 7 หรือ Windows Vista จากพรอมต์คำสั่ง:

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

และสำหรับอินเตอร์เฟส 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

หมายเหตุ:ในตัวอย่างนี้เชื่อมต่อเครือท้องถิ่นของฉันIPv6อินเตอร์เฟซได้เช่น MTU ต่ำ (1280) เพราะผมใช้บริการอุโมงค์ที่จะได้รับการเชื่อมต่อ IPv6

คุณสามารถเปลี่ยน MTU ของคุณ (Windows 7, Windows Vista) จากพรอมต์คำสั่งที่ยกระดับ :

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

ทดสอบกับ Windows 7 Service Pack 1

Windows XP

netshไวยากรณ์สำหรับ Windows XP จะแตกต่างกันเล็กน้อย

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

หมายเหตุ: Windows XP ต้องการให้บริการการกำหนดเส้นทางและการเข้าถึงระยะไกลเริ่มต้นก่อนที่คุณจะสามารถดูรายละเอียดเกี่ยวกับอินเทอร์เฟซ (รวมถึง MTU):

C:\Users\Ian>net start remoteaccesss

Windows XP ไม่ได้ให้วิธีการที่จะเปลี่ยนการตั้งค่า MTU netshจากภายใน เพื่อที่คุณจะสามารถ:

ทดสอบกับ Windows XP Service Pack 3

ดูสิ่งนี้ด้วย


การอภิปรายสั้น ๆ เกี่ยวกับ MTU คืออะไรโดยที่ 28 ไบต์มาจากไหน

การ์ดเครือข่าย (Ethernet) ของคุณมีขนาดแพ็กเก็ตสูงสุด1,500 bytes:

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

ส่วน IP ของTCP / IPต้องการส่วนหัว 20 ไบต์ (แฟล็ก 12 ไบต์, 4 ไบต์สำหรับที่อยู่ IP ต้นทาง, 4 ไบต์สำหรับที่อยู่ IP ปลายทาง) ทำให้เหลือพื้นที่น้อยลงในแพ็คเก็ต

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

ตอนนี้แพ็คเก็ต ICMP (ping) มีส่วนหัว 8 ไบต์ (1 ไบต์type, 1 ไบต์code, 2 ไบต์checksum, 4 ไบต์ข้อมูลเพิ่มเติม):

+------------------------+
| 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      |
|                        |
|                        |
|                        |
+------------------------+

นั่นคือที่ที่ "ขาดหายไป" 28 ไบต์ - มันเป็นขนาดของส่วนหัวที่จำเป็นในการส่งแพ็คเก็ตปิง

เมื่อคุณส่งแพ็กเก็ต ping คุณสามารถระบุข้อมูลเพิ่มเติมของข้อมูลที่ต้องการรวมได้ ในกรณีนี้หากคุณรวม 1472 ไบต์ทั้งหมด:

>ping -l 1472 obsidian

จากนั้นแพ็คเก็ตอีเธอร์เน็ตที่ได้จะเต็มไปด้วยเหงือก ทุกไบต์สุดท้ายของแพ็คเก็ต 1500 ไบต์จะถูกเติม:

+------------------------+
| 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....|
|........................|
|........................|
|........................|
|........................|
+------------------------+

หากคุณพยายามส่งอีกหนึ่งไบต์

>ping -l 1473 obsidian

เครือข่ายจะต้องแยกส่วนแพ็คเก็ต 1501 ไบต์เป็นหลาย ๆ แพ็คเก็ต:

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      |
|                        |
|                        |
|                        |
|                        |
|                        |
+------------------------+

การกระจัดกระจายนี้จะเกิดขึ้นหลังฉากโดยที่คุณไม่รู้ตัว

แต่คุณสามารถพูดได้และบอกเครือข่ายว่าแพ็คเก็ตไม่ได้รับอนุญาตให้แยกส่วน:

>ping -l 1473 -f obsidian

-fธงหมายถึงทำไม่ได้ส่วน ตอนนี้เมื่อคุณพยายามส่งแพ็คเก็ตที่ไม่พอดีกับเครือข่ายคุณได้รับข้อผิดพลาด:

>ping -l 1473 -f obsidian  

Packet needs to be fragmented but DF set.

แพ็กเก็ตจะต้องมีการแยกส่วน แต่มีการตั้งค่าสถานะDo Not Fragment

หากที่ใดก็ตามที่ต้องการแยกส่วนแพ็คเก็ตเครือข่ายจะส่งแพ็คเก็ต ICMP บอกคุณว่ามีการแตกแฟรกเมนต์เกิดขึ้น เครื่องของคุณรับแพ็คเก็ต ICMP นี้เครื่องจะบอกขนาดที่ใหญ่ที่สุดและควรหยุดส่งแพ็กเก็ตที่ใหญ่เกินไป น่าเสียดายที่ไฟร์วอลล์ส่วนใหญ่ปิดกั้นแพ็คเก็ต ICMP "Path MTU Discovery" เหล่านี้ดังนั้นเครื่องของคุณจะไม่ตระหนักว่าแพ็กเก็ตนั้นมีการแยกส่วน (หรือแย่กว่า: ลดลงเนื่องจากไม่สามารถแยกส่วนได้)

นั่นคือสิ่งที่ทำให้เว็บเซิร์ฟเวอร์ไม่ทำงาน คุณสามารถรับการตอบสนองเริ่มต้นขนาดเล็ก (<1280 ไบต์) แต่แพ็คเก็ตที่ใหญ่กว่าจะไม่สามารถผ่านได้ และไฟร์วอลล์ของเว็บเซิร์ฟเวอร์นั้นได้รับการกำหนดค่าที่ไม่ถูกต้องทำให้บล็อกแพ็คเก็ต ICMP ดังนั้นเว็บเซิร์ฟเวอร์จึงไม่ทราบว่าคุณไม่ได้รับแพ็กเก็ต

การแยกส่วนของแพ็คเก็ตไม่ได้รับอนุญาตใน IPv6 ทุกคนจะต้อง (อย่างถูกต้อง) อนุญาตให้ใช้แพ็คเก็ต ICMP mtu Discovery


8

@ ฉันไม่แน่ใจว่าnetshจริง ๆ แล้วแสดง MTU ที่ใช้อยู่ในปัจจุบัน ในเครื่อง Windows XP Pro SP3 ของฉันฉันได้ดำเนินการnetsh interface ip show interfaceแล้วและรายงานค่า MTU สำหรับส่วนต่อประสานที่เกี่ยวข้อง1500ดังนี้ ฉันเพิ่มคีย์รีจิสตรีต่อไปนี้แล้ว:

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 ระบุว่าการตั้งค่าEnablePMTUDiscoveryเป็น 0 จะตั้งค่า MTU เป็น 576

การตั้งค่าMTUรายการรีจิสตรีจะตั้งค่า MTU ด้วยตนเอง ฉันลองหลายค่าสำหรับMTUรายการ (รีบูตแต่ละครั้ง)

ในทั้งสองกรณี - เพิ่มรายการแรกจากนั้นรายการที่สอง - netshยังคงรายงาน MTU เป็น 1500 การทดสอบกับ ping ได้รับการยืนยัน (หรือแนะนำอย่างน้อยที่สุด) ว่าค่า MTU ที่กำหนดค่าในรีจิสตรีนั้นถูกใช้งานจริง

เมื่อฉันลองสิ่งนี้ในเครื่องของฉันครั้งแรกบริการการกำหนดเส้นทางและการเข้าถึงระยะไกลถูกปิดใช้งานดังนั้นฉันจึงไม่สามารถเริ่มใช้งานได้โดยใช้คำแนะนำของคุณ ฉันเปิดใช้งานโดยไปที่แผงควบคุม> เครื่องมือการจัดการ> การจัดการคอมพิวเตอร์> บริการและแอปพลิเคชัน> บริการ ฉันเปลี่ยน "ประเภทการเริ่มต้น" จากปิดการใช้งานเป็นด้วยตนเอง จากนั้นฉันก็เริ่มให้บริการจากกล่องโต้ตอบนั้นเช่นกัน

ฉันยังไม่แน่ใจว่า KB283165 นั้นเป็นคำแนะนำที่ถูกต้องสำหรับการเปลี่ยน MTU คำแนะนำเหล่านั้นไม่เกี่ยวข้องเฉพาะเมื่อใช้งานไคลเอนต์ Windows PPPoE หรือไม่ หากเชื่อมต่ออินเทอร์เน็ตผ่านเราเตอร์ที่เราเตอร์เป็นไคลเอนต์ PPPoE (ในกรณีของฉัน) คำแนะนำเหล่านั้นจะไม่เกี่ยวข้องใช่ไหม

คำแนะนำที่ฉันติดตามซึ่งนำฉันไปสู่การเปลี่ยนแปลงด้านบนของรีจิสทรีอยู่ในKB900926: การตั้งค่า TCP / IP ที่แนะนำสำหรับลิงค์ WAN ที่มีขนาด MTU น้อยกว่า 576 (วิธีที่ 2 และ 3)


แก้ไขโดย @ian

ดูเหมือนว่าคุณพูดถูก กำหนดค่าสำหรับ 1,200 แต่รายงานnetsh1500

ป้อนคำอธิบายรูปภาพที่นี่

>ping -l 1173 -f obsidian

Packet needs to be fragmented but DF set.

ดังนั้นฉันเดาคำตอบสำหรับคำถามเดิมคือว่าใน Windows XP คุณต้องใช้การทดลองและข้อผิดพลาดกับDo notแฟรกเมนต์แฟล็กเพื่อค้นหาแพ็กเก็ตที่ใหญ่ที่สุดที่คุณสามารถส่งได้ จากนั้นคุณมี MTU ของคุณ


2

คุณสามารถค้นหา MTU โดยใช้ ping พร้อมวิธีการทดลองและข้อผิดพลาด:

ping <address> -f -l nnnn

ปิง :

-f: ระบุว่าข้อความ Echo Request ถูกส่งไปพร้อมกับแฟล็ก Don't Fragment ในชุด IP header เป็น 1 ข้อความ Echo Request ไม่สามารถแยกส่วนได้โดยเราเตอร์ในเส้นทางไปยังปลายทาง พารามิเตอร์นี้มีประโยชน์สำหรับการแก้ไขปัญหาเส้นทาง Maximum Transmission Unit (PMTU)

-l Size: ระบุความยาวเป็นไบต์ของฟิลด์ Data ในข้อความ Echo Request ที่ส่ง ค่าเริ่มต้นคือ 32 ขนาดสูงสุดคือ 65,527

คุณจะได้รับข้อความ "แพ็คเก็ตต้องแยกส่วน แต่ชุด DF" เมื่อความยาวใหญ่เกินไป


นี่คือสิ่งที่ฉันทำข้างต้นเมื่อฉันเรียกว่า "The Ping Test"
andygeers

1

ดูAdapterWatch :

AdapterWatch แสดงข้อมูลที่เป็นประโยชน์เกี่ยวกับอะแดปเตอร์เครือข่ายของคุณ: ที่อยู่ IP, ที่อยู่ฮาร์ดแวร์, เซิร์ฟเวอร์ WINS, เซิร์ฟเวอร์ DNS, ค่า MTU, จำนวนไบต์ที่รับหรือส่ง, ความเร็วในการถ่ายโอนปัจจุบันและอื่น ๆ นอกจากนี้ยังแสดงสถิติ TCP / IP / UDP / ICMP ทั่วไปสำหรับคอมพิวเตอร์ในพื้นที่ของคุณ


1

ไมโครซอฟท์ KB314496: MTU เริ่มต้นขนาดสำหรับเครือข่ายที่แตกต่างกัน
คุณไม่ควรลองเล่นกับการกำหนดค่า MTU ในการตั้งค่าเครือข่ายปกติ

มีความเป็นรหัสอ้างอิง VB ที่นี่
นอกจากนี้ยังมีเครื่องมือที่เรียกว่าDrTCP :

ข้อความแสดงแทน


ในรีจิสทรี

  • ไปที่ HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards
  • เปิดอะแดปเตอร์ที่คุณสนใจ
  • คัดลอกServiceNameสตริง
  • ค้นหาสตริงHKLM\Systemนั้นใน คุณจะจับคู่NetCfgInstanceIdกุญแจ
  • เหนือกว่าเล็กน้อยที่จะเป็นMaxFrameSizeกุญแจสำคัญ (ฉันจะแสดง 1514)

นอกจากนี้ยังมีวิธีการเปลี่ยนแปลงสิ่งนี้ด้วยnetshคำสั่ง

ตรวจสอบการกำหนดค่า Path MTU Discovery ของคุณด้วย


ขอบคุณสำหรับสิ่งนั้น แต่โดยปกติแล้วฉันจะมั่นใจมากขึ้นถ้าฉันสามารถให้ Windows บอกจริง ๆว่า MTU นั้นใช้งานอะไรจริง ๆมากกว่าที่จะเป็นค่าเริ่มต้น อาจเป็นไปไม่ได้ว่า :-(
andygeers
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.