UDP 协议

UDP协议端格式

教科书上的:

16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度,描述了这个数据报多长;

实际上的:

UDP 会把载荷数据,就是通过 UDP Socket,即 send 方法拿来的数据基础上,在前面拼接上 8 个字节的报头。报头分成四个部分,每个部分 2 个字节。

因为 UDP 报文长度是 2 个字节表示,即 16 位,表示的范围是 -32768 → +32767,即 0 → 65535,换算单位就是 64 KB。如果应用层的数据包超过了 64 KB,有两种方法解决:1. 通过代码针对应用层数据报进行手动分包(send 多次)。2. 换成使用 TCP。

校验和:作用是验证传输的数据是否正确。因为在网络传输中,受到一些干扰可能会出现"比特翻转"(0 变 1,1 变 0)的情况。发送方会发数据和校验和过去,接收方会针对收到的数据生成一个校验和跟收到的校验和进行比较,一样的话就是正确的,不一样就会直接丢弃。出现内容变了但校验和没变的情况概率极小就忽略不计。

比较知名的生成校验和的算法:

  1. CRC:循环冗余校验。把数据的每个字节循环往上累加,溢出的高位就丢弃。但会出现一个数据变动了两个 bit 位,前一个少 1,后一个多 1。虽然内容变了但 CRC 没变。

  2. MD5:进行一系列复杂的数学运算。

特点:1. 定长,无论原始数据多长,得到的 MD5 值都是固定的。2. 冲突概率小,原始数据哪怕只改动一个地方,算出来的结果都会大相径庭。3. 不可逆,通过原始数据计算 MD5 很容易,但想通过 MD5 还原原始数据很难(运算量极大)。针对于这些特点,MD5 的用途有:计算校验和、作为计算 hash 值的方式、进行加密。(所谓的 MD5 解密实际上只是储存了常见的数据,进行查表而已)

  1. SHA1:只是跟 MD5 的计算方式不同。

UDP 的特点

UDP传输的过程类似于寄信。

无连接

知道对端的IP和端口号就直接进行传输,不需要建立连接。

不可靠

没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。

面向数据报

应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并; 用UDP传输100个字节的数据:如果发送端一次发送100个字节,那么接收端也必须一次接收100个字节;而不能循环接收10次,每次接收10个字节。

缓冲区

UDP只有接收缓冲区,没有发送缓冲区:UDP没有真正意义上的 发送缓冲区 。发送的数据会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作;UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一 致;如果缓冲区满了,再到达的UDP数据就会被丢弃;UDP的socket既能读,也能写,这个概念叫做 全双工

大小受限

UDP协议首部中有一个16位的最大长度。也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。

基于 UDP 的应用层协议

NFS: 网 络 文 件 系 统

TFTP: 简 单 文 件 传 输 协 议

DHCP: 动 态 主 机 配 置 协 议

BOOTP:启动协议(用于无盘设备启动)

DNS:域名解析协议

¥问题:

  1. UDP本身是无连接,不可靠,面向数据报的协议,如果要基于传输层UDP协议,来实现一个可靠传 输,应该如何设计?
  2. UDP大小是受限的,如果要基于传输层UDP协议,传输超过64K的数据,应该如何设计?

以上两个问题答案类似,都可以参考TCP的可靠性机制在应用层实现类似的逻辑: 例如:

引入序列号,保证数据顺序;

引入确认应答,确保对端收到了数据;

引入超时重传,如果隔一段时间没有应答,就重发数据;

相关推荐
库玛西16 分钟前
深入浅出Linux select网络模型:从底层位图原理到C++面向对象高级封装
linux·服务器·网络·c++·ubuntu
hiahiahia12324 分钟前
HTTP Streaming:为什么 AI 回答经常要边生成边返回?
人工智能·网络协议·http
实心儿儿1 小时前
Linux —— epoll(1)
linux·网络
Soari1 小时前
TSN网络之工业以太网协议测试
网络
s_w.h1 小时前
【 计网 】序列化与反序列化
linux·服务器·网络·算法·bash
物联通信量讯说1 小时前
5G会取代4G吗?物联网设备出海正在走向多网络融合
网络·物联网·5g
祖力551 小时前
网络编程:IO多路复用(select、poll、epoll)
linux·服务器·网络
数字智核1 小时前
2026昆山工厂空压机突然停机怎么办?找谁抢修
服务器·网络·数据库
pt10431 小时前
网络自动化Python课程:利用Cisco NSO编排网络服务
运维·网络·自动化
全栈技术负责人2 小时前
DeepSeek Harness 业务工具权限插件 dsh-tool-permission设计思路
网络·算法·ai·ai编程