【Linux】网络--传输层--UDP协议

个人主页~


UDP协议是一种传输层协议,User Datagram Protocol,中文名为用户数据报协议,它比起TCP比较简单,所以我们先学习,TCP可以说是在它的基础上再优化的

UDP协议

一、端口号

端口号是计算机网络通信中用于标识不同进程或服务的数字编号

  • 基础定义

    • 类比理解

      可将端口号类比为"网络门牌号",IP地址确定计算机位置,端口号则确定具体服务(如网站、邮件、视频通话等)

    • 编号范围

      0-65535(2^16),分为三大类:

      • 公认端口(0-1023):系统保留,如HTTP(80)、HTTPS(443)、FTP(21)
      • 注册端口(1024-49151):供用户程序注册使用
      • 动态/私有端口(49152-65535):临时分配给客户端进程
  • 核心作用

    • 服务区分:同一IP地址可通过不同端口运行多个服务(如同时提供Web和FTP服务)
    • 通信端点 :完整网络地址由"IP+端口"构成(如192.168.1.1:80
    • 协议无关性:TCP和UDP协议各自独立管理端口(如DNS同时使用TCP和UDP的53端口)
  • 常见端口示例

端口号 协议 服务用途
22 TCP SSH远程登录
25 TCP SMTP邮件发送
53 TCP/UDP DNS域名解析
80 TCP HTTP网页服务
443 TCP HTTPS加密网页服务
3389 TCP Windows远程桌面
  • 配置与管理

    • 端口冲突:同一端口不能同时被多个程序占用
    • 防火墙规则:通过开放/关闭端口控制网络访问(如开放80端口允许Web访问)
    • 端口转发:用于NAT环境下将外部端口映射到内部服务(常见于路由器设置)
  • 技术要点

    • 无状态性:UDP端口不维护连接状态
    • 端口扫描:网络安全检测的重要手段(如使用nmap工具)
    • 临时端口:客户端通常使用动态端口与服务器通信

二、UDP协议格式

UDP发送数据由报头和有效载荷组成,报头的大小一共有64位8字节,分别为源端口号、目的端口号、UDP长度、以及UDP检验和

下图是报文结构图

下面就是这个报头的结构体

c 复制代码
struct udp_header 
{
    uint16_t src_port; //源端口号
    uint16_t dst_port; //目的端口号
    uint16_t length;   //UDP长度
    uint16_t checksum; //UDP检验和
};
  • 源端口号:表示发送方应用程序或进程的端口号
  • 目的端口号:表示接收方目标服务或进程的端口号
  • UDP长度:表示整个 UDP 数据包的总长度,包括报头和数据部分,所以整个UDP报文最大也就是64KB,如果有比较大的文件就需要多次传输
  • UDP检验和:用于检测数据在传输过程中是否损坏或被篡改

三、组织UDP报文

Linux 内核网络子系统中用sk_buff管理网络数据包的核心数据结构,它贯穿于整个网络协议栈(从物理层到应用层),负责数据包的接收、处理、传输和内存管理

下面是sk_buff的核心结构体

c 复制代码
struct sk_buff {
    struct sk_buff *next;          // 链表指针
    struct sk_buff *prev;          // 链表指针
    struct sock *sk;               // 关联的 socket
    struct net_device *dev;        // 网络设备
    unsigned char *head;           // 内存块起始地址
    unsigned char *data;           // 有效数据起始地址
    unsigned char *tail;           // 有效数据结束地址
    unsigned char *end;            // 内存块结束地址
    unsigned int len;              // 有效数据长度
    unsigned int data_len;         // 分段数据长度(如分片)
    __u16 protocol;                // 协议类型(如 ETH_P_IP)
    // 其他字段(如时间戳、校验和、错误码等)
};

UDP报文通过sk_buff组织起来,是一个双向链表结构,其中还包括对报文各部分的指针

四、UDP特点

1、传输过程

  • 无连接:只要知道对端的IP和端口号就直接进行传输,不需要建立连接
  • 不可靠:没有确认机制,没有重传机制,如果因为网络故障该段无法发送给对方,UDP协议层也不会给应用层返回任何错误信息
  • 面向数据报:不能够灵活的控制读写数据的次数和数量

应用层交给UDP多长的报文,UDP就发送多长的报文,不会进行拆分和合并

2、缓冲区

UDP是没有实际意义上的发送缓冲区 的,调用sendto函数可以直接将数据交给内核,由内核将数据传给网络层协议进行后续的传输动作

UDP是有接收缓冲区的,但是这个缓冲区不能保证收到的UDP报文的顺序和发送的UDP报文的顺序一致,如果缓冲区满了,再想要到达的UDP数据就会被丢弃


今日分享就到这里了~

相关推荐
openHiTLS密码开源社区1 小时前
【密码学实战】openHiTLS passwd命令行:专业密码哈希生成工具
linux·密码学·哈希算法·ldap·密码策略·随机盐值
007php0071 小时前
某大厂跳动面试:计算机网络相关问题解析与总结
java·开发语言·学习·计算机网络·mysql·面试·职场和发展
筵陌1 小时前
深入理解 Reactor 反应堆模式:高性能网络编程的核心
服务器
知识分享小能手1 小时前
微信小程序入门学习教程,从入门到精通,微信小程序核心 API 详解与案例(13)
前端·javascript·学习·react.js·微信小程序·小程序·vue
WTCLLB2 小时前
netgear r6220 路由器,刷openwrt后,系统备份还原
linux·网络·智能路由器·openwrt
递归不收敛2 小时前
吴恩达机器学习课程(PyTorch 适配)学习笔记:3.3 推荐系统全面解析
pytorch·学习·机器学习
迎風吹頭髮2 小时前
UNIX下C语言编程与实践38-UNIX 信号操作:signal 函数与信号捕获函数的编写
linux·c语言·unix
做运维的阿瑞3 小时前
Linux系统性能监控与故障定位实战:CPU/内存/I/O/网络
linux·运维·网络
CiLerLinux3 小时前
第五十二章 ESP32S3 UDP 实验
网络·单片机·嵌入式硬件·网络协议·udp
驱动探索者3 小时前
车库到双子星:惠普的百年科技传奇
linux