UDP 收发流程
一个 UDP socket 对应:
- 一个接收缓冲区
- 一个发送缓冲区
收消息
- 客户端发数据 → 网络传输
- 服务端内核收到
- 内核把数据包放进 接收缓冲区
- 应用程序调用
recvfrom从里面读出来
发消息
- 应用程序调用
sendto把数据交给内核 - 数据先进入 发送缓冲区
- 内核接管,从缓冲区取出,打包发往网络
- 收:内核 → 接收缓冲区 → 应用
- 发:应用 → 发送缓冲区 → 内核
不管多少个客户端,共用这一对缓冲区,内核负责排队,你只管读写。
多个客户端"同时发" 会不会冲突?
不会!!!
- 操作系统内核会维护接收缓冲区
- 客户端 1 发 → 进缓冲区
- 客户端 2 发 → 也进缓冲区
- 客户端 3 发 → 还进缓冲区
说明:结合前面所说,所有客户端发的消息都在同一个缓冲区里放着。
服务端 recvfrom() 是一个一个取的。
可以理解成:
多个客户端同时寄信,邮局不会把信搞混,服务端一封一封收。
关键:UDP 是 "无连接" 的
服务端不需要区分 "哪个客户端",
它只关心:
- 这是谁发的(IP: 端口)
- 发了什么内容
所以:1 个服务端 socket = 可以处理无限个客户端
这就是 UDP 高性能、适合游戏、视频、实时消息的原因。