Redis 默认未使用 tls 协议,是否意味着传输数据可能会出错?

2022-04-30 10:33:48 +08:00
 Richard14

询问

  1. Redis6.0 新特性是加入 tls 支持,是否同义词是之前版本不支持 tls
  2. 如果 1 成立的话,Redis 基于 tcp 构建通信协议,tcp 的和校验本身有一定纠错能力,但小概率偶发多点同错时 tcp 只能保证流本身可靠,无法保证传输数据一定可靠。
  3. 这是否意味着我们基于 redis 构建内网服务时,比如多节点靠 redis 集群同步状态,存在状态传着传着就错了的可能性?
  4. 例子方面,之前似乎从未见过 Redis 传输错误的类似新闻,我在本地和内网环境使用也从未遇到过错误。
3784 次点击
所在节点    问与答
35 条回复
wy315700
2022-04-30 10:38:24 +08:00
tcp 的校验和重发机制保证了数据不会出错。

tls 协议是传输层安全协议,是保证数据不被窃听
Richard14
2022-04-30 10:46:45 +08:00
@wy315700



tcp 的 checksum 只有 16 位位计算校验,同发错误发生时如何保证不会出错?回答看得我一愣
3dwelcome
2022-04-30 11:03:20 +08:00
历史都是重复了,去年的回复:

Reply 103dwelcome 2021-04-01 20:56:43 PM
这问题有意思,我去 google 查了一下( http://noahdavids.org/self_published/CRC_and_checksum.html)
文章里确切的说,用百度云下载数据,每下载 15T 数据后,会有一个随机的错误包被混入其中( ps: 原文里是 10 亿数据包,一个包 1526 字节,相乘一下就是 15T 字节)

老外还说,15T 数据有一个 bit 出错,对大部分应用都是无感知的。也许互联网天然有容错机制。
wy315700
2022-04-30 11:13:55 +08:00
@Richard14 每个装入 IP 数据报文的 TCP 数据都有一个 16 位校验码,如果有多个错误然后校验码还没变的话,,建议写一篇论文去发表如何构造这种错误。
eason1874
2022-04-30 11:18:59 +08:00
Redis 数据校验是应用层自己的事,不关 TCP 传输层的事

多端同步保证数据一致性,这活不是 TCP 干的,也不是 TLS 干的。加 TLS 只是防监听和篡改,适应复杂的内网环境。可以确保内网绝对安全时,加不加都无所谓
Richard14
2022-04-30 11:44:41 +08:00
@wy315700 会发生就完事了,还扯什么构造不构造,我不是为了应对攻击,我是要防止程序遇到不可预料的数据
adadada
2022-04-30 11:58:38 +08:00
如果对数据完整性又严格要求,建议还是在业务逻辑中也加上额外的检查。隔壁组遇到过网卡的 tcp offload 实现有 bug ,csum 过的报文会以极小概率随机出现几个 bit 的错误
zhzy0077
2022-04-30 12:02:06 +08:00
程序的健壮性永远是个概率学的问题 不然世上就不会有人用 UUID 了

首先 TCP 的 checksum 无法保证数据不会错 事实上所有的 hash 算法都没法保证数据不被修改 但是在物理层传输的时候 一般的错误就是一两个位 bit 的翻转 这种情况下 checksum 的效果是很好的
其次你提到的 tls 同样没法保证数据不会错误

最后如果一个东西全世界用了几十年了 你担心满足不了你的需求 建议你同样考虑下太阳黑子对你内存数据的修改
shuax
2022-04-30 12:05:37 +08:00
tls 和这个有关系?
hxndg
2022-04-30 12:09:10 +08:00
hxndg
2022-04-30 12:11:23 +08:00
@Richard14 不好意思,刚才按错了。。。
即使用了 tls 也可能数据传输出错,即使是小概率。所以如果你问会不会发生,那确实会,不过你应用层上 hash 也会遇到碰撞,所以你要怎么防备呢?
没明白
ysc3839
2022-04-30 12:28:54 +08:00
@wy315700 TCP 不能保证数据完整性,只能保证流的连续性。早年间 http 下载东西容易损坏,rar 的恢复记录很流行就是这个原因。
@zhzy0077 TLS 至少能在数据完整性不通过时报告错误吧。
IvanLi127
2022-04-30 12:35:14 +08:00
你要说可能性有没有,那肯定是有。。op 的意思是 tls 能保证数据不会传错?
momocraft
2022-04-30 12:36:51 +08:00
1bit/15T 的漏过率在大量传输的情况下不算低了。

在 TCP checksum 基础上,消息内部再加个基于内容的 checksum 应该可以再减小概率。
yianing
2022-04-30 12:59:51 +08:00
tls 只是数据加密,和出错也没关系啊?
yolee599
2022-04-30 13:18:39 +08:00
tcp 会检验数据啊,发现出错会丢弃数据包,让对方重新传输
yyfearth
2022-04-30 13:23:00 +08:00
人家加上 TLS 主要为了加密 防止中间人窃听和资料泄漏
保证资料的正确性有 TCP 层和应用层校验足够了
kingjpa
2022-04-30 13:25:34 +08:00
我的理解是 redis 和其他应用一样 有自己的打包和解包协议, 不可能是裸 tcp ,
数据传输错误,redis 自己就会重发。

就连我们自己做 tcp 通行不也会 加包头和包尾 来确认是否完整的包啊。
smdbh
2022-04-30 13:53:41 +08:00
担心不可靠,就不要用呗
LeeReamond
2022-04-30 14:05:58 +08:00
@yyfearth 应用层校验可还行,所以应用层重新发明 tls ?

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

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

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

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

© 2021 V2EX