加密 tcp 传输解决粘包有没有好的解决方法

2017-07-06 01:25:28 +08:00
 liuminghao233
用 aes cfb 加密

我的想法是这样

包头放一个 unaigned short 表示长度
包尾放一个 char 表示结束


包的长度缺失会导致数据解不完全

收到首包先 decrypt 获取包标记的长度
残包则不 decrypt
所以现在有这些情况
1.首包完整
2.首包长度少了 标记残包
3.首包长度多了 标记 copy 出残包 处理完整的包
标记残包后又接受新包后出现:
4.还是残包
5.长度多了 重复 3
6.刚好 处理掉 等下一首包

问题来了,如果首包收到 1byte 的话,那就连长度都不知道了,处理起来简直爆炸。
各位大神有没有屌一点的解决思路?
3427 次点击
所在节点    问与答
12 条回复
xenme
2017-07-06 01:52:50 +08:00
来多少收多少。

然后根据长度,序号来处理就好了。
yangff
2017-07-06 01:58:28 +08:00
tcp 是流啊……
XiaoxiaoPu
2017-07-06 01:58:38 +08:00
TCP 是流(stream),怎么会粘包(packet)。设计 TCP 上的通信协议一定不要带着包这个概念。你看 HTTP 协议里,都是用特殊的内容(\r\n 或空行等等)来标记一个结构的结束,从来没提过“包”。
senghoo
2017-07-06 07:46:59 +08:00
做缓冲区,收到的全部扔缓冲区,然后根据包头获取指定长度,剩下的留着当作下个包。
sleshep
2017-07-06 09:30:31 +08:00
我读 4 字节,不够再读,大小不久得到了?
yxaaa123
2017-07-06 09:37:21 +08:00
几年前有次面试时候面试题里面看到『如何处理 TCP 的粘包问题?』的问题,那时候对网络完全不懂,后来在网上找这方面的答案,也找到了。其实很多人都把这种情况称为粘包。。。
qq292382270
2017-07-06 09:37:48 +08:00
会分包但是不会乱序. 所以可以一直接收数据,直到在数据里面拿到完整的就好了..
liuminghao233
2017-07-06 09:56:31 +08:00
毕竟要区分数据 每段数据长度不同 于是就把每段数据当成包了
monsterxx03
2017-07-06 09:59:29 +08:00
第一次看到粘包这词我也很费解,tcp 哪来的 packet 概念, 后来才反应过来他们是指应用层协议的包。
colincat
2017-07-06 10:00:05 +08:00
1.什么是 TCP 粘包与拆包

首先 TCP 是一个"流"协议,犹如河中水一样连成一片,没有严格的分界线。当我们在发送数据的时候就会出现多发送与少发送问题,也就是 TCP 粘包与拆包。得不到我们想要的效果。

所谓粘包:当你把 A,B 两个数据从甲发送到乙,本想 A 与 B 单独发送,但是你却把 AB 一起发送了,此时 AB 粘在一起,就是粘包了

所谓拆包: 如果发送数据的时候,你把 A、B 拆成了几份发,就是拆包了。当然数据不是你主动拆的,是 TCP 流自动拆的



2.TCP 粘包与拆包产生原因

1.进行了 MSS 大小的 TCP 分段
2.以太网帧的 plyload 大与 MTU 进行了 IP 分片
3.应用程序 write 写入的字节大小大于套接口发送的缓冲区大小



3.解决方法

1.消息定长,比如把报文消息固定为 500 字节,不够用空格补位

2.在包尾增加回车换行符进行分割,例如 FTP 协议

3.将消息分为消息头和消息体,消息头中包含表示消息总长度的字段


可以使用 varint 不固定包头
ldbC5uTBj11yaeh5
2017-07-06 10:01:54 +08:00
liuminghao233
2017-07-13 14:02:32 +08:00
写了半个月终于把 ss 写出来了ˊ_>ˋ
其实不算很难
sock5-relay-relayserver-sock5 这个模型中考虑的东西稍微有点多

速度还是很给力的本地跑满 100m 没问题 2333
谢谢各位大佬

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/373359

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX