UDP是用户数据报协议的缩写。这是一个简单的协议。 UDP规范很简单RFC0768只有3页。
UDP是一种在IP层之上工作的传输层协议。 UDP有两个主要的IP扩展:
扩展端口号允许将IP数据报复用到用户进程。
扩展校验和可以在网络传输期间测试数据错误。
IP提供尽力而为的无连接数据报传送服务。 IP基于IP地址实现路由和分组转发。 IP数据报可以在网络上从一个主机传输到另一个主机。 IP地址确定将IP数据报发送到哪个主机。因此,IP提供主机到主机数据报传输服务。
IP数据报到达目的主机后,内核层实现的IP模块负责接收网卡上的IP数据报。但是,主机通常同时运行多个进程。 IP数据报应交给哪个进程?不定。
端口号(位于UDP标头中)确定数据报切换到主机上的哪个进程。因此,UDP为在终端主机上运行的应用程序提供端到端服务。
UDP特性
UDP是无连接的,并且数据报可以在通信之前直接发送而无需通信,而TCP是面向连接的。
UDP不提供纠错,但UDP提供错误检测(端到端校验和)。
UDP不会重复消除。
UDP不进行流量控制。
UDP不执行拥塞控制,并且没有协议机制来防止高速UDP流量对其他网络用户的负面影响。
UDP不保证订单,数据报的提交顺序。
UDP不可靠。 UDP仅负责将应用程序发送的数据发送到IP层。它不保证数据报到达目的地。可靠的交付需要应用程序来实现。
UDP支持多播传递。
UDP是保留消息边界的传输层协议。
消息边界
每次应用程序请求UDP输出时,它将生成UDP数据报,该数据报将发送IP数据报,接收端将收到每个UDP请求的完整UDP报告(如果有),该报告与数据无关 - 面向TCP。相同。
假设主机A两次发送主机2数据,前4个字节“abcd”,第二个3字节“xyz”,主机B接收2次,分别返回“abcd”和“xyz”消息。你也可以返回“xyz”,“abcd”两条消息(顺序并不重要),那么这就是保留消息边界。UDP是保留消息边界的传输层协议。每次执行传输操作时,使用UDP通信的应用程序都会生成IP数据报(无论碎片如何)。这限制了每次发送的数据量不大于MTU(最大传输单位)。每次接收时,接收端将返回一个UDP数据报的完整负载,并且不会返回半数据报负载。
TCP是一种不保留消息边界的流协议。发送方发送呼叫的次数和每次发送的数据量,与接收方接收呼叫的次数和每次接收的数据量没有对应关系,因此使用TCP的应用程序。该程序需要处理消息边界。
UDP数据报封装格式
IPv4协议字段标识值为17的UDP,通常为8个字节,然后是UDP标头,后跟UDP标头,然后是UDP数据Payload(如果有)。
易于理解的用户数据报协议(UDP)
IPv4 UDP数据报封装格式
IPv4封装包对应的UDP头由源端口号,目的端口号,长度和校验和组成,每个字段为2个字节。
(1)端口号,一个与任何物理实体无关的纯抽象标识符。
端口号用于帮助协议区分发送和接收进程。从网卡接收到IP数据报后,接收端的内核层识别UDP数据报(IP数据报头协议字段值=17),然后根据UDP头的目的端口号映射到对应的进程,并放置UDP数据。报告将移交给相应的处理流程。该映射关系由系统内核管理和维护。
易于理解的用户数据报协议(UDP)
UDP标头和有效负载
目标端口号是必需的,但源端口号是可选的。如果数据报的发送方不需要来自对方的回复,则源端口号可以设置为0。
因为IP层根据IP报头的协议类型字段将传入的IP数据报分发到特定的传输协议(TCP或UDP等),所以传输协议层将协议数据分发到不同的进程。端口号。因此,端口号与协议无关,并且不同协议的相同端口号不会引起混淆。
例如,计算机上的两个网络服务进程使用相同的IP地址和端口号,但一个使用TCP协议,另一个使用UDP协议,因此没有问题。
(2)长度字段是UDP报头和UDP数据的总长度,以字节为单位,因为UDP报头长度为8,允许空数据的UDP数据报,这意味着长度字段值最小。是8. UDP长度值是冗余的,因为它可以通过从IP数据报的总长度中减去IP报头的长度来导出。
(3)校验和,覆盖UDP头,UDP数据和伪头,由初始发送者计算,由最终目的地验证,用于确定数据报在网络传输过程中是否出错,例如1比特变为0 。如何使用UDP实现可靠的传输
众所周知,UDP不可靠,不保证订单。
(1)什么是不可靠的? A向UDP发送UDP数据报.UDP数据报不一定正确地传送到接收器B.但是,由于诸如网络质量的各种原因,可能发生分组丢失。 IP数据报是最好的努力。对于交付,一切都顺利进行。
有没有办法确保发送的UDP必须到达目的地?对不起,不能保证,做不到。
TCP提供的可靠传输意味着什么? TCP提供的可靠传输并不意味着没有丢包,因为TCP还依赖于IP(IP不可靠)来实现数据报传送。 TCP的可靠性意味着将重传丢失的数据包。在正确交付之前,下一个数据报将继续传输。
TCP如何实现可靠的传输?非常简单,确认(ack)+丢包重传。因此,如果UDP要提供可靠的传输,它也可以参考TCP的实现机制,除了TCP在内核层实现,基于UDP的应用程序可以实现到应用层的可靠传输。要进行收据确认+丢包重传,您需要一些其他信息,例如包序列号,您可以将其放入Payload,并就Payload中的附加信息的结构达成一致。
(2)保证的顺序是什么? A向B发送两个UDP数据报。两个UDP数据报封装在两个IP数据报中,并通过IP协议传输。因为两个IP数据报是独立路由的,哪一个先来?不一定,看看心情。
有没有办法确保UDP数据报按发送方发送的顺序到达目的地?另外,对不起,做不到。
因此,TCP提供的顺序实际上是根据接收端的发送顺序重新排序IP数据报。显然,UDP需要支持重新排序,并且还需要一些额外的信息,这些信息只能由有效载荷承载,而不是像TCP那样。 (TCP报头的某些字段用于接收器重新排序)。
总之,UDP仅在最简单的主机上提供应用程序的端到端服务。其他功能,如果您想提供它,请参考TCP的想法来实现它。
这很好:因为它很简单,开销很小。在某些应用场景中,可以容忍丢包和乱序,UDP非常适合。保时捷非常好,但拉砖或使用拖拉机。
UDP套接字编程
UDP Socket网络编程的API不多。 Socket()用于创建套接字,close()用于关闭套接字,sendto()用于发送数据,recvfrom()用于接收数据。
Bind()顾名思义是绑定,TCP可以绑定,UDP也可以,绑定UDP等于告诉内核:这个socket和网络的远端在绑定之前,您只能使用sendto()接口(通过参数指定目标)。 UDP套接字recv()返回UDP数据报(Payload)的数据部分,不包括UDP数据报头。这是因为UDP头字段用于分发或验证,并且不需要透明地传输到应用程序。
使用UDP套接字开发的网络应用服务器/客户端,与网络IO相关的操作和过程如下:
易于理解的用户数据报协议(UDP)
UDP套接字编程