gpt4 book ai didi

c# - UDP数据传输比TCP慢

转载 作者:可可西里 更新时间:2023-11-01 02:47:30 25 4
gpt4 key购买 nike

我目前正在使用 C#/.Net4 编写原型(prototype)应用程序,我需要在其中传输未知数量的数据。数据从文本文件中读入,然后序列化为字节数组。现在我需要实现两种传输方法,UDP 和 TCP。两种方式的传输都可以正常工作,但我在使用 UDP 时遇到了一些困难。我假设使用 UDP 的传输必须比使用 TCP 快得多,但实际上我的测试证明 UDP 传输比使用 TCP 慢大约 7 到 8 倍。我用一个 12 兆字节的文件测试了传输,TCP 传输大约需要 1 秒,而 UDP 传输大约需要 7 秒。在应用程序中,我使用简单的套接字来传输数据。由于 UDP 只允许每条消息最多 65535kb,我将文件的序列化字节数组分成几个部分,每个部分的大小为 socker SendBufferSize,然后我使用 Socket.Send() 方法调用传输每个部分。

这是发件人部分的代码。

while (startOffset < data.Length)
{
if ((startOffset + payloadSize) > data.Length)
{
payloadSize = data.Length - startOffset;
}
byte[] subMessageBytes = new byte[payloadSize + 16];
byte[] messagePrefix = new UdpMessagePrefix(data.Length, payloadSize, messageCount, messageId).ToByteArray();
Buffer.BlockCopy(messagePrefix, 0, subMessageBytes, 0, 16);
Buffer.BlockCopy(data, startOffset, subMessageBytes, messageOffset, payloadSize);
messageId++;
startOffset += payloadSize;
udpClient.Send(subMessageBytes, subMessageBytes.Length);
messages.Add(subMessageBytes);
}

这段代码只是将要发送的下一部分复制到一个字节数组中,然后调用套接字上的发送方法。我的第一个猜测是,字节数组的拆分/复制会降低性能,但我隔离并测试了拆分代码,拆分只花了几毫秒,所以这不是问题的原因。

int receivedMessageCount = 1;
Dictionary<int, byte[]> receivedMessages = new Dictionary<int, byte[]>();
while (receivedMessageCount != totalMessageCount)
{
byte[] data = udpClient.Receive(ref remoteIpEndPoint);
UdpMessagePrefix p = UdpMessagePrefix.FromByteArray(data);
receivedMessages.Add(p.MessageId, data);
//Console.WriteLine("Received packet: " + receivedMessageCount + " (ID: " + p.MessageId + ")");
receivedMessageCount++;
//Console.WriteLine("ReceivedMessageCount: " + receivedMessageCount);
}
Console.WriteLine("Done...");
return receivedMessages;

这是我接收 UDP 消息的服务器端代码。每条消息都有一些字节作为前缀,其中存储了消息总数和大小。所以我只是在循环中调用 socket.Receive,直到我收到前缀中指定的消息数量。

我这里的假设是我可能没有足够“有效”地实现 UDP 传输代码......也许你们中的一个人已经在代码片段中看到问题或者对我有任何其他建议或提示为什么我的 UDP 传输比 TCP 慢。

提前致谢!

最佳答案

虽然 UDP 数据报最大可达 64K,但实际的线帧通常为 1500 字节(普通以太网 MTU)。这还必须适合至少 20 字节的 IP header 和 8 字节的 UDP header ,从而为您留下 1472 字节的可用负载。

您看到的是操作系统网络堆栈的结果 fragmenting发送方的 UDP 数据报,然后在接收方重新组装它们。这需要时间,因此您的结果。

另一方面,TCP 进行自己的打包并尝试找到 path MTU , 所以在这种情况下效率更高。

将数据 block 限制为 1472 字节并再次测量。

关于c# - UDP数据传输比TCP慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9300555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com