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

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

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

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

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

11235 次点击
所在节点    程序员
84 条回复
sgissb1
2020-02-29 21:47:28 +08:00
参加之前上海某美国制裁黑名单企业面试时,小兄弟就用了这个词问我,我当时一脸黑人问号,这么含糊的意思,让我怎么回答么。再说我自己 tcp 的基础知识也确实不牢靠。。。
sgissb1
2020-02-29 21:47:57 +08:00
看来要上制裁黑名单也太容易了吧。
lance6716
2020-03-01 00:28:48 +08:00
@dndx 所以什么是粘包、粘块啊…
dndx
2020-03-01 00:30:54 +08:00
@sgissb1 你确定面试官不是在给你设套

@lance6716 两个都是伪命题
a627795061
2020-03-01 01:03:28 +08:00
纸上谈兵
back0893
2020-03-01 01:37:11 +08:00
我觉得说粘包很现象
出现粘包就是因为数据是不断获得
我依据规定的格式获得数据,
从而的得到我需要的包.
Mutoo
2020-03-01 05:54:09 +08:00
这是应用层的包,纯熟翻译问题,如果翻译成帧(frame)就没问题了。从流里拆帧。
alphatoad
2020-03-01 06:01:02 +08:00
TCP 当然有包,不能因为封装好了就说没有
jangit
2020-03-01 08:38:49 +08:00
这个是有可能的,tcp 有个小特性叫 tcp delay,就是把小的数据包组在一起发送
之前知道粘包就是因为这个特性
jangit
2020-03-01 08:42:22 +08:00
@jangit 没看清楚内容,确实是个伪命题,溜了
PDX
2020-03-01 08:51:55 +08:00
这种 沾沾自喜 的样子 很低级
xuanbg
2020-03-01 09:46:55 +08:00
数据在网络层是分包发送和接收的。每个包都有固定的数据格式,这个数据格式就是我们说的网络协议。包的大小和 MTU 值有关,流数据超出 MTU 值,就会被自动分成多个数据包进行发送。在网络层确实不存在什么粘包这个说法,只有接收侧会有包的次序问题。因为网络设备不能保证你先发送的包一定会先到达。

说 TCP 是流没有包某种意义上也没错,对于上层应用来说,网络传输就是数据流。实际上我们在使用网络传输数据的时候,也是按流而不是包进行处理的。
nianyu
2020-03-01 10:29:53 +08:00
阴阳怪气
pythonee
2020-03-01 10:33:31 +08:00
还是不懂,而且工程上似乎是要考虑的
itskingname
2020-03-01 10:43:53 +08:00
@Mohanson #9 你这个回答毫无意义,就像是说:楼主你的帖子里面有一个错别字,你花一天时间翻一下新华字典就好了。 除了让人觉得你看过,还能说明什么?你能不能具体说明是卷几?哪一章哪一节第几页?
sintrb
2020-03-01 11:18:49 +08:00
@arloor 赞一个!
letking
2020-03-01 11:31:49 +08:00
这 tm 都是月经贴了吧?
不讨论楼主自身水平如何、做法对不对,反正如今还在维护“粘包”这个说法的都是傻 B,欢迎互 B。
wangyzj
2020-03-01 11:32:51 +08:00
明明知道这是针对不同职位和不通层级的说法
为啥一定要纠结呢
shujun
2020-03-01 12:13:39 +08:00
角度不同而已

在底层实现者眼里,传输不涉及应用逻辑 所以不负责处理这个封包解包

应用层开发者确实直接用 tcp 的不多,习惯了 http 那种封装好的协议 请求和相应一对一的。
FrankHB
2020-03-01 12:37:31 +08:00
想知道粘包警察是何种文化输出……樱警察 /车万警察 /厄介警察?
另外倒是想出警把 serialization/deserialization 或者 mashalling/unmarshalling 和 I/O 混为一谈的……

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

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

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

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

© 2021 V2EX