UDP

UDP (User Datagram Protocol)用户数据报协议是用来发数据电报,不用连接。UDP 能够无连 接的发送轻量级数据包给主机。UDP 数据包不保证到达目的地,也可能不按发报的顺序到达。 当发送一个 UDP 数据包时,它是成块发送的。因此,你决不能发超过你的 TCP/IP 栈的最大 尺寸的数据包。
因为这些原因,许多人觉得 UDP 基本没用。事实上不是这样。许多流协议,比如 Real Audio 使用 UDP。

可靠性
UDP 数据包的可靠性依赖于网络的可靠性和饱和度。UDP 数据包也常用于在局域网(LAN)上 跑的应用,因为局域网很可靠。在因特网上传输的 UDP 数据包通常也很可靠,可以在改错 后使用,或者更常在添写后使用。添改(Interpolation)是在基于之前或者之后收到的数据包推 测出发生了数据丢失然后发生的。然而传输并不是在任何网络上都能保证——所以不要默认 你的数据必然到达。
因为 UDP 不会确认发送,它也不保证到达。如果你给另一个主机发送 UDP 数据包,你无法 得知数据包是否真的传到了。栈(stack)不会,也没有办法,确认到达,因此即使数据包没有 达到目的地也无法报错。如果你需要这些信息,你需要从异地服务器发回些类似于回执的东 西。
UDP 就像用老式的手机(传呼机之类的)给某人发了个短信,你知道你发了信息,但你不知道 他收到了没。可能不存在,也可能不在服务区,可能没开机,也有可能坏掉了。并且数据网 络也有可能丢失信息。除非他给你回了消息,不然你根本不知道他到底收到了没。还有,如 果你发了多条短信,有可能它们会按不同顺序到达。
另一个现实世界中和 UDP 相似的例子是邮寄服务。你可以发送它,但你不知道它会不会到 达目的地,它可能在路上的任何地方丢失或者在到达前损坏。

广播
UDP 有一个很有用的特殊能力。这个能力就是可以发广播。广播的意思是发送一条消息,但 是可以被许多人接收到。这和群播(multicasting)不是一回事。群播是一个订阅模型,在模型 中,接受者订阅并且被添加到了分发列表中。通过广播,一个消息在网络上传播,任何在收 听的人都可以接收到而不用先订阅。
群播就好像分发报纸。只有那些订阅了的人才能收到报纸。广播就像无线电台信号。任何有 收音机的人都可以调到特定的电台去收听。用户不用通知收听的电台。

然而几乎所有路由器都被设计地默认过滤掉广播信息。换句话说,信息不会传播过 桥和外 部路由器,广播会被限制在本地局域网。

数据包大小
大部分操作系统允许 32K 甚至 64K 的 UDP 数据包大小。然而一般路由器的限制较大。UDP 数据包只能和最大允许尺寸一样大,也就是所有要经过的路由器和网络设备允许的最大大小。 没办法预测这个大小。

在局域网环境中 UDP 十分可靠。然而在广域网或者因特网中你就得实现许多确认计划 。

每个数据包都被收到数据的人确认。如果发出后在给定时间 没有收到确认,就会重发。
因为"确认"本身可能丢失,每个包裹都要有个独一无二的身份。一般这个身份是个简单的序 列号。于是接收数据的接受者可以过滤掉重复的数据包,同样的,"确认"信息也可以说明它 们到底收到了哪一个数据包。

排序
数据包可以由一个序列号区分。这个数字可以让接收者用来确认数据包是否丢失。然后就可 以请求重发特定的丢失的数据包,或者有时比如音频可以根据邻近的数据包添改数据来最佳 猜测丢失的数据或者简单的无视掉丢失数据。
这种丢失数据包的行为可以在使用 real audio 或者移动数字电话时听出来。在某些系统中你 几乎听不出来跳跃或者中断。在其他数据包很小并且系统添写的情况下你可能听到一声 "worbling"。

 

posted @ 2016-06-03 16:15  delphi中间件  阅读(617)  评论(0编辑  收藏  举报