UDP 是无连接、不可靠的数据报传输层协议,为应用程序发送和接收数据报,只是将数据报的分组从一台主机发送到另一台主机,但并不保证数据报能够到达另一端,任何必须的可靠性都由应用程序提供。在 UDP 情况下,虽然可以确保发送消息的大小,却不能保证消息一定会达到目的端。没有超时和重传功能,当 UDP 数据封装到 IP 数据报传输时,如果丢失,会发送一个 ICMP 差错报文给源主机。
即使出现网络阻塞情况,UDP 也无法进行流量控制。此外,传输途中即使出现丢包,UDP 也不负责重发,甚至当出现包的到达顺序杂乱也没有纠正的功能。若需要这些细节控制,则必须交给 UDP 的应用程序去处理。
UDP 首部由源端口号、目标端口号、UDP 包长度以及检验和组成。UDP 首部只有 8 字节,每个部分 占 16 位。其结构如下图所示:
--源端口号:表示发送端的端口号,字段长度为 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 数据报将会被丢掉,不产生任何差错报文。
理论上 IP 数据报的最大长度为 65535 字节,去除 20 字节的 IP 首部和 8 个字节的 UDP 首部,因此 UDP 数据报的最大长度为 65507 字节。但是,大多数实现所提供的长度比这个最大值小。由于 UDP 最大数据报的限制,大于这个限制的数据报会被截断,从而发生数据丢失,且不会有任何数据丢失的通知。一般有两个因素的限制:
参考资料:
《TCP/IP 详解》
《图解 TCP/IP》
原文地址:http://blog.csdn.net/chenhanzhun/article/details/41552359