Workerman UDP和TCP有什么区别

夜涛吖_3466

夜涛吖_3466

2026-09-04

195人浏览

原创

workerman中udp与tcp的根本区别在于协议语义:udp无连接、不维护连接状态、需显式传地址发包且无重传,tcp面向连接、自动管理生命周期、支持直接send但需处理粘包。

workerman udp和tcp有什么区别

Workerman 中 UDP 和 TCP 的根本区别不在框架层,而在协议语义和底层 socket 行为——你用的是 udp:// 还是 tcp://,决定了整个通信模型。

UDP 服务无法维持长连接状态

UDP 是无连接的,Worker 启动后监听一个端口,但不会为每个客户端维护连接对象。收到数据时,onMessage 回调里的 $connection 实际是一个轻量级的 UdpConnection 实例,它只保存了客户端的 ipport,不带生命周期管理(没有 onConnect/onClose)。这意味着:

  • 你不能在 onMessage 外部缓存 $connection 并期望它长期有效
  • 主动发包必须显式传入目标地址:$connection->send($data, $client_ip, $client_port)
  • 若客户端位于 NAT 后,5 分钟无交互,Linux 内核可能丢弃该五元组会话,导致后续发包失败(使用 stream_socket 时更明显)

TCP 服务天然支持连接生命周期管理

TCP 是面向连接的,Workerman 会为每个新连接创建一个持久的 TcpConnection 对象,并触发 onConnect;断开时触发 onClose。这个连接对象可被安全地存入全局数组或 Channel,用于后续广播或定向推送:

Recraft AI
Recraft AI

Recraft AI是一款AI 3D生成工具,免费无限AI画板,生成高质量矢量艺术画、图标、3D图片和插画。

下载
  • $connection->send() 不需要额外参数,直接复用已建立的 socket 句柄
  • 连接对象自带心跳、超时、缓冲区控制等能力(如 $connection->close()$connection->isClosed()
  • 粘包问题必须处理:TCP 是字节流,onMessage 收到的数据可能是半包、整包或粘连的多包,需靠协议解析(如自定义 decode)切分

UDP 发送必须“记住”客户端地址,TCP 不用

这是最常踩的坑:UDP 服务端首次收到客户端数据后,必须立刻把 $connection->getRemoteIp()$connection->getRemotePort() 记下来,否则下次想回包就找不到目标。而 TCP 的 $connection 本身已绑定远端地址,随时可发。

  • UDP 示例片段:
    $worker->onMessage = function ($connection, $data) {
        $client_ip = $connection->getRemoteIp();
        $client_port = $connection->getRemotePort();
        // 必须显式传入地址才能发回去
        $connection->send("ack", $client_ip, $client_port);
    };
  • TCP 示例片段:
    $worker->onMessage = function ($connection, $data) {
        // 直接 send,无需地址参数
        $connection->send("ack");
    };
  • UDP 若忘记存地址,又没做心跳保活,60 秒后发包大概率静默失败(无错误提示,包直接被内核丢弃)

UDP 没有重传/拥塞控制,TCP 有但需注意阻塞风险

UDP 的“快”是双刃剑:它不保证送达,也不排队、不重试、不控速。适合音视频、SIP、GB28181 这类容忍丢包但忌延迟的场景。TCP 虽可靠,但在 Workerman 中要注意:

  • 单个 TcpConnectionsend() 是异步写入缓冲区,但如果对方接收慢或网络卡顿,缓冲区满后会阻塞整个事件循环(尤其在未启用 buffer_size 限流时)
  • UDP 的 send() 几乎总是立即返回(除非系统发送缓冲区爆满),但不等于对方收到了
  • UDP 无法感知丢包,调试时得靠抓包(tcpdump -i any udp port 5060)或应用层 ACK 机制

真正容易被忽略的是:UDP 的“无状态”不是便利,而是责任转移——你得自己实现地址记忆、心跳保活、应用层确认、乱序容忍。TCP 把这些扛在协议栈里,但换来了粘包、缓冲区管理和连接可靠性开销。选哪个,取决于你的业务能不能接受“发了但不知道到了没”,以及愿不愿意为“到了但可能乱序/重复”写解析逻辑。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

workerman

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
tcp和udp的区别
tcp和udp的区别

TCP和UDP的区别,在连接性、可靠性、速度和效率、数据报大小以及适用场景等方面。本专题为大家提供tcp和udp的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.25

423

5

udp是什么协议
udp是什么协议

UDP是OSI参考模型中一种无连接的传输层协议。本专题为大家带来udp是什么协议的相关文章,免费提供给大家。

2023.08.08

2251

5

tcp和udp有什么区别
tcp和udp有什么区别

tcp和udp的区别有:1、udp是无连接的,tcp是面向连接的;2、udp是不可靠传输,tcp是可靠传输;3、udp是面向报文传输,tcp是面向字节流传输。想了解更多tcp相关的内容,可阅读本专题下面的相关文章。

2024.11.14

2589

8

Workerman安装配置教程
Workerman安装配置教程

Workerman安装配置教程专题提供Workerman安装配置、WebSocket开发、TCP通信、异步编程、高并发服务搭建与PHP实时通信开发教程。

2026.05.20

146

15

Workerman实时通信与长连接开发教程
Workerman实时通信与长连接开发教程

WWorkerman实时通信与长连接开发教程聚合实时通信、聊天室、长连接、消息推送、AI流式输出等Workerman高并发开发内容。

2026.05.20

162

12

Workerman异步通信与TCP服务器开发
Workerman异步通信与TCP服务器开发

Workerman异步通信与TCP服务器开发专题整理Workerman异步通信、TCP服务、HTTP服务、WebSocket开发与高并发PHP服务器教程。

2026.05.20

127

13

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

2026.09.21

0

20

NumPy随机数文件读写与dtype数据类型
NumPy随机数文件读写与dtype数据类型

本专题整理 NumPy 随机数、文件读写与 dtype 数据类型相关教程,覆盖 Generator/random、随机数种子、正态分布采样、npy/npz/CSV/TXT 保存读取、loadtxt/savetxt、memmap、大文件处理、astype 类型转换、结构化 dtype、整数溢出和精度丢失等场景。

2026.09.21

0

24

NumPy矩阵运算与线性代数计算
NumPy矩阵运算与线性代数计算

本专题整理 NumPy 矩阵运算与线性代数计算相关教程,覆盖矩阵乘法、dot 与 @ 运算符、逆矩阵、行列式、特征值与特征向量、SVD、线性方程组、欧氏距离、矩阵分解和大规模矩阵性能优化等内容,帮助读者掌握 np.linalg 与矩阵计算实战。

2026.09.21

0

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习