低延迟 websocket html 5 游戏的数据包大小

And*_*gan 5 html javascript websocket node.js socket.io

我正在制作 HTML 5 国际象棋游戏。我用长度(大小)为 64 的无符号 8 位二进制数组表示棋盘。因为国际象棋棋盘上有 64 个位置。

var board = Uint8Array(64);
Run Code Online (Sandbox Code Playgroud)

每个棋子在棋盘上通过(显然)8 位无符号整数表示。然后在客户端上有一个将片段的二进制表示与文本字符串相关联的映射,例如:

var pieceMap = { 01: 'BlackKnight', 112: 'WhitePawn', 6: 'BlackRook' ... }
Run Code Online (Sandbox Code Playgroud)

数据是通过 socket.io 连接发送的(假设我们使用的是 websockets),我认为是 TCP?所以问题是: TCP 是否会发送与我提供给它的数据一样小的数据包(带有 TCP 开销),或者 TCP 是否有最小数据包大小并将我的 200 字节数据包作为 1024 字节数据包发送?

为什么如此痴迷于尺寸?我知道这并不重要,但我用它来学习体验,在未来的游戏中我将用它来降低延迟......我知道国际象棋不需要低延迟。

Mam*_*aac 5

根据 RFC 的指示,成帧的数据包:

https://www.rfc-editor.org/rfc/rfc6455#section-5

每条消息的开销最多为 10 个字节,或者每个消息片段更少。每个片段发送多少字节由有效负载长度(帧的一部分)决定。不过,碎片可能相当大。除非您发送非常大的消息,否则我认为这不会成为问题。

根据成帧和分段的工作方式,如果成帧 + 数据仅为 100 字节左右,则不应发送/接收 1024 字节的数据。

我的猜测是,某些实现可能会存在细微的差异,但您不应该过多关注这样的细节,除非您开始看到我们的应用程序出现压力问题。

“过早优化是万恶之源”Donald Knuth

另一个细节:如果您确实想要非常低的延迟,则必须开始研究使用 UDP 或多播等技术。问题是:websockets 不支持这些。减少数据包大小对于网络来说并不是唯一重要的事情,但只是其中的一部分......根据我对 socket.io 的经验,CPU 在带宽之前成为小消息的瓶颈,RAM 也可能会受到很大的打击当消息处于低千比特时,也会在带宽之前。当然,这完全取决于你的应用,我只是说经验。