私はより定期的に WebSocket 接続を使用しているので、内部でどのように動作するかに興味がありました。そこで、エンドレスの仕様書をしばらく掘り下げましたが、これまでのところ、伝送ストリーム自体をチャンク化することについては何も見つかりませんでした。
WebSocket プロトコルはこれをデータ フレームと呼びます (純粋なデータ ストリームを表すため、非制御フレームとも呼ばれます)。私が仕様を理解している限り、定義された最大長と定義された MTU (最大転送単位) 値はありません。つまり、単一の WebSocket データフレームには、仕様 (!) によって無限の量のデータが含まれる可能性があります。 (ここで間違っている場合は訂正してください。私はまだ学生です)。
それを読んだ後、私はすぐに小さなNode WebSocket サーバーをセットアップしました。私はAjaxの歴史が強いので(ストリーミングとコメットについても)、当初の私の期待は、「転送中にデータを読み取るための何らかのインタラクティブ モードが必要だ」というものでした。しかし、私は間違っていますよね?
4kbのデータから始めました。
サーバ
testSocket.emit( 'data', new Array( 4096 ).join( 'X' ) );
予想どおり、これは 1 つのデータチャンクとしてクライアントに到着します
クライアント
wsInstance.onmessage = function( data ) {
console.log( data.length ); // 4095
};
そのため、ペイロードを増やしましたが、実際には、ある時点でクライアント側のonmessage
ハンドラーが繰り返し起動し、送信を効果的にチャンクすることを期待していました。しかし、私のショックなことに、それは決して起こりませんでした(node-server 、 firefox、chrome、およびsafariクライアント側でテスト済み)。私の最大のペイロードは80 MBでした
testSocket.emit( 'data', new Array( 1024*1024*80 ).join( 'X' ) );
そして、それはまだクライアント上の 1 つの大きなデータ チャンクに到着しました。もちろん、接続が良好な場合でも、これには時間がかかります。ここでの質問は
- XHR readyState3 モードと同様に、これらのストリームをチャンクする可能性はありますか?
- 単一の ws データ フレームにサイズ制限はありますか?
- Websocket はそのような大きなペイロードを転送するはずがないのですか? (これは、定義された最大サイズがない理由をもう一度不思議に思うでしょう)
私はまだWebSocketについて間違った視点から見ているかもしれません.おそらく大量のデータを送信する必要はなく、送信する前に自分でデータを論理的にチャンク/分割する必要がありますか?