2

由于 UDP 是一种无连接协议,因此我们知道无法保证接收方会接收到数据。但是如果收到数据报,数据是否可能部分/完全损坏?

UDP标头也包含CRC,所以这让我觉得如果收到数据报,数据会可靠吗?这是正确的还是不正确的?

为了更详细地说明问题,我从 Java udp 服务器发送数据,例如

// Sending in Java
InetAddress group = InetAddress.getByName("230.0.0.1");
    //buf is a String.getBytes();
DatagramPacket packet = new DatagramPacket(buf, buf.length, group, 4446);
//socket is DatagramSocket in Java
socket.send(packet);

并像这样在 C# 客户端中获取数据

       // client  is UdpClient of C#
       Byte[] data = client.Receive(ref localEp);                        
       strData = Encoding.ASCII.GetString(data);

我自己不是在操作 CRC,在接收器端我得到了在 buf 中发送的相同数据,所以我如何在这里检查 CRC,因为我有一个字节数据数组..?或假设它是正确的(我可以忍受那些 CRC 匹配的极端情况,即 CRC 和数据被神奇地损坏)

4

3 回答 3

1

假设硬件、操作系统和 IP 堆栈正常工作,IP 校验和可确保单数据包完整性。

我提到了这个假设,因为我已经看到许多 IP 校验和被关闭的案例(在总是返回“OK”的意义上)出于性能原因,或者作为实现缺陷:一些 NIC 可以在硬件中进行校验和,但是不好或错误驱动程序参数可能会毁了你的一天。

于 2012-12-11T11:40:06.660 回答
0

默认情况下,操作系统会拒绝校验和无效的数据包。这意味着您将收到比正确数据包更少的坏数据包。但是您可以配置套接字以允许将部分/损坏的数据包传播到用户空间。

于 2012-12-11T11:39:50.907 回答
0

如果校验和(技术上不是 CRC)正确,您可以相信数据报是完整的,但这并不意味着您可以信任数据。校验和公式没有什么神奇之处,因此更改数据的过程只能重新计算校验和,而您永远不会知道。

于 2012-12-11T11:40:33.647 回答