分享文章: TCP 粘包? TCP 警察什么梗

2022-08-29 08:02:57 +08:00
 DonaldY

文章地址:TCP 粘包? TCP 警察什么梗

从 v2 学到很多,按照自己理解总结了下。0.0

11741 次点击
所在节点    程序员
89 条回复
zjp
2022-08-29 08:49:26 +08:00
讲拆包粘包的很大比例是 Javer ,Netty 权威指南功不可没…
jiulang
2022-08-29 08:52:01 +08:00
TCP 粘包?伪命题,tcp 从来不是像 UDP 一样,以包设计的,而是流式的,就像滔滔不绝的流水一样。
RRyo
2022-08-29 08:54:00 +08:00
有请双方选手入...哦 2L 已经入场一位!
winterbells
2022-08-29 08:56:55 +08:00
好久没有这个话题了,恭喜 lz 找到了热点
wanguorui123
2022-08-29 08:59:12 +08:00
警察看了头疼
mywaiting
2022-08-29 09:08:33 +08:00
粘包一词到底是怎么造出来的,我很是好奇

PS 每每看到粘包警察一词就想笑
TWorldIsNButThis
2022-08-29 09:11:28 +08:00
粘念 zhān 还是 nián ?
xlsepiphone
2022-08-29 09:12:42 +08:00
原封不动的把一篇文章看完了,耗时 10 分钟。
mringg
2022-08-29 09:13:02 +08:00
警察已经开始摆烂了
qrobot
2022-08-29 09:14:21 +08:00
TCP 粘包是啥? 自己创造一个名词出来? TCP 从来没有粘包一说, 看你的文章你也是对 TCP 一知半解。 麻烦赶紧删了,免得误人子弟。

我先跟你说,很明确的来说 TCP 没有粘包这一个说法,根本就不存在。


我看你用 Java 写的代码, 那么我就用 Java 代码给你举个例子

```
Socket socket = new Socket("127.0.0.1", 8000);
OutputStream os = socket.getOutputStream();
os.write("test".getBytes());
```

实际上会发生什么?

如果网络延迟,或则发生丢包,那么会超时重传. 然后网络线路没问题, 那么会直接写入系统的 TCP/IP buffer 里面去。

如下


```
Socket socket = new Socket("127.0.0.1", 8000);
OutputStream os = socket.getOutputStream();
os.write("test".getBytes());
os.write("test1".getBytes());
os.write("test3".getBytes());
```

那么我写入三次表示什么? 很显然根据我上面说的,系统为了性能会缓存对应的 TCP/IP 的数据信息, 那么我可以采用一个很大 buffer 来进行一次性将这两次的请求给直接读取过来。


根据这个理解那么就可以把 TCP 看作流, 通过流来进行运输货物,很显然明显的是 TCP 就是流协议。 流协议何谈封包和拆包?


那如何解决判断 TCP 中这次请求的信息已经是末端了?

很常见的两种方案


1. 一次请求一次响应, 后续关掉 socks
2. 用 4 字节定义一个无符号的整数来定义这个报文的 Length 就好了


所谓的 `特殊分隔符`简直是最愚蠢的做法, 难道我的报文中就不能出现对应的特殊符号吗? `固定消息长度` 简直是浪费内存和网络开销。完全不可取。


因为是流协议, 所以需要应用自己去判断写入的字节什么时候已经达到的末端。
tairan2006
2022-08-29 09:15:21 +08:00
其实这块儿的中文术语很模糊,报文、帧、数据包啥的,用英文表达会好一点。

有的书把 packet 翻译成报文,有的把 message 翻译成报文,服了…
yyf1234
2022-08-29 09:15:41 +08:00
eason1874
2022-08-29 09:15:51 +08:00
热帖预订。顺便提示楼主,还有一个流量密码:HTTP 状态码一律 200 、HTTP 请求方式一律 GET/POST
TomVista
2022-08-29 09:15:53 +08:00
无所谓了,只要你能听明白, 需要一个上层协议来拆分信息就行

前一阵子有个沙雕,非要我发送的时候,给他拆好 .dog

我接收的怎么是这样子 .jpg
你那里有问题 .jpg
不是我的问题 .jpg
不是我负责的 .jpg
你前端改改 .jpg
darkengine
2022-08-29 09:21:49 +08:00
TCP: 我把东西按顺序给到你了,我们也不知道你们发的啥玩意儿,自己看吧
qrobot
2022-08-29 09:22:07 +08:00
当我看到 TCP 粘包的时候,我很震惊, 后面我开始解释 TCP 没有粘包, 只有 “因为是流协议, 所以需要应用自己去判断写入的字节什么时候已经达到的末端。” 后来我渐渐的麻木......
mercury233
2022-08-29 09:22:19 +08:00
TCP 粘包就是理论上不存在但实际上必须处理的东西 /狗头
Rache1
2022-08-29 09:22:51 +08:00
这页面上乱七八糟的元素,我还以为我打开了内容农场

stoluoyu
2022-08-29 09:22:59 +08:00
@zjp 死去的回忆开始攻击我
miyuki
2022-08-29 09:23:57 +08:00
packet frame message
跨频道聊天是吧

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

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

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

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

© 2021 V2EX