getifentry和Netsh之间的MTU不匹配
-
04-10-2019 - |
题
我正在研究伪传输层软件,该软件在UDP上运行,提供了可靠的以连接为导向的传输,作为TCP的替代方案。为了最大程度地提高网络效率,我们在初始化时查询“最佳”网络适配器的MTU。
MIB_IFROW row = {0};
row.dwIndex = dwBestIfIndex;
dwRes = GetIfEntry(&row);
在线搜索我发现您可以使用以下NetSh命令从命令提示符(而不是C ++ API)查询相同的值
netsh interface ipv4 show interfaces
netsh interface ipv4 show subinterfaces
令人不安的问题是,虽然row.dwmtu可能设置为1500,但在发送笔记本电脑上的网络流量显示了我们的数据包被片段分成1300个字节数据包。 Netsh还报告说MTU为1300。
显然,Netsh命令报告的值是实际使用的值。有人知道我可以称呼什么API获得与NetSh相同的值?
解决方案
有本地MTU大小和路径MTU(请参阅RFC 1191)。您可以使用命令
ping -f -l 1464 www.stackoverflow.com
ping -f -l 1465 www.stackoverflow.com
确定路径MTU。考虑到ICMP软件包和IP标头的标头大小。看 路径MTU发现 对于API解决方案。
更新: :请不要再这样的问题!找到答案对我来说非常有趣,我花了几个小时为此。但是...我找到了!要接收正确的MTU大小的值 GetIpInterfaceTable
返回的API PMIB_IPINTERFACE_TABLE
结构的阵列 MIB_IPINTERFACE_ROW
结构。 MIB_IPINTERFACE_ROW
帽子 InterfaceIndex
它可以帮助您识别IP接口,与其他知名的IP辅助功能相同。您也可以使用 ConvertInterfaceLuidToNameW
从另一个领域接收的功能 InterfaceLuid
接口名称。
但是最有趣的是 nlmtu 场地
typedef struct _MIB_IPINTERFACE_ROW {
ADDRESS_FAMILY Family;
NET_LUID InterfaceLuid;
NET_IFINDEX InterfaceIndex;
// ...
ULONG NlMtu;
// ...
};
在文档中(请参阅 http://msdn.microsoft.com/en-us/library/aa814496(v=vs.85).aspx)被描述为“网络层mTU大小,字节。“。相同的文本,您再也不会在Windows驱动程序套件文档中找到(请参阅 http://msdn.microsoft.com/en-us/library/ff559254(vs.85).aspx)。这个领域 nlmtu 是您要搜索的内容。例如,我的计算机通过DSL路由器连接到Internet, NlMtu
不是没有路由器的1500,而是正确的值1492。在您的情况下,必须是1300。
如果您安装了Microsoft SDK的最后一个版本之一,那么您将在 C: Program Files Microsoft SDK Windows Windows V7.0 samples netds iphelp netinfo 目录一个使用的示例 GetIpInterfaceTable
API。只需在该线路上设置一个大约270 Netinfo.C 文件,您会看到 InterfaceTable->Table[i].NlMtu
正确的值 IP MTU 相应的接口适配器。 If you verify in registry under HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesTcpipParametersInterfaces{34407201-997C-41FF-9EBF-1B7D6DF92B38} which value has MTU REG_DWORD for your Interfaces card ({34407201-997C-41FF-9EBF-1B7D6DF92B38就我而言,它必须是相同的值。
功能 GetIpInterfaceTable
从Vista开始,但是您如何从名称中看到 PMIB_IPINTERFACE_TABLE
这些值来自TCP适配器的MIB信息,请参见(Windows DDK)。几年前,根本没有IP Helper DLL,并且要接收显示IPCONFIG.EXE的信息,必须使用CreateFile和Deviceiocontrol来提供TCP TDI驱动程序的此类信息(请参阅l“ device tcp”等常数tcpioctl.h)。因此,也许可以在Windows XP上提供相同的信息,但这并不重要。