UDP是一种用户数据报协议,属于OSI模型中的传输层。这是一种无连接协议,这意味着上一条消息和下一条消息在协议级别上没有连接,并提供简单的不可靠传输服务。
每个程序员都应该了解TCP和UDP。 UDP是一种用户数据报协议,属于OSI模型中的传输层。这是一种无连接协议,这意味着上一条消息和下一条消息在协议级别上没有连接,并提供简单的不可靠传输服务。
也就是说,UDP是不可靠的。如果要使数据可靠,则需要在业务层进行错误纠正和错误检测。例如:TFTP。
同学可能会问。既然不可靠,为什么不直接使用IP协议呢?添加协议UDP是如此昂贵吗?
实际上,最重要的原因之一是IP协议中没有端口概念。它仅指定两个主机之间的通信,而不能解决不同主机上的应用程序之间的通信。如果主机上的多个应用程序需要通信,则无法使用IP协议直接区分哪个应用程序是数据。
可以理解,端口是通信通道。当然,UDP添加了一些基于IP协议的功能,因此让我们总结一下:
UDP没有连接,也没有连接。因此,其发送和接收的开销将小得多。
UDP不能保证可靠地传送数据,只有这种可能。因此,无需维护复杂的连接关系。
UDP是面向消息的,添加到应用程序层的数据层,直接插入IP层。
UDP没有拥塞控制
UDP支持多播。
UDP头很小,表示传输了更多的数据内容。
下图显示了UDP与上层和下层之间的关系:
UDP和上下层
UDP的头是什么?
首先看下图:
UDP头
从图中可以看出,UDP的报头包括四个部分:
每个16位源端口和目标端口用于标记已发送和已接收的应用程序进程。由于UDP不需要答复,因此源端口是可选的,如果不使用源端口,则将其设置为零。当传输层从IP层接收到UDP数据报时,它基于报头中的目标端口,将UDP数据报通过相应的端口传递并将其移交给***应用程序的末尾。如果接收端口UDP发现接收的数据包中的目标端口号不正确,则该数据包将被丢弃,并且端口不可达错误数据包将通过Internet控制协议ICMP发送给发送方。 ICMP应用程序Traceroute是让发送的UDP用户数据报故意使用非法的UDP端口。结果,ICMP返回“端口不可达”错误消息,从而达到测试目的。目标端口后跟一个固定长度的数据包长度字段(以字节为单位),该字段用于指定UDP数据报的数据部分的长度,最小长度为8个字节。
标头的其余16位用于标头和数据部分之间的校验和。这部分是可选的,但通常在实际应用中使用。
UDP和TCP校验和都覆盖其标头和数据,而IP标头校验和仅覆盖IP标头。
如何同时使用UDP和套接字
进入传输层时,我们还可以在操作系统中调用API来构建套接字。套接字是操作系统提供的用于表示特定网络通信的编程接口。该应用程序调用系统内核中通过套接字处理网络协议的模块,这些内核模块负责特定网络协议的实现。
这样,我们可以让内核接收网络协议的详细信息,而我们只需要提供要传输的内容,内核将帮助我们控制格式并进一步封装底层内容。因此,在实际应用中,我们不需要知道如何形成UDP数据包,而只需要提供相关信息(例如IP地址,端口号等要传输的信息),操作系统内核将基于传输信息我们提供的信息构成一个合格的UDP数据包(以及基础数据包和帧)。看下面的图片。
UDP使用场景
需要更少的资源,具有更好网络条件的Intranet或对数据包丢失不敏感的应用程序。例如,DHCP协议基于UDP。通常,获取的IP地址都是内部网请求,可以一次获取IP。例如,基于UDP的RTP,TFTP和一帧数据的丢失不是大问题。另一个示例是一些设备发现协议等。
无需一对一通信,建立连接,而是可以广播的应用程序。 DHCP是一种广播形式。 VXLAN还需要多播,并且基于UDP协议。
它需要快速处理,低延迟,并且可以容忍少量的数据包丢失,但是要求即使网络拥塞,它也不会收缩。
QUIC是Google提出的一种基于UDP的通信协议,旨在减少网络通信的延迟并提供更好的用户交互体验。