背景

到目前为止,你所见过的绝大多数的例子都使用了基于连接的协议,如TCP。

在本章中,我们将会把重点放在一个无连接协议即用户数据报协议(UDP)上,它通常用在性能至关重要并且能够容忍一定的数据包丢失的情况下。

我们将会首先概述 UDP 的特性以及它的局限性。

在这之后,我们将描述本章的示例应用程序,其将演示如何使用UDP 的广播能力。

我们还会使用一个编码器和一个解码器来处理作为广播消息格式的POJO。

在本章的结束时候,你将能够在自己的应用程序中使用UDP。

UDP 协议

面向连接的传输(如TCP)管理了两个网络端点之间的连接的建立,在连接的生命周期内的有序和可靠的消息传输,以及最后,连接的有序终止。

相比之下,在类似于UDP 这样的无连接协议中,并没有持久化连接这样的概念,并且每个消息(一个UDP 数据报)都是一个单独的传输单元。

此外,UDP 也没有TCP 的纠错机制,其中每个节点都将确认它们所接收到的包,而没有被确认的包将会被发送方重新传输。

通过类比,TCP 连接就像打电话,其中一系列的有序消息将会在两个方向上流动。

相反,UDP 则类似于往邮箱中投入一叠明信片。你无法知道它们将以何种顺序到达它们的目的地,或者它们是否所有的都能够到达它们的目的地。

UDP的这些方面可能会让你感觉到严重的局限性,但是它们也解释了为何它会比TCP快那么多:所有的握手以及消息管理机制的开销都已经被消除了。

显然,UDP很适合那些能够处理或者容忍消息丢失的应用程序,但可能不适合那些处理金融交易的应用程序。

UDP 广播

到目前为止,我们所有的例子采用的都是一种叫作单播的传输模式,定义为发送消息给一个由唯一的地址所标识的单一的网络目的地。

面向连接的协议和无连接协议都支持这种模式。

UDP 提供了向多个接收者发送消息的额外传输模式:

  1. 多播——传输到一个预定义的主机组;

  2. 广播——传输到网络(或者子网)上的所有主机。

本章中的示例应用程序将通过发送能够被同一个网络中的所有主机所接收的消息来演示UDP 广播的使用。

为此,我们将使用特殊的受限广播地址或者零网络地址255.255.255.255。

发送到这个地址的消息都将会被定向给本地网络(0.0.0.0)上的所有主机,而不会被路由器转发给其他的网络。

接下来,我们将讨论该应用程序的设计。

参考资料

《Netty in Action》 P185