tcp_stick/

directory
v0.0.0-...-f86eec2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 5, 2023 License: MIT

README

粘包情况

  1. https://www.topgoer.com/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/socket%E7%BC%96%E7%A8%8B/TCP%E9%BB%8F%E5%8C%85.html

为什么会出现粘包

主要原因就是tcp数据传递模式是流模式,在保持长连接的时候可以进行多次的收和发。

“粘包”可发生在发送端也可发生在接收端:

  • Nagle算法造成的发送端的粘包:
    • Nagle算法是一种改善网络传输效率的算法。
    • 简单来说就是当我们提交一段数据给TCP发送时,TCP并不立刻发送此段数据,而是等待一小段时间看看在等待期间是否还有要发送的数据,若有则会一次把这两段数据发送出去。
  • 接收端接收不及时造成的接收端粘包
    • TCP会把接收到的数据存在自己的缓冲区中,然后通知应用层取数据。
    • 当应用层由于某些原因不能及时的把TCP的数据取出来,就会造成TCP缓冲区中存放了几段数据。

如何解决

出现”粘包”的关键在于接收方不确定将要传输的数据包的大小,因此我们可以对数据包进行封包和拆包的操作

封包
  1. 封包就是给一段数据加上包头,这样一来数据包就分为包头和包体两部分内容了。 2. 过滤非法包时,封包会加入”包尾”内容
  2. 包头部分的长度是固定的,并且它存储了包体的长度,根据包头长度固定以及包头中含有包体长度的变量就能正确的拆分出一个完整的数据包。

如何实战解决

TODO

扩展

1.encoding/binary

参考:

此包实现了对数据与byte之间的转换,以及varint的编解码。复杂一些的解释:https://zhuanlan.zhihu.com/p/35326716

字节端序

https://blog.csdn.net/puss0/article/details/114196882

  • 大端序是数据的低字节放在高地址,高字节放在低地址
  • 小端序是数据的低字节放在低地址,高字节放在高地址。

其实代表了一种数据处理的顺序,在数据传输和存储中,我们先处理高字节,那就是大端序,先处理低字节,就是小端序。

varint

https://blog.csdn.net/qq_43684922/article/details/126680289

简单来说varint(自己理解为:变长int)是一种数据压缩算法,其核心思想是利用bit位来实现数据的压缩。使用一个或多个字节序列化整数的方法。较小的数字占用较少的字节数。

Directories

Path Synopsis
bad_case
correct_example

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL