C# 如果udp客户端接收到数据GAM,我们可以信任数据完整性吗?

C# 如果udp客户端接收到数据GAM,我们可以信任数据完整性吗?,c#,udp,C#,Udp,由于UDP是一种无连接协议,因此我们知道,无法保证数据将由接收器接收。但是,如果收到数据报,数据是否可能部分/完全损坏 UDP报头也包含CRC,所以这让我觉得在收到数据报的情况下,数据是可靠的?对不对 为了更详细地说明这个问题,我从JavaUDP服务器发送数据,如 // Sending in Java InetAddress group = InetAddress.getByName("230.0.0.1"); //buf is a String.getBytes(); Datagram

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

UDP报头也包含CRC,所以这让我觉得在收到数据报的情况下,数据是可靠的?对不对

为了更详细地说明这个问题,我从JavaUDP服务器发送数据,如

// 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中获取数据

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

我自己并不是在操作CRC,在接收端,我得到的数据与buf中发送的数据相同,因此,如果我有一个字节数据数组,我如何检查CRC?或者假设它是正确的(我可以忍受CRC匹配ie CRC和数据神奇地损坏的极端情况)

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

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

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


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

假设硬件、操作系统和IP堆栈正常工作,单包完整性由IP校验和保证


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

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

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

我进一步阐述了我的问题,我收到一个字节数组,就像我从java发送它们一样。我自己没有放入任何crc。但我不知道如果给定字节[],您不必验证校验和。它将在几个级别为您进行验证。如果
UdpClient.Receive()
返回一个数据报,您可以假设校验和与该数据报内容匹配。我进一步阐述了我的问题,我收到一个字节数组,就像我从java发送它们一样。我自己并没有放入任何crc。但我不知道如何在给定字节[]的情况下进行校验您不必验证校验和。它将在几个级别为您进行验证。如果
UdpClient.Receive()
返回一个数据报,您可以假设校验和与该数据报内容匹配。我在接收调用中收到一个字节[],但这些字节只包含数据,我应该自己匹配crc吗?还是假设字节[]正确吗?你只得到数据包的有效载荷,而不是数据包本身(你需要一个
raw
socket),我认为你应该按原样使用它,但在你的应用程序中建立一些弹性,以防发生什么事。我收到一个字节[]在接收调用中,但这些字节只包含数据,我应该自己匹配crc吗?或者假设字节[]正确,您只获得数据包的有效载荷,而不是数据包本身(您需要一个
raw
套接字来实现这一点),我认为你应该按原样使用它,但在你的应用程序中建立一些弹性,以防发生什么情况。很抱歉,我对这句话感到困惑,“这意味着你收到的坏数据包比正常数据包少。”?你是说我只会在应用层得到好的数据包吗?我的意思是,你只会得到那些通过校验和验证的数据包。当然,这样的数据包可能与远程端发送的数据包不一样,但你会去掉大部分由于自然原因在传输过程中损坏的数据包。对不起,我弄糊涂了声明中说,“这意味着你收到的坏数据包比正常数据包少”?你是说我只会在应用层得到好的数据包吗?我的意思是,你只会得到那些通过校验和验证的数据包。当然,这样的数据包可能与远程端发送的数据包不一样,但你会去掉大部分由于自然原因在传输过程中损坏的数据包。