基础概念
UDP是一种传输层协议,用于在计算机网络中通过网络传输数据。与TCP不同,UDP是面向数据报的协议,是一种无连接的协议,即不需要在数据传输之前建立连接。
传输特点
- 无连接: 发送方直接将数据包发送到目标地址,知道对端的IP和端口号就直接进行传输,不需要建立连接和维护状态。这使得UDP在某些场景下更高效,因为不需要连接建立和维护过程所带来的开销。
- 不可靠: 它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。其本身并不提供数据包的确认和重传,也不处理数据包丢失或重复,没有流量控制,也不保证数据包的顺序性,无法避免网络阻塞;如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息;这些错误处理机制需要在应用层进行实现。
- 面向数据报: 不能够灵活的控制读写数据的次数和数量;应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并;
例如用UDP传输100个字节的数据:
如果发送端调用一次sendto
, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom
, 接收100个
字节; 而不能循环调用10次recvfrom
, 每次接收10个字节;
协议格式
如上图所示,UDP协议格式包括5个部分,其中报头分为4个字段。接下来详细介绍报文的格式。
- 源端口号:即发送端的进程端口号,字段长16比特位。该字段是可选项,有时可能不会设置源端口号。没有源端口号的时候该字段的值设置为0。可用于不需要返回的通信中。
- 目标端口号:表示接收端端口,字段长度16位。
- 包长度:该字段保存了UDP报头的长度跟数据的长度之和,单位为字节(8位字节)
- 校验和:当你使用UDP协议发送数据时,数据包的内容可能会在传输过程中受到干扰、错误或损坏。为了帮助识别这些问题并确保数据的准确传输,UDP包含了一个称为“校验和”的特殊数据来提供可靠的UDP首部和数据。如果校验和出错, 数据报就会直接丢弃;
给一个简单点的理解:
想象你要给朋友发一封信,你写了信放进信封,然后写下信封上的数字,这个数字是你信的内容的某种摘要。当你的朋友收到信时,他也会计算信的内容的摘要,然后对比你写的数字和他计算出的数字。如果两个数字一样,说明信的内容没有在传输过程中出现问题。但如果数字不一样,就意味着信的内容可能在传输途中发生了变化,可能是信纸有点折叠,文字模糊了一些,或者是信封上的标签不小心撕破了。
在UDP协议中,也有类似的机制。每个UDP数据包都有一个校验和,这个校验和是根据数据包中的内容计算出来的一个数字。当接收方收到数据包时,它会再次计算校验和,然后将计算出的数字与数据包中的校验和进行比较。如果两个数字一样,说明数据包的内容没有在传输过程中发生错误。但如果数字不一样,就表示数据包可能在传输过程中发生了变化,可能是因为某些原因导致数据包的内容被改变了。
简而言之,UDP首部的校验和就像是一个邮件的数字标签,用于检查数据包是否在传输中出现了错误或损坏。这可以帮助确保数据的可靠传输。
UDP的缓冲区
UDP没有真正意义上的发送缓冲区. 调用sendto
会直接交给内核, 由内核将数据传给网络层协议进行后
续的传输动作;
UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果
缓冲区满了, 再到达的UDP数据就会被丢弃;
UDP的socket是全双工的,既能读也能写。
应用场景
UDP被设计用于那些对实时性和效率要求较高,但对数据可靠性要求相对较低的应用。
由于UDP面向无连接,它可以随时发送数据。再加上UDP本身的处理既简单又高效,因此经常用于以下几个方面:
- 包总量较少的通信(DNS、SNMP等)。
- 视频、音频等多媒体通信(即时通信)
- 限定于LAN等特定网络中的应用通信,在局域网中,由于网络质量相对较好,数据包丢失的概率较低。
- 广播通信(广播、多播)
UDP的不可靠如何缓解
例如在视频、音频等多媒体通信中,由于需要低延迟,实时性要求较高,显然更适合UDP,而为了减少UDP的数据包丢失带来的影响,可以在应用层实现对应的差错处理。