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 1 或 netstat -s | grep -i udp

2 UDP 连接超时?

  • UDP 无连接,但可以使用 SO_RCVTIMEO 和 SO_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

相关推荐

  • AI开发入门教程怎么选?AI开发平台哪个好?

    AI开发的本质是数据、算法与算力的系统工程,选择合适的AI开发平台是降低技术门槛、加速项目落地的核心关键,对于初学者而言,掌握从数据预处理到模型部署的全流程,比单纯钻研算法理论更具实战价值,高效的AI开发入门路径,应当依托成熟的AI开发平台,以任务驱动学习,快速实现从理论到工程的跨越,为何AI开发平台成为入门首……

    2026年3月30日
    9000
  • CUBECLOUD魔方云618有哪些优惠,便宜VPS怎么买?

    CUBECLOUD 魔方云 618 上云采购季:全场 88 折,开启高效云端之旅迎接 618 电商盛典,CUBECLOUD 魔方云正式开启“上云采购季”活动,无论您是初创团队、独立开发者还是企业用户,现在都是升级云端基础设施的最佳时机,核心优惠详情全场产品 88 折:本次活动覆盖全线产品,所有云服务均可享受 8……

    2026年7月12日
    13000
  • Linux扇区大小是多少?linux扇区大小4096

    在 Linux 系统中,“扇区大小”(Sector Size)是一个关键参数,它决定了存储设备(如硬盘、SSD、U盘等)与文件系统交互的最小单位,理解扇区大小对于性能优化、数据对齐以及兼容性至关重要,以下是关于 Linux 扇区大小的详细解析:什么是扇区大小?物理扇区(Physical Sector):磁盘硬件……

    2026年7月10日
    5800
  • s1刀片服务器要花多少钱?,s1刀片服务器多少钱

    S1刀片服务器的价格并非固定值,它受硬件配置、新旧程度和采购渠道三个维度影响:全新入门级配置约3-5万元,主流业务配置在6-12万元区间,而高性能配置则可能超过15万元, 实际采购前,建议先明确业务负载,再对比不同服务商的报价,这样能更精准地控制预算,影响S1刀片服务器价格的核心因素硬件配置决定成本基线S1刀片……

    2026年8月20日
    400
  • CrownCloud KVM VPS值得买吗?美国VPS性价比高推荐

    CrownCloud KVM VPS以$5/月的极致性价比,提供4核2G内存与1Gbps带宽,是搭建个人博客、轻量级应用及跨境业务的高性价比首选方案,在2026年的云计算市场,VPS(虚拟专用服务器)的选择早已超越了单纯的参数比拼,转向了稳定性、网络质量与综合成本的深度考量,对于许多独立开发者、小型企业以及个人……

    2026年6月27日
    1810
  • UCloud专线家族有哪些?全球动态加速UDPN怎么选

    UCloud专线家族通过高速通道UDPN、全球动态加速PathX、GlobalSSH及GlobalRDP四大组件,构建了从底层网络优化到上层应用加速的全链路解决方案,能够以较低成本实现跨国业务的高可用与低延迟,是出海企业应对复杂网络环境的优选策略,在数字化出海浪潮中,网络稳定性直接决定了业务的生命线,许多企业在……

    2026年6月28日
    2200
  • h3c服务器r2900默认密码是多少,怎么重置

    H3C UniServer R2900服务器的默认管理密码通常为Password@_,用于HDM管理接口;若为出厂较早版本,可能为Admin@123,请优先尝试前者,并建议首次登录后立即修改,H3C R2900默认密码为何备受关注新服务器到货,测试机柜连通性、配置RAID、安装操作系统,第一关就是HDM管理口的……

    2026年7月31日
    800
  • Clearcase在Linux上怎么安装,有哪些常见问题?

    在Linux上部署ClearCase,需接受其仅支持RHEL和SLES的限制,且许可成本高昂;相比之下,Git等现代工具能提供更灵活的协作模式和更低的总拥有成本,迁移已成为行业主流趋势,行业共识认为,ClearCase在传统制造业、金融业仍有部分存量用户,但新建项目几乎不再采用,据Forrester在2022年……

    2026年7月20日
    900
  • Apache服务器的配置怎么做,Apache配置详细步骤教程

    Apache服务器的配置核心在于精准控制httpd.conf主配置文件与虚拟主机模块的协同工作,通过模块化设计实现安全性与性能的双重优化,成功的Apache配置并非简单的参数堆砌,而是基于最小权限原则与模块按需加载策略构建的高效Web服务架构,这一结论构成了Apache服务器稳定运行的基石,任何偏离此核心的配置……

    2026年3月27日
    8900
  • 安卓开发如何连接MySQL数据库?App特征信息获取方法详解

    安卓开发实现与MySQL数据库的连接,核心在于构建安全、高效的中间层架构,而App特征信息的获取则是保障数据交互安全与用户身份认证的关键环节,直接在移动端连接数据库存在极大的安全隐患,专业方案必须采用“安卓端-服务端-数据库”的三层架构模式,通过App特征信息作为身份标识,确保数据请求的合法性与可追溯性,核心架……

    2026年3月25日
    9500

发表回复

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