【Linux】传输层协议UDP

一、传输层核心功能

传输层的核心作用是确保数据能够从发送端的应用程序,准确传输到接收端的对应应用程序,核心解决 "数据交付到主机后,如何匹配到具体进程" 的问题。

二、端口号(Port)

2.1 端口号的定义与作用

  • 端口号是 16 位整数(取值范围 0-65535),用于标识主机上进行网络通信的不同应用程序,实现 "IP 定位主机 + 端口号定位进程" 的二级定位。
  • 通信唯一标识:在 TCP/IP 协议中,通过 "源 IP、源端口号、目的 IP、目的端口号、协议号"五元组 唯一标识一次网络通信,可通过netstat -n命令查看当前系统的通信连接。

2.2 端口号范围划分

端口号范围 类型 特点与用途
0-1023 知名端口号 由 IANA(互联网数字分配机构)统一分配,对应固定应用层协议,供服务器端程序使用。
1024-65535 动态分配端口号 由操作系统在客户端程序发起连接时随机分配,使用后释放,避免占用知名端口。

2.3 常见知名端口号

应用层协议 / 服务 对应的知名端口号 用途
SSH(安全外壳协议) 22 远程登录服务器,实现安全的命令行操作
FTP(文件传输协议) 21 用于文件的上传与下载
Telnet(远程终端协议) 23 早期远程登录协议(安全性较低,现已较少使用)
HTTP(超文本传输协议) 80 普通网页访问(未加密)
HTTPS(安全超文本传输协议) 443 加密的网页访问(如电商、支付场景)

2.4 端口号相关查询与注意事项

  • 查看所有知名端口号映射:执行cat /etc/services命令,可查看系统中预定义的端口号与服务对应关系。
  • 自定义程序端口号:需避开 0-1023 的知名端口号,避免端口冲突导致程序启动失败。

2.5 端口号与进程的绑定问题

  1. 一个进程是否可以 bind 多个端口号? 可以。一个进程可通过多次bind系统调用,绑定多个不同的端口号(如一个服务器进程同时监听 80 和 443 端口,分别处理 HTTP 和 HTTPS 请求)。
  2. 一个端口号是否可以被多个进程 bind? 不可以。端口号具有唯一性,一个端口号只能被一个进程绑定;若已绑定的端口号被其他进程再次尝试绑定,会返回 "端口已占用" 错误(如Address already in use)。

三、UDP 协议(用户数据报协议)

3.1 UDP 协议首部格式

UDP 首部共 8 字节,包含 4 个字段,结构简单:

  • 16 位源端口号:标识数据发送端的应用程序端口。
  • 16 位目的端口号:标识数据接收端的应用程序端口。
  • 16 位 UDP 长度:表示整个 UDP 数据报(首部 + 数据)的字节数,最大值为 65535(即 64K)。
  • 16 位校验和:用于校验 UDP 数据报的完整性(若校验出错,数据报会被直接丢弃,不返回错误信息)。

3.2 UDP 的核心特点

(1)无连接
  • 通信前无需建立连接,只需知道对方的 IP 和端口号,即可直接发送数据(类似 "寄信",无需提前确认对方是否在线)。
  • 优势:减少连接建立 / 释放的开销,通信效率高;劣势:无法保证对方是否能接收数据。
(2)不可靠
  • 无确认机制:发送端发送数据后,不要求接收端返回确认信息,无法确认数据是否送达。
  • 无重传机制:若数据因网络故障丢失(如网络拥堵、链路中断),UDP 协议层不会重传,也不会向应用层返回错误信息。
  • 无顺序保证:若多个 UDP 数据报因网络延迟差异到达接收端,可能出现 "后发先至" 的情况,UDP 不处理顺序问题。
(3)面向数据报
  • 应用层交给 UDP 的数据会被当作一个 "完整的数据报",UDP 原样发送,不拆分、不合并
  • 收发数据规则:发送端调用 1 次sendto发送 N 字节数据,接收端必须调用 1 次recvfrom接收全部 N 字节数据,不能分多次接收(如发送 100 字节,接收端不能循环 10 次每次接收 10 字节)。

3.3 UDP 的缓冲区特性

缓冲区类型 特点
发送缓冲区 无真正意义上的发送缓冲区:调用sendto后,数据直接交给内核,由内核传递给网络层,不暂存数据。
接收缓冲区 有接收缓冲区:用于暂存从网络层接收的 UDP 数据报,但不保证数据顺序(与发送顺序可能不一致);若缓冲区满,后续到达的 UDP 数据报会被直接丢弃。

3.4 UDP 的全双工特性

UDP 的 Socket(套接字)支持全双工通信,即同一个 Socket 既可以读取数据(接收),也可以写入数据(发送),无需额外创建新的 Socket。

3.5 UDP 使用注意事项

  • 数据长度限制:UDP 数据报最大长度为 64K(含首部),若应用层需传输超过 64K 的数据,需在应用层手动 "分包"(拆分数据为多个 64K 以内的片段),并在接收端手动 "拼装"(按顺序合并片段)。

3.6 基于 UDP 的应用层协议

协议名称 用途
NFS(网络文件系统) 实现不同主机间的文件共享(如 Linux 服务器间的文件访问)
TFTP(简单文件传输协议) 轻量级文件传输协议,适用于小型设备(如嵌入式设备)的文件传输
DHCP(动态主机配置协议) 为局域网内的设备自动分配 IP 地址、子网掩码、网关等网络配置
BOOTP(启动协议) 用于无盘设备(如无硬盘的服务器)从网络启动,获取启动镜像
DNS(域名解析协议) 将域名(如www.baidu.com)解析为对应的 IP 地址,便于用户访问
自定义应用层协议 开发 UDP 程序时,可根据需求自定义数据格式与交互规则(如即时通信、游戏数据传输)
相关推荐
Evan芙2 小时前
Bash 变量命名规则与类型使用
linux·运维·开发语言·chrome·bash
濊繵2 小时前
Linux网络--Socket 编程 TCP
linux·网络·tcp/ip
menge23333 小时前
Linux网站搭建
linux·运维·网络
Bruce_Liuxiaowei3 小时前
Kali Linux 加入 Windows 域实战指南:解决域发现与加入失败问题
linux·运维·windows
LumenL1u3 小时前
CentOS 7/8/9 上安装 MySQL 8.0+ 完整指南
linux·mysql
梁正雄3 小时前
linux服务-nginx原理与安装-1
linux·运维·nginx
伊卡洛斯az4 小时前
Linux veth
linux·服务器
brucelee1864 小时前
在 Linux Ubuntu 24.04 安装 IntelliJ IDEA
linux·ubuntu·intellij-idea
阿伟实验室4 小时前
debian10部署简易web服务器
运维·服务器·前端