说起udp想必大家都不陌生吧,今天我们就来聊聊udp协议。


文章目录

  • 协议实现
  • 协议特性
  • 编程影响




我们会从三个方面对UDP协议进行解析:协议实现、协议特性、编程影响。

我们说一切都是为编程服务的,了解协议实现和特性是为了更好的使用udp,写出更好的代码。

那么不多说,直接开始吧。


协议实现

首先我们要看的必然是协议头的信息

udp报文分析wireshark udp协议报文分析_udp报文分析wireshark

16位源端端口+16位对端端口:用于表示进程,描述主机上通信的两端进程

16位数据报长度:用于描述一个完整包含头部的udp报文长度,所能存放的最大大小是65535,也就是要求一个udp报文大小必须小于64k
因为udp报头长度是8字节,因此要求sendto发送的数据大小必须小于64k-8,否则函数会直接报错

16位校验和:采用二进制反码求和算法,校验接收到的数据与发送的数据是否一致
二进制反码求和算法:发送方最初校验和字段设置为0,然后将报文从起始处(udp报头也算)每个字节取反相加,多出16位的部分截断取出来,回到第1位相加,最终得到一个校验和的值,填充到校验和字段。
接收方接收到数据后,从起始处开始反码求和,最终得到0表示数据一致,非0表示数据不一致。


协议特性

无连接、不可靠、面向数据报

无连接:通信时不需要建立连接,只需要知道对方地址就可以直接进行发送

不可靠:不保证数据安全到达,更不保证数据有序到达(没有丢包检测机制,也没有数据的排序机制)

面向数据报:描述的是一种最大固定长度限制的传输方式


编程影响

  1. 如果传输的数据比较大,则需要程序猿在应用层进行分包操作(将大数据分为多个小数据进行传输)
  2. 如果进行了分包操作,则需要程序猿在应用层进行包序管理(应用层协议头中定义当前的包序)
  3. 数据报传输发送数据时,数据直接封装头部进行发送,接收方udp向上层交付数据时是整条交付(不会交付半条或者多条),因此recvfrom接收数据时,缓冲区空间必须给的足够放下一条完整的数据。