Cách nhận biết MTU nào đang được sử dụng trong Windows XP


21

Tôi đang gặp phải một vấn đề thực sự kỳ lạ khi tôi ngẫu nhiên gặp lỗi "Kết nối với máy chủ được đặt lại" khi cố truy cập các trang web (lỗi HTTP 12031 theo công cụ chẩn đoán mạng Windows) - điều này xảy ra bất kể trang web đó có xảy ra hay không Tôi đang cố gắng truy cập trên internet bên ngoài hoặc ngay cả khi đó là từ một cá thể Apache cục bộ đang chạy trên localhost. Nó ảnh hưởng đến tất cả các máy tính trên mạng cục bộ của chúng tôi (Ethernet, không phải không dây), tất cả đều đang chạy Windows XP.

Nó đã được đề xuất với tôi rằng nó có thể được thực hiện với MTU được sử dụng trên lưu lượng mạng. Nếu tôi thực hiện Kiểm tra Ping để tìm ra gói lớn nhất có thể trải qua không bị phân mảnh, tôi có thể ping localhost với gói 1492 byte (+28 byte cho một tiêu đề?) Và tôi có thể ping bộ định tuyến của chúng tôi với gói 1462 byte (là 1490 byte khi bạn bao gồm tiêu đề 28 byte). Nếu tôi thử và ping thứ gì đó ở bên ngoài như Google, tôi không thể nhận được bất cứ thứ gì lớn hơn 1430 (tức là 1458 với tiêu đề).

Tôi đã thử làm theo các bộ hướng dẫn khác nhau để cập nhật Windows XP Registry với cài đặt MTU này, đang cập nhật HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{AdapterID}\MTU. Tôi đã thử không có kết thúc của các giá trị thay thế: giá trị đúng rõ ràng nhất có vẻ là 1490, nhưng tôi cũng đã thử 1462, 1458, 1430, v.v., v.v. Khi tôi khởi động lại máy tính để thay đổi có hiệu lực, nó dường như hoạt động trong vài phút (khó có thể nói chắc chắn vì nó luôn luôn ngẫu nhiên thay vì nhất quán) nhưng nó không bao giờ tồn tại lâu.

Ban đầu, khi tôi đang thử 1430 như một giá trị, sau vài phút hoạt động tốt, kết quả của Thử nghiệm Ping sẽ giảm 28 byte - đột nhiên tôi thấy rằng tôi chỉ có thể nhận được gói 1402 byte cho Google. Nếu tôi cập nhật cài đặt đăng ký MTU thành 1402, khi tôi khởi động lại và đợi vài phút, thì đó sẽ là 1374, sau đó là 1346, v.v. Các máy tính khác trên mạng vẫn không bị ảnh hưởng (vẫn ở 1430) và xóa cài đặt MTU từ sổ đăng ký sẽ khôi phục mọi thứ trở lại bình thường (và vẫn bị hỏng).

Điều mà tôi thấy khó khăn nhất trong việc chẩn đoán tất cả những điều này là rất khó để biết liệu tôi có đang chơi với cài đặt đăng ký chính xác hay không. Vì vậy, đơn giản nhất, câu hỏi của tôi sẽ là: Làm thế nào tôi có thể biết cài đặt MTU nào mà Windows đang cố sử dụng?

Ngoài ra, nếu bất kỳ ai có ý tưởng làm thế nào để biết lý do tại sao MTU tiếp tục giảm 28, điều đó cũng hữu ích (ví dụ: có tệp nhật ký Windows ở đâu đó nơi nó sẽ ghi nhật ký vào thời điểm giá trị thay đổi không?)

Cuối cùng, nếu ai đó có thể nói cho tôi biết một cách dứt khoát làm thế nào để biết tôi nên cố gắng sử dụng cài đặt MTU nào, điều đó thật tuyệt!


FWIW, cuối cùng, đó là một đường dây điện thoại tinh ranh là vấn đề. Khi tôi cắm điện thoại vào thì không có âm quay số.
andygeers

Câu trả lời:


58

Đối với Windows 7, Windows Vista và Windows XP, MTU cho các giao diện khác nhau có sẵn từ chính Windows sử dụng netsh.

Windows 7, Windows Vista

Để hiển thị MTU hiện tại trên Windows 7 hoặc Windows Vista, từ dấu nhắc lệnh:

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

Và đối với giao diện 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

Lưu ý: Trong ví dụ này, giao diện IPv6 kết nối khu vực địa phương của tôi có MTU thấp (1280) vì tôi đang sử dụng dịch vụ đường hầm để có kết nối IPv6 .

Bạn cũng có thể thay đổi MTU của mình (Windows 7, Windows Vista). Từ một dấu nhắc lệnh nâng cao :

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

