4

これは単なる好奇心に基づく質問ですが、何か役立つことを学べるかもしれません。

私の Node.js サーバーでは、net.Server 経由でデータを受信したときに、各データ「パケット」のサイズ (バイト単位) を出力しました。

socket.on 'data', (data) -> console.log data.length

ほとんどの場合、1374 バイトであることに気付きました。それ以外の場合はすべて 1374 の倍数です。約 200 のデータ イベントから取得した最高値は 17,862 でした。

この 1374 という数字はどこから来たのですか? また、データ長がときどきその倍数になるのはなぜですか?


私の推測では、TCP では 1500 バイトがイーサネットの最も一般的な MTU であり、その他の 126 バイトが TCP パケットのヘッダーを構成しています。Node.js は、これらのパケットを十分に迅速に受信すると、これらのパケットをまとめることがあります。

4

1 に答える 1

1

126 の一部は、20 バイトの TCP ヘッダー自体によるものです。

データは、サーバーライブラリによって課された「ヘッダー」によってさらにパディングされます。これは、あなたが説明したまさにその理由で使用されます。複数のパケットが十分に接近して受信されたときにデータを「まとめる」。パケットが立て続けにある場合、含まれている追加情報を使用して、適切なパケットの順序が決定され、返されるデータが連結されます。

これは、データの完全なセットごとに行われる処理量を削減するための一般的な手法です (より大きな既存のセットに対して 1 回実行できるのに、3 つの別々のデータに対して 3 回処理を実行する理由)。 - ネゴシエーションが関係している場合、「愚かなウィンドウ シンドローム」として知られるものに寄与する可能性があります (ウィンドウが縮小され、配信されるデータがヘッダー自体よりも小さくなり、送信が非常に非効率になります)。ただし、この問題に達した場合は、おそらくデータの送受信方法を再考する必要があります。

于 2012-08-31T15:47:35.980 に答える