我正在研究伪传输层软件,该软件在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上提供相同的信息,但这并不重要。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top