linux中udp是什么?linux中udp和tcp有什么区别

在 Linux 系统中,UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的传输层协议,它以其低延迟高吞吐量著称,广泛应用于实时应用(如视频流、在线游戏、DNS 查询等)。

以下是关于 Linux 中 UDP 的核心概念、配置、调试及编程指南:

理解TCP和UDP协议的核心原理和区别
加载中
理解TCP和UDP协议的核心原理和区别

核心特性

特性 说明
无连接 发送数据前不需要建立连接(如 TCP 的三次握手)。
不可靠 不保证数据包到达、不保证顺序、不重传丢失包。
面向报文 保留应用层数据的边界,不会像 TCP 那样进行字节流拆分。
头部开销小 UDP 头部仅 8 字节,比 TCP 的 20+ 字节更轻量。
支持广播/组播 天然支持一对多通信。

常用网络工具与命令

1 查看 UDP 端口监听状态

# 查看正在监听的 UDP 端口(需要 root 权限)
sudo netstat -ulnp
# 或使用 ss 命令(推荐,更现代)
sudo ss -ulnp
  • -u: 显示 UDP 协议
  • -l: 显示监听状态
  • -n: 以数字形式显示地址和端口
  • -p: 显示进程信息

2 测试 UDP 连通性

# 使用 nc (netcat) 发送 UDP 数据包
# 发送 "Hello" 到 127.0.0.1 的 9999 端口
echo "Hello" | nc -u -w 1 127.0.0.1 9999
# 监听 UDP 端口(接收端)
nc -ul 9999

3 防火墙配置 (iptables/nftables/firewalld)

UDP 端口默认可能被防火墙阻止,需手动开放:

# 使用 firewalld (CentOS/RHEL)
sudo firewall-cmd --add-port=9999/udp --permanent
sudo firewall-cmd --reload
# 使用 iptables
sudo iptables -A INPUT -p udp --dport 9999 -j ACCEPT

linux中udp是什么?linux中udp和tcp有什么区别


Linux 内核参数调优(性能优化)

UDP 在高负载下容易丢包,可通过调整内核参数提升性能。

1 关键参数说明

参数 默认值 建议值 说明
net.core.rmem_max 212992 16777216 接收缓冲区最大大小
net.core.rmem_default 212992 262144 接收缓冲区默认大小
net.core.wmem_max 212992 16777216 发送缓冲区最大大小
net.core.wmem_default 212992 262144 发送缓冲区默认大小
net.core.netdev_max_backlog 1000 5000+ 网卡接收队列长度,防止丢包
net.ipv4.udp_mem 自动 手动设置 UDP 内存使用阈值

2 修改方法

编辑 /etc/sysctl.conf 文件:

sudo vim /etc/sysctl.conf
# 增大 UDP 缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 262144
net.core.wmem_default = 262144
# 增加网卡接收队列
net.core.netdev_max_backlog = 5000
# 启用 UDP 快速路径(可选)
net.ipv4.udp_lro = 1

应用配置:

sudo sysctl -p

C 语言编程示例

