Skip to content

Latest commit

 

History

History
27 lines (16 loc) · 1.75 KB

TCP 粘包、拆包及解决办法.md

File metadata and controls

27 lines (16 loc) · 1.75 KB

TCP 粘包、拆包及解决办法

一、什么是 TCP 粘包、拆包

​ 我们使用 TCP 协议在传输数据的时候,如果数据块比较大,就会考虑将其切分。把一个大的数据包进行切割成一个个小的数据包发送。这时候就会遇到拆包和粘包的问题。

​ 比如说在这里客户端发送了两个数据包 D1 和 D2 到服务端,在传输的时候就可能会遇到下列问题:

img

  • 情况1(正常):D1 和 D2 正常发送,每次发送一个整包。
  • 情况2(拆包):D1 数据包比较大,D2 比较小。第一次发送 D1 的一部分,第二次发送 D1 剩下的和 D2 整包。
  • 情况2(粘包):D1 和 D2 数据包都比较小,一次发送两个整包。
  • 情况4(拆包):D1 数据包比较小,D2 比较大。第一次发送 D1 整包和 D2 一部分,第二次发送 D2 剩下的。这叫拆包。
  • 情况5(拆包):D1 和 D2 数据包都比较大,这时候分开发。

产生拆包、粘包的原因

​ TCP 在接受数据的时候,有一个滑动窗口来控制接受数据的大小,这个滑动窗口你就可以理解为一个缓冲区的大小。缓冲区满了就会把数据发送。数据包的大小是不固定的,有时候比缓冲区大,有时候小。这时候就会出现上面的现象。

二、粘包问题解决

​ 解决的思路很简单,也就是每次发送一个数据包的时候,添加一个标识符,读的时候一直读到这个标识符才表示一个完整的数据包。也就是换行符“\n”。

三、netty 的解决方案

// TODO