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

nodejs 有没有好用的解决粘包问题的库?

  •  
  •   cl903254852 · 2020-10-12 14:00:00 +08:00 · 8559 次点击
    这是一个创建于 1501 天前的主题,其中的信息可能已经有所发展或是发生改变。
    58 条回复    2020-10-30 20:05:41 +08:00
    temporary
        1
    temporary  
       2020-10-12 14:10:11 +08:00
    粘包是什么
    Mohanson
        2
    Mohanson  
       2020-10-12 14:12:35 +08:00 via Android   ❤️ 29
    喂,110 吗
    LANB0
        3
    LANB0  
       2020-10-12 14:15:58 +08:00
    粘包是什么?
    基于 TCP 的应用层协议数据,处理方法只有 2 种:
    1 、逐字节从 socket 读取数据,匹配起始标识和头信息,根据头信息中的数据段长度继续读取指定长度的数据段
    2 、socket 收的数据全部丢入循环缓冲区,同时运行指定的分包线程从缓冲区分包取数据包处理
    mxT52CRuqR6o5
        4
    mxT52CRuqR6o5  
       2020-10-12 14:26:38 +08:00 via Android   ❤️ 1
    别用 tcp,用些上层协议(比如 websocket),解决方案也无非是自己再实现一套类似 websocket 的上层协议
    stephenxiaxy
        5
    stephenxiaxy  
       2020-10-12 14:27:57 +08:00
    自己根据自定义协议处理
    no1xsyzy
        6
    no1xsyzy  
       2020-10-12 14:28:37 +08:00
    Cops In Action
    joyhub2140
        7
    joyhub2140  
       2020-10-12 14:59:23 +08:00
    tcp 是流吧。。。粘包是个什么鬼。。。

    在 tcp 流里读取数据,一定会有边界的概念的,我们一般在流里的前几个字节存放后面的 data 的长度,再根据这个长度获取数据流的 data 啊。
    nutting
        8
    nutting  
       2020-10-12 15:02:34 +08:00
    狗头伸出来
    dallaslu
        9
    dallaslu  
       2020-10-12 15:03:26 +08:00   ❤️ 3
    他来了他来了,他带着两个粘在一起的包来了
    GM
        10
    GM  
       2020-10-12 15:03:37 +08:00
    @joyhub2140
    大部分是初学者不理解 stream 这个概念,总以为发送方 send 了一次,接收方 read 一次就能读到完整内容(恰恰好完整,不多也不少),结果实际发现 read 出来的内容有时候多、有时候少、又有时候刚刚好相同,百思不得其解,最后有人对这种现象造出一个词:“粘包”。
    noe132
        11
    noe132  
       2020-10-12 15:21:00 +08:00 via Android
    这得看你想处理粘(nian)包还是粘(zhan)包
    cl903254852
        12
    cl903254852  
    OP
       2020-10-12 15:59:08 +08:00
    @noe132 是粘包(手动狗头)
    cl903254852
        13
    cl903254852  
    OP
       2020-10-12 16:02:11 +08:00
    @GM 正解
    wysnylc
        14
    wysnylc  
       2020-10-12 16:03:11 +08:00   ❤️ 9
    大胆,何人在此粘包!
    cl903254852
        15
    cl903254852  
    OP
       2020-10-12 16:04:14 +08:00
    @stephenxiaxy 想偷个懒 找个第三方插件用用
    cl903254852
        16
    cl903254852  
    OP
       2020-10-12 16:04:38 +08:00
    livepps
        17
    livepps  
       2020-10-12 16:04:45 +08:00
    手写也是分分钟吧,消息头加上长度。
    超过长度的数据切割出消息,末尾多的数据缓存等待新数据。
    不够长度的直接缓存等待新数据。
    opengps
        18
    opengps  
       2020-10-12 16:15:29 +08:00 via Android
    自己重新封装下 socket 处理吧
    reus
        19
    reus  
       2020-10-12 16:23:23 +08:00
    所有能处理流的,都能处理 tcp
    例如绝大部分浏览器都自带的 Streams api
    https://developer.mozilla.org/en-US/docs/Web/API/Streams_API
    菜。
    Chenamy2017
        20
    Chenamy2017  
       2020-10-12 16:50:49 +08:00
    流处理处理,协议定义好,协议头+数据内容。协议头固定长度且包括数据内容长度,然后就是按需从流数据里面取数据就好了。
    muzuiget
        21
    muzuiget  
       2020-10-12 16:54:39 +08:00
    月经问题,认为“粘包”是个问题,都是对“数据流“概念理解错误。
    back0893
        22
    back0893  
       2020-10-12 16:55:37 +08:00 via Android   ❤️ 2
    粘包警察不请自来
    imherer
        23
    imherer  
       2020-10-12 17:05:44 +08:00
    果然,我就知道会是这样的评论🐶
    xuanbg
        24
    xuanbg  
       2020-10-12 17:19:39 +08:00
    别想着直接用 socket 传数据,应用层协议不好给你吃掉的啊,楼主。
    ochatokori
        25
    ochatokori  
       2020-10-12 17:23:36 +08:00 via Android
    粘包警察出动
    zunceng
        26
    zunceng  
       2020-10-12 17:24:30 +08:00
    用个 rpc 吧 别手撸 tcp 了 大家都不知道怎么回答你
    PepperEgg
        27
    PepperEgg  
       2020-10-12 17:25:00 +08:00
    粘包听起来感觉就像是 一个包数据流在光纤中传输被后面一个包追上了 两人打了一架 XD
    boris93
        28
    boris93  
       2020-10-12 17:27:13 +08:00 via Android
    @PepperEgg 是追尾 /滑稽
    yolee599
        29
    yolee599  
       2020-10-12 17:36:29 +08:00
    粘包警察不请自来。tcp 就是数据流协议,不存在“粘包”一说。
    zsdroid
        30
    zsdroid  
       2020-10-12 17:41:30 +08:00
    正确的发帖法:nodejs 有没有好用的解决粘流问题的库
    shyling
        31
    shyling  
       2020-10-12 17:43:16 +08:00
    有,不用 nodejs,推荐 netty
    lingxi27
        32
    lingxi27  
       2020-10-12 17:44:39 +08:00
    这不是一个“问题”
    bleepbloop
        33
    bleepbloop  
       2020-10-12 17:47:36 +08:00
    参考 http 协议
    BreadBig
        34
    BreadBig  
       2020-10-12 18:53:55 +08:00
    @Chenamy2017 正解。
    基于 tcp 自定义的应用层协议,自己按约定好的协议拆包即可,想找现成的工具库不现实
    leafdream
        35
    leafdream  
       2020-10-12 19:13:34 +08:00
    先看看脑子
    monkeyWie
        36
    monkeyWie  
       2020-10-12 19:40:48 +08:00 via Android
    日常粘包
    icyalala
        37
    icyalala  
       2020-10-12 19:48:23 +08:00   ❤️ 2
    看到标题就猜到下面回复是个什么样子了🤣
    neoblackcap
        38
    neoblackcap  
       2020-10-12 19:53:20 +08:00
    @cl903254852 你又要基于 TCP 进行网络编程,你又不要定义协议的解析方式。那为什么要用 TCP 呢?你基于 http 不就可以了?
    masker
        39
    masker  
       2020-10-12 19:54:33 +08:00 via Android
    钓鱼一时爽,全家***
    neoblackcap
        40
    neoblackcap  
       2020-10-12 19:55:32 +08:00
    @zsdroid 流就更没有粘流了,不如直接说有没有网络编程方式不用自己解析协议好了。
    我是不明白既然都不愿意定义协议了,为什么还要基于 TCP 进行编程。
    springz
        41
    springz  
       2020-10-12 20:02:00 +08:00
    看到标题就知道评论区盛况了,用上层协议吧,http,websocket 都行,非要用 TCP 那就自己定义下结构,最简单的定义一个起始标志位后面有多少个字节的数据,往后逐字节读到 buffer 里。
    AmosAlbert
        42
    AmosAlbert  
       2020-10-12 20:14:29 +08:00
    TCP 没有粘包这个说法哈,下次注意点
    正确的发帖法:nodejs 有没有好用的解决粘流问题的库
    ZRS
        43
    ZRS  
       2020-10-12 20:15:11 +08:00 via iPhone
    不样钓鱼
    pabupa
        44
    pabupa  
       2020-10-12 20:18:59 +08:00
    哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
    djoiwhud
        45
    djoiwhud  
       2020-10-12 20:33:04 +08:00
    你都用 nodejs 了,为啥不用 websock ? websock 读一次是一个完整的包。
    lewinlan
        46
    lewinlan  
       2020-10-12 20:47:17 +08:00 via Android
    粘包警察可真优越啊
    lxilu
        47
    lxilu  
       2020-10-13 00:54:23 +08:00 via iPhone
    还是叫乱流吧
    cl903254852
        48
    cl903254852  
    OP
       2020-10-13 09:37:58 +08:00
    @masker 谁钓鱼?不想回答就不回答,不要说这种“脏话”,我没惹着你
    cl903254852
        49
    cl903254852  
    OP
       2020-10-13 09:40:29 +08:00
    @neoblackcap 是需要定义协议的,header 固定,加个 body 长度,然后封装一下就行了,我是想如果有比较好用的库能帮我解决,我就不用自己写了
    raptor
        50
    raptor  
       2020-10-13 10:15:16 +08:00
    粘包这个说法从开始就是个误导加错误的概念,不知道是哪个 TCP 没学好的沙雕造出来的说法……
    letking
        51
    letking  
       2020-10-13 10:48:07 +08:00
    @cl903254852 那你直接问有没有封装协议的库不好吗?跟谁学的“粘包”?
    baxtergu
        52
    baxtergu  
       2020-10-13 11:04:26 +08:00
    固定长度消息头里写消息体的长度,读取的时候不够就缓存下来不处理,等下一个包拼起来完整了再处理
    oneoyn
        53
    oneoyn  
       2020-10-13 11:28:35 +08:00
    netty
    cl903254852
        54
    cl903254852  
    OP
       2020-10-13 15:02:26 +08:00
    @letking 我也是在网上的文档中看到的粘包这个词
    samzhou
        55
    samzhou  
       2020-10-13 21:35:12 +08:00
    这两个库配合使用很好
    ByteBuffer
    ExBuffer

    发现这个网站论坛,吹水的人比较多,务实的少。。。
    而且看到想回复你总是,连个注册登录都要 VPS 跑到 google 上去。。。
    cl903254852
        56
    cl903254852  
    OP
       2020-10-14 16:51:03 +08:00
    @samzhou 没办法,我对这方面也是懵懂,所以“挨喷”也正常。感谢提供的库,我去研究研究
    cl903254852
        57
    cl903254852  
    OP
       2020-10-14 16:59:36 +08:00
    @Chenamy2017 如果在协议头添加一个请求 ID 作为唯一标识,比如整个标识从 0 自增,问题是这段代码可以说是高频的,而协议头是固定大小的,请求 ID 早晚会溢出,这个有好的方法吗?
    aaronlam
        58
    aaronlam  
       2020-10-30 20:05:41 +08:00
    [为什么 TCP 要粘我的数据包]( https://www.aaronlam.xyz/2019/04/04/why-tcp-sticky-my-packet/) 可以了解一下。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2957 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 14:36 · PVG 22:36 · LAX 06:36 · JFK 09:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.