V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wythechen
V2EX  ›  Java

到底啥叫流,是因为像水一样不会断吗

  •  
  •   wythechen · 2019-03-26 10:25:04 +08:00 via Android · 9139 次点击
    这是一个创建于 1851 天前的主题,其中的信息可能已经有所发展或是发生改变。
    64 条回复    2019-03-27 20:15:29 +08:00
    toconoma
        1
    toconoma  
       2019-03-26 10:36:35 +08:00
    流动
    fkdog
        2
    fkdog  
       2019-03-26 10:39:18 +08:00   ❤️ 2
    TCP 连接可以当成是一条水管。
    传输的二进制是水流。
    水龙头开着,随时都会有水流出来。
    有时候半天没有一滴水,有时候水流充足。

    你体会一下。
    mattx
        3
    mattx  
       2019-03-26 10:40:25 +08:00 via iPhone   ❤️ 2
    因为流所以没边界,试着查下粘包,再理解下。
    guguji
        4
    guguji  
       2019-03-26 10:40:48 +08:00
    这里的流指的是 流水线的意思
    流水生产作业,没到一个关口( map, filter,...),做一道加工,最后出来自己想要的(collect)
    azh7138m
        5
    azh7138m  
       2019-03-26 10:45:30 +08:00   ❤️ 20
    9102 年了,为啥还有人提粘包?
    darknoll
        6
    darknoll  
       2019-03-26 10:46:48 +08:00
    就是没有边界的意思
    Dxxxxs
        7
    Dxxxxs  
       2019-03-26 10:54:47 +08:00 via Android   ❤️ 1
    @azh7138m 不懂就问。为什么 2019 年就不能提粘包了
    k9982874
        8
    k9982874  
       2019-03-26 10:57:30 +08:00   ❤️ 1
    @azh7138m #5 不管到了哪年 粘包都在那
    hellojinjie
        9
    hellojinjie  
       2019-03-26 10:57:57 +08:00
    你说的流是指 Java 的 IO 流还是,Java 8 中的 stream ?
    2 楼和 4 楼已经分别回答你的问题了。
    changwei
        10
    changwei  
       2019-03-26 10:58:24 +08:00 via Android
    @Dxxxxs 同问,为什么 2019 就不粘包了?
    cpdyj0
        11
    cpdyj0  
       2019-03-26 10:59:26 +08:00 via Android
    算了粘不粘包是对 TCP 的误用和错误理解导致的,但是不妨碍提出这个问题
    hundan
        12
    hundan  
       2019-03-26 11:00:43 +08:00 via Android   ❤️ 3
    @changwei https://www.v2ex.com/t/519253

    因为本来就是个伪概念
    shawngao
        13
    shawngao  
       2019-03-26 11:04:34 +08:00
    bytes ( raw )直出, 没有经过任何处理
    想象一下,拍片没有任何剪辑,打码,美颜,嗯!
    celeron533
        14
    celeron533  
       2019-03-26 11:05:25 +08:00
    你不知道他的结尾。
    SuperMild
        15
    SuperMild  
       2019-03-26 11:09:05 +08:00
    没必要通过比喻来理解,你直接看它具体有哪些方法就可以了,有了那些方法就是流,是流就能提供那些方法给你用。
    wythechen
        16
    wythechen  
    OP
       2019-03-26 11:14:24 +08:00 via Android
    @fkdog 这是指的 IO 流吗
    misaka19000
        17
    misaka19000  
       2019-03-26 11:16:16 +08:00
    misaka19000
        18
    misaka19000  
       2019-03-26 11:17:20 +08:00
    stream 是与 batch data 相对应的
    VoidChen
        19
    VoidChen  
       2019-03-26 11:17:29 +08:00
    还有可能是 storm 或者 spark streaming 的流数据= =
    wythechen
        20
    wythechen  
    OP
       2019-03-26 11:18:14 +08:00 via Android
    了解👌
    azh7138m
        21
    azh7138m  
       2019-03-26 11:20:42 +08:00
    @Dxxxxs
    @changwei
    我手上有一本英文原版的计算机网络,亲爱的你,告诉我,你是在哪里看到这个概念的?
    hhhsuan
        22
    hhhsuan  
       2019-03-26 11:20:47 +08:00
    这种模糊不清的问题,居然还有这么多人回复,请大家不要纵容这种浪费大家时间的行为,直接无视才能让楼主学会怎么提问。
    psuwgipgf
        23
    psuwgipgf  
       2019-03-26 11:48:11 +08:00
    @azh7138m 不知道你那本计算机网络里,有没有提到如何分割 tcp 连接发送过来的数据的。不管你承不承认这个概念,他就是有这种问题。而且搜索 粘包 可以很快找到解决方法。
    neoblackcap
        24
    neoblackcap  
       2019-03-26 11:58:29 +08:00   ❤️ 1
    @psuwgipgf 有这样的问题就是解析器写得不好,应该回去再看看编译相关的书籍,不是去看网络相关的。粘包这词也就中文社区会出现。所谓的粘包唯一正确的解决方法就是写好你的解析器,或者修改你的应用层协议。
    noli
        25
    noli  
       2019-03-26 12:14:42 +08:00   ❤️ 2
    @psuwgipgf

    分割“流” 本来就是一个伪问题。
    你想说的内容其实是,如何设计一个基于流的数据格式或者协议……有这个概念的话就不会有所谓“粘包”。

    “粘包” 这个概念也无助于正确地表达本质——缓冲大小读取与数据格式所定义的大小不同步,并且每次读取的数据大小不可预知。
    vjnjc
        26
    vjnjc  
       2019-03-26 12:15:22 +08:00
    流就是一边接受数据,一边处理嘛。
    不像以前需要把整个数据读完。
    catror
        27
    catror  
       2019-03-26 12:18:21 +08:00   ❤️ 4
    @psuwgipgf 不管你承不承认这个概念,所谓的解决办法(加包头、固定长度之类的),其实是一个应用层协议了,和 TCP 无关,把 TCP 换成任意流协议都一样。所谓的 TCP 粘包,就是半吊子的人提出来的伪概念。还有人把这个概念翻译成英文,stick package,我也是醉了。
    catror
        28
    catror  
       2019-03-26 12:22:51 +08:00
    @catror sticky package,少到一个 y
    xaw483051011
        29
    xaw483051011  
       2019-03-26 12:38:34 +08:00 via iPhone
    问个问题啊,BIo 是基于流的,NIo 是基础通道,和流有关系吗
    dddd1919
        30
    dddd1919  
       2019-03-26 13:09:25 +08:00
    流弊,听懂掌声
    GeruzoniAnsasu
        31
    GeruzoniAnsasu  
       2019-03-26 13:12:04 +08:00 via Android   ❤️ 2
    不是不会断


    流是对无边界数据的统一抽象
    一个“流”意味着可以从中读写未事先确定总长度的数据





    tcp 没有粘包,但其实再不专业也不会认为粘包是 tcp 协议的概念。首先粘包有明确含义,指在 tcp 传输中接收方读出数据与发送方写入数据同单位 /边界不同步的现象。对于了解 tcp 的人来说他会明白“粘包”是流传输的正常结果,对于不了解的人来说他并不知道 tcp 协议有哪些内容,只是认为“粘包是 tcp 经常发生的问题”——而其实这个印象是对的。

    作为一个能明确代表“ tcp 传输接发双方必须自行确定协议并组织数据单位和边界否则由于流式 io 会导致接收方无法按发送单位接收数据”问题的词,“粘包”其实创造得还挺形象,交流业务的时候大可不必这么严谨,讨论技术问题的时候严谨一点是好的,但个人觉得也没必要把这词废除掉。
    wweir
        32
    wweir  
       2019-03-26 13:49:46 +08:00
    人肉封装了几次 TCP 协议,不知“粘包”为何物。

    面向流就用面向流的处理手法,面向包就用面向包的处理手法,非要二者混为一谈,自找麻烦
    no1xsyzy
        33
    no1xsyzy  
       2019-03-26 13:57:06 +08:00   ❤️ 3
    @psuwgipgf 你肛门不夹断怪屎粘在一起?
    无包哪来的粘包?
    @GeruzoniAnsasu 与其说叫粘包不如说叫 “分包不清” 或者 “分包错误”。
    还生硬地创造粘包的概念,明明有更直接、更清楚、更准确的叫法。
    再说粘包我要拿出 SICP 从头讲流了。
    zhujinliang
        34
    zhujinliang  
       2019-03-26 13:58:43 +08:00 via iPhone
    看一下 RingBuffer 的实现原理就明白了
    ghos
        35
    ghos  
       2019-03-26 14:05:01 +08:00
    其实就是表述上面的问题。。。所谓‘粘包’‘拆包’就是应用层协议的解码问题
    HuasLeung
        36
    HuasLeung  
       2019-03-26 14:07:30 +08:00
    有"方向"的才叫流
    richieboy
        37
    richieboy  
       2019-03-26 14:16:31 +08:00
    从头到尾流动,不能后退,不能随机
    quadpixels
        38
    quadpixels  
       2019-03-26 15:31:47 +08:00
    如果说是计算中的 streaming,也可以指“ cache 对其是无效的,所有数据只用一次”的意思吧。
    az031120103
        39
    az031120103  
       2019-03-26 16:58:45 +08:00
    流,哲学概念,也是所有设计必须遵循的一种原则
    流,只有一个方向
    水从高到低
    看书,浏览网页从左到右,从上到下
    数据流方向由父到子
    等等都是遵循了流只有一个方向的原则
    atonku
        40
    atonku  
       2019-03-26 19:16:10 +08:00
    一群傻吊
    clevermoon
        41
    clevermoon  
       2019-03-26 19:19:52 +08:00 via Android
    学到了大学几年都没学到的计网知识
    no1xsyzy
        42
    no1xsyzy  
       2019-03-26 19:21:35 +08:00
    @atonku 哦,您可有高见?
    nikolai
        43
    nikolai  
       2019-03-26 21:01:52 +08:00
    @no1xsyzy 正在吃饭看到你这个💩解释喷了 😂
    cheneydog
        44
    cheneydog  
       2019-03-26 21:03:03 +08:00
    边读边处理,不用等待流完全结束。
    cpdyj0
        45
    cpdyj0  
       2019-03-26 21:04:32 +08:00
    @nikolai 你还别说,这比喻还挺抽象
    jorneyr
        46
    jorneyr  
       2019-03-26 21:31:39 +08:00
    流:逝者如斯夫,不舍昼夜,一去不复返
    ThomasZ
        47
    ThomasZ  
       2019-03-26 21:39:32 +08:00 via Android
    流,有一种动态感,而且有方向,就和河流一样会从一个地方流动到另一个地方,那么放在网络就是数据这条河流沿着线缆由主机到客户端这就有了动态,有了方向,这不就跟河流很像嘛,所以被叫做流。
    webjin1
        48
    webjin1  
       2019-03-26 22:10:28 +08:00 via Android
    你指的是银行那种吗?那叫流水。
    lozzow
        49
    lozzow  
       2019-03-26 22:14:56 +08:00 via iPhone
    连续地电信号
    msg7086
        50
    msg7086  
       2019-03-26 23:13:34 +08:00
    流有几种不同的含义。
    网络里的流一般是指无边界数据流,即输入方只管源源不断地塞数据,输出方只管源源不断地出数据,而不管数据的结构是怎么样的。
    视频音频里的流媒体则是指可以从任何一个字节开始读取并解码,而不需要事先得知视频的长度等信息。流中带有自动同步机制,从任何一个字节开始读取都可以找到同步点。
    liuminghao233
        51
    liuminghao233  
       2019-03-26 23:21:12 +08:00 via iPhone
    粘包 ---> 序列化
    Vitameans
        52
    Vitameans  
       2019-03-26 23:35:03 +08:00 via iPhone
    @catror 「包」怎么也得是 packet 吧。
    weakish
        54
    weakish  
       2019-03-27 00:36:21 +08:00
    水流会断啊。比如水龙头打开,就是水流,关掉,水流就断了。所以 stream 也有 complete。
    aparadeway
        55
    aparadeway  
       2019-03-27 01:00:15 +08:00 via Android
    看到楼上们讨论粘包
    不知道为什么突然好想吃鸡肉包啊
    jedihy
        56
    jedihy  
       2019-03-27 05:10:29 +08:00
    TCP 对应用层来说没有包这个概念,也就是不存在粘包一说(至少在应用层)。至于 Kernel 怎么决定那几块 buffer 一起发,跟应用层没有联系。

    Kernel 是有和粘包很类似的行为,在 TX/RX 都有,而且取决于你的 kernel 是什么实现。但是这和你怎么在应用层收发数据,判断边界没有任何关系。
    jsun
        57
    jsun  
       2019-03-27 10:05:37 +08:00
    元素按照一定的方向(顺序)在容器(或者通道)内排列,都可称之为流。例如文档流,文本流,数据流。和断不断没啥关系
    Everyxin
        58
    Everyxin  
       2019-03-27 10:09:16 +08:00
    流?水?
    只有我想多了吗...
    Leiothrix
        59
    Leiothrix  
       2019-03-27 12:28:05 +08:00
    长连接
    no1xsyzy
        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
    catror
        61
    catror  
       2019-03-27 14:29:29 +08:00 via Android
    @no1xsyzy 你说的这个 OSI 七层模型是个理论模型,事实上的互联网标准是 TCP/IP 四层模型
    no1xsyzy
        62
    no1xsyzy  
       2019-03-27 15:05:35 +08:00
    @catror 我是想要指正你 #27 说的 “应用层”。
    TCP/IP 又没有跳出 OSI 模型,只是发生了跨越和变形,一些层的功能描述分在两个协议里实现,而一些协议实现了不同层的功能。真要说事实标准那么事实的复杂性根本不能用层解释了。
    用 KCP 怎么算? TLS/SSL 怎么算?中间挂了些代理甚至 $$/∨ray,应用层还会有 WebSocket 在七层上重新做出一个四层的协议,然后还有各种拍脑袋出来的 “协议”。要把上面的全部归到和 HTTP 同一层不仅诡异,而且其实和套用 OSI 模型一样地生硬。
    catror
        63
    catror  
       2019-03-27 17:24:30 +08:00
    @no1xsyzy 我知道你在说的什么,既然你提出来,那我就说说我对网络的理解吧。从操作系统的角度来看,数据在传输层( TCP/UDP )之上都是具体的应用在处理,不管什么样的花式协议,操作系统都不关心。所以,你提及的这些协议都是 TCP/IP 模型的应用层协议。应用在自己的数据处理中,再做二次协议分层是很正常的事情,但是这时候的分层已经不能算是通用网络模型的分层了。之所以会觉得生硬,是因为你把本来不应属于通用网络模型的分层强行套进去。
    no1xsyzy
        64
    no1xsyzy  
       2019-03-27 20:15:29 +08:00
    听起来好像是符合 “关注点分离” 的分层?那我不太明白四层的下面两层是什么。
    那样的话不应该是 硬件层——内核层——应用层 这样三层区分吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5173 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 08:20 · PVG 16:20 · LAX 01:20 · JFK 04:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.