我正在使用Netty-3.10,我无法在Netty文档中找到这个问题的答案。
我有一个UDP Netty服务。我有一个客户端将UDP数据包发送到我的主机/端口。我的服务很棒。
在代码审查期间,我得到了回击,Netty没有明确说明它是否只向管道提供单个完整的数据报。我想这是公平的,我在文档中没有明确地找到它,即使我没有看到如果不是这种情况,UDP的任何使用都有可能工作。例如,部分更新可能会出现故障并与其他主机的数据交织在一起。
Netty文档中是否有一个地方明确指出Netty框架不会对UDP数据包进行分片并对管道进行部分更新?
由于
答案 0 :(得分:1)
我不认为这是Netty指定的规则,而是UDP协议之一。 User Datagram Protocol州的维基百科页面:
数据报 - 单独发送数据包并进行检查 诚信只有在他们到达时。数据包有明确的界限 在收到时很荣幸,这意味着在接收器上进行读取操作 socket将生成最初发送的完整消息。
因此,由于将始终在套接字读取上生成完整的数据报,因此有意义的是,管道将始终仅被调用一次,与TCP相反,其中逻辑传输可能被分段并且需要多次读取。 / p>
Netty QOTM example server实施中有一个有用且有些相关的说明:
// Allow packets as large as up to 1024 bytes (default is 768).
// You could increase or decrease this value to avoid truncated packets
// or to improve memory footprint respectively.
//
// Please also note that a large UDP packet might be truncated or
// dropped by your router no matter how you configured this option.
// In UDP, a packet is truncated or dropped if it is larger than a
// certain size, depending on router configuration. IPv4 routers
// truncate and IPv6 routers drop a large packet. That's why it is
// safe to send small packets in UDP.
可靠性和消息聚合可能由应用程序本身实现,在这种情况下,可以从涉及多个管道调用的一个或多个数据报构建更大的特定于应用程序的消息,以便聚合接收的数据报,但每个人根据定义,数据报只会触发一个管道调用。