V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Game Engines
Unreal Engine
MyCryENGINE
e8c47a0d
V2EX  ›  游戏开发

WebSocket 会存在碰包的情况吗?

  •  
  •   e8c47a0d · 2018-08-08 11:23:48 +08:00 · 12441 次点击
    这是一个创建于 2299 天前的主题,其中的信息可能已经有所发展或是发生改变。
    既然 WebSocket 基于 tcp,那么这里大概能确定的是,在一条连接内,如果服务器或客户端的任意一端连续发消息,另一端也能按顺序收到。但如果,服务器和客户端几乎同时发出一连串消息,那么这些消息的顺序和完整性还能被保证吗?
    87 条回复    2023-08-21 14:14:03 +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
    我知道现实生活中有碰瓷现象,至于碰包也许是有吧。
    x7395759
        49
    x7395759  
       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 是在抱歉,我是搬砖出身的,勉强懂点应用层协议已经很不错了。我没读书,没什么文化,应用层之下的协议看不懂。
    DOLLOR
        81
    DOLLOR  
       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 两个包撞上了,纠缠到了一起,最终实现了量子计算。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   957 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 20:52 · PVG 04:52 · LAX 12:52 · JFK 15:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.