Đã thử nghiệm với Windows 7 Service Pack 1

Windows XP

Các netshcú pháp cho Windows XP là hơi khác nhau:

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

Lưu ý: Windows XP yêu cầu dịch vụ Định tuyến và Truy cập từ xa phải được khởi động trước khi bạn có thể xem chi tiết về giao diện (bao gồm MTU):

C:\Users\Ian>net start remoteaccesss

Windows XP không cung cấp cách thay đổi cài đặt MTU từ bên trong netsh. Cho rằng bạn có thể:

Đã thử nghiệm với Windows XP Gói dịch vụ 3

Xem thêm


Thảo luận ngắn về MTU là gì, nơi 28 byte đến từ đâu.

Thẻ mạng của bạn (Ethernet) có kích thước gói tối đa là 1,500 bytes:

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

Phần IP của TCP / IP yêu cầu tiêu đề 20 byte (12 byte cờ, 4 byte cho địa chỉ IP nguồn, 4 byte cho địa chỉ IP đích). Điều này để lại ít không gian có sẵn trong gói:

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

Bây giờ gói ICMP (ping) có tiêu đề 8 byte ( dữ liệu bổ sung 1 byte type, 1 byte code, 2 byte checksum, 4 byte):

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

Đó là nơi "thiếu" 28 byte - đó là kích thước của các tiêu đề cần thiết để gửi gói ping.

Khi bạn gửi một gói tin ping, bạn có thể xác định có bao nhiêu phụ bạn muốn tải dữ liệu bao gồm. Trong trường hợp này, nếu bạn bao gồm tất cả 1472 byte:

>ping -l 1472 obsidian

Sau đó, gói ethernet kết quả sẽ đầy đến mang. Mỗi byte cuối cùng của gói 1500 byte sẽ được điền:

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

Nếu bạn cố gửi thêm một byte

>ping -l 1473 obsidian

mạng sẽ phải phân chia gói 1501 byte đó thành nhiều gói:

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

Sự phân mảnh này sẽ xảy ra đằng sau hậu trường, lý tưởng mà bạn không biết.

Nhưng bạn có thể có ý nghĩa và nói với mạng rằng gói không được phép bị phân mảnh:

>ping -l 1473 -f obsidian

Các -f phương tiện cờ không mảnh . Bây giờ khi bạn cố gửi một gói không phù hợp trên mạng, bạn sẽ gặp lỗi:

>ping -l 1473 -f obsidian  

Packet needs to be fragmented but DF set.

Gói cần được phân mảnh, nhưng cờ Không phân mảnh đã được đặt.

Nếu bất cứ nơi nào dọc theo một gói cần phải được phân mảnh, mạng thực sự sẽ gửi một gói ICMP cho bạn biết rằng một sự phân mảnh đã xảy ra. Máy của bạn nhận được gói ICMP này, được cho biết kích thước lớn nhất là bao nhiêu và có nghĩa vụ ngừng gửi các gói quá lớn. Thật không may, hầu hết các tường lửa đều chặn các gói ICMP "Khám phá MTU" này, vì vậy máy của bạn không bao giờ nhận ra các gói đang bị phân mảnh (hoặc tệ hơn: bị hủy vì chúng không thể bị phân mảnh).

Đó là nguyên nhân khiến máy chủ web không hoạt động. Bạn có thể nhận được các phản hồi nhỏ ban đầu (<1280 byte), nhưng các gói lớn hơn không thể vượt qua. Và tường lửa của máy chủ web bị định cấu hình sai, chặn các gói ICMP. Vì vậy, máy chủ web không nhận ra bạn không bao giờ có gói.

Phân mảnh các gói không được phép trong IPv6, mọi người đều được yêu cầu (chính xác) cho phép các gói khám phá mtu ICMP.


8

@ian Tôi không chắc chắn rằng netshthực sự hiển thị MTU hiện đang được sử dụng. Trên máy Windows XP Pro SP3 của tôi, tôi đã thực thi netsh interface ip show interfacevà nó đã báo cáo giá trị MTU cho giao diện có liên quan như 1500. Sau đó tôi đã thêm các khóa đăng ký sau:

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 nói rằng cài đặt EnablePMTUDiscoverythành 0 sẽ đặt MTU thành 576.

Đặt MTUmục đăng ký sẽ đặt MTU theo cách thủ công. Tôi đã thử một vài giá trị cho MTUmục nhập (khởi động lại mỗi lần).

Trong cả hai trường hợp - thêm mục nhập đầu tiên, sau đó là mục nhập thứ hai - netshvẫn báo cáo MTU là 1500. Thử nghiệm với ping đã được xác nhận (hoặc ít nhất là được đề xuất) rằng giá trị MTU được định cấu hình trong sổ đăng ký thực sự đang được sử dụng.

