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

2020 年 2 月 29 日
 asilin

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

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

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

12395 次点击
所在节点    程序员
84 条回复
dany813
2020 年 3 月 2 日
围观大佬们的嘲讽
FrankHB
2020 年 3 月 3 日
@yuikns 按我看到的一般的常见的用法,serializing / deserializing 指数据结构的内部表示和(至少)允许串行访问的外部存储的表示(尤其是直接对应外存中的可持久化格式,如文件映像)之间的转换; marshalling / unmarshalling 则强调系统内处理的以既定方式访问的数据(通常就是语言运行时支持的一等对象(first-class object) )和系统外的表示形式(不限制格式是否公开稳定,不强调持久化,具体支持和语言之间互操作的要求有关)的交互。两者外延不同但有交集,条件允许时可以共用一套实现。

划分 I/O 操作的基准要看什么是系统“内部”。I/O 是指保证对外部有不可忽略的影响的操作。否则,找不到一个外延去限定什么才能算 I/O,字面含义也说不通。
有些操作作为 I/O 是没疑问的:产生可观察且无法保证消除的行为(比如说,总是需要消耗电力)的物理设备发生的通信是真实的 I/O。
除此之外,还可以假装认为存在其它类似的影响外部状态操作,以实现不可控的“外部”系统交互。例如通用操作系统的内核把设备驱动排除出这里的“内部”,统计的所谓 I/O 可以包括仅在虚拟设备上有意义的操作;为便于设备驱动实现和统计方式的原因,这种假定姑且是合理的。
但就不提供让用户显式指定如何处理的计算作用(computational effect) 大多数编程语言来讲,没有说得过去的理由这样装。特别是 C 和 C++ 对这种“外部”副作用已经专门用 volatile 区分了,再含糊地给库函数开洞只会导致不必要的劣化和库 API 设计的混淆。
BiuBiuBiu
2020 年 3 月 28 日
@Archeb "因为其实二层的 Ethernet 和三层的 IP 都分别有 Frame 和 Packet 的概念,不然为什么要有 MTU/MSS 呢?" 如果没记错的话 MSS 应该是 TCP 里的吧? IP 层好像没规定什么大小
Archeb
2020 年 3 月 28 日
@BiuBiuBiu
Ethernet → MTU,TCP → MSS
我的理解是,MSS 是为了适应两端 MTU 不同的情况,所以我把 MTU 和 MSS 都说了。

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

https://study.congcong.us/t/648625

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

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

© 2021 V2EX