2014-04-15 19 views
1

从Websocket的RFC6455, 有可能控制帧与分段帧交织。为什么Websocket RFC允许控制帧与多帧交织

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

目前,控制框架可以是“关闭”,“平”和“邦”(其他一切都保留)。

如果控制帧是“关闭”,然后接收碎片的到底是没用的,所以没有交织将被要求(该分段侧可以只发送“关闭”操作码和停止发送任何更多的片段,因为你在“关闭”之后不应该发送任何东西)。

如果控制帧是“Ping”或“Pong”,它没有任何意义。碎片方正在向客户端发送数据,那么为什么它要求对客户端进行ping处理(如果它已经存在)(它已经在发送系统调用中有这个信息)?或者立即回复ping,因为它实际上是向客户端发送数据?因此,为什么我们为什么需要这种机制(交错控制帧)呢?

回答

1

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

对方可以发送你的数据,但无法让您的数据。所以能够交叉ping和pongs,可以检查至少另一端能够理解你的消息并回复它们。

它并没有让它变得更加复杂。无论如何,当你找到一个控制帧,采取行动并继续阅读更多帧时,你必须阅读分隔帧。

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

.3.4坪和傍帧

WebSocket协议规范定义Ping和傍镜架, 可以用于保持活动,心脏-节拍,网络状态探测, 延迟仪器等等。这些目前不在API中暴露 。

用户代理可以发送ping和未经请求的乒乓帧作为期望的话,用于 例如在试图维持本地网络的NAT映射,以 检测失败的连接,或以显示等待时间指标给用户。 用户代理不得使用ping或未经请求的pongs来帮助服务器; 假定服务器将在需要时随时请求服务器的需求。

+0

如果对方能够发送数据给你,那么它会被告知连接被丢弃,因为它不会得到任何ACK(这是TCP协议的工作原理)。同样,如果接收方没有收到任何东西,发送PING将导致TCP错误,所以在这种情况下不需要交织,PING将在分片过程中发生(在套接字的RX部分而不是TX)在分裂的一面。 – xryl669

+0

在应用程序级别,客户端可能正在发送,但无法接收TCP,例如,如果读取线程崩溃。但是我认为交织控制帧的最重要原因是用于检测,以测量服务器和客户端之间的延迟。由于这些新技术的重点在于实现实时通信,因此这种内置乒乓功能是一种有价值的工具。另外请记住,RFC6455是WebSockets的第一个非草稿版本,谁知道我们将来会有哪些控制帧。 – vtortola