Java:在Java中使用UDP可能会损坏数据



我正在编写一个网络测试,它发送不同大小的UDP数据包(最多50k字节)。我想测量ping和包裹丢失。我是否也需要检查传输的数据,或者如果包中包含损坏的数据会被丢弃?

首先,TCP/IP协议套件(包括UDP)在所有现代操作系统中都实现了。该实现通常被称为网络堆栈。Java虚拟机本身使用常规的用户级套接字进行网络连接,因此它使用操作系统的网络堆栈。在Java中所能做的就是设置套接字选项,指定源和目标,并提供要发送的数据。因此,我不会担心从Java创建格式不正确的数据包。段(第4层)、包(第3层)和帧(第2层)都是由操作系统为应用程序创建的。除非你使用原始的套接字,否则你无法对常规套接字做任何改变。

第二,在每个TCP/IP包中有多个错误检测码。UDP和TCP有一个16位校验码,用于验证报头、数据包的有效载荷和几个IP报头字段。IP数据包本身有一个报头校验和,以太网(802.3)和Wifi(802.11)在帧级别都有自己的错误检测机制。我在网络设备和端点操作系统中看到的处理错误数据包时的默认行为是丢弃它们。因此,在用户级套接字中出现错误的可能性非常小。

编辑:

关于UDP值得一提的一点是,与面向流的TCP不同,UDP套接字以每个数据包为基础进行操作。因此,无论您使用UDP套接字send(),都将作为单个UDP数据包发送。我建议你在任何地方都不要放太大的东西。不要尝试将4KiB的大块作为单个数据包发送,因为这会导致ip级碎片。尽量确保发送的数据包比从您的机器到目的地的路径上的最小MTU至少小20字节(20字节是因为IP报头通常是20字节长)。当有疑问时,将每个数据包发送的数据限制在大约1000-1200字节,远低于常见的~1400-1500 MTU限制。

最新更新