Pregunta

Estoy trabajando en software de capa de pseudo-transporte que se ejecuta a través de UDP, proporcionando la transmisión orientado a la conexión fiable, como una alternativa a TCP. Con el fin de maximizar la eficiencia de la red, consultamos la MTU de la "mejor" adaptador de red en la inicialización.

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

dwRes = GetIfEntry(&row);

La búsqueda en línea me encontré con que se pueden utilizar los siguientes comandos netsh a consulta para este mismo valor, desde un símbolo del sistema (no es una API de C ++)

netsh interface ipv4 show interfaces
netsh interface ipv4 show subinterfaces

El tema preocupante es que mientras row.dwMtu se puede establecer en 1500, husmear el tráfico de red en los programas de ordenador portátil que envía de que nuestros paquetes se fragmentan en paquetes de 1300 bytes. netsh también informa que la MTU es de 1300.

Es evidente que el valor informado por el comando netsh son los valores reales usados. Alguien sabe qué API que puede llamar para obtener los mismos valores que netsh?

¿Fue útil?

Solución

Hay tamaño de MTU MTU local y el camino (véase RFC 1191). Puede utilizar comandos como

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

para determinar una MTU Path. Tome en consideración el tamaño del encabezado de los paquetes ICMP y cabeceras IP. Ver para la solución de API.

ACTUALIZADO : Por favor no más este tipo de preguntas! Fue muy interesante para mí para encontrar la respuesta y paso algunas horas para esto. Pero ... he encontrado! Para recibir el valor correcto del tamaño de MTU se debe utilizar la API GetIpInterfaceTable que devuelve estructura PMIB_IPINTERFACE_TABLE que tiene matriz de estructuras MIB_IPINTERFACE_ROW. MIB_IPINTERFACE_ROW InterfaceIndex sombrero que le ayuda a identificar interfaz IP, es el mismo que en otras funciones auxiliares de IP conocidas. También puede utilizar la función ConvertInterfaceLuidToNameW reciba desde otro InterfaceLuid campo del nombre de la interfaz.

Pero lo más interesante es NlMtu

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

En la documentación (ver http: / /msdn.microsoft.com/en-us/library/aa814496(v=VS.85).aspx ) se describe como " El tamaño de la red capa de MTU, en bytes. " . El mismo texto y no más se encuentra también en la documentación del Kit de controladores de Windows (ver http://msdn.microsoft.com/en-us/library/ff559254 (VS.85) .aspx ). Este campo NlMtu es lo que usted está buscando. Mi equipo, por ejemplo, está conectado a Internet a través de un router DSL y NlMtu no es 1500 que sería sin el router, pero tiene el valor correcto 1492 en su lugar. En su caso, debe ser 1300.

Si tiene instalada una de las últimas versiones de Microsoft SDK, entonces se encontrará en C: \ Archivos de programa \ Microsoft SDKs \ Windows \ v7.0 \ Samples \ netds \ iphelp \ Netinfo directorio de un ejemplo que utilizan la API GetIpInterfaceTable. Sólo hay que establecer un brakepoint en la línea 270 en el archivo netinfo.c y verá en InterfaceTable->Table[i].NlMtu el valor correcto de IP MTU del adaptador de interfaz correspondiente. Si comprueba en el registro en HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ Interfaces {34407201-997C-41ff-9EBF-1B7D6DF92B38}, que tiene el valor MTU REG_DWORD para su tarjeta de interfaces ({34407201-997C-41ff-9EBF-1B7D6DF92B38 } en mi caso) debe ser el mismo valor.

Existe la GetIpInterfaceTable funciones que empieza con Vista, pero ¿cómo se puede ver en el nombre PMIB_IPINTERFACE_TABLE los valores provienen de la información MIB del adaptador TCP ver (DDK de Windows). Hace algunos años que no fue una DLL auxiliar IP en absoluto y para recibir la información que muestra Ipconfig.exe uno tiene que utilizar CreateFile y DeviceIoControl para dar este tipo de información de controlador TCP TDI (ver constantes como la L "\ Device \ Tcp" y en IOCTL_TCP_QUERY_INFORMATION_EX tcpioctl.h). Así que tal vez es posible dar la misma información en Windows XP, pero no es importante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top