1 UDP 服务器端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 9999
#define BUFFER_SIZE 1024
int main() {
    int sockfd;
    char buffer[BUFFER_SIZE];
    struct sockaddr_in serv_addr, cli_addr;
    socklen_t len = sizeof(cli_addr);
    // 1. 创建 UDP 套接字
    if

linux中udp是什么?linux中udp和tcp有什么区别

((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("Socket creation failed"); exit(EXIT_FAILURE); } memset(&serv_addr, 0, sizeof(serv_addr)); memset(&cli_addr, 0, sizeof(cli_addr)); // 2. 配置服务器地址 serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); serv_addr.sin_addr.s_addr = INADDR_ANY; // 3. 绑定地址 if (bind(sockfd, (struct sockaddr )&serv_addr, sizeof(serv_addr)) < 0) { perror("Bind failed"); exit(EXIT_FAILURE); } printf("UDP Server listening on port %d...n", PORT); // 4. 接收数据 while (1) { memset(buffer, 0, BUFFER_SIZE); int n = recvfrom(sockfd, (char )buffer, BUFFER_SIZE, MSG_WAITALL, (struct sockaddr )&cli_addr, &len); buffer[n] = ''; printf("Received message from %s:%d: %sn", inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port), buffer); // 可选:回显消息 sendto(sockfd, buffer, n, MSG_CONFIRM, (const struct sockaddr )&cli_addr, len); } close(sockfd); return 0; }

2 UDP 客户端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 9999
#define SERVER_IP "127.0.0.1"
#define BUFFER_SIZE 1024
int main() {
    int sockfd;
    char buffer[BUFFER_SIZE];
    struct sockaddr_in serv_addr;
    socklen_t len = sizeof(serv_addr);
    // 1. 创建 UDP 套接字
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);
    serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
    // 2. 发送数据
    const char message = "Hello UDP Server!";
    sendto(sockfd, message, strlen(message), MSG_CONFIRM,
      

linux中udp是什么?linux中udp和tcp有什么区别

(const struct sockaddr )&serv_addr, len); printf("Message sent to %s:%dn", SERVER_IP, PORT); // 3. 接收回显 memset(buffer, 0, BUFFER_SIZE); int n = recvfrom(sockfd, (char )buffer, BUFFER_SIZE, MSG_WAITALL, (struct sockaddr )&serv_addr, &len); buffer[n] = ''; printf("Response from server: %sn", buffer); close(sockfd); return 0; }

常见问题与调试技巧

1 如何判断 UDP 是否丢包?

  • 工具tcpdump
    sudo tcpdump -i any udp port 9999 -n
  • 监控sar -n DEV 1netstat -s | grep -i udp

2 UDP 连接超时?

  • UDP 无连接,但可以使用 SO_RCVTIMEOSO_SNDTIMEO 设置接收/发送超时:
    struct timeval timeout;
    timeout.tv_sec = 5;
    timeout.tv_usec = 0;
    setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));

3 广播与组播

  • 广播:设置 SO_BROADCAST 选项。
  • 组播:使用 IP_ADD_MEMBERSHIP 加入组播组。

场景 推荐协议
文件传输、网页浏览、邮件 TCP(可靠、有序)
视频流、语音通话、DNS、游戏 UDP(低延迟、容忍丢包)

