Loading... ## UDP 协议的主要特点 1. **UDP 是一种无连接的传输层协议。** 即发送数据之前不需要建立连接,因此减少了发送数据的开销和时延 2. **UDP 会尽最大努力交付。** 即不保证数据的可靠交付,因此主机不需要维护复杂的连接状态表。 3. **UDP 是面向报文的传输层协议。** 对于应用层交付的报文,UDP 不会进行合并或者拆分,而是**保留这些报文的边界**,直接添加首部再向下交付给网络层。 4. **UDP 没有拥塞控制。** 因此网络出现拥塞不会使源主机的发送速率降低,适合一些对数据时延要求较高但可以容忍一些丢包的应用,如 实时视频会议。 5. **UDP 支持一对一,一对多,多对一,多对多的交互通信。** 6. **UDP 的首部开销小。** UDP 首部只有 8 字节,相比 TCP 的 20 ~ 60 字节要短。 > 1. 不使用拥塞控制功能的UDP有可能会引起网络产生严重的拥塞问题。 > 2. 一些使用UDP的实时应用进程本身可以在不影响应用的实时性的前提下,增加一些提高可靠性的措施,如采**用前向纠错**或**重传已丢失的报文**。 ## UDP 数据报格式 用户数据报 UDP 有两个字段:**数据字段**和**首部字段**。 ![udp报头.png](https://blog.domineto.top/usr/uploads/2020/04/3504035730.png) 首部字段很简单,只有8个字节,由四个字段组成,**每个字段的长度都是两个字节**。各字段的意义如下: 1. **源端口:** 源端口号。在需要对方回信时使用,不需要时可以填全 0 。 2. **目的端口:** 目的端口号。在终点交付报文时使用。 3. **长度:** UDP 用户数据报的长度。 4. **校验和:** 校验 UDP 数据包再传输过程中是否出错。若出错则丢弃该数据包。 ### 伪首部 一个UDP模块必须提供产生和验证校验和的功能,但是一个应用程序在使用 UDP 服务时,可以自由选择是否要求产生校检和。在计算校检和时,要在 UDP 用户数据报之前增加 12 字节的伪首部。**校检和就是按照这个临时的UDP用户数据报来计算的**。 ## UDP协议校验和计算 UDP计算校检和的方法和计算IP数据报首部校检和的方法相似。但不同的是:IP 数据报的校检和只校检**IP数据报的首部**,但 UDP 的校检和是将**首部和数据部分**一起都校检 校验和的计算规则很简单,先将校验和的位置置零,然后将 UDP 数据报中每 16 bit 的二进制相加,然后再取反,得到的结果就是校验和了。 > 计算校验和的过程中,如果遇到最高位进位,那么需要对结果进行**回卷**。 > > ![校验和回卷.png](https://blog.domineto.top/usr/uploads/2020/04/4097713606.png)![](https://blog.domineto.top/usr/uploads/2020/04/469300362.png) > > 简单来说就是将进的那一位加到尾部。 **举例:** ![UDP校验和.png](https://blog.domineto.top/usr/uploads/2020/04/310703597.png) ## 课堂提问 ### 问题1:UDP的报文头包含哪些信息,分别有什么作用? | UDP 首部字段 | 作用 | | ------------ | -------------------------------------- | | 源端口号 | 需要对方回信时使用,不需要时可以填全 0 | | 目的端口号 | 在终点交付报文的时候使用 | | UDP 长度 | 记录 UDP 数据报的长度 | | 校验和 | 检验 UDP 数据报在传播过程中是否有丢失 | ### 问题2:UDP校验和如何计算?伪报文头是否需要传输?接收端如何进行校验? 校验位置零,然后将 UDP 数据包中每 16 bit 进行二进制反码求和,最高位进位进行内卷,得到的和即为校验和。 伪报文头是从 IP 层获取的相关信息的,所以不需要进行传输。 校验可以有多种方法。这里举个例子:在不将校验位置零的情况下计算校验和,若计算出来的校验和全为零,则数据没有丢失。 ### 问题3:UDP适用于哪些场景?既然UDP不能保证可靠传输,其存在的意义是什么?是否可以去掉UDP? UDP 适用场景举例: - 对性能的要求高于对数据完整性的要求。 - 需要“简短快捷”的数据交换。 - 需要多播和广播的应用。 使用 TCP 协议传输数据时,如果一个数据段丢失或者接受端对某个数据段没有确认,发送端会重新发送该数据段。这就带来了传输延时和重复数据。 UDP采用端口标识同一主机上的不同应用程序,所以它可以识别同一主机上的不同进程,这是 UDP 最大的一个优势。 对于一些多点通信的场景,如果采用有连接的TCP,那么就需要和多个通信节点建立其双向连接。有时在NAT环境下,两个通信节点建立其直接的TCP连接不是一个容易的事情。在涉及NAT穿越的时候,UDP协议的无连接性使得穿透成功率更高。 ### 问题4:采用UDP的应用层协议一定不能实现可靠传输。是否正确? 不正确。 TCP 实现可靠性传输的方法:**应答确认,超时重传,滑动窗口** UDP 的传输层是无连接的,但是可以在应用层模拟这些功能,从而达到可靠传输的目的。 下面是几个利用 UDP 实现可靠数据传输的开源程序: **RUDP** RUDP 提供一组数据服务质量增强机制,如拥塞控制的改进、重发机制及淡化服务器算法等,从而在包丢失和网络拥塞的情况下, RTP 客户机(实时位置)面前呈现的就是一个高质量的 RTP 流。在不干扰协议的实时特性的同时,可靠 UDP 的拥塞控制机制允许 TCP 方式下的流控制行为。 **RTP** 实时传输协议(RTP)为数据提供了具有实时特征的端对端传送服务,如在组播或单播网络服务下的交互式视频音频或模拟数据。应用程序通常在 UDP 上运行 RTP 以便使用其多路结点和校验服务;这两种协议都提供了传输层协议的功能。但是 RTP 可以与其它适合的底层网络或传输协议一起使用。如果底层网络提供组播方式,那么 RTP 可以使用该组播表传输数据到多个目的地。 RTP 本身并没有提供按时发送机制或其它服务质量(QoS)保证,它依赖于底层服务去实现这一过程。 RTP 并不保证传送或防止无序传送,也不确定底层网络的可靠性。 RTP 实行有序传送, RTP 中的序列号允许接收方重组发送方的包序列,同时序列号也能用于决定适当的包位置,例如:在视频解码中,就不需要顺序解码。 **UDT** 基于UDP的数据传输协议(UDP-basedData Transfer Protocol,简称UDT)是一种互联网数据传输协议。UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。顾名思义,UDT建于UDP之上,并引入新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠的数据报传输。由于UDT完全在UDP上实现,它也可以应用在除了高速数据传输之外的其它应用领域,例如点到点技术(P2P),防火墙穿透,多媒体数据传输等等。 ## Reference https://seanwangjs.github.io/2017/10/19/udp-protocol-checksum.html https://blog.csdn.net/why_still_confused/article/details/51658930 https://blog.csdn.net/gettogetto/article/details/76736365 最后修改:2020 年 04 月 14 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