关于提高UDP发送效率的方法

发布时间:2024-11-20 11:37

使用敏捷开发方法提高效率 #生活技巧# #职场生存技巧# #项目管理方法#

UDP的发送效率和什么因素有关呢?

直观认为,UDP的切包长越大,应该发送效率越高(最长为65536)。但是根据实际测试和在网上查到的资料的结果,包长度为1024为发送效率最高。

这种结果让人感到疑惑,为什么是1024这种奇怪的值呢?为什么不是MTU(最小发送单元)的长度(即1500-28)呢?

后来调查发现,Windows的网络底层,默认UDP分片长度为1024时,走的是快速通道模式,具体怎样的快速通道?没有再继续深入研究。

通过修改下面的注册表可以加大1024.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AFD\Parameters\FastSendDatagramThreshold

并且需要修改网卡注册表的MTU与上面的值一致,具体注册表项如下所示:

HKEY_LOCAL_MACHINE\\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces\MTU

修改以上注册表值的示例代码:

// 修改本地UDP包发送长度并根据网络MTU确定实际UDP发送的包长度

// <span style="font-family: Arial, Helvetica, sans-serif;">lenPacket【out】:包长度,</span><span style="font-family: Arial, Helvetica, sans-serif;">bIsToRestartComputer【out】:是否重启计算机(当修改了注册表,则需要重启有效)</span>

<pre name="code" class="cpp"><span style="font-family:Arial, Helvetica, sans-serif;">// 返回:TRUE(成功),FALSE(失败)</span>

BOOL SetMaxEfficencyUDPPacketLength(INT &lenPacket, BOOL &bIsToRestartComputer)

{

lenPacket = MAX_SUPER_DISPLAY_UDP_LENGTH;

if (!CUtil::IsKeyExist(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\AFD\\Parameters"),

_T("FastSendDatagramThreshold")))

{

if (!CUtil::WriteKey(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\AFD\\Parameters"),

_T("FastSendDatagramThreshold"), MTU_DEFAULT))

{

lenPacket = NOT_SET_FAST_SEND_DATAGRAME_UDP_LENGTH;

return FALSE;

}

bIsToRestartComputer = TRUE;

}

else

{

INT iValue = 0;

if (CUtil::ReadKey(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\AFD\\Parameters"),

_T("FastSendDatagramThreshold"), iValue))

{

if (iValue != MTU_DEFAULT)

{

if (!CUtil::WriteKey(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\AFD\\Parameters"),

_T("FastSendDatagramThreshold"), MTU_DEFAULT))

{

lenPacket = NOT_SET_FAST_SEND_DATAGRAME_UDP_LENGTH;

return FALSE;

}

bIsToRestartComputer = TRUE;

}

}

}

HKEY hMainKey = NULL;

LONG lRetCode = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters\\Interfaces"),0,KEY_READ,&hMainKey);

if(lRetCode != ERROR_SUCCESS)

{

return TRUE;

}

DWORD dwIndex = 0;

TCHAR swzSubKey[MAX_PATH] = _T("");

DWORD dwNameLen = MAX_PATH;

while(ERROR_SUCCESS == ::RegEnumKeyEx(hMainKey, dwIndex, swzSubKey, &dwNameLen, NULL, NULL, NULL, NULL))

{

CString strFullSubKey = _T("SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters\\Interfaces\\");

strFullSubKey += swzSubKey;

if (CUtil::IsKeyExist(HKEY_LOCAL_MACHINE, strFullSubKey, _T("MTU")))

{

INT iValue = 0;

if (CUtil::ReadKey(HKEY_LOCAL_MACHINE, strFullSubKey, _T("MTU"), iValue))

{

if (iValue != MTU_DEFAULT)

{

if (!CUtil::WriteKey(HKEY_LOCAL_MACHINE, strFullSubKey, _T("MTU"), MTU_DEFAULT))

{

lenPacket = NOT_SET_FAST_SEND_DATAGRAME_UDP_LENGTH;

return FALSE;

}

bIsToRestartComputer = TRUE;

}

}

}

memset(swzSubKey, 0, sizeof(swzSubKey));

dwNameLen = MAX_PATH;

dwIndex ++;

}

::RegCloseKey(hMainKey);

return TRUE;

}

但是需要注意的是,修改此值需要确保小于或者等于整个网络路径的MTU,怎样检查整个网络的MTU呢?可以通过执行下面指令获取:

ping -f -n 1 -l 1472 192.168.0.2

其中,1472为发送的包长度,如果执行结果为0,表示能够发送;可以继续提高1472,否则降低;直至获取最大值。

具体代码如下所示:

UINT GetLanMTU(ULONG ulDestIP)

{

UINT lenPacket = NOT_SET_FAST_SEND_DATAGRAME_UDP_LENGTH;

CHAR szCmdBuf[MIDDLE_BUF_LENGTH];

memset(szCmdBuf, 0, sizeof(szCmdBuf));

sprintf_s(szCmdBuf, MIDDLE_BUF_LENGTH, "ping -f -n 1 -l 1472 %s",

inet_ntoa(*(struct in_addr *)&ulDestIP));

INT iRet = system(szCmdBuf);

if (iRet == 0)

{

lenPacket = MAX_SUPER_DISPLAY_UDP_LENGTH;

}else

{

CUtil::OutputConsoleLogString("LAN's MTU isn't 1500");

}

return lenPacket;

}

网址:关于提高UDP发送效率的方法 https://www.yuejiaxmz.com/news/view/153120

相关内容

关于提高效率的格言
提高工作效率的方法
关于如何提高学习效率
如何提高工作效率,提高工作效率的方法
提高工作效率的十大方法(三种提高工作效率的方法)
关于提高效率的作文(精选28篇)
提高学习效率的方法
有利于提高学习效率的方法介绍
如何提高工作效率,提高工作效率的方法?
一种基于智能手机的家电智能控制方法与流程

随便看看