在 Linux 中优化 UDP 性能,关键在于:

  1. 增大缓冲区rmem/wmem
  2. 增加网卡队列netdev_max_backlog
  3. 使用高性能 I/O 模型(如 epoll + non-blocking

如有具体场景(如高并发 UDP 服务器、组播应用等),可进一步提供细节,我将给出更针对性的建议。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://test.idctop.com/article/480783.html

(0)
H3C路由器多条宽带负载均衡怎么设置?如何实现多线接入
上一篇 2026年7月10日 15:54
linux rpm bin是什么?linux下rpm包管理命令详解
下一篇 2026年7月10日 15:55

相关推荐

  • 监控摄像头连电视怎么连,老式电视能连吗?

    将监控摄像头的画面实时显示在电视屏幕上,不仅能获得更广阔的视野,还能利用电视的大屏幕特性提升细节观察的体验,实现这一目标主要有三种成熟且专业的方案:利用硬盘录像机(NVR)通过HDMI线传输、使用视频采集卡将USB或网络信号转为HDMI、以及借助智能电视的内置系统进行网络投屏,针对监控摄像头连电视怎么连这一核心……

    2026年2月20日
    34700
  • 国外1核1g云通信特价多少钱?国外云服务器特价推荐

    对于寻求高性价比海外业务部署的企业与开发者而言,国外1核1g云通信特价方案不仅是降低基础设施成本的捷径,更是实现全球业务低延迟、高并发通信的关键切入点,这一配置看似入门,实则是经过精密计算的“黄金性价比”组合,能够完美承载90%以上的初期业务验证与轻量级通信需求,是中小企业出海的最优解,为何1核1G配置是海外通……

    2026年3月6日
    10100
  • asp网站图片轮播代码怎么写?asp轮播图片代码大全

    ASP网站图片轮播代码的实现核心在于逻辑处理与前端展示的完美分离,一个高效的轮播模块不仅需要稳定的后台数据调用,更依赖于流畅的前端交互脚本,对于使用ASP技术构建的老牌网站而言,实现{asp网站图片轮播代码_轮播图片}功能,最佳方案是采用“ASP动态输出数据 + JavaScript控制DOM + CSS3动画……

    2026年3月16日
    11900
  • 安卓如何进行机器学习?安卓界面及windows相关

    在安卓设备上运行机器学习模型,核心在于利用TensorFlow Lite或PyTorch Mobile将训练好的模型量化并转换为轻量级格式,结合Android Studio进行本地部署,从而实现低延迟、高隐私保护的端侧智能体验,随着移动芯片算力的飞跃,将AI能力下沉到终端已成为行业共识,过去,用户习惯将数据上传……

    2026年6月1日
    4500
  • ec服务器4d装扮到底要多少钱,价格贵不贵?

    ec服务器4d装扮的价格通常在500元至3000元之间,具体取决于装扮的稀有度、保底机制和区服物价,但核心花费逻辑是“抽奖概率+碎片合成”的双轨制,近年来,ec服务器的人气持续走高,4d装扮作为游戏中辨识度极高的外观物品,一直是玩家群体讨论的焦点,价格不透明、交易风险高、区服差异大,让不少新玩家感到困惑,这篇内……

    2026年8月17日
    400
  • 如何拥有一个华丽的linux,有哪些必备软件?

    华丽 Linux 桌面美化指南让你的 Linux 桌面从极客走向视觉盛宴,以下是一些核心思路和工具,选择适合的桌面环境不同的桌面环境(DE)提供不同的华丽起点:KDE Plasma — 高度可定制,内置毛玻璃、动画和大量特效GNOME — 简洁现代,搭配扩展可变为圆润毛玻璃风格XFCE — 轻量但通过主题也能变……

    2026年7月14日
    700
  • 天翼云1核2G主机低至60.53元/年是真的吗?天翼云主机最新优惠活动

    天翼云10.12至10.31期间推出“云上云狂欢季”提前购活动,1核2G云主机低至60.53元/年,新老用户均可享受此优惠,是低成本搭建个人网站或测试环境的最佳时机,天翼云10.12-10.31云上云狂欢季提前购核心权益解析在云计算市场竞争日益激烈的当下,寻找高性价比的基础算力资源已成为许多开发者和小微企业的刚……

    2026年7月3日
    2100
  • 易探云香港云服务器2核2G5M首月39元值得买吗,香港云服务器推荐

    易探云香港云服务器2核2G5M配置首月仅需39元,年付享6.8折低至636.48元,且自带1G防御,是中小网站低成本高可用的优质选择,在云计算市场日益内卷的当下,寻找一款性价比高、稳定性强且具备基础安全防护的云服务器,是许多个人开发者、初创团队以及小型企业的首要任务,易探云推出的这款香港云服务器产品,凭借其极具……

    2026年6月26日
    2400
  • 国外业务中台服务解决方案有哪些?海外中台搭建指南

    构建高效的全球化运营体系,核心在于建立一套能够快速响应市场变化、打破数据孤岛并实现能力复用的中台架构,国外业务中台服务解决方案不仅是技术架构的升级,更是企业国际化战略落地的关键支撑,它通过将通用业务能力“沉淀”与“共享”,解决了跨国经营中重复造轮子、响应滞后及合规风险高等核心痛点,实现从“单点作战”向“协同赋能……

    2026年3月1日
    13200
  • linux logo怎么制作?linux系统图标设计教程

    制作Linux Logo的核心在于理解开源社区的视觉规范,通过SVG矢量格式结合Tux企鹅或Tux变体进行设计,并利用Inkscape等工具进行标准化导出,最终确保文件符合GPL及开源标识使用指南,在开源生态中,Logo不仅仅是一个图形,它是身份的象征,对于开发者、系统管理员或Linux爱好者来说,拥有一个独特……

    2026年7月7日
    8100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注