【问题标题】:Why does Websocket RFC allows control frame interleaved with multiframe为什么Websocket RFC允许控制帧与多帧交错
【发布时间】:2014-04-15 10:21:10
【问题描述】:

来自 Websocket 的RFC6455, 控制帧可能与碎片帧交错。

我不明白它的必要性,因为它使发送和接收部分的设计更加复杂。

目前,控制框可以是“Close”、“Ping”和“Pong”(其他都保留)。

如果控制帧是“关闭”,那么接收分片的结束是没有用的,所以不需要交错(分片方可以只发送“关闭”操作码并停止发送更多的分片,因为你是在“关闭”之后不应该发送任何东西)。

如果控制帧是“Ping”或“Pong”,则没有任何意义。分片端正在向客户端发送数据,那么如果客户端还活着,为什么它会要求 ping 客户端(它已经在发送系统调用中具有此信息)?还是立即回复 ping,因为它实际上是在向客户端发送数据?

那么,为什么我们需要这种(交错控制帧的)机制呢?

【问题讨论】:

    标签: websocket rfc


    【解决方案1】:

    检测半开连接:http://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html

    对方可能正在向您发送数据,但无法获取您的数据。因此,能够交错 ping 和 pong,就可以检查至少另一端是否能够理解您的消息并回复它们。

    它并没有使它变得更复杂。无论如何,您都必须读取定界帧,当您找到控制帧时,采取行动并继续读取更多帧。

    http://www.whatwg.org/specs/web-apps/current-work/multipage/network.html#ping-and-pong-frames

    .3.4 Ping 和 Pong 帧

    WebSocket 协议规范定义了 Ping 和 Pong 帧 可用于保持活动、心跳、网络状态探测、 延迟检测等。这些暂时没有曝光 在 API 中。

    用户代理可以根据需要发送 ping 和未经请求的 pong 帧,例如 尝试维护本地网络 NAT 映射的示例,以 检测失败的连接,或向用户显示延迟指标。 用户代理不得使用 ping 或未经请求的 pong 来帮助服务器; 假设服务器将在适当的时候请求乒乓球 服务器的需求。

    【讨论】:

    • 如果对方能够向你发送数据,那么它会被告知连接被丢弃,因为它不会得到任何ACK(这是TCP协议的工作方式)。同样,如果接收端没有收到任何东西,发送 PING 将导致 TCP 错误,因此在这种情况下不需要交错,PING 将在分段期间发生(在套接字的 RX 部分,而不是 TX)在碎片化方面。
    • 在应用程序级别,客户端可能正在发送但不接收,尽管有 TCP,例如如果读取线程崩溃。但我认为使用交错控制帧的最重要原因是为了测量服务器和客户端之间的延迟。由于这些新技术的全部意义在于实现实时通信,因此这种内置的乒乓球是一种有价值的工具。还要记住,RFC6455 是 WebSockets 的第一个非草案版本,谁知道我们将来会有哪些控制框架。
    猜你喜欢
    • 2017-06-25
    • 2014-01-06
    • 2012-03-10
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2017-09-03
    相关资源
    最近更新 更多