WebSocket 会存在碰包的情况吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Game Engines
Unreal Engine
MyCryENGINE
e8c47a0d
V2EX    游戏开发

WebSocket 会存在碰包的情况吗?

  •  
  •   e8c47a0d 201808-08 11:23:48 +08:00 13021 次点击
    这是一个创建于 2621 天前的主题,其中的信息可能已经有所发展或是发生改变。
    既然 WebSocket 基于 tcp,那么这里大概能确定的是,在一条连接内,如果服务器或客户端的任意一端连续发消息,另一端也能按顺序收到。但如果,服务器和客户端几乎同时发出一连串消息,那么这些消息的顺序和完整性还能被保证吗?
    88 条回复    2025-07-17 15:39:20 +08:00
    InternetExplorer
        1
    InternetExplorer  
       2018-08-08 11:25:02 +08:00   6
    所以你真的了解 TCP 吗
    momocraft
        2
    momocraft  
       2018-08-08 11:26:40 +08:00   1
    碰包这个词第一次听说
    Clarencep
        3
    Clarencep  
       2018-08-08 11:27:25 +08:00   1
    第一次听说“碰包”……
    cuzfinal
        4
    cuzfinal  
       2018-08-08 11:28:33 +08:00
    这些低级错误在大佬们设计 tcp 协议的时候早就解决了,还有碰包是什么鬼?
    wxt
        5
    wxt  
       2018-08-08 11:28:47 +08:00 via Android   1
    好像碰瓷
    wxt
        6
    wxt  
       2018-08-08 11:30:38 +08:00 via Android   11
    两个包撞上了,形成了一种原子力量,发生了聚变,产生了物理冲撞,爆炸形成了信息宇宙
    opiuy
        7
    opiuy  
       2018-08-08 11:30:43 +08:00   3
    你把我碰倒了,赔我 10 万个包,这件事就算了
    suikator
        8
    suikator  
       2018-08-08 11:32:20 +08:00 via Android
    恭喜 IT 民科喜提碰包
    suikator
        9
    suikator  
       2018-08-08 11:33:19 +08:00 via Android   7
    粘包:欢迎碰包弟弟加入这个大家庭
    elsove812
        10
    elsove812  
       2018-08-08 11:33:46 +08:00   1
    tcp 包这么智能,都会违章了
    CrisTao
        11
    CrisTao  
       2018-08-08 11:35:54 +08:00   1
    你是觉得他们会在同一个通道内撞上吗?当这是开车?
    wizardoz
        12
    wizardoz  
       2018-08-08 11:36:09 +08:00
    单工、半双工、全双工了解一下。
    TCP 是全双工
    misaka19000
        13
    misaka19000  
       2018-08-08 11:38:18 +08:00
    今日最佳
    catcn
        14
    catcn  
       2018-08-08 11:39:00 +08:00
    碰碰包
    catror
        15
    catror  
       2018-08-08 11:40:57 +08:00 via Android
    你逆行撞到我了,赔我的包
    glacer
        16
    glacer  
       2018-08-08 11:46:20 +08:00
    网线可不是单行道,先补补通信基础吧
    towser
        17
    towser  
       2018-08-08 11:46:52 +08:00
    TCP 是全双工协议,可以理解为发送路径和接收路径不是一条路,不会 ”碰包“。
    blueskit
        18
    blueskit  
       2018-08-08 11:49:22 +08:00 via Android
    在同轴电缆时代,倒确实会碰包。
    est
        19
    est  
       2018-08-08 11:49:57 +08:00   1
    LZ 的意思是 websocket 不是严格的 请求 - 响应,而是有可能连续请求中,夹杂着响应。

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

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

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

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

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

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

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

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

    从你的回复中可以看出,你的在网络分层方面的知识完全是混乱的,很明显你需要重新学习计算机网络课程,包括 OSI 和 TCP/IP 的概念和原理。
    Cambrian07
        82
    Cambrian07  
       2018-08-09 12:37:17 +08:00
    @e8c47a0d 我是看完了整个帖子回复的,你至少先搜索一下所谓的”碰包“再来发帖子啊。
    zhzer
        83
    zhzer  
       2018-08-09 15:04:36 +08:00
    真是活到老学到老
    misaka19000
        84
    misaka19000  
       2018-08-09 23:41:10 +08:00
    现代交换机都是全双工的,在早期的集线器中是有可能发生从两端同时接收到数据的情况的,不过这已经是链路层的事情了,网络层网上都不需要考虑这个问题,只要单纯的认为网络是全双工的就可以了
    julyclyde
        85
    julyclyde  
       2018-08-10 11:58:37 +08:00
    @e8c47a0d TCP 的 segment 是给 TCP 协议栈用的,不是给你用的。你写应用层只能看到“流”
    你必须首先树立“ TCP 是流”的概念,然后再去讨论其它事
    而不是质疑 TCP 到底是不是流
    yincrow
        86
    yincrow  
       2019-10-19 11:49:35 +08:00
    你应该没有使用过 WebSocket,WebSocket 的服务端只有接收到消息后才能发送,没有办法主动发送消息
    mzDV4TUeHyesLbUQ
        87
    mzDV4TUeHyesLbUQ  
       2023-08-21 14:14:03 +08:00
    @wxt 两个包撞上了,纠缠到了一起,最终实现了量子计算。
    alan9999
        88
    alan9999  
       86 天前
    @yincrow 你搞错,你说的应该是 HTTP ,WebSocket 可以全双工通信
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     928 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 19:14 PVG 03:14 LAX 12:14 JFK 15:14
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86