我在这里阅读了很多相关问题,但它仍然很令人困惑:如何为 UDP 数据报选择合适的大小,如果目标是尽可能快地发送数据,允许的数据包丢失约为 5%?
我正在使用 Delphi 10.2 和 Indy 10。
首先,我尝试通过发送带有
PMTU
标志的数据报来检测 DF
:
UDPServer.Binding.SetSockOpt(IPPROTO_IP, IP_DONTFRAGMENT, 1)
SetLength(SData, N);
UDPServer.SendBuffer(ABinding.PeerIP, ABinding.PeerPort, SData);
在我的特定测试用例中,数据仍然到达时最大的 N 变成
1472
,据我所知,这意味着这种大小的数据报正在不分段地传输。
然后我尝试发送尽可能多的数据:
TotalSent := 0;
for L := 1 to 100 do begin
for k := 1 to Count do begin
SData[0] := k;
UDPServer.SendBuffer(ABinding.PeerIP, ABinding.PeerPort, SData);
TotalSent := TotalSent + N;
end;
If SLeepTm > 0 then sleep(SLeepTm);
end;
测量客户端接收到的总数据量,我发现数据报大小为 1464 字节(与上面的
PMTU
确定为 1472
字节相反)可实现最佳速度。 1464
数据报的速度,或者更准确地说,数据丢失速度大约快 2 倍!
如何在没有这样的压力测试的情况下在实际应用程序中确定这个
1464
值,我的推理是否正确,即为了获得最佳效率,应该在应用程序中将数据分割成这种大小的数据报?
有一个与您非常相似的老问题:最大吞吐量的 udp 数据包的最佳大小是什么,其答案完整且内容丰富。
请记住,本地网络和互联网之间可能存在重要差异。