UDP - User Datagram Protocol 无连接不可靠 用户数据报协议
UDP 是 User Datagram Protocol 的缩写,中文译为用户数据报协议。UDP 用来支持那些需要在计算机之间传输数据的网络应用。
UDP Helper 可以实现对指定 UDP 端口广播报文的中继转发,即将指定 UDP 端口的广播报文被转换为单播报文被发送给指定服务器。
为在给定主机中能识别多个目标地址,同时允许多个应用程序在同一台主机中工作并能独立进行数据包的发送和接收,设计用户数据报协议 UDP。
UDP 是无连接 Internet 传输协议,除给应用程序发送数据包并允许在所需的层上架构自己的协议外,几乎没做任何特别的事情。面向连接的是 TCP,该协议几乎做了所有事情。
UDP 是 OSI (Open System Interconnection,开放式系统互联) 参考模型中的无连接传输层协议,主要用于不要求按分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成。
UDP 协议与 TCP 协议一样都用于处理数据包,在 OSI 模型中两者都位于传输层,是处于 IP 协议上层的协议;UDP 在 IP 报文的协议号是 17。
UDP 提供面向事务的简单不可靠信息传送服务,由 IETF RFC 768 定义,UDP 协议适合端口分别运行在同一台设备上的多个应用程序。
UDP 有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
智能编辑重构 批处理式 "数字 Python IDE" 集成开发环境 (集成高效 Cython PyInstaller 批处理小程序)
http://dt.digitser.cn/zh-CN/ide/idepy/index.html
适用场景
UDP 不保证传送数据包的可靠性,适合于一次传输少量数据。
许多应用只支持 UDP (如:多媒体数据流),不希望产生任何额外数据,即使知道有损坏包也不进行重发。
由于 UDP 协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或能保障可靠性的应用程序,如 TFTP、SNMP、NFS、DNS、BOOTP 等。
客户端/服务器模式的网络应用 (如:网络视频会议系统),要求数据传输时间短 ,当强调传输性能而非传输完整性时 (如:音频和多媒体应用),都会用到 UDP 协议。
UDP 协议从问世至今已被使用了很多年,其最初的光彩虽已被一些类似协议所掩盖,但即使在今天 UDP 仍然不失为一项非常实用且可行的网络传输层协议。
若有一个 UDP 消息丢失,在几秒之后会有另一个新消息替换它 (如:在屏幕上报告股票市场、显示航空信息、QQ 等)。
UDP 也用在 RIP (Routing Information Protocol 路由信息协议) 中修改路由表。
主要特征
UDP 报文没有可靠性保证、顺序保证及流量控制字段等,可靠性较差。若吞吐量不受拥挤控制算法的调节,则只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
发送方 UDP 对应用程序交付而来的报文,在添加首部后就向下交付给 IP 层。报文既不拆分也不合并,保留其边界,因此,应用程序需要选择合适的报文大小。
由于传输数据时不用建立连接,因此也就不需要维护连接状态 (包括收发状态等) ,因此一台服务机可同时向多个客户端传输相同消息。
UDP 传输数据之前源端和终端不建立连接,当想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络中。
UDP 具有较好的实时性,工作效率较 TCP 协议高;UDP 段结构比 TCP 的段结构简单,因此网络开销也小。
UDP 信息包的标题很短,只有 8 个字节,相对于 TCP 的 20 个字节信息包而言 UDP 的额外开销很小。
在发送端,UDP 传送数据的速度仅仅受应用程序生成数据的速度、计算机的能力及传输带宽的限制。
在接收端,UDP 把每个消息段放在队列中,应用程序每次从队列中读一消息段。
报文结构
在 UDP 协议层次模型中,UDP 位于 IP 层之上。应用程序访问 UDP 层,然后使用 IP 层传送数据包。IP 数据包的数据部分即为 UDP 数据包。
IP 层的报头指明了源主机和目标主机地址,而 UDP 层的报头指明了主机上的源端口和目标端口。
UDP 传输 segment (段) 由 8 个字节的报头和有效载荷字段构成。
UDP 报头由 4 个域组成,其中每个域各占用 2 个字节,包括:源端口号、目标端口号、数据包长度、校验值。
UDP 协议模型
端口号
UDP 协议使用端口号为不同的应用保留其各自的数据传输通道。
UDP 和 TCP 协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。
数据发送方 (可以是客户端或服务器) 将 UDP 数据包通过源端口发送出去,而数据接收方则通过目标端口接收数据。
有的网络应用只能使用预先为其预留或注册的静态端口,而另一些网络应用则可以使用未被注册的动态端口。
因为 UDP 报头使用两个字节存放端口号,所以端口号的有效范围是从 0 到 65535。
UDP 端口指定有两种方式:由管理机构指定端口、动态绑定。
常用 UDP 端口:53 DNS、69 TFTP、161 SNMP。
一般来说,大于 49151 的端口都是动态端口。
长度
数据报的长度是指包括报头和数据部分在内的总字节数。
由于报头长度固定,所以该域主要用来计算可变长度的数据部分 (又称为数据负载)。
数据报的最大长度根据操作系统环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为 65535 字节。
一些实际应用往往限制数据报的大小,有时会降低到 8192 字节。
校验值
UDP 协议使用报头中的校验值来保证数据的安全。
数据发送方首先通过特殊算法计算得出校验值,传递到接收方后,还需要再重新计算。
若某个数据报在传输过程中被第 3 方篡改或由于线路噪声等受到损坏,发送和接收方的校验计算值将不相符,因此 UDP 协议可以检测是否出错。TCP 协议要求必须具有校验值。
许多链路层协议都提供错误检查,包括流行的以太网协议,UDP 为什么也提供检查校验和?因为链路层以下的协议在源端和终端之间的某些通道,可能不提供错误检测。
虽然 UDP 有提供错误检测,但检测到错误时 UDP 不做错误校正,只是简单地把损坏消息段扔掉,或给应用程序提供警告信息。
扫一扫关注 德云社区 微信公众号
版权声明:
本文为独家原创稿件,版权归 德云社区,未经许可不得转载。
|