《网络协议》UDP 协议

清疚 2022-08-14 03:51 402阅读 0赞

概述

UDP 是无连接、不可靠的数据报传输层协议,为应用程序发送和接收数据报,只是将数据报的分组从一台主机发送到另一台主机,但并不保证数据报能够到达另一端,任何必须的可靠性都由应用程序提供。在 UDP 情况下,虽然可以确保发送消息的大小,却不能保证消息一定会达到目的端。没有超时和重传功能,当 UDP 数据封装到 IP 数据报传输时,如果丢失,会发送一个 ICMP 差错报文给源主机。

即使出现网络阻塞情况,UDP 也无法进行流量控制。此外,传输途中即使出现丢包,UDP 也不负责重发,甚至当出现包的到达顺序杂乱也没有纠正的功能。若需要这些细节控制,则必须交给 UDP 的应用程序去处理。

UDP 首部

UDP 首部由源端口号、目标端口号、UDP 包长度以及检验和组成。UDP 首部只有 8 字节,每个部分 占 16 位。其结构如下图所示:

Center

--源端口号:表示发送端的端口号,字段长度为 16 位。该字段是可选的,有时可能不会设置源端口号,没有源端口号时该字段的值设为 0。此时,可用于不需要返回的通信中;

--目标端口号:表示接收端的端口号,字段长度为 16 位;

--UDP 包长度:该字段保存了 UDP 首部的长度与 UDP 数据的字节长度之和,该字段的最小值为 8 字节,IP 数据报是指数据报总的长度,因此,UDP 数据报长度是总的长度减去 IP 首部的长度;

--检验和:检验和是为了提供可靠的 UDP 首部和数据而设计;

检验和

首先先说明计算 UDP 检验和引入 UDP 伪首部的原因。在前面介绍《TCP 与 UDP 协议基本概述》中说到,为了防止相同端口号之间通信混乱,TCP/IP 或 UDP/IP 通信中通常采用 5 个信息来识别一个通信。它们分别是“源 IP 地址”、“目的 IP 地址”、“协议号”、“源端口号”、“目标端口号”。只要其中某一项不同,则被认为是其他通信。然而在 UDP 首部中只有源端口号和目的端口号,余下的 3 项都包含在 IP 首部中。假如其他 3 项信息(协议号、源 IP 地址、目的 IP 地址)被破坏,可能会导致无法正确接收到所需要的包(即可能收不到需要的包,而收到不该收的包)。为了避免这类问题的出现,有必要验证一个通信中必要的 5 项识别码是否正确。因此,在检验和的计算中引入了伪首部信息,UDP 伪首部为 12 字节,它包含 IP 首部的一些字段,其目的是让 UDP 两次检查数据是否已正确到达目的地。

在 IP 首部的检验和中,只需对 IP 首部进行检验,而 UDP 和 TCP 的检验和,对 UDP 首部和 UDP 数据或者 TCP 首部和 TCP 数据都进行检验。UDP 的检验和是可选的,而 TCP 的检验和是必须的。

UDP 检验和是一个端到端的检验和,它由发送端计算,然后由接收端验证。其目的是为了发现 UDP 首部和数据在发送端到接收端之间发生变化。如果 UDP 数据报的发送端没打开 UDP 校验和,而接收端计算校验和有差错,那么 UDP 数据报将会被丢掉,不产生任何差错报文。

Center 1

最大 UDP 数据报长度

理论上 IP 数据报的最大长度为 65535 字节,去除 20 字节的 IP 首部和 8 个字节的 UDP 首部,因此 UDP 数据报的最大长度为 65507 字节。但是,大多数实现所提供的长度比这个最大值小。由于 UDP 最大数据报的限制,大于这个限制的数据报会被截断,从而发生数据丢失,且不会有任何数据丢失的通知。一般有两个因素的限制:

  1. 应用程序可能会受到其程序接口的限制,一些 API 的实现中可能有限定 UDP 数据报的最大长度。另外,现在大部分系统都默认提供了可读写大于 8192 字节的 UDP 数据报。
  2. 受限于 TCP/IP 内核的实现,可能存在一些实现特性,使 IP 数据报长度小于 65535 字节。

UDP 优点:在少量数据的传输时,使用 UDP 协议传输信息流,可以减少 TCP 连接的过程,提高工作效率;
UDP 缺点:当使用 UDP 协议传输信息流时,用户应用程序必须负责解决数据报排序,差错确认等问题;

参考资料:

《TCP/IP 详解》
《图解 TCP/IP》

发表评论

表情:
评论列表 (有 0 条评论,402人围观)

还没有评论,来说两句吧...

相关阅读

    相关 网络UDP协议和TCP协议

    协议:数据在网络中的传输规则,常见的协议有 UDP协议和TCP协议 协议:计算机网络中,连接和通信的规则被称为网络通信协议 UDP协议:用户数据报协议,是面向无连接

    相关 网络协议UDP 协议

    概述 UDP 是无连接、不可靠的数据报传输层协议,为应用程序发送和接收数据报,只是将数据报的分组从一台主机发送到另一台主机,但并不保证数据报能够到达另一端,任何