Game Engines
Unreal Engine
MyCryENGINE
e8c47a0d

WebSocket 会存在碰包的情况吗?

  •  
  •   e8c47a0d · Aug 8, 2018 · 13644 views
    This topic created in 2836 days ago, the information mentioned may be changed or developed.
    既然 WebSocket 基于 tcp,那么这里大概能确定的是,在一条连接内,如果服务器或客户端的任意一端连续发消息,另一端也能按顺序收到。但如果,服务器和客户端几乎同时发出一连串消息,那么这些消息的顺序和完整性还能被保证吗?
    88 replies    2025-07-17 15:39:20 +08:00
    InternetExplorer
        1
    InternetExplorer  
       Aug 8, 2018   ❤️ 6
    所以你真的了解 TCP 吗
    momocraft
        2
    momocraft  
       Aug 8, 2018   ❤️ 1
    碰包这个词第一次听说
    Clarencep
        3
    Clarencep  
       Aug 8, 2018   ❤️ 1
    第一次听说“碰包”……
    cuzfinal
        4
    cuzfinal  
       Aug 8, 2018
    这些低级错误在大佬们设计 tcp 协议的时候早就解决了,还有碰包是什么鬼?
    wxt
        5
    wxt  
       Aug 8, 2018 via Android   ❤️ 1
    好像碰瓷
    wxt
        6
    wxt  
       Aug 8, 2018 via Android   ❤️ 11
    两个包撞上了,形成了一种原子力量,发生了聚变,产生了物理冲撞,爆炸形成了信息宇宙
    opiuy
        7
    opiuy  
       Aug 8, 2018   ❤️ 3
    你把我碰倒了,赔我 10 万个包,这件事就算了
    suikator
        8
    suikator  
       Aug 8, 2018 via Android
    恭喜 IT 民科喜提碰包😂
    suikator
        9
    suikator  
       Aug 8, 2018 via Android   ❤️ 7
    粘包:欢迎碰包弟弟加入这个大家庭😂
    elsove812
        10
    elsove812  
       Aug 8, 2018   ❤️ 1
    tcp 包这么智能,都会违章了
    CrisTao
        11
    CrisTao  
       Aug 8, 2018   ❤️ 1
    你是觉得他们会在同一个通道内撞上吗?当这是开车?
    wizardoz
        12
    wizardoz  
       Aug 8, 2018
    单工、半双工、全双工了解一下。
    TCP 是全双工
    misaka19000
        13
    misaka19000  
       Aug 8, 2018
    今日最佳
    catcn
        14
    catcn  
       Aug 8, 2018
    碰碰包
    catror
        15
    catror  
       Aug 8, 2018 via Android
    你逆行撞到我了,赔我的包
    glacer
        16
    glacer  
       Aug 8, 2018
    网线可不是单行道,先补补通信基础吧
    towser
        17
    towser  
       Aug 8, 2018
    TCP 是全双工协议,可以理解为发送路径和接收路径不是一条路,不会 ”碰包“。
    blueskit
        18
    blueskit  
       Aug 8, 2018 via Android
    在同轴电缆时代,倒确实会碰包。
    est
        19
    est  
       Aug 8, 2018   ❤️ 1
    LZ 的意思是 websocket 不是严格的 请求 - 响应,而是有可能连续请求中,夹杂着响应。

    那么答案是:是的。websocket 是一种双向流协议。你得考虑这种情况。

    其实原始的 http 也会有这种情况,只不过反向代理和 web 框架帮你把这事儿处理了。
    abcbuzhiming
        20
    abcbuzhiming  
       Aug 8, 2018
    我还以为说粘包呢,碰包是什么鬼?难道楼主没听说过发送和接收是分开的吗
    ericls
        21
    ericls  
       Aug 8, 2018 via iPhone
    可以保证一边发送的顺序是另一边接收的顺序
    paw
        22
    paw  
       Aug 8, 2018
    lz 是从以太半双工的年代穿越过来的吧
    e8c47a0d
        23
    e8c47a0d  
    OP
       Aug 8, 2018
    那么我肯定误解了 packet collision 这个概念,不过短时间内为什么这么多回复?这个节点
    e8c47a0d
        24
    e8c47a0d  
    OP
       Aug 8, 2018
    @InternetExplorer 不了解,只知道 tcp 可以保证完整性和顺序。
    est
        25
    est  
       Aug 8, 2018   ❤️ 1
    @ericls 看逻辑。如果只是 hello world 当然可以保证顺序。但是如果 websocket 架构可以异步返回,那么耗时长的肯定在后面返回,就没有顺序了。
    @e8c47a0d packet collision 是半双工的概念吧。。websocket 是全双工的。
    e8c47a0d
        26
    e8c47a0d  
    OP
       Aug 8, 2018
    @paw 第一次知道以太半双工的概念
    e8c47a0d
        27
    e8c47a0d  
    OP
       Aug 8, 2018
    @wizardoz 恍然大悟!
    noNOno
        28
    noNOno  
       Aug 8, 2018
    哈哈,新词
    e8c47a0d
        29
    e8c47a0d  
    OP
       Aug 8, 2018
    @est 看来可能需要自己在 ws 的基础上加一层通讯顺序的检测才能防止
    e8c47a0d
        30
    e8c47a0d  
    OP
       Aug 8, 2018
    @paw 抱歉应用层以下的协议完全没有研究过
    e8c47a0d
        31
    e8c47a0d  
    OP
       Aug 8, 2018
    @wxt 没有这么壮观吧
    e8c47a0d
        32
    e8c47a0d  
    OP
       Aug 8, 2018   ❤️ 1
    这 sb 帖子竟然飘到了今日最热……
    nobird
        33
    nobird  
       Aug 8, 2018 via iPhone
    我告诉你为啥变成了最热…… by 微博观光团
    changnet
        34
    changnet  
       Aug 8, 2018 via Android
    @est tcp 是有顺序保证的,哪里有异步就可能乱序的说法。异步只是说你程序不阻塞而已,和数据流的顺序有啥关系?
    e8c47a0d
        35
    e8c47a0d  
    OP
       Aug 8, 2018
    @nobird 天啊
    est
        36
    est  
       Aug 8, 2018   ❤️ 1
    @changnet

    收到 1 请求,worker 开始处理 1,暂时不返回
    收到 2 请求,worker 开始处理 2,立刻返回
    worker 返回 1 请求的结果

    这个时候如果你是客户端如何区分 2 个返回?仅靠顺序可能嘛?
    e8c47a0d
        37
    e8c47a0d  
    OP
       Aug 8, 2018
    @abcbuzhiming 粘包我知道,但分开的这件事有点不确定。
    est
        38
    est  
       Aug 8, 2018
    @e8c47a0d 粘包 这个倒是实实在在的伪概念。。国内游戏开发师徒制+百度流传出来的。。。
    e8c47a0d
        39
    e8c47a0d  
    OP
       Aug 8, 2018
    @est 所示的情况正是混乱的根源
    e8c47a0d
        40
    e8c47a0d  
    OP
       Aug 8, 2018
    @est 有听说过,当初找不到英文翻译后来才发现是国内来的。
    changnet
        41
    changnet  
       Aug 8, 2018 via Android
    @est 咱说的不是同一件事。我说的是发到 tcp 里的数据对方收到的也是按顺序的。你那是具体业务逻辑
    e8c47a0d
        42
    e8c47a0d  
    OP
       Aug 8, 2018
    恭喜本帖荣登 V2EX 首页顶部🎉㊗️
    est
        43
    est  
       Aug 8, 2018
    @changnet 也是不一定的。TCP OOB 了解一下。。2333。

    国内做技术的就是喜欢瞎 jb 发明名词,然后另一拨人对名词后面的需求又瞎 jb 起哄。

    分包 粘包 这个其实是 layer 7 应用层更上面的需求,其实也应该严肃对待。

    http 严格的来说属于 OSI 7 层了,websocket 至少 8 层了。websocket 里套业务逻辑应该 9 层了?
    allgy
        44
    allgy  
       Aug 8, 2018
    又一个自创名词的..."碰包"自己听起来不别扭吗,人家已经有习惯性的称谓"粘包"就不要瞎造词
    NullException
        45
    NullException  
       Aug 8, 2018
    双击
    paparika
        46
    paparika  
       Aug 8, 2018
    听俺们量子物理和 cs 双学位的老工程师给讲过,碰包和欧洲那边原子对撞机是一个原理的撒,搞不好哪天就碰出黑洞,把地球湮灭了哦
    loveCoding
        47
    loveCoding  
       Aug 8, 2018   ❤️ 1
    全双工,你可以理解为有两条通道....粘包倒是有...
    pagxir
        48
    pagxir  
       Aug 8, 2018 via Android
    我知道现实生活中有碰瓷现象,至于碰包也许是有吧。
    quickma
        49
    quickma  
       Aug 8, 2018
    多看书啊。
    crab
        50
    crab  
       Aug 8, 2018
    粘包 碰包 - -!
    pcmid
        51
    pcmid  
       Aug 8, 2018 via Android   ❤️ 2
    前几天我了解了粘包,今天我又知道了碰包。。。
    affyun
        52
    affyun  
       Aug 8, 2018 via Android
    坐等肉包豆包
    zhujinliang
        53
    zhujinliang  
       Aug 8, 2018
    发现碰包后,请出示船票,大喊“我可以上船了”
    shilyx
        54
    shilyx  
       Aug 8, 2018
    @est websocket 并不承载在 http 之上
    est
        55
    est  
       Aug 8, 2018
    @shilyx Upgrade 不是 http 发起?
    zhoulouzi
        56
    zhoulouzi  
       Aug 8, 2018   ❤️ 1
    贼讨厌 粘包 这种词汇,没有为什么。
    e8c47a0d
        57
    e8c47a0d  
    OP
       Aug 8, 2018
    @zhoulouzi 就好像设计师听到“美工”两个字一样……
    shilyx
        58
    shilyx  
       Aug 8, 2018
    @est 发起是的,但是似乎不能认为 websocket 是 http 承载的一层
    est
        59
    est  
       Aug 8, 2018
    @shilyx websocket 至少借了 http 的壳吧。端口一致,QoS 一致,握手一致。tls 也一致。
    ericls
        60
    ericls  
       Aug 8, 2018 via iPhone
    @est 我说的是先发的肯定先收到 不是先”请求”的先返回
    momocraft
        61
    momocraft  
       Aug 8, 2018
    把 ws 称为第 8 层感觉有点怪, 毕竟 upgrade 后那个 tcp 连接就完全归 ws 了 (而且 http over http tunnel 这样的用法不知得排到第几层去)
    est
        62
    est  
       Aug 8, 2018
    @ericls 这个其实没意义。大规模服务器部署的时候 websocket 不一定命中同一个 service/worker 来处理。
    hacher
        63
    hacher  
       Aug 8, 2018
    在 TCP 专业术语里叫:碰瓷
    jin5354
        64
    jin5354  
       Aug 8, 2018
    按 @est 说的这种场景,lz 想问的叫竟态啊。。
    jin5354
        65
    jin5354  
       Aug 8, 2018
    竞态
    dosmlp
        66
    dosmlp  
       Aug 8, 2018
    楼主肯定不知道 tcp 是怎么回事,可以说连“了解 TCP ”都达不到
    est
        67
    est  
       Aug 8, 2018
    @jin5354 race condition 我觉得主要会导致多个发起方同时等待。。。似乎也不太对。
    NUT
        68
    NUT  
       Aug 8, 2018
    火贴留名
    yanaraika
        69
    yanaraika  
       Aug 8, 2018
    猜楼主想问的是 server onReceive()和 send()方法要不要做同步。答案是当然要做,最简单的就是如果其中共享了数据加把锁
    wcsjtu
        70
    wcsjtu  
       Aug 8, 2018
    @est 网络数据达到顺序,和你应用层代码执行顺序没半毛钱关系。websocket 包并不包含 http 的帧头,所以不存在 websocket 是在 http 之上的说法。json、xml、protobuf 这些姑且可以算作 http 之上的协议。
    est
        71
    est  
       Aug 9, 2018 via Android
    @wcsjtu 所以有个问题,h2 里边 wss 如何跑的?
    fyibmsd
        72
    fyibmsd  
       Aug 9, 2018
    tcp 协议:笔给你,你来写
    Cambrian07
        73
    Cambrian07  
       Aug 9, 2018 via Android
    lz,有问题先 Google,哪怕百度一下也行啊,就不至于闹笑话了。
    哈哈哈
    agostop
        74
    agostop  
       Aug 9, 2018
    微博的都来了,V2 的脸往哪搁
    e8c47a0d
        75
    e8c47a0d  
    OP
       Aug 9, 2018
    @est #71 http/2 里的 wss 确实是包在 h2 里面。
    ryuzaki113
        76
    ryuzaki113  
       Aug 9, 2018   ❤️ 1
    tcp 没有“包”这个概念
    julyclyde
        77
    julyclyde  
       Aug 9, 2018   ❤️ 1
    @e8c47a0d packet collision 是数据链路层(协议访问控制子层)的概念
    这么多回复,是因为我把这篇转发到微博去了
    julyclyde
        78
    julyclyde  
       Aug 9, 2018
    @e8c47a0d packet collision 是数据链路层(介质访问控制子层)的概念。刚才写协议访问控制子层,是我短路写错了

    这么多回复,是因为我把这篇转发到微博去了
    e8c47a0d
        79
    e8c47a0d  
    OP
       Aug 9, 2018
    @Cambrian07 回复前只看了标题吧?
    @ryuzaki113 连 IP 都有,TCP 怎么没有包的概念?
    e8c47a0d
        80
    e8c47a0d  
    OP
       Aug 9, 2018
    @dosmlp 是在抱歉,我是搬砖出身的,勉强懂点应用层协议已经很不错了。我没读书,没什么文化,应用层之下的协议看不懂。
    AV1
        81
    AV1  
       Aug 9, 2018   ❤️ 1
    @e8c47a0d
    数据包( packet )是网络层(第 3 层)的数据单位,IP 协议就工作在网络层。
    TCP 属于传输层(第 4 层),传输层的数据单位是数据段( segment )。
    所谓的收发冲突是发生在数据链路层(第 2 层),这里的数据单位是数据帧( Frame )。
    HTTP、Websocket 都是应用层(第 7 层)的协议。

    从你的回复中可以看出,你的在网络分层方面的知识完全是混乱的,很明显你需要重新学习计算机网络课程,包括 OSI 和 TCP/IP 的概念和原理。
    Cambrian07
        82
    Cambrian07  
       Aug 9, 2018
    @e8c47a0d 我是看完了整个帖子回复的,你至少先搜索一下所谓的”碰包“再来发帖子啊。
    zhzer
        83
    zhzer  
       Aug 9, 2018
    真是活到老学到老
    misaka19000
        84
    misaka19000  
       Aug 9, 2018
    现代交换机都是全双工的,在早期的集线器中是有可能发生从两端同时接收到数据的情况的,不过这已经是链路层的事情了,网络层网上都不需要考虑这个问题,只要单纯的认为网络是全双工的就可以了
    julyclyde
        85
    julyclyde  
       Aug 10, 2018
    @e8c47a0d TCP 的 segment 是给 TCP 协议栈用的,不是给你用的。你写应用层只能看到“流”
    你必须首先树立“ TCP 是流”的概念,然后再去讨论其它事
    而不是质疑 TCP 到底是不是流
    yincrow
        86
    yincrow  
       Oct 19, 2019
    你应该没有使用过 WebSocket,WebSocket 的服务端只有接收到消息后才能发送,没有办法主动发送消息
    mzDV4TUeHyesLbUQ
        87
    mzDV4TUeHyesLbUQ  
       Aug 21, 2023
    @wxt 两个包撞上了,纠缠到了一起,最终实现了量子计算。
    alan9999
        88
    alan9999  
       Jul 17, 2025
    @yincrow 你搞错,你说的应该是 HTTP ,WebSocket 可以全双工通信
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1305 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 200ms · UTC 17:19 · PVG 01:19 · LAX 10:19 · JFK 13:19
    ♥ Do have faith in what you're doing.