TCP 粘包? 到底有没有粘包?

176 天前
 error0

听说这是贵站的月经贴! 关于 TCP 协议 ”粘包和拆包“ 的见解

7795 次点击
所在节点    程序员
68 条回复
kenvix
175 天前
也就是说,只要你没显式指定 TCP_NODELAY ,那就有可能粘
cnbatch
175 天前
打个生活化的比喻:
UDP 相当于带虚线的纸(例如厕所卷纸、针式打印机的打印纸),可以按照虚线一格一格拔断
TCP 相当于购物小票打印纸,需要自己计算好切纸位置

所谓“粘包”,相当于用惯虚线纸的人以为购物小票卷纸也是有虚线可以拔的,拿到手才发现没有虚线,总是断错位置。
cnbatch
175 天前
所以“粘包”完全就是使用者自己用法错误,乱起“术语”
conanxu
175 天前
我只关心有没有粘豆包
mingl0280
175 天前
TCP 哪来的包?你再说一遍粘什么?
hekkowoerld
175 天前
nagle 只是优化机制,不是错误,国内技术圈自嗨的产物
simenet
175 天前
再说粘 乱棍打死
julyclyde
175 天前
@Bingchunmoli 是的。所以后来我又发了一句,觉得应该用 mistake 这个词
est
175 天前
不沾只是偶然。
iceheart
175 天前
看起来是不懂 TCP 如何使用的程序员,在用 UDP 的方式处理数据的时候遇到了问题。他们又不承认自己错了,就发明了"粘包"这个词。
offswitch
175 天前
这玩意儿有什么好讨论的,一点技术含量都没有的东西。
jinghong
175 天前
一直不知道是读“zhan”还是读“nian”
leaflxh
175 天前
对 TCP 包进行赋能,热了,就不粘了
cwek
175 天前
首先记住 TCP 是一个流式负载的传输层协议,对上层应用层协议没有明确的报文长度机制,所以 100 字节输入进去,对面不保证一次读取就是 100 字节到齐(可能多次 1 字节交付,或者连后面再传入的 100 字节一起交付)。所以需要知道报文长度的应用层协议必须自己想办法制定应用层报文长度确认机制,不要靠 TCP 帮你解决这个问题,它不解决。
cwek
175 天前
所以“粘包”这东西就是搞错了自己写基于有边界的应用层协议,通过 TCP 层传输时,会体现出 IP 层的传输边界,但实际上 TCP 层没有“传输边界”这玩意,就是一串在管子的粘性果冻串,透明到看不出边界,就算 IP 层将管子切成一段段,在连一边粘回一起,从管子出来时,还是一整条透明到看不到边界的粘性果冻串,所以应用层需要自己塞一些有颜色的果冻段来方便接受层知道,这一长串果冻是有边界的。
cz5424
175 天前
你是说水管黏水?
totoro52
175 天前
引战引流,这种人能不能处理掉啊, 真的浪费大家时间
WuSiYu
175 天前
一句话就能说明白:TCP 提供的接口形式是“流”,当用户错误的认为其形式是“包”时,其自然会“观察到”所谓粘包等现象,但这对于 TCP 其实是 as design 的

我的观点:粘包确实是个东西,但要理解它是“建立在编程人员的错误理解之下的,一种自认为的现象”
msg7086
174 天前
TCP 没有包概念。TCP 本身会把流切成段,因为下层的 IP 协议是分包的。
就像你统计人数坐大巴,本来好好按人头数来数就行了,有人偏要跑过来跟你说,我们今天来了 1.5 吨人,大巴一个座位坐 100 公斤人,需要 15 个座位。你不把他当傻子么。
zhangsanfeng2012
174 天前
其实是 ip 粘包🐶

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

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

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

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

© 2021 V2EX