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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top