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封装的各类应用层协议(如游戏帧同步、视频流传输等)。

相关推荐
无相求码3 分钟前
罪魁祸首:for 括号后面那个"隐形分号"
c语言
hy.z_7774 分钟前
【C语言】11. 深入理解指针1
c语言·开发语言
charlie11451419110 分钟前
现代C++工程实践——WeakPtr 第二关:核心骨架与控制块
开发语言·c++
2401_8697695936 分钟前
内容9 string 1
c++
岑梓铭2 小时前
《考研408数据结构》第六章(6.3 图的遍历)复习笔记
数据结构·笔记·考研··拓扑排序·408
XH华2 小时前
C++语言第二章类和对象(下)
开发语言·c++
he_wen_jian2 小时前
【无标题】
笔记
从零开始的代码生活_2 小时前
C++ stack、queue 与 priority_queue:容器适配器原理与实战
开发语言·c++·后端·学习·算法
灵性(๑>ڡ<)☆3 小时前
Java学习笔记--面向对象高级(多态)
笔记·学习
小樱花的樱花3 小时前
Linux 多线程编程:互斥锁(Mutex)详解
linux·c语言·开发语言