Question

Je travaille sur le logiciel de couche pseudo-transport qui fonctionne sur UDP, fournissant transmission orienté connexion fiable, comme une alternative à TCP. Afin de maximiser l'efficacité du réseau, nous nous interrogeons sur le MTU de l'adaptateur réseau « meilleur » lors de l'initialisation.

MIB_IFROW row = {0};
row.dwIndex = dwBestIfIndex;

dwRes = GetIfEntry(&row);

Recherche en ligne je trouve que vous pouvez utiliser les commandes netsh suivantes à la requête de cette même valeur, à partir d'une invite de commande (pas une API C ++)

netsh interface ipv4 show interfaces
netsh interface ipv4 show subinterfaces

La question troublante est que si row.dwMtu peut être réglé sur 1500, fouiner le trafic réseau sur les spectacles portables d'envoi que nos paquets sont fragmentés en 1300 paquets d'octets. netsh signale également que le MTU est 1300.

Il est clair que la valeur indiquée par la commande netsh sont les valeurs utilisées réelles. savoir Anyone ce que je peux API appeler pour obtenir les mêmes valeurs que netsh?

Était-ce utile?

La solution

Il y a la taille de MTU locale et MTU Path (voir RFC 1191). Vous pouvez utiliser les commandes comme

ping -f -l 1464 www.stackoverflow.com
ping -f -l 1465 www.stackoverflow.com

pour déterminer un MTU de chemin. Prendre en considération la taille d'en-tête des paquets ICMP et en-têtes IP. Voir Path MTU Discovery pour la solution API.

MISES À JOUR : il vous plaît pas plus à ces questions! Il était très intéressant pour moi de trouver la réponse et je passe quelques heures pour cela. Mais ... j'ai trouvé! Pour recevoir la valeur correcte de la taille MTU, vous devez utiliser l'API GetIpInterfaceTable qui retourne la structure PMIB_IPINTERFACE_TABLE qui a tableau de structures MIB_IPINTERFACE_ROW. MIB_IPINTERFACE_ROW chapeau InterfaceIndex qui vous permet d'identifier l'interface IP, il est le même que dans d'autres fonctions d'assistance IP bien connus. Vous pouvez également utiliser la fonction ConvertInterfaceLuidToNameW pour recevoir d'une autre InterfaceLuid champ le nom de l'interface.

Mais la chose la plus intéressante est NlMtu

typedef struct _MIB_IPINTERFACE_ROW {
    ADDRESS_FAMILY Family;
    NET_LUID InterfaceLuid;
    NET_IFINDEX InterfaceIndex;
    // ...
    ULONG NlMtu;
    // ...
};

Dans la documentation (voir http: / /msdn.microsoft.com/en-us/library/aa814496(v=VS.85).aspx ), il est décrit comme " La couche réseau de taille MTU, en octets. " . Le même texte et plus vous trouverez également dans la documentation de Windows Driver Kit (voir http://msdn.microsoft.com/en-us/library/ff559254 (VS.85) .aspx ). Ce champ NlMtu est ce que vous recherchez. Mon ordinateur par exemple est connecté à Internet via un routeur DSL et NlMtu n'est pas 1500 comme il serait sans le routeur, mais a la valeur correcte 1492 à la place. Dans votre cas, il doit être 1300.

Si vous avez l'une des dernières versions de Microsoft SDK installé, vous trouverez dans C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0 \ Samples \ netds \ iphelp \ Netinfo répertoire un exemple qui utilise l'API GetIpInterfaceTable. Il suffit de définir un brakepoint sur la ligne 270 dans le netinfo.c fichier et vous verrez dans InterfaceTable->Table[i].NlMtu la valeur correcte de MTU IP de l'adaptateur d'interface correspondante. Si vous vérifiez dans le registre sous HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services de Tcpip \ Parameters \ Interfaces {34407201-997C-41FF-9EBF-1B7D6DF92B38} dont la valeur MTU a REG_DWORD pour votre carte Interfaces ({34407201-997C-41FF-9EBF-1B7D6DF92B38 } dans mon cas), il doit être la même valeur.

La GetIpInterfaceTable fonction existe à partir de Vista, mais comment vous pouvez voir à partir du nom PMIB_IPINTERFACE_TABLE les valeurs proviennent de l'information MIB de voir adaptateur TCP (Windows DDK). Il y a quelques années, il était pas DLL d'assistance IP du tout et de recevoir les informations qui affiche un IPCONFIG.EXE doit utiliser CreateFile et DeviceIoControl pour donner ces informations à partir du pilote TCP TDI (voir les constantes comme L « \ Device \ Tcp » et IOCTL_TCP_QUERY_INFORMATION_EX dans tcpioctl.h). Alors peut-être il est possible de donner les mêmes informations sur Windows XP, mais il est pas important.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top