2025/12/20小于 1 分钟
Vuepress Hope
一个强大的Vuepress主题。
Mr.Hope
Mr.Hope是Vuepress Hope主题的作者,点击跳转到Hope的博客。
友情链接
包括一些教程网站、博客网站等。
开个盲盒
点击后随机跳转到本站的一个页面
本文参考JavaGuide:有了 HTTP 协议,为什么还要有 RPC ?
总结
-
问题:TCP 是流式协议,没有消息边界
-
现象:会出现"粘包"(多个消息粘在一起)和"拆包"(一个消息被拆开)
-
解决方案:消息头 + 消息体
- 消息头:固定格式,包含消息体长度等信息
- 消息体:实际要传输的数据
-
工作流程:
-
发送方:计算长度 → 添加头部 → 发送
-
接收方:读取头部 → 解析长度 → 读取对应长度的数据
更细节知识参考:为什么要组装发送的数据
基于上方文章补充:当接收端收到的消息长度小于 Content-Length 时,说明还有些消息没收到。那接收端会一直等,直到拿够了消息或超时。
-
-
优点:
- 明确的消息边界
- 可以传输任意长度的数据
- 支持复杂协议扩展
- 纯裸 TCP 是能收发数据,但它是个无边界的数据流,上层需要定义消息格式用于界定 消息边界。于是就有了各种协议,HTTP 和各类 RPC 协议就是在 TCP 之上定义的应用层协议。这就是为什么几乎所有基于 TCP 的协议(HTTP、WebSocket、Redis 协议等)都需要定义自己的消息格式来界定消息边界的原因。
- TCP 是传输层的协议 ,而基于 TCP 造出来的 HTTP 和各类 RPC 协议,它们都只是定义了不同消息格式的 应用层协议 而已。
2025/12/20大约 4 分钟
UDP的特点
UDP的三个特点:面向无连接、不可靠、基于数据报。
基于数据包
基于数据报是指无论应用层交给 UDP 多长的报文,UDP 都照样发送,即一次发送一个报文。至于如果数据包太长,需要分片,那也是IP层的事情,大不了效率低一些。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。而接收方在接收数据报的时候,也不会像面对 TCP 无穷无尽的二进制流那样不清楚啥时候能结束。正因为基于数据报和基于字节流的差异,TCP 发送端发 10 次字节流数据,而这时候接收端可以分 100 次去取数据,每次取数据的长度可以根据处理能力作调整;但 UDP 发送端发了 10 次数据报,那接收端就要在 10 次收完,且发了多少,就取多少,确保每次都是一个完整的数据报。
2025/12/20小于 1 分钟