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/linux%e4%b8%adudp%e6%98%af%e4%bb%80%e4%b9%88%ef%bc%9flinux%e4%b8%adudp%e5%92%8ctcp%e6%9c%89%e4%bb%80%e4%b9%88%e5%8c%ba%e5%88%ab/

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

相关推荐

  • h5传奇服务器多少钱一台,传奇h5开服要多少钱?

    h5传奇服务器多少钱?没有全国统一价,只有按业务参数算出来的价, 普通测试服、小服通常在几十元到几百元每月,商业合区服、高防大带宽服常见千元级到数千元每月,真正拉开差价的,是在线人数、带宽线路、防御清洗、机房资质和售后响应,影响H5传奇服务器报价的核心变量在线人数与开区数量H5传奇和传统端游不同,玩家用浏览器或……

    2026年9月25日
    100
  • 山东聊城服务器IP地址是多少,怎么查询?

    山东省聊城市的服务器IP地址没有固定的单一数值,而是由机房运营商根据IP段规划动态分配的,精确IP需以服务商控制面板或备案信息为准, 对于在聊城本地部署业务或选择聊城机房的用户来说,最直接的获取方式是登录服务商后台查询独立IP或共享IP对应关系,本文将从IP地址的分配逻辑、本地机房查询方法、备案关联性以及服务商……

    2026年9月22日
    000
  • 4g8核10m的阿里服务器多少钱,哪家最便宜

    4核8G10M配置的阿里云服务器,年付价格通常在3000元至5000元之间,但实际费用会因购买渠道、时长和活动折扣而有所浮动, 对于中小企业和开发者而言,这个配置属于性价比较高的选择,能满足大多数Web应用和轻量级后端服务需求,阿里云4核8G10M服务器价格是多少?在讨论具体价格前,需要明确一点:阿里云服务器的……

    2026年7月25日
    1000
  • ice服务器里究竟有多少个小游戏,怎么玩

    ice服务器有多少个小游戏,并没有一个全网统一的固定答案,按常驻玩法、赛季轮换、限时活动和隐藏入口综合统计,ICE服务器常见状态是“核心常驻玩法十几款上下,活动期可体验种类更多”;如果只看当天大厅首屏,数字会少一些,为什么ICE服务器的小游戏数量会变统计口径不同,答案就不同问“ice服务器有多少个小游戏”,先要……

    2026年9月23日
    100
  • 服务器3TB流量能撑多少人,服务器流量怎么算

    服务器3TB流量能支撑多少人?答案取决于你的网站类型和用户行为,如果是纯文本博客,可支撑数十万次访问;如果是高清视频站,仅能支撑几千次播放,核心变量:决定流量消耗的三要素流量消耗不是玄学,而是由三个硬指标决定的,算清楚它们,你就能反向推算出3TB流量大概能撑住多少访客,平均页面大小页面大小是流量消耗的基石,一个……

    2026年8月24日
    600
  • 服务器网口一个到底多少钱,服务器网卡接口收费标准是什么

    一个服务器网口本身并不独立计价,它通常是集成在主板上的免费标配;单独购买一块主流千兆网卡约50-200元,万兆光口网卡约300-1500元,而决定你实际支出的往往是配套的带宽、交换机端口和机房服务,很多初次接触服务器租用或IDC托管的朋友,都会把“网口”理解成一个类似USB接口那样可以单独插拔的零件,服务器网口……

    2026年9月12日
    200
  • 服务器CPU使用率多少算正常,如何降低CPU使用率?

    服务器CPU使用率多少正常?先给结论对于大多数在线业务服务器,CPU使用率长期稳定在40%-70%之间属于健康区间,峰值可短暂冲至85%左右,但持续高于90%则必须立即排查, 这个数值没有绝对标准,它取决于你的业务类型、实例规格和架构设计,但掌握判断逻辑比死记数字更重要,先分清场景:不同业务的“正常”天差地别高……

    2026年10月7日
    300
  • 服务器机房一台多少钱?,机房服务器怎么收费

    服务器机房不是按“一台”标价,实际是机柜、机位、U位、带宽、IP和电力组合报价;2026年国内持牌自营机房中,单台1U服务器托管年付常见几千元到一两万元,整柜月租常见几千元到几万元,一线城市、高防、GPU和BGP带宽会明显上浮,服务器机房多少钱一台,先搞清“一台”指什么很多人张口就问服务器机房多少钱一台,这个问……

    相关资讯 2026年10月3日
    100
  • 6核8g服务器一年多少钱,云服务器6核8g哪家好

    6核8G服务器月租价格多数在99元到600元之间,普通BGP机房的独享带宽方案常见于150元至350元,简米科技和酷番云这类持牌自营机房,6核8G配置的月付报价通常集中在199元至299元,价格背后的硬件与网络成本机房线路决定基础价6核8G服务器贵不贵,先看线路,单线机房成本最低,双线次之,BGP多线最贵,BG……

    相关资讯 2026年9月9日
    100
  • 一台服务器电费多少钱,一个月耗多少度电?

    普通1U/2U多在两百到五百元,GPU高配机可到上千甚至数千元,核心取决于功率、电价和PUE,如果你直接问“服务器电费多少钱一台”,我会先反问一句:你说的是普通业务机,还是塞满GPU的训练机?因为服务器不是冰箱,没有统一的“一天几度电”,它的电费由三个变量决定:实际功率、运行时长、电价,托管在IDC机房时,还要……

    2026年9月25日
    100

发表回复

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