如果udp客户端收到datagam,我们可以信任数据的完整性吗?

时间:2012-12-11 11:35:26

标签: c# udp

由于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和数据神奇地腐败)

3 个答案:

答案 0 :(得分:1)

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

我提到了这些假设,因为我已经看到很多IP校验和被关闭的情况(总体而言,由于性能原因而返回“OK”),或者作为实现缺陷:某些NIC可以在硬件中执行校验和,但是错误或错误的驾驶员参数可能会破坏你的一天。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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