关于websockets协议发送BINARY数据的问题:
为什么屏蔽了有效负载?没有TCP保证数据完整性吗?
究竟什么是碎片?这是否意味着,如果我发送一个1000字节有效载荷的帧,另一端(由于中间代理)可能会收到四个独立的帧,分别为200,300,270和230字节(只有最后一帧有FIN)位设置?)
答案 0 :(得分:3)
从客户端发送到服务器(不是服务器到客户端)的有效负载既不是出于数据完整性和真实性的原因而被屏蔽,而是为了防止恶意脚本混淆(并可能攻击)旧的中介(Web代理等)。 / p>
任何符合RFC6455的WebSocket客户端都必须屏蔽客户端到服务器的帧。不过,有些库允许您关闭客户端的屏蔽,并关闭非屏蔽客户端帧的失败(例如AutobahnPython)。
后者可用于消除与屏蔽相关的CPU开销。当两个端点都在您的控制和之间时,两者之间的路由完全在您的控制之下(例如,通过环回或Unix域套接字或LAN讨论WebSocket)或者您正在使用TLS,因此(在大多数情况下)无论如何都没有中间人能够查看流量。
碎片的工作方式如下:WebSocket消息可以拆分为多个WebSocket框架 - 并且不仅可以由发送者在任何时间合并,而且还可以在前往接收者的途中合并任何中间人。是的,只有给定消息的帧序列的最后一个WebSocket帧才会设置FIN
位。