![]() | 1 toconoma 2019-03-26 10:36:35 +08:00 流动 |
2 fkdog 2019-03-26 10:39:18 +08:00 ![]() TCP 连接可以当成是一条水管。 传输的二进制是水流。 水龙头开着,随时都会有水流出来。 有时候半天没有一滴水,有时候水流充足。 你体会一下。 |
3 mattx 2019-03-26 10:40:25 +08:00 via iPhone ![]() 因为流所以没边界,试着查下粘包,再理解下。 |
4 guguji 2019-03-26 10:40:48 +08:00 这里的流指的是 流水线的意思 流水生产作业,没到一个关口( map, filter,...),做一道加工,最后出来自己想要的(collect) |
5 azh7138m 2019-03-26 10:45:30 +08:00 ![]() 9102 年了,为啥还有人提粘包? |
6 darknoll 2019-03-26 10:46:48 +08:00 就是没有边界的意思 |
9 hellojinjie 2019-03-26 10:57:57 +08:00 你说的流是指 Java 的 IO 流还是,Java 8 中的 stream ? 2 楼和 4 楼已经分别回答你的问题了。 |
![]() | 11 cpdyj0 2019-03-26 10:59:26 +08:00 via Android 算了粘不粘包是对 TCP 的误用和错误理解导致的,但是不妨碍提出这个问题 |
13 shawngao 2019-03-26 11:04:34 +08:00 bytes ( raw )直出, 没有经过任何处理 想象一下,拍片没有任何剪辑,打码,美颜,嗯! |
14 celeron533 2019-03-26 11:05:25 +08:00 你不知道他的结尾。 |
15 没必要通过比喻来理解,你直接看它具体有哪些方法就可以了,有了那些方法就是流,是流就能提供那些方法给你用。 |
![]() | 17 misaka19000 2019-03-26 11:16:16 +08:00 |
![]() | 18 misaka19000 2019-03-26 11:17:20 +08:00 stream 是与 batch data 相对应的 |
![]() | 19 VoidChen 2019-03-26 11:17:29 +08:00 还有可能是 storm 或者 spark streaming 的流数据= = |
20 wythechen OP 了解 |
22 hhhsuan 2019-03-26 11:20:47 +08:00 这种模糊不清的问题,居然还有这么多人回复,请大家不要纵容这种浪费大家时间的行为,直接无视才能让楼主学会怎么提问。 |
![]() | 23 psuwgipgf 2019-03-26 11:48:11 +08:00 @azh7138m 不知道你那本计算机网络里,有没有提到如何分割 tcp 连接发送过来的数据的。不管你承不承认这个概念,他就是有这种问题。而且搜索 粘包 可以很快找到解决方法。 |
24 neoblackcap 2019-03-26 11:58:29 +08:00 ![]() @psuwgipgf 有这样的问题就是解析器写得不好,应该回去再看看编译相关的书籍,不是去看网络相关的。粘包这词也就中文社区会出现。所谓的粘包唯一正确的解决方法就是写好你的解析器,或者修改你的应用层协议。 |
25 noli 2019-03-26 12:14:42 +08:00 ![]() @psuwgipgf 分割“流” 本来就是一个伪问题。 你想说的内容其实是,如何设计一个基于流的数据格式或者协议……有这个概念的话就不会有所谓“粘包”。 “粘包” 这个概念也无助于正确地表达本质缓冲大小读取与数据格式所定义的大小不同步,并且每次读取的数据大小不可预知。 |
![]() | 26 vjnjc 2019-03-26 12:15:22 +08:00 流就是一边接受数据,一边处理嘛。 不像以前需要把整个数据读完。 |
![]() | 27 catror 2019-03-26 12:18:21 +08:00 ![]() @psuwgipgf 不管你承不承认这个概念,所谓的解决办法(加包头、固定长度之类的),其实是一个应用层协议了,和 TCP 无关,把 TCP 换成任意流协议都一样。所谓的 TCP 粘包,就是半吊子的人提出来的伪概念。还有人把这个概念翻译成英文,stick package,我也是醉了。 |
29 xaw483051011 2019-03-26 12:38:34 +08:00 via iPhone 问个问题啊,BIo 是基于流的,NIo 是基础通道,和流有关系吗 |
30 dddd1919 2019-03-26 13:09:25 +08:00 流弊,听懂掌声 |
31 GeruzoniAnsasu 2019-03-26 13:12:04 +08:00 via Android ![]() 不是不会断 流是对无边界数据的统一抽象 一个“流”意味着可以从中读写未事先确定总长度的数据 tcp 没有粘包,但其实再不专业也不会认为粘包是 tcp 协议的概念。首先粘包有明确含义,指在 tcp 传输中接收方读出数据与发送方写入数据同单位 /边界不同步的现象。对于了解 tcp 的人来说他会明白“粘包”是流传输的正常结果,对于不了解的人来说他并不知道 tcp 协议有哪些内容,只是认为“粘包是 tcp 经常发生的问题”而其实这个印象是对的。 作为一个能明确代表“ tcp 传输接发双方必须自行确定协议并组织数据单位和边界否则由于流式 io 会导致接收方无法按发送单位接收数据”问题的词,“粘包”其实创造得还挺形象,交流业务的时候大可不必这么严谨,讨论技术问题的时候严谨一点是好的,但个人觉得也没必要把这词废除掉。 |
![]() | 32 wweir 2019-03-26 13:49:46 +08:00 人肉封装了几次 TCP 协议,不知“粘包”为何物。 面向流就用面向流的处理手法,面向包就用面向包的处理手法,非要二者混为一谈,自找麻烦 |
![]() | 33 no1xsyzy 2019-03-26 13:57:06 +08:00 ![]() @psuwgipgf 你肛门不夹断怪屎粘在一起? 无包哪来的粘包? @GeruzoniAnsasu 与其说叫粘包不如说叫 “分包不清” 或者 “分包错误”。 还生硬地创造粘包的概念,明明有更直接、更清楚、更准确的叫法。 再说粘包我要拿出 SICP 从头讲流了。 |
![]() | 34 zhujinliang 2019-03-26 13:58:43 +08:00 via iPhone ![]() 看一下 RingBuffer 的实现原理就明白了 |
![]() | 35 ghos 2019-03-26 14:05:01 +08:00 其实就是表述上面的问题。。。所谓‘粘包’‘拆包’就是应用层协议的解码问题 |
![]() | 36 BCy66drFCvk1Ou87 2019-03-26 14:07:30 +08:00 有"方向"的才叫流 |
![]() | 37 richieboy 2019-03-26 14:16:31 +08:00 从头到尾流动,不能后退,不能随机 |
38 quadpixels 2019-03-26 15:31:47 +08:00 如果说是计算中的 streaming,也可以指“ cache 对其是无效的,所有数据只用一次”的意思吧。 |
39 az031120103 2019-03-26 16:58:45 +08:00 流,哲学概念,也是所有设计必须遵循的一种原则 流,只有一个方向 水从高到低 看书,浏览网页从左到右,从上到下 数据流方向由父到子 等等都是遵循了流只有一个方向的原则 |
![]() | 40 atonku 2019-03-26 19:16:10 +08:00 一群傻吊 |
![]() | 41 clevermoon 2019-03-26 19:19:52 +08:00 via Android 学到了大学几年都没学到的计网知识 |
![]() | 44 cheneydog 2019-03-26 21:03:03 +08:00 边读边处理,不用等待流完全结束。 |
46 jorneyr 2019-03-26 21:31:39 +08:00 流:逝者如斯夫,不舍昼夜,一去不复返 |
![]() | 47 ThomasZ 2019-03-26 21:39:32 +08:00 via Android 流,有一种动态感,而且有方向,就和河流一样会从一个地方流动到另一个地方,那么放在网络就是数据这条河流沿着线缆由主机到客户端这就有了动态,有了方向,这不就跟河流很像嘛,所以被叫做流。 |
![]() | 48 webjin1 2019-03-26 22:10:28 +08:00 via Android 你指的是银行那种吗?那叫流水。 |
![]() | 49 lozzow 2019-03-26 22:14:56 +08:00 via iPhone 连续地电信号 |
![]() | 50 msg7086 2019-03-26 23:13:34 +08:00 流有几种不同的含义。 网络里的流一般是指无边界数据流,即输入方只管源源不断地塞数据,输出方只管源源不断地出数据,而不管数据的结构是怎么样的。 视频音频里的流媒体则是指可以从任何一个字节开始读取并解码,而不需要事先得知视频的长度等信息。流中带有自动同步机制,从任何一个字节开始读取都可以找到同步点。 |
![]() | 51 liuminghao233 2019-03-26 23:21:12 +08:00 via iPhone 粘包 ---> 序列化 |
![]() | 53 catror 2019-03-27 00:22:35 +08:00 via Android |
![]() | 54 weakish 2019-03-27 00:36:21 +08:00 水流会断啊。比如水龙头打开,就是水流,关掉,水流就断了。所以 stream 也有 complete。 |
55 aparadeway 2019-03-27 01:00:15 +08:00 via Android 看到楼上们讨论粘包 不知道为什么突然好想吃鸡肉包啊 |
![]() | 56 jedihy 2019-03-27 05:10:29 +08:00 TCP 对应用层来说没有包这个概念,也就是不存在粘包一说(至少在应用层)。至于 Kernel 怎么决定那几块 buffer 一起发,跟应用层没有联系。 Kernel 是有和粘包很类似的行为,在 TX/RX 都有,而且取决于你的 kernel 是什么实现。但是这和你怎么在应用层收发数据,判断边界没有任何关系。 |
![]() | 57 jsun 2019-03-27 10:05:37 +08:00 元素按照一定的方向(顺序)在容器(或者通道)内排列,都可称之为流。例如文档流,文本流,数据流。和断不断没啥关系 |
![]() | 58 Everyxin 2019-03-27 10:09:16 +08:00 流?水? 只有我想多了吗... |
59 Leiothrix 2019-03-27 12:28:05 +08:00 长连接 |
![]() | 60 no1xsyzy 2019-03-27 13:58:50 +08:00 @catror #53 第二次因为 “粘包” 见这个项目了…… 看了一下不就是个 parser 吗? 另外,parser 在第六层,而不是第七层,大小端也是第六层干的事。 Serialization of complex data structures into flat byte-strings (using mechanisms such as TLV or XML) can be thought of as the key functionality of the presentation layer. https://en.wikipedia.org/wiki/Presentation_layer |
![]() | 61 catror 2019-03-27 14:29:29 +08:00 via Android @no1xsyzy 你说的这个 OSI 七层模型是个理论模型,事实上的互联网标准是 TCP/IP 四层模型 |
![]() | 62 no1xsyzy 2019-03-27 15:05:35 +08:00 @catror 我是想要指正你 #27 说的 “应用层”。 TCP/IP 又没有跳出 OSI 模型,只是发生了跨越和变形,一些层的功能描述分在两个协议里实现,而一些协议实现了不同层的功能。真要说事实标准那么事实的复杂性根本不能用层解释了。 用 KCP 怎么算? TLS/SSL 怎么算?中间挂了些代理甚至 $$/∨ray,应用层还会有 WebSocket 在七层上重新做出一个四层的协议,然后还有各种拍脑袋出来的 “协议”。要把上面的全部归到和 HTTP 同一层不仅诡异,而且其实和套用 OSI 模型一样地生硬。 |
![]() | 63 catror 2019-03-27 17:24:30 +08:00 @no1xsyzy 我知道你在说的什么,既然你提出来,那我就说说我对网络的理解吧。从操作系统的角度来看,数据在传输层( TCP/UDP )之上都是具体的应用在处理,不管什么样的花式协议,操作系统都不关心。所以,你提及的这些协议都是 TCP/IP 模型的应用层协议。应用在自己的数据处理中,再做二次协议分层是很正常的事情,但是这时候的分层已经不能算是通用网络模型的分层了。之所以会觉得生硬,是因为你把本来不应属于通用网络模型的分层强行套进去。 |
![]() | 64 no1xsyzy 2019-03-27 20:15:29 +08:00 听起来好像是符合 “关注点分离” 的分层?那我不太明白四层的下面两层是什么。 那样的话不应该是 硬件层内核层应用层 这样三层区分吗? |