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

相关推荐

  • 自制一台迷你电脑怎么做,新手小白需要准备什么配件

    自制一台迷你电脑不仅能获得超越同体积品牌机的性能,还能根据需求精准控制预算,实现极致的空间利用与个性化定制,核心在于硬件选型的兼容性匹配与合理的散热风道设计,对于大多数用户而言,选择NUC准系统或ITX架构是当前最成熟的解决方案,整个过程并不复杂,只需遵循标准化的组装流程即可完成,通过DIY,用户可以灵活升级内……

    2026年2月19日
    21700
  • FPGA和Linux怎么结合?FPGA与Linux系统开发教程

    FPGA与Linux并非简单的硬件与软件关系,而是通过Zynq等SoC架构实现软硬协同,利用Linux处理复杂业务逻辑,FPGA负责低延迟硬件加速,从而在边缘计算和工业控制领域达到性能与灵活性的最佳平衡,在嵌入式开发领域,开发者常面临一个经典抉择:是用纯软件跑Linux,还是用纯硬件写Verilog?答案往往不……

    2026年7月8日
    5000
  • FTP服务器变更IP地址后公网无法访问怎么办?,怎么解决

    为什么IP地址一换,公网访问就掉线?FTP服务器在内网换了IP地址,公网立刻连不上,这个现象几乎每个运维人员都遇到过,根本原因在于网络路径上的映射关系没有同步更新,路由器端口转发指向的还是旧IP,服务器防火墙规则还在拦截新地址的流量,FTP协议本身控制连接和数据连接分离,在NAT环境下极易因配置断层导致数据通道……

    2026年8月3日
    800
  • 印尼互联网发展现状如何?UCloud雅加达机房配置及价格

    印尼互联网市场正处于高速增长期,UCloud雅加达机房凭借低延迟、合规性强及高性价比的优势,成为出海企业部署本地化业务的理想选择,随着东南亚数字经济的崛起,印尼作为该区域最大的经济体,其互联网基础设施的完善程度直接决定了企业在当地的运营效率,对于希望深耕东南亚市场的中国企业而言,选择正确的云服务提供商和机房节点……

    2026年6月18日
    2600
  • asp网站如何改首页布局视频教程,如何配置应用布局?

    修改ASP网站首页布局的核心在于精准定位文件结构、熟练运用Include指令以及遵循CSS盒模型规范,而配置应用布局的本质则是实现代码逻辑与视觉表现的分离,对于基于ASP技术构建的动态网站,首页布局的调整并非简单的拖拽操作,而是需要深入理解头部文件、主体内容区以及底部文件的嵌套关系,成功的布局改造,必须建立在备……

    2026年4月4日
    8100
  • iWebFusion美国独立服务器硬件升级不涨价?,美国独立服务器哪个好?

    iWebFusion作为深耕美国市场的资深IDC服务商,凭借其稳定的硬件维护体系和极具竞争力的价格策略,成为海外业务部署的优选,其提供的高性价比独立服务器,在保持$49/月起步价的同时,通过免费硬件升级和1Gbps大带宽接入,能够有效满足中小型企业及个人开发者对高性能计算资源的需求,iWebFusion怎么样……

    2026年7月12日
    5100
  • linux简史知多少,linux是什么?

    Linux 内核初版发布于1991年,由芬兰学生林纳斯·托瓦兹(Linus Torvalds)基于Minix操作系统开发,这标志着Linux简史的正式开端,也是整个开源生态的基石,从个人爱好到全球协作:Linux 诞生初期的那些事1991年,一个学生的暑期项目在1991年,操作系统领域被巨头牢牢把控,微软的Wi……

    2026年7月18日
    1300
  • 国外nas云存储怎么查看,国外nas云存储无法访问怎么办

    查看国外NAS云存储的核心在于打通“网络连接、权限配置、远程访问服务”这三大关键环节,无论使用群晖、威联通(QNAP)还是其他品牌,其底层逻辑均为:通过公网IP或内网穿透服务建立连接通道,配合严格的用户权限与安全策略,实现数据的远程可视化与管理,对于国内用户而言,解决网络连通性问题是查看国外NAS云存储的首要前……

    2026年3月5日
    15000
  • 企业安全管理解决方案有哪些?如何构建高效安全管理体系

    安全管理解决方案的核心在于将分散的监控、预警与响应流程整合为统一的数字化闭环,通过AI驱动的风险识别实现从“被动防御”向“主动治理”的跨越,传统安全管理的痛点与数字化转型的必然性过去,企业的安全管理往往依赖人工巡检和纸质记录,这种模式在面对复杂的生产环境或庞大的办公园区时,显得力不从心,业内专家指出,传统手段最……

    2026年6月6日
    3300
  • ipv4全球的根域服务器有多少

    全球IPv4根域名服务器一共只有13台,它们由12个独立机构运营,是互联网域名解析体系的最高层级,这13台根服务器并非物理意义上的13台电脑,而是13个由镜像节点组成的逻辑集群,分布于全球多个节点,理解根服务器的数量、分布与运作机制,是掌握互联网基础设施运行逻辑的基础,本文将从根服务器的构成、分布、运作原理、安……

    2026年8月21日
    100

发表回复

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