我工作五年的时候也不知道 “TCP 粘包”

2018-12-20 10:35:02 +08:00
 sagaxu
也不知道 cake(cache)是什么,比 catch 还难猜
还有 marven(maven),第一次听时也没反应过来
无限级,无限分类,直接说树和递归不好吗?
C 井倒是马上就能联想到是 csharp
21115 次点击
所在节点    程序员
100 条回复
PureWhiteWu
2018-12-20 20:03:25 +08:00
@Chingim 我知道什么叫贾克斯哈哈哈哈
kiddult
2018-12-20 20:25:32 +08:00
@liuminghao233 跟业务没关系,TCP 本来就是流,跟包没关系,你又不设计系统,就跟你说河里面的一段水一样。。。。。
python
2018-12-20 20:27:10 +08:00
![]( )
kiddult
2018-12-20 20:27:33 +08:00
@Mutoo 这种指令系统设计从一开始就是废物吧,哪有这么设计协议的,就为了省俩字节?
blless
2018-12-20 21:12:55 +08:00
tcp 粘包的是不是业务层多线程写数据没有处理好…不然怎么可能两个包数据混杂在一起
crab
2018-12-20 22:17:20 +08:00
@liuxey 应该是要说应用层上的格式吧。
ryd994
2018-12-21 03:32:58 +08:00
@blless nagle 算法了解一下
就算没有 nagle,如果有重传 /重排,接收端程序一下读到两个包的数据,也是很正常的。在应用层就不应该尝试跨层思考到底有几个包。
如果你需要包边界,可以用 sctp。有顺序有重传,但同时也提供包边界。
jxl
2018-12-21 09:03:32 +08:00
能问到别人,不算啥。能解释的让不知者能听明白,那才是牛。
lieh222
2018-12-21 09:03:54 +08:00
那是不是 UDP 还有没素质的插队包?
reus
2018-12-21 09:24:11 +08:00
@ryd994 你用 socket api 读 tcp,是不会读到重复或者乱序的
q397064399
2018-12-21 09:48:18 +08:00
@Mutoo #80 业务层面上 其实应该换一个术语 避免跟 底层的概念混淆
Mutoo
2018-12-21 10:07:49 +08:00
@kiddult 每个指令包都是 len + payload 并没有省。其实像 websocket 这种也是一样的原理, frame over tcp.
@blless 粘包是指缓冲区出现两个包接连在一起的情况,不是指数据没处理好。
@q397064399 这名字不知道哪个年代的大佬起的,后来就一直流传了,改不改不了。
vipppppp
2018-12-21 10:24:02 +08:00
我还以为这些科普贴。。。。。。。。
karllynn
2018-12-21 10:25:04 +08:00
粘包就是扯淡的,说白了就是应用层协议设计
oldcoder
2018-12-21 11:14:52 +08:00
将字节流转化成特定的协议?协议没有制定好,编解码器编写不完善,就会发生所谓的“粘包”“拆包”?
xuanbg
2018-12-21 11:22:05 +08:00
TCP 怎么没有包?协议本身就是有包这个定义的。
xfriday
2018-12-21 14:10:02 +08:00
@xuanbg 可惜不是他们说的“粘包”的包
toinmyfree
2018-12-21 14:31:50 +08:00
额,刚看到还以为是红豆小粘包或者紫薯小粘包啥的...
ryd994
2018-12-21 19:18:58 +08:00
@reus 你只知其一不知其二。我只是在解释即使没有 nagle,一样可以发生所谓的粘包。

考虑 123 三个包,2 丢失或者乱序,接收顺序为 132
收 1 ACK1,没有问题
收 3 ACK1,这时如果去读,只能读出 1。原则上这时可以丢弃 3。但一般操作系统都会保留 3 以提高效率。由此还产生了 SACK。
收 2 ACK3,这时如果去读,就会同时读到 23。

这还是假设程序读取频率远高于包到达的评论的情况。如果网卡有 tso,那还是会二合一。如果应用程序被 deschedule 太久,那还是会二合一。如果应用程序就是太忙,过很久才读,那还是会二合一。
jiejiss
2018-12-23 15:15:46 +08:00
“我工作五年的时候也不知道 ‘ TCP 粘包’”
我还没工作都能看出来你在杠 = =

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

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

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

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

© 2021 V2EX