Ngoài ra, khi tôi lần đầu tiên thử điều này trên máy của mình, dịch vụ Định tuyến và Truy cập từ xa đã bị tắt, vì vậy tôi không thể khởi động nó bằng hướng dẫn của bạn. Tôi đã kích hoạt nó bằng cách vào Bảng điều khiển> Công cụ quản trị> Quản lý máy tính> Dịch vụ và ứng dụng> Dịch vụ. Tôi đã thay đổi "Loại khởi động" từ Vô hiệu thành Thủ công. Sau đó tôi cũng bắt đầu dịch vụ từ hộp thoại đó.

Tôi cũng không chắc chắn rằng KB283165 nhất thiết phải là hướng dẫn chính xác để thay đổi MTU. Không phải những hướng dẫn đó chỉ có liên quan khi chạy ứng dụng khách Windows PPPoE sao? Nếu kết nối với internet thông qua bộ định tuyến trong đó bộ định tuyến là máy khách PPPoE (như trong trường hợp của tôi), những hướng dẫn đó sẽ không liên quan, phải không?

Các hướng dẫn tôi đã làm theo, khiến tôi thực hiện các thay đổi ở trên đối với sổ đăng ký, là trong KB900926: Cài đặt TCP / IP được đề xuất cho các liên kết WAN có kích thước MTU nhỏ hơn 576 (phương pháp 2 & 3).


Chỉnh sửa bởi @ian

Có vẻ như bạn đúng. Cấu hình cho 1.200, nhưng netshbáo cáo 1500.

nhập mô tả hình ảnh ở đây

>ping -l 1173 -f obsidian

Packet needs to be fragmented but DF set.

Vì vậy, tôi đoán câu trả lời cho câu hỏi ban đầu là trên Windows XP, bạn phải sử dụng thử và lỗi với cờ Không phân đoạn để tìm gói lớn nhất bạn có thể gửi. Sau đó, bạn có MTU của bạn.


2

Bạn có thể tìm thấy MTU bằng cách sử dụng ping với phương pháp thử và sai:

ping <address> -f -l nnnn

Bình :

-f: Chỉ định rằng các tin nhắn Yêu cầu Echo được gửi với cờ Donment Fragment trong tiêu đề IP được đặt thành 1. Tin nhắn Yêu cầu Echo không thể bị phân mảnh bởi các bộ định tuyến trong đường dẫn đến đích. Tham số này hữu ích cho việc khắc phục sự cố đường dẫn Đơn vị truyền tối đa (PMTU).

-l Size: Chỉ định độ dài, tính bằng byte, của trường Dữ liệu trong các tin nhắn Yêu cầu Echo được gửi. Mặc định là 32. Kích thước tối đa là 65,527.

Bạn sẽ nhận được thông báo "Gói cần được phân mảnh nhưng DF set" khi độ dài quá lớn.


Đây là những gì tôi đã làm ở trên khi tôi đề cập đến "Thử nghiệm Ping"
andygeers

1

Xem AdaptorWatch :

AdapterWatch hiển thị thông tin hữu ích về bộ điều hợp mạng của bạn: địa chỉ IP, địa chỉ phần cứng, máy chủ WINS, máy chủ DNS, giá trị MTU, Số byte nhận hoặc gửi, Tốc độ truyền hiện tại, v.v. Ngoài ra, nó sẽ hiển thị số liệu thống kê TCP / IP / UDP / ICMP chung cho máy tính cục bộ của bạn.


1

Microsoft KB314496: Kích thước MTU mặc định cho các cấu trúc liên kết mạng khác nhau .
Bạn không nên thử chơi với cấu hình MTU trong các thiết lập mạng thông thường.

Có một tài liệu tham khảo mã VB ở đây .
Ngoài ra còn có một công cụ gọi là DrTCP :

văn bản thay thế


Trong sổ đăng ký,

  • Đi đến HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards
  • Mở bộ chuyển đổi mà bạn quan tâm
  • Sao chép ServiceNamechuỗi
  • Tìm kiếm chuỗi đó trong HKLM\System; bạn sẽ khớp với một NetCfgInstanceIdchìa khóa
  • Một chút ở trên đó sẽ là MaxFrameSizechìa khóa (của tôi cho thấy 1514)

Cũng có một cách để thay đổi điều này với netshlệnh.

Ngoài ra, hãy kiểm tra cấu hình Path MTU Discovery của bạn .


Cảm ơn vì điều đó, nhưng lý tưởng nhất là tôi sẽ yên tâm hơn nếu tôi có thể khiến Windows thực sự cho tôi biết MTU thực sự đang sử dụng, thay vì chỉ là những gì bạn mong đợi mặc định. Có lẽ điều này là không thể mặc dù :-(
andygeers
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.