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://idctop.com/article/480783.html

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

相关推荐

  • 一个服务器一年多少钱,哪个配置性价比高?

    一台服务器一年的费用没有固定答案,从几千元到数十万元不等,具体取决于硬件配置、带宽需求和机房等级,对于大多数中小型网站,租用一台入门级云服务器一年预算在2000元到5000元之间,而选择物理服务器托管则需5000元到20000元,影响服务器价格的核心因素服务器的成本构成并不复杂,但每一项都直接决定最终报价,了解……

    2026年8月7日
    1100
  • 北京2u服务器租用价格是多少钱,2u服务器一个月多少钱

    北京2U服务器租用月付价格通常在400元至1500元之间,托管机位约300至800元/月,实际成交价取决于带宽类型、线路质量、硬件配置和机房资质,下面把价格拆开说清楚,避免只比“最低价”结果踩坑,2U服务器费用到底由哪几块组成2U指机柜内占用2个标准高度单元,高度约8.9厘米,北京地区机柜资源紧张,2U位置本身……

    2026年9月20日
    200
  • 装个服务器到底要多少钱,租用和购买哪个划算?

    装一个服务器的费用从几千元到几十万元不等,入门级自用服务器约3000-8000元,企业级机架式服务器约1.5万-5万元,托管或租用则按年付费约5000元起步,价格差异主要取决于硬件配置、网络带宽、机房等级以及你选择自建还是租用,下面从实际采购角度拆解各项成本,需求定位决定预算区间不谈用途就谈价格没有意义,服务器……

    2026年9月14日
    400
  • squad服务器一个月多少钱

    租一台能流畅运行《Squad》(战术小队)的64人服务器,市场主流月付价格在200元至800元之间;若是百人满编且需要高主频CPU的配置,月付预算通常在1000元至2000元区间,这个价格区间基于国内持牌IDC服务商的公开报价与行业常见参数,具体取决于CPU型号、内存容量、带宽类型和防御能力,影响Squad服务……

    2026年8月13日
    400
  • x8672服务器功率到底是多少?,功率多少瓦?

    x8672服务器的功率通常由CPU TDP(150W)与整机硬件配置共同决定,单路配置下典型整机功耗在250W到400W之间,双路配置则普遍落在450W到650W区间, 这个数值不是固定参数,而是随CPU负载率、内存数量、硬盘类型以及扩展卡功耗动态变化的实时指标,本文将从CPU规格、整机功耗构成、实际测算方法以……

    2026年8月23日
    900
  • web服务器默认端口是多少?常见端口有哪些?

    Web服务器默认端口是80(HTTP)和443(HTTPS),其中443是目前绝大多数网站实际使用的主要端口,当用户在浏览器输入域名时,浏览器默认访问的就是这两个端口,无需手动指定,端口在Web访问中扮演什么角色端口是服务器与外界通信的逻辑通道,一台服务器可以同时运行多个服务,端口号就是区分这些服务的“门牌号……

    2026年8月28日
    700
  • SSL服务器证书一年多少钱,怎么买便宜又靠谱

    你问SSL服务器证书一年多少钱,答案其实很简单:从免费到每年数千元甚至上万元,具体取决于你的网站类型、验证等级和购买渠道,对于大多数个人博客或展示型网站,免费证书或几十元的域名验证型证书就够用;而企业电商、金融平台往往需要几百到上千元的组织验证或扩展验证证书,才能获得浏览器地址栏的绿色标识和最高信任度,SSL证……

    2026年8月23日
    200
  • 简米云100t的服务器多少钱一台,值得买吗?

    阿里云100TB存储服务器的月费依据配置差异,大致在3000元至15000元之间,但实际支出会因存储类型、带宽和计费模式而波动,如果你需要更透明的定价和本土化服务,可以关注简米科技和酷番云这类持牌运营商,它们在同等配置下往往能提供更具竞争力的方案,阿里云100T服务器价格拆解要准确回答“阿里云100T服务器多少……

    2026年8月20日
    1000
  • 5000g的服务器到底多少钱一台,性价比高吗

    一台5000G(5TB)存储的服务器,月租价格通常在500元至3000元之间,具体取决于CPU、内存、带宽等配置及服务商资质,低配共享带宽方案可低至300元,高配独享带宽则可能超过5000元,5000G服务器的定价逻辑5000G存储本身不是价格的决定因素,真正影响成本的是围绕硬盘的整机架构,同一块5TB硬盘,搭……

    2026年8月11日
    900
  • TS服务器一个月多少钱,租用价格贵不贵?

    ts服务器一个月的费用通常在几十元到数百元不等,具体取决于在线人数规模、语音质量要求以及服务商定价策略,选择ts服务器时,价格只是表象,背后是机房资源、网络线路和运维能力的综合博弈,一个百人规模的游戏战队,与一个千人规模的社区公会,每月开支可能相差十倍,本文从实际运营角度拆解ts服务器的定价逻辑,并给出可落地的……

    2026年9月4日
    1100

发表回复

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