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

主机 A 给主机 B 发送一个 “你好,逍遥”,此时主机 A 调用系统的 send 方法将 “你好,逍遥” 发送到主机 A 的发送缓冲区,等到这个数据通过网络传输到主机 B 的接受缓冲区的时候,主机 B 调用系统的 receive 方法从接受缓冲区读取 “你好,逍遥”,这个数据,每次读取一个字节或者一次全部读取,这样主机 B 就能接收到这个数据了。
这样读取数据的方式就像读取一个 “流” 一样,因此 TCP 是面向字节流的协议。
粘包问题
如果主机 A 一次性给接收方发送多组数据,比如发送了
数据1 (123)
数据2 (123123)
数据3 (123123123)
这组数据,此时主机 B 的接受缓冲区就是 123123123123123123 这样的数据,主机 B 难以区分数据的界限。这就是 粘包问题!
粘包问题 是 面向字节流 常见的问题,而 面向数据报 不存在 粘包问题。
而 粘包问题 是 应用层 发送数据造成的,因此解决问题就要从 应用层 下手!即设计 应用层 协议的时候,能够显示区分出来数据包的边界。
解决方案
- 在应用层里显示指定包的长度。
- 显示的指定包和包之间的分隔符,也就是每个包的结束标记。
HTTP 协议内置了解决 粘包问题。
- GET 请求

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

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