实用指南:【Linux篇章】再续传输层协议UDP :从低可靠到极速传输的协议重生之路,揭秘无连接通信的二次进化密码!

news/2025/9/21 9:14:59/文章来源:https://www.cnblogs.com/tlnshuju/p/19103186

实用指南:【Linux篇章】再续传输层协议UDP :从低可靠到极速传输的协议重生之路,揭秘无连接通信的二次进化密码!

2025-09-21 09:14  tlnshuju  阅读(0)  评论(0)    收藏  举报

本篇摘要:

  • 本篇将承接上次的UDP系列网络编程,来深入认识下UDP协议结构,特性,底层原理,注意事项及应用场景

在这里插入图片描述
在这里插入图片描述

欢迎拜访:点击进入博主主页
本篇主题:再续UDP协议
制作日期:2025.09.01
隶属专栏:点击进入所属Linux专栏

一. 再识UDP协议

  • 传输层:负责数据能够从发送端传输到接收端。

  • 可以先理解成用于数据在传输层封装的协议。

再认识传输层上面那常见的几个层结构:

会话层:用于连接与断开的(如tcp)。

表示层:可以理解成之前我们用于序列化与反序列化。

应用层:用户设计一些通信完成的功能。

这里UDP就是在这层工作的:
在这里插入图片描述

二. 重新认识下端口号

端口号范围划分

  • 0 - 1023:知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的端口号都是固定的。

  • 1024 - 65535:操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的。</font>

认识知名端口号(Well-Know Port Number)

有些服务器是非常常用的,为了使用方便,人们约定一些常用的服务器,都是用以下这些固定的端口号:

使用下面指令查看知名端口号(也就是我们网络通信的时候绑定要避开的端口号):

cat /etc/services

如下:

在这里插入图片描述

重新认识下之前的两个问题:

  • 一个进程是否可以 bind 多个端口号?
  • 一个端口号是否可以被多个进程 bind?

原因:端口号的目的是通过它找到指定进程!

三.⚠️ UDP 协议端格式

首先看张图了解下:
在这里插入图片描述

上面有了五大元组的目的端口号与源端口号(剩下的会在ip层完成封装)

  • 16 位 UDP 长度表示整个数据报(UDP 首部+UDP 数据)的最大长度。

  • 16位UDP校验和:如果校验和出错,就会直接丢弃。

⚠️ 那么数据如果要是有的话,可以是2^16-1-8个字节数据, 如果比它多了就需要应用层手动的分包,多次发送,并在接收端手动拼装

其实传输的就是上面样式的结构体:

struct udphdr {
uint16_t uh_sport;
/* 源端口 */
uint16_t uh_dport;
/*目的端口 */
uint16_t uh_ulen;
/* UDP 长度 */
uint16 _t uh_sum;
/*校验和 */
};

因为内核规定的端口号就是16位,因此我们要传递的就是这个格式。

四. ⏳UDP特点

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

  • 不可靠:没有确认机制,没有重传机制;如果因为网络故障该段无法发到对方,UDP 协议层也不会给应用层返回任何错误信息。

  • 面向数据报:不能够灵活的控制读写数据的次数和数量。

下面再深入了解下不可靠性以及面向数据报

1. 对于它的不可靠性:

-udp无发送缓冲区,故不能像tcp那样可以先把数据储存在发送缓冲区,如果它的接收缓冲区满了导致没收到数据,就可以再次把保存在发送缓冲区的数据再发一次! udp如果发送的时候接收缓冲区满了,或者其他原因就会丢包现象!

2. 对于面向数据报:

  • 应用层交给 UDP 多长的报文,UDP 原样发送,既不会拆分,也不会合并:

比如UDP传输100字节数据,如果发送端调用一次 sendto,发送 100 个字节,那么接收端也必须调用对应的100次 recvfrom,接收 100 个字节; 而不能循环调用 10 次recvfrom,每次接收 10 个字节

  • 可以简单理解成udp对数据发的信息原样转发出去,不能像tcp那样灵活读取,这里就认为是一团数据,一口气发送或者接收!

五. UDP缓冲区

这里有个疑问,为啥它没发送缓冲区?

六. 底层基于 UDP 的应用层协议

  • NFS: 网络文件系统。

  • TFTP:简单文件传输协议。

  • DHCP:动态主机配置协议 比如路由器给电脑分配的ip地址。

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

  • DNS:域名解析协议 http时候的解析域名成ip。

  • 当然,也包括自己写 UDP 程序时自定义的应用层协议。

常用于 可靠性低 允许丢包 语音 比赛等实时性高的通信任务!

七. OS如何管理封装的报文

首先我们说到了UDP有接收缓冲区,当收到数据包的时候,OS也是需要管理的。

首先我们先理解一下sk _buff这里就是os用来管理在那几层传递的报文:

下面看张图(这里把TCP换成UDP是一样的):
在这里插入图片描述

这里只需要认识四个指针:

也就是根据 报文 =报头+ 有效载荷 这一原则进行的。

sk_buff结构代码如下:

