Game Engines
› Unreal Engine
› MyCryENGINE
e8c47a0d

WebSocket 会存在碰包的情况吗?

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

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

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

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

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

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

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

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

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

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