
🎬 个人主页 :艾莉丝努力练剑
❄专栏传送门 :《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》
《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》
⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平
🎬 艾莉丝的简介:

文章目录
- 思维导图
- 导入语
- [1 ~> 传输层基础](#1 ~> 传输层基础)
-
- [1.1 传输层核心作用](#1.1 传输层核心作用)
- [1.2 传输层主要协议](#1.2 传输层主要协议)
- [1.3 OSI 与 TCP/IP 模型对应关系](#1.3 OSI 与 TCP/IP 模型对应关系)
- [2 ~> 端口号核心机制](#2 ~> 端口号核心机制)
-
- [2.1 端口号定义](#2.1 端口号定义)
- [2.2 五元组标识通信](#2.2 五元组标识通信)
- [2.3 端口号范围划分](#2.3 端口号范围划分)
- [2.4 两个问题:端口号与进程绑定规则](#2.4 两个问题:端口号与进程绑定规则)
- [2.5 端口号绑定给进程,操作系统做了什么?](#2.5 端口号绑定给进程,操作系统做了什么?)
- [2.6 查看知名端口号](#2.6 查看知名端口号)
- [3 ~> UDP 协议基础](#3 ~> UDP 协议基础)
-
- [3.1 协议本质](#3.1 协议本质)
- [3.2 UDP 报文格式(定长 8 字节报头)](#3.2 UDP 报文格式(定长 8 字节报头))
- [3.3 UDP 报头结构体(C 语言内核定义)](#3.3 UDP 报头结构体(C 语言内核定义))
- [4 ~> UDP 封装与解包流程](#4 ~> UDP 封装与解包流程)
-
- [4.1 封装原理](#4.1 封装原理)
- [4.2 解包与分用](#4.2 解包与分用)
- [4.3 关键特性:无粘包问题](#4.3 关键特性:无粘包问题)
- [5 ~> UDP 核心特点](#5 ~> UDP 核心特点)
-
- [5.1 无连接](#5.1 无连接)
- [5.2 不可靠](#5.2 不可靠)
- [5.3 面向数据报](#5.3 面向数据报)
- [5.4 全双工](#5.4 全双工)
- [6 ~> UDP 缓冲区设计](#6 ~> UDP 缓冲区设计)
-
- [6.1 发送缓冲区](#6.1 发送缓冲区)
- [6.2 接收缓冲区](#6.2 接收缓冲区)
- [7 ~> UDP 传输限制](#7 ~> UDP 传输限制)
-
- [7.1 单报文最大长度](#7.1 单报文最大长度)
- [7.2 大数据传输方案](#7.2 大数据传输方案)
- [8 ~> 基于 UDP 的应用层协议](#8 ~> 基于 UDP 的应用层协议)
- 总结
- 结尾

思维导图

导入语
传输层是网络通信中端到端数据交付 的核心层,主要包含 TCP 与 UDP 两大协议。UDP 作为轻量级、无连接的传输协议,凭借简单、高效、低延迟的特性,广泛应用于 DNS、DHCP、视频通话、游戏传输等场景。本文严格对照 UDP 协议官方文档与课堂笔记,从端口号核心机制、UDP 报文格式、封装解包流程、协议特点、缓冲区设计、应用场景等维度完整拆解,帮你从原理到实践吃透 UDP,理清它与 TCP 的本质区别,夯实网络传输层基础。
1 ~> 传输层基础

1.1 传输层核心作用
传输层负责将数据从发送端主机完整传递到接收端主机,是应用程序与网络之间的桥梁,屏蔽底层网络细节,为应用层提供端到端通信服务。
1.2 传输层主要协议
TCP/IP 模型中传输层包含:
- UDP(用户数据报协议)
- TCP(传输控制协议)
- UDP-Lite、SCTP、DCCP 等扩展协议
1.3 OSI 与 TCP/IP 模型对应关系
- OSI 七层:应用层 → 表示层 → 会话层 → 传输层 → 网络层 → 数据链路层 → 物理层
- TCP/IP 四层:应用层 → 传输层 → 互联网层(网络层) → 网络接口层(数据链路 + 物理层)
2 ~> 端口号核心机制
这次是"再谈端口号"啦。

2.1 端口号定义
端口号(Port)用于标识同一台主机上不同的应用程序,让操作系统能将网络数据准确交付给对应进程。
2.2 五元组标识通信
TCP/IP 中用五元组唯一标识一条网络通信:
- 源 IP
- 源端口号
- 目的 IP
- 目的端口号
- 协议号(TCP/UDP 标识) 可使用
netstat -n命令查看系统当前五元组连接。

如下图所示:


2.3 端口号范围划分
- 0~1023:知名端口号 系统固定分配给通用服务,普通程序不可随意绑定,需
sudo权限。 常用:SSH (22)、FTP (21)、Telnet (23)、HTTP (80)、HTTPS (443)、DNS (53)。 - 1024~65535:动态端口号 操作系统自动分配给客户端程序,自定义服务推荐使用此区间。
注意:也不一定都是0~1023,比如MYSQL是3366端口号。

2.4 两个问题:端口号与进程绑定规则
- 一个进程可以绑定多个端口号
- 一个端口号只能被一个进程绑定(端口冲突会导致绑定失败)

2.5 端口号绑定给进程,操作系统做了什么?

2.6 查看知名端口号
Linux 命令:cat /etc/services,可查看系统预定义端口与服务对应关系。
bash
cat /etc/services

3 ~> UDP 协议基础

3.1 协议本质
UDP 是操作系统之间约定的报文结构体,通信双方按统一格式解析数据,无需建立连接即可传输。

3.2 UDP 报文格式(定长 8 字节报头)
Plain
0 15 16 31
┌────────┬────────┐
│源端口号 │目的端口号│ 16位
├────────┼────────┤
│UDP长度 │校验和 │ 16位
└────────┴────────┘
数据部分
- 16 位源端口号:发送方进程端口
- 16 位目的端口号:接收方进程端口
- 16 位 UDP 长度:整个 UDP 报文(报头 + 数据)总长度
- 16 位校验和:校验报文完整性,出错直接丢弃
- 数据部分:应用层交付的有效载荷
3.3 UDP 报头结构体(C 语言内核定义)
c
struct udphdr {
__be16 source; // 源端口
__be16 dest; // 目的端口
__be16 len; // 总长度
__sum16 check; // 校验和
};
4 ~> UDP 封装与解包流程

4.1 封装原理
- 应用层调用
sendto交付数据 - 内核创建
sk_buff数据包管理结构 - 数据指针前移
sizeof(struct udphdr),填充 UDP 报头 - 将
sk_buff加入发送队列,交给网络层传输
4.2 解包与分用
- 接收端按8 字节定长报头分离报头与数据
- 解析目的端口号,通过操作系统哈希表找到对应进程
- 将有效载荷交付给应用层,完成分用
4.3 关键特性:无粘包问题
UDP 面向数据报,应用层发多大,接收端就收多大,收发次数严格对等,无需处理粘包。
5 ~> UDP 核心特点

5.1 无连接
知道对端 IP + 端口即可直接发送数据,无需三次握手建立连接,开销极低。
5.2 不可靠
- 无确认机制、无重传机制
- 报文丢失、乱序、出错时,协议层不通知应用层
- 校验和失败直接丢弃,发送端无感知
5.3 面向数据报
- 不拆分、不合并应用层数据,原样传输
- 一次
sendto对应一次recvfrom,读写长度完全一致
5.4 全双工
UDP Socket 可同时读写,双向通信无阻塞。
6 ~> UDP 缓冲区设计

6.1 发送缓冲区
无真正意义的发送缓冲区,sendto 调用后数据直接交给内核网络层,不缓存、不重发。
即:UDP没有真正意义上的发送缓冲区,调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作。
6.2 接收缓冲区
- 存在接收队列,但不保证报文有序
- 缓冲区满时,新到达报文直接丢弃
- 底层基于
sk_buff链表管理接收报文
即:UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,再到达的UDP数据就会被丢弃。
7 ~> UDP 传输限制
既是UDP的传输限制,也可以理解为是UDP在使用时需要注意的事项。
7.1 单报文最大长度
16 位长度字段限制:单个 UDP 报文最大 64KB(含报头)。
7.2 大数据传输方案
超过 64KB 需在应用层手动分包、多次发送、接收端重组,协议层不支持自动分片。
8 ~> 基于 UDP 的应用层协议
- DNS:域名解析,轻量查询场景
- DHCP:动态 IP 地址分配
- TFTP:简单文件传输
- NFS:网络文件系统
- 视频通话、直播、游戏:低延迟优先场景

总结
- 传输层通过端口号 区分进程,五元组唯一标识通信,知名端口 0~1023 需管理员权限。
- UDP 是8 字节定长报头、无连接、不可靠、面向数据报的轻量协议,封装解包简单高效。
- UDP 无发送缓冲区、接收缓冲区不保证有序,无粘包问题,单报文最大 64KB。
- 适合对延迟敏感、可容忍少量丢包的场景,是 DNS、DHCP、实时音视频的底层协议。
- 端口与进程绑定规则:一进程可多端口,一端口只能一进程,是网络通信的基础约束。

结尾
uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ### 艾莉丝努力练剑 C/C++ & Linux 底层探索者 | 一个正在努力练剑的技术博主 *** ** * ** *** 👀 【关注】 跟随我一起深耕技术领域,见证每一次成长。 ❤️ 【点赞】 让优质内容被更多人看见,让知识传递更有力量。 ⭐ 【收藏】 把核心知识点存好,在需要时随时查、随时用。 💬 【评论】 分享你的经验或疑问,评论区一起交流避坑! 不要忘记给博主"一键四连"哦! "今日练剑达成!"
"技术之路难免有困惑,但同行的人会让前进更有方向。" |
结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主"一键四连"哦!
往期回顾:
【Linux网络】Linux 网络编程:HTTP(五)HTTP收尾,从Cookie会话保持、抓包问题到 HTTPS 初识
🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა
