Frage

Ich arbeite an pseudo-Transportschicht-Software, dass läuft über UDP, zuverlässige verbindungsorientierte Übertragung, als Alternative zu TCP. Um die Effizienz des Netzwerks zu maximieren, fragen wir die MTU des „besten“ Netzwerkadapter bei der Initialisierung.

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

dwRes = GetIfEntry(&row);

Online-Suche fand ich, dass Sie die folgenden netsh-Befehle zu Abfrage für den gleichen Wert verwenden können, von einer Eingabeaufforderung (keine C ++ API)

netsh interface ipv4 show interfaces
netsh interface ipv4 show subinterfaces

Das beunruhigende Problem ist, dass während row.dwMtu bis 1500 eingestellt wird, den Netzwerkverkehr auf dem Sende Laptop zeigt Snooping, dass unsere Pakete in 1300-Byte-Pakete fragmentiert werden. netsh berichtet auch, dass die MTU ist 1300.

Klar, dass der von netsh Befehl angegebene Wert ist die aktuell verwendeten Werte. Wer weiß, was API kann ich nennen die gleichen Werte wie netsh zu bekommen?

War es hilfreich?

Lösung

Es gibt lokale MTU-Größe und Pfad-MTU (siehe RFC 1191). Sie können Befehle verwenden wie

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

einen Pfad MTU zu bestimmen. Nehmen Sie unter Berücksichtigung der Kopfgröße von ICMP-Paketen und IP-Header. Siehe Path MTU Discovery für API-Lösung.

AKTUALISIERT : Bitte nicht mehr solche Fragen! Es war sehr interessant für mich, um die Antwort zu finden, und ich verbringen einige Stunden dafür. Aber ... ich gefunden habe! Um den korrekten Wert der MTU-Größe zu erhalten, sollten Sie GetIpInterfaceTable API verwenden, die PMIB_IPINTERFACE_TABLE Struktur zurückgibt, die Anordnung von MIB_IPINTERFACE_ROW Strukturen aufweist. MIB_IPINTERFACE_ROW Hut InterfaceIndex, die Sie IP hilft Schnittstelle zu identifizieren, ist es das gleiche wie in anderen bekannten IP-Helper-Funktionen. Sie können auch ConvertInterfaceLuidToNameW Funktion erhalten aus einem anderen Feld InterfaceLuid die Schnittstellennamen verwenden.

Aber das Interessanteste ist, NlMtu

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

In der Dokumentation (siehe http: / /msdn.microsoft.com/en-us/library/aa814496(v=VS.85).aspx ) ist es, wie beschrieben wird " Die Netzwerkschicht MTU-Größe in Bytes. " . Der gleiche Text und nicht mehr auch in Windows Driver Kit-Dokumentation finden (siehe http://msdn.microsoft.com/en-us/library/ff559254 (VS.85) aspx ). Dieses Feld NlMtu ist das, was Sie suchen. Mein Computer wird zum Beispiel mit dem Internet über einen DSL-Router angeschlossen und NlMtu ist nicht 1500, wie es ohne den Router sein würde, aber hat den richtigen Wert 1492 statt. In Ihrem Fall muss es 1300 sein.

Wenn Sie eine der letzten Versionen von Microsoft SDK installiert haben, dann werden Sie feststellen, in C: \ Programme \ Microsoft SDKs \ Windows \ v7.0 \ Samples \ netds \ iphelp \ Netinfo Verzeichnis ein Beispiel, das GetIpInterfaceTable API verwenden. Stellen Sie einfach eine brakepoint auf der Linie 270 in der netinfo.c Datei und Sie werden in InterfaceTable->Table[i].NlMtu den richtigen Wert von IP MTU der entsprechenden Schnittstellenadapter sehen. Wenn Sie in der Registry unter HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ Interfaces überprüfen {34407201-997C-41ff-9EBF-1B7D6DF92B38}, die Wert MTU REG_DWORD für Ihre Schnittstellen-Karte hat ({34407201-997C-41ff-9EBF-1B7D6DF92B38 } in meinem Fall) muss der gleiche Wert sein.

Die Funktion GetIpInterfaceTable existiert mit Vista starten, aber wie man aus dem Namen PMIB_IPINTERFACE_TABLE die Werte stammen aus MIB-Informationen von TCP-Adapter siehe (Windows DDK) sehen kann. Vor einigen Jahren war es keine IP-Helfer DLL überhaupt und die Informationen zu erhalten, die zeigt ipconfig.exe hat man Create und DeviceIoControl zu verwenden, wie Informationen aus TCP TDI-Treiber zu geben (siehe Konstanten wie L „\ Device \ Tcp“ und IOCTL_TCP_QUERY_INFORMATION_EX in tcpioctl.h). So ist es vielleicht möglich, die gleichen Informationen unter Windows XP zu geben, aber es ist nicht wichtig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top