UDP数据报套接字中的校验和 + Java

6
我了解到UDP协议没有定义当数据损坏时(即校验和失败)应采取的行动。这意味着我们的应用程序可以使数据包被重传或声明数据包已丢失......
在使用Java实现数据报套接字时,我想确定某些发送的数据包的校验和是否正确......
在Java中有什么方法可以做到这一点...
基本上,我希望知道这个数据包在传输过程中已经损坏,因此必须重新传输...
非常感谢。
3个回答

2
我会查看以下两个类:CheckedInputStreamChecksum。发送数据包的机器应该执行校验和,接收数据包的机器也应该执行校验和,然后比较值。至少我是这样做的。
注意:校验和必须包含在发送的数据包中。此外,由于您正在检查数据是否已损坏,ByteArrayInputStream 也可能会很有用。这里有一个示例

1
我不同意“校验和必须包含在发送的数据包中”的说法。UDP头本身就有一个用于特定目的“校验和”的字段。 - foo

0

首先,您需要将校验和添加到UDP消息中。我假设校验和已经放在消息的前面,而且我假设calcCheckSum可以计算出校验和。

import java.net.*;

DatagramSocket socket = new DatagramSocket();
byte[] buffer = new byte[256]; // some appropriate size
DatagramPacket packet = new DatagramPacket(buf, buf.length);

socket.receive(packet);
String checksum = new String(packet.getData(),0, <some length>);
boolean ok = calcCheckSum(checksum);

0

UDP头本身很短并且大小固定(8字节):

偏移量 大小 内容
0 16位 源端口
2 16位 目标端口
4 16位 长度
6 16位 校验和

校验和算法在RFC 768中定义。

所以,说到Java,DatagramSocket/DatagramPackets应该执行校验和计算和检查。

但是它们似乎没有这样做。我深入挖掘了实现类,它们仍然位于com.sun.legacy包中,并且似乎完全忽略了校验和。没有计算,也没有检查。

它们也不会向用户发送异常或其他通知,告知校验和失败。因此,对于最初的问题的答案是:

  • Java JDK实现根本不处理UDP校验和。
  • 因此,在标准Java中,您无法确定UDP校验和是否正确
  • 您必须在数据包有效负载数据中执行自己的校验和。

在数据中,如何执行完全取决于您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接