• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
xiaoyaovo
博客园    首页    新随笔    联系   管理    订阅  订阅
TCP 中面向字节流与粘包问题

什么是面向字节流?

两台主机完成建立连接,也就是三次握手后,各自会在内核维护一对缓冲区,即 接收缓冲区 和 发送缓冲区

在这里插入图片描述

主机 A 给主机 B 发送一个 “你好,逍遥”,此时主机 A 调用系统的 send 方法将 “你好,逍遥” 发送到主机 A 的发送缓冲区,等到这个数据通过网络传输到主机 B 的接受缓冲区的时候,主机 B 调用系统的 receive 方法从接受缓冲区读取 “你好,逍遥”,这个数据,每次读取一个字节或者一次全部读取,这样主机 B 就能接收到这个数据了。
这样读取数据的方式就像读取一个 “流” 一样,因此 TCP 是面向字节流的协议。

粘包问题

如果主机 A 一次性给接收方发送多组数据,比如发送了
数据1 (123)
数据2 (123123)
数据3 (123123123)
这组数据,此时主机 B 的接受缓冲区就是 123123123123123123 这样的数据,主机 B 难以区分数据的界限。这就是 粘包问题!

粘包问题 是 面向字节流 常见的问题,而 面向数据报 不存在 粘包问题。

而 粘包问题 是 应用层 发送数据造成的,因此解决问题就要从 应用层 下手!即设计 应用层 协议的时候,能够显示区分出来数据包的边界。

解决方案

  1. 在应用层里显示指定包的长度。
  2. 显示的指定包和包之间的分隔符,也就是每个包的结束标记。

HTTP 协议内置了解决 粘包问题。

  1. GET 请求
    在这里插入图片描述

这个空行就是结束的标志,就可以区分出每个包的界限了。

  1. POST 请求
    在这里插入图片描述

Content-Length:1765 就表示真正数据包的长度是 1765,这里就指定了包的长度。可以区分出包与包之间的界限!

posted on 2021-08-01 19:07  豆本豆红枣豆奶  阅读(30)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3