UDP协议与网络通信知识点

1. UDP协议特点

UDP(用户数据报协议)的传输过程类似于寄信,具有以下四大核心特征:

  • 无连接: 只要知道对端的IP和端口号即可直接发送数据,无需事先建立连接。

  • 不可靠传输: 没有确认(ACK)和重传机制。如果数据因网络故障丢失,UDP协议层不会向应用层返回任何错误信息。

  • 面向数据报: 应用层交给UDP多长的报文,UDP就原样发送,不拆分、不合并

    • 示例: 发送端调用一次 sendto 发送100字节,接收端必须调用一次 recvfrom 接收100字节,不能分10次每次接收10字节。
  • 全双工通信: UDP的 socket 支持同时进行读操作(read/recv)和写操作(write/send),即支持双向数据同时传输。


2. UDP的缓冲区机制

UDP的读写缓冲机制与TCP有显著区别:

  • 发送缓冲区:无。 UDP没有真正意义上的发送缓冲区。调用 sendto 后,数据会直接交付给内核,由内核传递给网络层(IP层)进行封装和发送。

  • 接收缓冲区:有。

    • 乱序: 接收缓冲区不能保证收到报文的顺序与发送端一致。

    • 丢包: 如果接收缓冲区满了,后续到达的UDP数据报会被直接丢弃。


3. UDP报文格式与大小限制

![[Pasted image 20260513192621.png]]

UDP的报头非常精简,固定为 8个字节

字段 长度 说明
源端口号 16位 发送方应用程序的端口
目的端口号 16位 接收方应用程序的端口
UDP长度 16位 表示整个数据报(UDP首部 + UDP数据)的最大长度
UDP校验和 16位 用于校验数据完整性,如果校验和出错,报文会直接丢弃

⚠️ 关键限制(64K问题):

因为"UDP长度"字段占16位,这意味着一个UDP数据报的最大长度是 64KB (包含UDP首部)。在现代互联网中64KB很小,如果需要传输超过64KB的数据,必须在应用层手动分包发送,并在接收端手动拼装。


4. 通信模型与端口号 (Port)

传输层的主要职责是确保数据能从发送端传输到接收端,而端口号用于标识主机上不同的应用程序。

4.1 网络通信五元组

在TCP/IP协议中,通过以下五个元素来唯一标识一次网络通信(可通过 netstat -n 查看):

源IP + 源端口号 + 目的IP + 目的端口号 + 协议号

4.2 端口号范围划分

  • 0 - 1023(知名端口号 / Well-Know Port): 固定分配给广为使用的应用层协议。开发者自己写程序时应避开这些端口。(可通过 cat /etc/services 命令查看系统端口分配)

  • 1024 - 65535: 操作系统动态分配的端口号,通常用于客户端程序。

4.3 常见知名端口号

  • FTP: 21

  • SSH: 22

  • Telnet: 23

  • HTTP: 80

  • HTTPS: 443

两个经典问题

  1. 一个进程是否可以bind多个端口号? 可以。一个进程可以创建多个 socket,分别绑定不同的端口。

  2. 一个端口号是否可以被多个进程bind? 通常不可以(会提示端口被占用),但在某些特殊机制下(如父子进程继承或设置了特定的端口复用选项 SO_REUSEPORT),存在特殊情况。


5. 底层通信模型数据流向

在局域网内两台主机(A与B)通信时,数据流动呈现严格的自上而下的层级封装:

  1. 应用层: 生成业务数据(如消息文本、时间戳、昵称)。

  2. 系统调用接口: 通过 write/send 等系统调用向内核传递数据。

  3. OS 内核层: 负责管理协议栈(TCP/UDP)、缓冲区处理及向下层传递。

  4. 底层网络(网络层/链路层): 加上IP首部、MAC帧头,最终转化为物理信号通过局域网发送至对端。


6. 常见的基于UDP的应用层协议

虽然UDP不可靠,但其极低的延迟使其成为许多经典应用层协议的基石:

  • DNS: 域名解析协议(最常见)

  • DHCP: 动态主机配置协议(用于自动获取IP)

  • NFS: 网络文件系统

  • TFTP: 简单文件传输协议

  • BOOTP: 启动协议(用于无盘设备启动)

  • 自定义协议: 开发者自己基于UDP封装的各类应用层协议(如游戏帧同步、视频流传输等)。

相关推荐
神仙别闹2 小时前
基于QT(C++)实现学生成绩管理系统
数据库·c++·qt
怀旧,2 小时前
【Linux网络编程】8. 网络层协议 IP
linux·网络·tcp/ip
C+++Python3 小时前
C 语言 动态内存分配:malloc /calloc/realloc /free
c语言·开发语言
cen__y3 小时前
Linux11(网络编程)
linux·运维·服务器·c语言·网络·网络协议·tcp/ip
小新同学^O^3 小时前
简单学习 --> WebSocket
java·websocket·网络协议·学习
CableTech_SQH3 小时前
商业地产和高端酒店该怎么选综合布线解决方案?
运维·服务器·网络
万点科技1233 小时前
定制软件开发公司实施方
网络
君义_noip3 小时前
CSP-S 2025 入门级 第一轮(初赛) 完善程序(1)
c++·算法·信息学奥赛·初赛·csp 第一轮
怀旧,4 小时前
【Linux网络编程】9. 数据链路层
linux·服务器·网络