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

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

  •  
  •   wythechen · 26 天前用 Android 发布 · 6464 次点击
    64 回复  |  直到 2019-03-27 20:15:29 +08:00
        1
    toconoma   26 天前
    流动
        2
    fkdog   26 天前   ♥ 2
    TCP 连接可以当成是一条水管。
    传输的二进制是水流。
    水龙头开着,随时都会有水流出来。
    有时候半天没有一滴水,有时候水流充足。

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

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

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

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


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





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

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

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

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