最近自底向上学习网络模型,看到 TCP 层经常有人提到"粘包",我笑了

2020-02-29 15:52:34 +08:00
 asilin

那些探讨所谓 TCP 层“粘包”问题的同学们,你们为什么不问问他的兄弟第一层的“物理层”,是如何在物理介质里面处理载波信号的“粘包”的?

对于网络基础同学比较扎实的同学,就应该知道所谓的 TCP“粘包”是不存在的,数据要在 TCP 层流式传播,首先就应该做好“表示层”的边界定位工作,而且数据本身就应该是结构化的。

大部分探讨“粘包”问题的案例,都是直接 nc 一个 TCP 端口,开始灌入 ASCII 码文本,但数据的传输并不是这么用的,就算在 C 语言里面,复杂数据也得用结构体来存储吧,就算是 HTTP,也使用了“\r\n”来进行分隔,你就直接往里面灌,能不出现问题嘛。

11497 次点击
所在节点    程序员
84 条回复
ahmcsxcc
2020-02-29 16:20:45 +08:00
那粘包是如何出现的呢?
dndx
2020-02-29 16:21:57 +08:00
粘包本身就是伪命题,讨论这个毫无意义。
mightofcode
2020-02-29 16:22:41 +08:00
人群中,你笑了
。。。


好吧,粘包确实是一个搞笑的概念,tcp 交付的是流式数据,就没包的概念,所以应该是怎么基于字节流解包
k9982874
2020-02-29 16:24:04 +08:00
你这说的就跟上帝面前人人平等一样,忽视现实哗众取宠而已。
hfc
2020-02-29 16:25:00 +08:00
既然你是在学习时搞明白的这个问题,那为什么不直接来写个详细的科普贴?
科普贴❌
嘲讽贴✔
lloovve
2020-02-29 16:27:14 +08:00
用字节流传输时,哪来的包结构,都是 0101 数据了,要解包就需要,寻找包头,从而解析,黏包概念就是几组数据同时到达
BBCCBB
2020-02-29 16:30:22 +08:00
tcp 的确实流..

但是对业务方来说, 他要接收的是一个一个完整的包. 多个包的数据混在一起, 说粘包也没毛病.
keygen88
2020-02-29 16:35:02 +08:00
你 G 点太低了。。。
Mohanson
2020-02-29 16:36:28 +08:00
TCP 卷一卷二卷三花一天时间看看就明白是怎么回事了,不存在的东西没必要去讨论
wanglufei
2020-02-29 16:41:27 +08:00
我找不到粘包警察那个帖子了。。
asilin
2020-02-29 16:45:55 +08:00
@wanglufei https://www.v2ex.com/t/630159 哈哈,我们都是“粘包警察”。
waruqi
2020-02-29 16:53:19 +08:00
原本就是个伪概念
neoblackcap
2020-02-29 16:54:39 +08:00
我来再科普一次吧。
首先“粘包”是不存在的,“粘包”这一个词主要是面向低水平或者没有受过比较系统的网络编程学习的读者。
因为 TCP 是没有包这个概念的,都是流。
那么既然没有包这个概念了,那么“粘包”如何谈起?显然包这概念就出现在应用层了( TCP/IP 五层网络模型)。“粘包”本质上就是如何从流里面提取信息出错。导致好像两个信息好像粘连在一起一样。
实际上这是一个解析错误,本质是对二进制数据解析出错。根本不是 TCP 的问题,是应用层的信息解析器写得太烂了。出现解析错误,无法正确处理从 socket 里面读取的数据。
heiheidewo
2020-02-29 17:02:37 +08:00
没毛病啊,这个“包”是指上层的协议包
luopengfei14
2020-02-29 17:12:03 +08:00
@BBCCBB 我比较支持 7 楼的观点。
脱离业务的瞎逼逼没有任何意义
littlewing
2020-02-29 17:15:18 +08:00
不说物理层是因为不需要应用程序处理,应用程序处理的就是 TCP 的字节流
对于应用程序来说,我发出去的应用层的多个包,在 TCP 中都是字节流了,我需要自己去处理,识别出应用层的包
所以说对于应用层的包,我来处理的时候就是粘在一起了,这就是所谓的粘包
littlewing
2020-02-29 17:16:37 +08:00
@littlewing 另外,重来没有人说这是 TCP 的问题。如果你觉得这是问题,可以选择用 UDP 或者 QUIC
dndx
2020-02-29 17:17:13 +08:00
@BBCCBB 业务自己不做分包解包怎么保证发出来的是一个一个的包?更别说接收了。这说明业务根本就不懂流式协议是怎么用的。

或者要是自己实在是不会设计,用个 WebSocket 之类的已经封装好的协议也行啊。
tt67wq
2020-02-29 17:23:59 +08:00
粘包问题来自各种拿来主义的 java 程序员
dndx
2020-02-29 17:24:55 +08:00
其实这个问题很好理解,TCP 的设计就是一个类似文件流的读写行为,只是底层用的传输方式 IP 是基于包交换的,这是一种实现细节跟 TCP 想要达到的效果无关。

类比一下,系统读写磁盘也是基于块的,为什么没有人读写文件的时候抱怨过有“粘块”的问题?把 TCP 当作文件读写来对待就 ok 了。思维方式需要改变。

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

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

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

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

© 2021 V2EX