《TCP/IP协议族》:UDP协议

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yexiangCSDN/article/details/85710326

1. UDP概述

UDP:User Datagram Protocol 用户数据报协议

2. UDP 有如下的特点:

无连接、不可靠

无连接:意思就是在通讯之前不需要建立连接,直接传输数据。

不可靠:是将数据报的分组从一台主机发送到另一台主机,但并不保证数据报能够到达另一端,任何必须的可靠性都由应用程序提供。在 UDP 情况下,虽然可以确保发送消息的大小,却不能保证消息一定会达到目的端。没有超时和重传功能当 UDP 数据封装到 IP 数据报传输时,如果丢失,会发送一个 ICMP 差错报文给源主机。即使出现网络阻塞情况,UDP 也无法进行流量控制。此外,传输途中即使出现丢包,UDP 也不负责重发,甚至当出现包的到达顺序杂乱也没有纠正的功能。

UDP是一种无连接的, 即发送数据前不需要建立连接,因此减小的开销和发送数据的延迟

UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表

UDP没有拥塞控制,因此网络出现的拥塞不会使主机的发送率降低

UDP支持一对一,一对多,多对一和多对多的交互通信

UDP首部开销小,只有8字节,比TCP的20个字节的首部要短

在网络质量令人十分不满意的环境下,UDP 协议数据包丢失会比较严重。但是由于 UDP 的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用 UDP 较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的 ICQ 和 QQ 就是使用的 UDP 协议。

3. UDP报文格式

UDP在IP报文中的位置如图所示:

UDP报文格式如图所示:

UDP首部

源端口号:占16位,源主机的应用进程所使用的端口号

目标端口号:占16位,目标主机的应用进程所使用的端口号,也就是我们需要通信的目标进程

UDP(包)报长度:UDP用户数据报的长度,数据部分+UDP首部之和为UDP报长度。最小8个字节(发送一份0字节的UDP数据报是可以的

检验和:

检验和是为了提供可靠的 UDP 首部和数据而设计,这里不要和上面的不可靠传输搞混淆了,这里提供可靠的UDP首部,是因为一个进程可能接受多个进程过来的报文,那么如何区分他们呢?

当进行检验和计算时,要在UDP数据报之前增加临时的12个字节伪首部,就是通过5个东西来进行区分的, “源 IP 地址”、“目的 IP 地址”、“协议号”、“源端口号”、“目标端口号”的,这个检测可靠,是检测接受哪个正确的报文,也就是说是哪个报文要进这个端口。那个不可靠,说的是这个报文可能丢失,可能其中数据损坏了我们不关心,但是这些的前提是,你得传输到正确的目的地去,不然乱出乱发数据报,岂不是乱套了。

详细说明下:

1. UDP数据报的长度在检验和计算过程中出现两次。(伪首部和首部)

2. 如果检验和的计算结果为0,则存入的值为全1(65535),这在二进制反码计算中是等效的。如果传送的检验和为0,说明发送端没有计算检验和。

3. 如果发送端没有计算检验和而接收端检测到检验和有差错,UDP数据报就要被丢弃。不产生任何差错报文(当IP层检测到IP首部检验和有差错时也这样做)。

4. UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为了发现UDP首部和数据在发送端到接收端之间发生的任何改动。

5. 尽管UDP检验和是可选的,但是它们应该总是在用。

6. UDP检验和(事实上,TCP/IP协议簇中所有的检验和)是简单的16 bit和。它们检测不出交换两个16 bit的差错。

UDP伪首部

就是拿到IP层的一些数据,因为要进行检验和,就必须要有这些数据。其中检验的算法跟IP层中检验首部的办法是一样的。

一个目标进程中,其中的报文协议,目标端口,目标ip地址肯定都是一样的,但是源IP地址和源端口就可能不一样,这就说明了不同源而同一目的地的报文会定位到同一队列。通过这5个参数进行校验和才能给到正确的目的地。

补充:

UDP检验和覆盖UDP首部和UDP数据。而IP首部的检验和,只覆盖IP的首部,并不覆盖IP数据报中的任何数据。UDP和TCP在首部中都有覆盖它们首部和数据的检验和。UDP的检验和是可选的,而TCP的检验和是必需的。UDP检验和的基本计算方法IP首部检验和计算方法相似(16 bit字的二进制反码和),但它们之间存在不同的地方:

1. UDP数据报的长度可以为奇数字节,但检验和算法是把若干个16 bit字相加。解决方法是必要时在最后增加填充字节0,这只是为了检验和的计算,可能增加的填充字节不被传送。

2. UDP数据报和TCP段都包含一个12字节长的伪首部,它是为了计算检验和而设置的。伪首部包含IP首部一些字段,目的是让UDP两次检查数据是否已经正确到达目的地。

猜你喜欢

转载自blog.csdn.net/yexiangCSDN/article/details/85710326