详解UDP协议

引子

在之前的文章里面,我们介绍了TCP协议的相关内容。TCP协议是一种基于连接的传输层协议,他可以保证数据完整正确的从网络的一端到达另一端,但是代价是什么呢?当然就是传输速度了。

数据的可靠性和数据的传输速度是两个不可兼得的特性,可靠性就意味着要对数据进行反复确认,要实现建立连接,但是这些过程都需要浪费数据传输的时间。所以我们应该做的是在适当的使用场景使用适当的传输协议。

而在一些对数据可靠性要求不那么高,反而对数据传输速度要求比较高的场合,如视频聊天,语音通话等,就需要用到无连接的不可靠的传输协议了,也就是我们今天要讲的UDP协议。

UDP协议的特点

UDP协议具有以下特点

  1. 无连接性:UDP是一种无连接的协议,发送端和接收端之间在通信之前不需要建立连接。每个UDP数据报都是独立的,独立于其他数据报,这使得UDP协议的通信开销较低。
  2. 面向数据报的传输:UDP将应用程序传输的数据划分为较小的数据报进行传输,每个数据报都包含了完整的数据和目标地址信息。
  3. 低延迟和高性能:由于UDP协议的简单性和无连接性,UDP具有较低的通信延迟。相对于TCP协议而言,UDP不需要进行连接的建立和断开,因此可以更快地发送数据。
  4. 不可靠性和数据丢失:UDP协议不提供数据的可靠性保证。它不进行数据的确认和重传,也不提供错误检测和纠正机制。这意味着在传输过程中,UDP数据报可能会丢失、重复或者乱序。如果数据报在传输过程中丢失,UDP协议不会重新发送该数据报。
  5. 无拥塞控制和流量控制:UDP协议没有内建的拥塞控制和流量控制机制。它不会根据网络的拥塞情况调整发送速率,而是一股脑地发送数据。这可能导致数据包的丢失或者网络拥塞的发生。因此,应用程序需要自行处理拥塞和流量控制的问题。

UDP数据报格式

就像TCP协议一样,UDP协议同样也是将数据切割为一个一个的数据报进行发送,下面是一个典型的UDP数据报的格式:
在这里插入图片描述
可以看到,UDP数据报由两部分构成,分别是首部和数据部分,其中首部占8字节,由以下字段组成:

  • 源端口号,目的端口号:标识发送方和接收方的应用程序使用的端口号,和TCP协议中端口号的概念一样;
  • UDP长度:标识UDP数据报的长度,包括报文和数据;
  • UDP校验和:用来判断该数据报在传输过程中是否发生了错误,如果发生了错误,直接丢弃。

以上就是UDP报文段的格式,当某个应用程序要发送数据时,UDP将数据报的报头字段填充好,并将数据附加在报头后面,形成一个完整的UDP数据报,然后顺着网络进行传输。

当接收方的UDP从网络中接收到UDP数据报后,根据目标端口号将数据报交给对应的应用程序进行处理。接收方将解析数据报的报头字段,提取出数据并传递给应用程序处理。

这就是UDP协议中数据报的封装和解封装的过程。

校验和的使用

当使用UDP协议进行数据传输时,校验和是一项重要的机制,用于检测数据报在传输过程中是否发生了错误。毕竟虽然UDP是不可靠的传输方式,但数据报对不对还是要知道的,毕竟丢掉错数据总是比传输错数据要好。

我们可以首先介绍一下校验和的计算方法,以n个字节的数据需要求他的校验和为例:

  1. 检查n是奇数还是偶数,如果是奇数的话,在所有数据的最后再添加1个字节的数据,这个字节的数据全设为0;
  2. 按顺序将数据划分为16位的字块,也就是说每个字块占据两个字节;
  3. 对多个字块执行二进制加法操作,注意,这里是二进制加法,而不是异或,是需要有进位的。通过加法操作,得到数据X;
  4. 如果X的值超过16位的话,将高位溢出的部分加回到低位;
  5. 将X的值按位取反,最后得到的数据便是校验和。

上面是这个过程的叙述,为了让大家更加直观的了解这个过程,可以举一个例子。比如说我有一个5字节的数据0x123456789A,我们要求这个数据的校验和。

  1. 首先,这个数据的字节数不是一个偶数,所以最这个数据的最后要添0,即将这个数据变为0x123456789A00;

  2. 按顺序将数据划分为16位的字块,如下图:
    在这里插入图片描述

  3. 对多个字块执行二进制加法操作,得到数据X,如图:
    在这里插入图片描述

  4. X的值超过16位,将高位溢出的部分加回到低位,得到0000 0010 1010 1101

  5. 对X进行取反,得到校验和,所以0x123456789A的校验和就是1111 1101 0101 0010,也即0xFD52

如此,我们就知道了n个字节的数据如何求他的校验和,接下来我们介绍整个UDP报文段是如何求校验和的。

首先,会将UDP报文段进行扩展,在UDP报文段头部之前扩展出一个伪头部。伪头部中包含了4字节的源IP地址、4字节目的IP地址,1个字节的全0和1个字节的协议号最后还有2个字节的UDP长度,如下图:
在这里插入图片描述

伪头部的作用主要是将伪头部的这些消息也校验一次,防止发生比如发错地址等问题。当然,伪头部的消息在UDP报文段发送时候是不参与的,他们并不能算是UDP报文段的一部分,只是参与校验和的计算而已。

之后发送方把校验和置为全1,然后将所有的UDP伪头部、头部、数据部分一起进行校验和计算,得到最终的校验和,填入校验和字段,这就是UDP校验和计算的全过程。

UDP和TCP的应用场景

我们都知道TCP和UDP的一些区别,主要在于他们的可靠性和效率方面,我们这边列举了一些基于UDP和基于TCP的协议,供大家参考。

协议
TCPHTTP、FTP、SSH、SMTP
UDPDNS、DHCP、TFTP、SNMP
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值