【Linux网络】Linux 网络编程:传输层UDP

🎬 个人主页艾莉丝努力练剑
专栏传送门 :《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 中用五元组唯一标识一条网络通信:

  1. 源 IP
  2. 源端口号
  3. 目的 IP
  4. 目的端口号
  5. 协议号(TCP/UDP 标识) 可使用 netstat -n 命令查看系统当前五元组连接。

如下图所示:


2.3 端口号范围划分

  1. 0~1023:知名端口号 系统固定分配给通用服务,普通程序不可随意绑定,需 sudo 权限。 常用:SSH (22)、FTP (21)、Telnet (23)、HTTP (80)、HTTPS (443)、DNS (53)。
  2. 1024~65535:动态端口号 操作系统自动分配给客户端程序,自定义服务推荐使用此区间。

注意:也不一定都是0~1023,比如MYSQL是3366端口号。

2.4 两个问题:端口号与进程绑定规则

  1. 一个进程可以绑定多个端口号
  2. 一个端口号只能被一个进程绑定(端口冲突会导致绑定失败)

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位
└────────┴────────┘
        数据部分
  1. 16 位源端口号:发送方进程端口
  2. 16 位目的端口号:接收方进程端口
  3. 16 位 UDP 长度:整个 UDP 报文(报头 + 数据)总长度
  4. 16 位校验和:校验报文完整性,出错直接丢弃
  5. 数据部分:应用层交付的有效载荷

3.3 UDP 报头结构体(C 语言内核定义)

c 复制代码
struct udphdr {
    __be16 source;  // 源端口
    __be16 dest;    // 目的端口
    __be16 len;     // 总长度
    __sum16 check;  // 校验和
};

4 ~> UDP 封装与解包流程

4.1 封装原理

  1. 应用层调用 sendto 交付数据
  2. 内核创建 sk_buff 数据包管理结构
  3. 数据指针前移 sizeof(struct udphdr),填充 UDP 报头
  4. sk_buff 加入发送队列,交给网络层传输

4.2 解包与分用

  1. 接收端按8 字节定长报头分离报头与数据
  2. 解析目的端口号,通过操作系统哈希表找到对应进程
  3. 将有效载荷交付给应用层,完成分用

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 的应用层协议

  1. DNS:域名解析,轻量查询场景
  2. DHCP:动态 IP 地址分配
  3. TFTP:简单文件传输
  4. NFS:网络文件系统
  5. 视频通话、直播、游戏:低延迟优先场景

总结

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

结尾

uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ### 艾莉丝努力练剑 C/C++ & Linux 底层探索者 | 一个正在努力练剑的技术博主 *** ** * ** *** 👀 【关注】 跟随我一起深耕技术领域,见证每一次成长。 ❤️ 【点赞】 让优质内容被更多人看见,让知识传递更有力量。 ⭐ 【收藏】 把核心知识点存好,在需要时随时查、随时用。 💬 【评论】 分享你的经验或疑问,评论区一起交流避坑! 不要忘记给博主"一键四连"哦! "今日练剑达成!" "技术之路难免有困惑,但同行的人会让前进更有方向。" |

结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主"一键四连"哦!

往期回顾

【Linux网络】Linux 网络编程:HTTP(五)HTTP收尾,从Cookie会话保持、抓包问题到 HTTPS 初识

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა

相关推荐
陈eaten12 小时前
centos 7等保整改学习
linux·运维·服务器·网络安全·centos·等保
牢七12 小时前
契约锁分析
linux·运维·服务器
承渊政道13 小时前
Linux系统学习【进程概念从入门到深入理解】
linux·服务器·笔记·学习·ubuntu·系统架构·bash
无忧.芙桃13 小时前
进程间通信的基本概念(上)
linux·运维·服务器
ylscode13 小时前
微软Edge浏览器启动时停止将已保存的密码加载到内存中
网络·数据库·安全·安全威胁分析
运维瓦工13 小时前
DevOps 生态介绍(四):Sonarqube&jacoco 与jenkins集成使用
运维·jenkins·devops
草莓熊Lotso15 小时前
【Linux系统加餐】从原理到封装:基于建造者模式实现System V信号量工业级C++封装
android·linux·运维·服务器·网络·c++·建造者模式
广州灵眸科技有限公司21 小时前
瑞芯微(EASY EAI)RV1126B 核心板供电电路
linux·运维·服务器·单片机·嵌入式硬件·电脑
keyipatience21 小时前
18.Linux进程退出和进程等待机制详解
linux·运维·服务器