Para Windows 7, Windows Vista e Windows XP, a MTU para várias interfaces está disponível a partir do próprio Windows usando netsh
.
Windows 7, Windows Vista
Para mostrar o MTU actual no Windows 7 ou Windows Vista, a partir de um prompt de comando:
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
E para interfaces 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
Nota: Neste exemplo a minha interface de Área Local IPv6* tem uma MTU tão baixa (1280) porque estou a usar um serviço túnel para obter conectividade IPv6 .
Também pode alterar a sua MTU (Windows 7, Windows Vista). A partir de um prompt de comando elevado:
>netsh interface ipv4 set subinterface "Local Area Connection" mtu=1492 store=persistent
Ok.
Testado com Windows 7 Service Pack 1
Windows XP
A sintaxe netsh
para Windows XP é ligeiramente diferente:
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
Nota: ** O Windows XP requer que o serviço **Routing and Remote Access seja iniciado antes de poder ver detalhes sobre uma interface (incluindo MTU):
C:\Users\Ian>net start remoteaccesss
O Windows XP não fornece uma forma de alterar a configuração da MTU a partir de netsh
. Para isso, pode:
Testado com o pacote de serviços do Windows XP 3
Ver também
& - Configurar o tamanho da unidade de transferência máxima TCPIP (MTU) no Vista
- Configurar a MTU no Windows Vista
- Alterar a ajuda das definições da MTU!
- KB283165 - Como alterar o tamanho da MTU PPPoE no Windows XP
- DSLReports - DrTCP
Breve discussão sobre o que é a MTU, de onde vêm os 28 bytes.
A sua placa de rede (Ethernet) tem um tamanho máximo de pacote de 1,500 bytes
:
+---------+
| 1500 |
| byte |
| payload |
| |
| |
| |
+---------+
A parte IP de TCP/IP* requer um cabeçalho de 20 bytes (12 bytes de bandeiras, 4 bytes para o endereço IP de origem, 4 bytes para o endereço IP de destino). Isto deixa menos espaço disponível no pacote:
+------------------------+
| 12 bytes control flags | \
| 4 byte from address | |- IP header: 20 bytes
| 4 byte to address | /
|------------------------|
| 1480 byte payload |
| |
| |
| |
+------------------------+
Agora um pacote ICMP (ping) tem um cabeçalho de 8 bytes (1 byte type
, 1 byte code
, 2 bytes checksum
, 4 bytes de dados adicionais):
+------------------------+
| 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 |
| |
| |
| |
+------------------------+
É aí que se encontram os 28 bytes “em falta” - é o tamanho dos cabeçalhos necessários para enviar um pacote ping.
Quando envia um pacote ping, pode especificar quanto extra* dados de carga útil gostaria de incluir. Neste caso, se incluir todos os 1472 bytes:
>ping -l 1472 obsidian
Então o pacote ethernet resultante estará cheio até às guelras. Cada último byte do pacote de 1500 bytes será preenchido:
+------------------------+
| 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....|
|........................|
|........................|
|........................|
|........................|
+------------------------+
Se tentar enviar um byte a mais
>ping -l 1473 obsidian
a rede terá de fragmentar esse pacote de 1501 bytes em pacotes múltiplos:
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 |
| |
| |
| |
| |
| |
+------------------------+
Esta fragmentação acontecerá nos bastidores, idealmente sem que você saiba.
Mas pode ser mau, e dizer à rede que o pacote não pode ser fragmentado:
>ping -l 1473 -f obsidian
A bandeira -f significa não fragmentar. Agora, quando se tenta enviar um pacote que não cabe na rede, obtém-se o erro:
>ping -l 1473 -f obsidian
Packet needs to be fragmented but DF set.
O pacote precisa de ser fragmentado, mas a bandeira não fragmentar foi colocada.
Se em qualquer ponto da linha um pacote precisasse de ser fragmentado, a rede envia na realidade um pacote ICMP dizendo-lhe que ocorreu uma fragmentação. A sua máquina recebe este pacote ICMP, é informada de qual era o maior tamanho, e é suposto deixar de enviar pacotes demasiado grandes. Infelizmente, a maioria das firewalls bloqueiam estes pacotes ICMP “Path MTU discovery”, pelo que a sua máquina nunca se apercebe que os pacotes estão a ser fragmentados (ou pior: largados porque não podiam ser fragmentados).
Isso é o que faz com que o servidor web não funcione. Pode obter as respostas iniciais pequenas (<1280 byte), mas os pacotes maiores não conseguem passar. E as firewalls do servidor web estão mal configuradas, bloqueando os pacotes ICMP. Assim, o servidor web não se apercebe que nunca recebeu o pacote.
A fragmentação de pacotes não é permitida em IPv6, todos são requeridos para (correctamente) permitir pacotes de descoberta de mtu ICMP.