struct sk_buff {
/* List management pointers */
struct sk_buff_head *list;
struct sk_buff *next;
/* Control buffer for private use */
char cb[48] __aligned(8);
/* Pointers to the data in the buffer */
unsigned char *head, *data;
unsigned char *tail, *end;
/* Length of the buffer */
unsigned int truesize;
/* Reference count */
atomic_t users;
/* State flags */
unsigned int state;
/* Destructor function */
void *destructor;
/* Protocol type */
__be16 protocol;
/* Length of the packet */
unsigned int len;
/* Length of the data in the buffer */
unsigned int data_len;
/* MAC header length */
__u16 mac_len;
/* Network header length */
__u16 network_header_len;
/* Transport header length */
__u16 transport_header_len;
/* Timestamp */
struct timespec64 tstamp;
/* Socket pointer */
struct sock *sk;
/* Network device pointer */
struct net_device *dev;
/* Space in front of data (headroom) */
unsigned int headroom;
/* Space at the end of data (tailroom) */
unsigned int tailroom;
};

这里只需大致了解一下即可!

❗此时还有个小问题:

如果应用层正在进行报文的解析,处理,会不会影响OS继续从网络中读取报文?

  • 答:不会,因此我们就可以知道,当udp在进行数据接收后在进行解析的时候(应用层),但是底层还是会不断接收信息(以sk_buff形式管理),也就是利用了os的中断机制了,因此是可以同时进行的!

八. UDP协议总结

特性分析

应用场景及注意事项:

  • 实时音视频(直播、视频会议、语音通话)

应用原因:低延迟保证画面、声音连贯性。

注意事项:需在应用层补充丢包恢复机制(如FEC前向纠错)、抗抖动缓冲处理。

  • 在线游戏

应用原因:快速传输玩家操作信息,确保游戏流畅。

注意事项:增加状态同步机制,解决少量数据丢失或乱序问题。

  • 网络管理(SNMP)

应用原因:频繁发送管理信息,UDP开销小更合适。

注意事项:关键管理指令需设计应用层确认重传机制。

  • 广播与多播(网络电视、在线广播)

应用原因:支持同时向多目标发送相同数据。

注意事项:对带宽依赖高,需控制数据报大小,避免网络拥塞 。

九. 本篇小结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据建模流程分析

📋 完成的工作 我已经为您创建了一个完整的高速列车轴承智能故障诊断系统,包含以下核心组件: 1. 数据预处理模块 (data_preprocessing.py)✅ 支持.mat文件解析✅ 多采样率统一处理(12kHz/48kHz/32kHz)✅ 时域特征…

第四章:大模型(LLM)】08.Agent 教程-(7)使用 LangGraph 的作文评分架构

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详细介绍:您必须知道的 10 大 Highcharts 性能优化技巧—— 提升加载速度与交互体验的实战建议

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

PHP8.5 Pipeline Operator 你应该了解的 8 个特性

PHP8.5 将在今年 11 月份发布Pipeline Operator (|>) 是 PHP 中一个令人兴奋的新特性,它从函数式编程中汲取灵感。它提供了一种干净、可读且富有表现力的方式来链接多个操作,无需嵌套括号或创建不必要的中间变量。…

Nvidia Orin DK 本地 ollama 主流 20GB 级模型 gpt-oss, gemma3, qwen3 部署与测试 - 实践

Nvidia Orin DK 本地 ollama 主流 20GB 级模型 gpt-oss, gemma3, qwen3 部署与测试 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importa…

Mysql查询条件里的字符串不加引导索引失效

View PostMysql查询条件里的字符串不加引导索引失效因为类型不一致,mysql做了隐式转换,就会导致索引失效

详细介绍:在Ubuntu平台搭建RTMP直播服务器使用SRS简要指南

详细介绍:在Ubuntu平台搭建RTMP直播服务器使用SRS简要指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

实用指南:在 k8s 上部署 Kafka 4.0 3节点集群

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Django HttpRequest 对象的常用属性 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

完整教程:Ajax-day2(图书管理)-弹框显示和隐藏

完整教程:Ajax-day2(图书管理)-弹框显示和隐藏pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

实用指南:C语言基础【20】:指针7

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

civil 3d com api 帮助文档

以前很容易搜到, 不知为什么现在搜不到了。 Getting Started

完整教程:【教程4>第8章>第28节】OFDM完整通信链路项目FPGA开发22——提取导频

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:万字详解架构设计:业务架构、应用架构、数据架构、技术架构、单体、分布式、微服务都是什么?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

WebSockets与Socket.io渗透测试实战指南

本文深入探讨如何通过降级WebSocket通信至HTTP协议实现安全测试,涵盖Socket.io传输机制滥用、协议升级中断技术及Burp Suite高级会话管理配置,提供可实操的渗透测试方法。如何渗透测试WebSockets与Socket.io Ethan R…

深入解析:spring boot3.0整合rabbitmq3.13

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

完整教程:VLAN划分——TRUNK

完整教程:VLAN划分——TRUNKpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

现代操作系统-音频处理技术1 Linux驱动底层

应用数学基础: 香农-奈奎斯特采样定理 角速度倒数是频率; 采样一段最大角速度为ω的信息,理想状态下需要2ω的速度才能完全采样,否则就会产生混叠Aliasing(即较高频被对称采样到较低频段),而限制于前后端,一般…

mcp-server-chart chart mcp 服务

mcp-server-chart chart mcp 服务基于antv 的mcp 服务,支持25+ charts 的生成,对于图表的开发还是挺方便的,对于图表的渲染基于了ssr,同时官方还提供了额一个示例实现(ssr 转换为图片) 简单试用安装npm install …

元推理:人和事物,都是针对性的存在着与必然因果,残缺之美

元推理:人和事物,都是针对性的存在着与必然因果,残缺之美ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891▮ 推理就绪:基于自然辩证法数学形式化系统启动因果律算符 命题是穿透表象的终极洞察。所言的不…