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

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

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

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

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

11212 次点击
所在节点    程序员
84 条回复
Archeb
2020-02-29 17:28:37 +08:00
楼主问的“什么不问问他的兄弟第一层的“物理层”,是如何在物理介质里面处理载波信号的“粘包”的?”这个问题,其实不太合理。
因为其实二层的 Ethernet 和三层的 IP 都分别有 Frame 和 Packet 的概念,不然为什么要有 MTU/MSS 呢?
只是到了四层的 TCP/UDP 等协议又把包化成流,对于更上层的应用程序来说不存在包的概念了而已。
reus
2020-02-29 17:30:52 +08:00
初学者不懂 TCP 的特性也就罢了,学习一下就能懂的。
有些人居然拿什么“现实”、“业务”来开脱,真是搞笑。
反正谁用这个词,谁就是没水平。
realpg
2020-02-29 17:34:55 +08:00
粘包换成人话就是:

如何处理流式数据的不同数据组分界问题。
Counter
2020-02-29 17:35:14 +08:00
难道不是因为双方讨论的不是同一层的问题
Orenoid
2020-02-29 17:39:10 +08:00
没有系统学习带来的用词不当与伪概念,但逻辑上都是在讨论应用层协议的问题。
看到纠正就好了,不好好解释反而一通嘲讽并不可取。
back0893
2020-02-29 17:42:35 +08:00
惹不起,惹不起
@粘包警察
zsdroid
2020-02-29 17:45:44 +08:00
为什么很多人喜欢揪字眼?

我在 tcp 层处理数据出现的现象,叫做 TCP“粘包”,仅此而已。这种叫法也无可厚非啊。不代表是 tcp 传输出现了粘包。
而 tcp 以流传输,然后就说 TCP“粘包”不存在。

照这么说,bug 其实也不存在喽,出现 bug 只是因为你基础不扎实??
back0893
2020-02-29 17:47:36 +08:00
@zsdroid 粘包警察只是想嘲讽下而已,
laoyur
2020-02-29 18:03:10 +08:00
其实很简单,因为楼主觉得他弄明白了,所以肆无忌惮地加入了嘲讽的行列
arloor
2020-02-29 19:55:20 +08:00
你写过 tcp 网络编程吗?
你是自底而上学习了网络编程,觉得 tcp 粘包 wtf
而有的人是自上而下,先写 tcp 网络编程,遇到粘的问题,然后再从“粘”这个特点去寻找答案

两种都可以,自上而下,自下而上,两种学习方式而已。
问题 1:有什么好嘲讽的?
问题 2:你自底向上学了网络模型,那你写过网络编程吗?你有没有考虑过如何在应用层解决“粘”?程序员的精神是 show me the code,而不是“我笑了”。那些对说“粘包”的人冷嘲热风的人,真的可耻

从你的描述,“自底而上”,80%的可能性,你没写过。

最后一句,那些说粘包的,他们又没说粘的是 tcp 的包,说的是应用层的包
yisiyisi
2020-02-29 20:03:12 +08:00
有啥好笑的?
useben
2020-02-29 20:13:23 +08:00
粘包这个概念是针对应用层的,tcp 是流式传输,哪管你啥包啥包。粘包是说你的不同意义的业务数据因为流式传输而造成在同一次读取。。。
vevlins
2020-02-29 20:22:50 +08:00
就是楼主这种人让我在讨论这种问题时不得不(tcp 其实是面向流的,并没有粘包)。照你这么说,大学以下不少课程都是学了假知识。
DOLLOR
2020-02-29 20:27:13 +08:00
让我想起某物理讨论区因为“离心力”而大战几百楼的盛况。
luckyrayyy
2020-02-29 20:36:07 +08:00

懂?
LPeJuN6lLsS9
2020-02-29 20:47:38 +08:00
本粘包警察来了。粘包学家还有碰包学家,全都抓进监狱
boyhailong
2020-02-29 21:15:33 +08:00
人家说的是收到的数据解析成应用层可用的“包”
hardwork
2020-02-29 21:19:43 +08:00
物极必反,粘包警察都有了,lz 还在笑粘包
NullData
2020-02-29 21:28:42 +08:00
想说什么就好好说,在不合适的语境下阴阳怪气让我感到恶心
gamexg
2020-02-29 21:32:29 +08:00
看过协议的都知道 tcp 是流。
但是初学者或者代码 bug 造成错误的处理了包边界的现象需要个名称。
虽然不知道粘包是从哪里叫起的,但是这的确是个很常见的称呼。
碰到初学者类似问题求助,真没心情去详细解释,直接给个"粘包"关键字,对方可以容易的找到相关资料。
这个就足够了,不使用粘包,我真不知道什么关键字可以更准确的让对方找到解决办法。

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

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

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

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

© 2021 V2EX