MTU disallineamento tra GetIfEntry e netsh
-
04-10-2019 - |
Domanda
Sto lavorando su un software strato pseudo-trasporto che gira su UDP, fornendo la trasmissione orientato alla connessione affidabile, come alternativa a TCP. Al fine di massimizzare l'efficienza della rete, interroghiamo la MTU del "migliore" scheda di rete al momento dell'inizializzazione.
MIB_IFROW row = {0};
row.dwIndex = dwBestIfIndex;
dwRes = GetIfEntry(&row);
Ricerca on-line ho scoperto che è possibile utilizzare i seguenti comandi netsh di query per questo stesso valore, da un prompt dei comandi (non un'API C ++)
netsh interface ipv4 show interfaces
netsh interface ipv4 show subinterfaces
Il problema preoccupante è che, mentre row.dwMtu può essere impostato a 1500, snooping il traffico di rete sulle invio spettacoli laptop che i nostri pacchetti sono frammentate in 1300 pacchetti di byte. netsh riferisce inoltre che il MTU è di 1300.
Chiaramente il valore riportato da comando netsh sono i valori effettivi utilizzati. Qualcuno sa cosa API posso chiamare per ottenere gli stessi valori netsh?
Soluzione
Ci sono dimensioni MTU locale e Path MTU (vedi RFC 1191). È possibile utilizzare i comandi come
ping -f -l 1464 www.stackoverflow.com
ping -f -l 1465 www.stackoverflow.com
per determinare un percorso MTU. Prendere in considerazione la dimensione di intestazione di pacchetti ICMP e intestazioni IP. Vedere per soluzione API.
AGGIORNAMENTO : Si prega di non più queste domande! E 'stato molto interessante per me trovare la risposta e trascorro qualche ora per questo. Ma ... Ho trovato! Per ricevere corretto valore della dimensione MTU si dovrebbe usare API GetIpInterfaceTable
che restituisce struttura PMIB_IPINTERFACE_TABLE
che ha matrice di strutture MIB_IPINTERFACE_ROW
. cappello MIB_IPINTERFACE_ROW
InterfaceIndex
che vi aiuta a identificare l'interfaccia IP, è lo stesso che in altri ben noti funzioni di supporto IP. È inoltre possibile utilizzare la funzione ConvertInterfaceLuidToNameW
di ricevere da un altro InterfaceLuid
campo il nome dell'interfaccia.
Ma la cosa più interessante è NlMtu
typedef struct _MIB_IPINTERFACE_ROW {
ADDRESS_FAMILY Family;
NET_LUID InterfaceLuid;
NET_IFINDEX InterfaceIndex;
// ...
ULONG NlMtu;
// ...
};
Nella documentazione (vedi http: / /msdn.microsoft.com/en-us/library/aa814496(v=VS.85).aspx ) è descritto come " La dimensione rete strato MTU, in byte. " . Lo stesso testo e non più troverete anche in Windows documentazione Driver Kit (vedi http://msdn.microsoft.com/en-us/library/ff559254 (VS.85) aspx ). Questo campo NlMtu è quello che stai cercando. Il mio computer per esempio, è connesso a Internet tramite un router DSL e NlMtu
non è 1500 come sarebbe senza il router, ma ha il valore corretto invece 1.492. Nel tuo caso deve essere 1300.
Se si dispone di una delle ultime versioni di Microsoft SDK installato, allora si troverà in C: \ Program Files \ Microsoft SDK \ Windows \ v7.0 \ Samples \ netds \ iphelp \ Netinfo directory un esempio che usa GetIpInterfaceTable
API. Basta impostare un brakepoint sulla linea di circa 270 nel file netinfo.c e vedrete nel InterfaceTable->Table[i].NlMtu
il valore corretto di IP MTU della scheda di interfaccia corrispondente. Se si verifica nel registro HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ Interfaces {34407201-997C-41 e seguenti-9EBF-1B7D6DF92B38} che valore ha MTU REG_DWORD per la vostra scheda Interfaces ({34407201-997C-41 e seguenti-9EBF-1B7D6DF92B38 } nel mio caso) deve essere lo stesso valore.
La funzione di GetIpInterfaceTable
esiste a partire da Vista, ma come si può vedere dal nome PMIB_IPINTERFACE_TABLE
i valori provengono da informazioni MIB di TCP adattatore See (Windows DDK). Alcuni anni fa, non era un DLL di supporto IP a tutti e per ricevere le informazioni che visualizza Ipconfig.exe si deve utilizzare CreateFile e DeviceIoControl per dare tali informazioni dal driver TCP TDI (vedi costanti come L "\ Device \ Tcp" e IOCTL_TCP_QUERY_INFORMATION_EX in tcpioctl.h). Quindi, forse, è possibile dare le stesse informazioni su Windows XP, ma non è importante.