0

プログラムが Java オブジェクトをネットワーク経由で送信するために使用する帯域幅の量を測定しようとしています。オブジェクトをディスクにシリアル化し、ファイル サイズを指標として使用できると思っていましたが、そうではないようです。私がしたことは、tcpdump でネットワークの使用状況をキャプチャしながら、オブジェクトをファイルにシリアル化することでした。

sudo tcpdump -l -i lo port 54544 | tee test_112_512

次に、使用された合計トラフィックを決定するために、次のコマンドを使用しました。

cat test_112_512 | grep '54544 >' | awk '{N = N + $NF + 20} END {print N}'

20 バイトは、長さを報告するときに tcpdump が考慮しない TCP ヘッダー (~250 パケット) を考慮するためのものです。grep の部分は、戻ってくるトラフィックを無視することです。私はそれに興味がないからです。

この方法を使用すると、ネットワーク トラフィックの合計がディスク上のファイル サイズよりも最大 10% 少なくなることがわかりました。ディスク上のファイルには TCP ヘッダーがないため、これは予期しない結果です。私は何か間違ったことをしていますか?

4

2 に答える 2

0

Java シリアライゼーションは、宛先に関係なく常に同じサイズです。送信量を減らすことができる 1 つのことは、同じストリームで以前に送信したものです。たとえば、オブジェクトを既存のストリームに書き込む場合、ファイルだけに書き込む場合よりもサイズが小さくなる可能性があります。

于 2012-07-02T16:19:17.213 に答える
0

明らかに、すべての TCP オーバーヘッドを考慮していません。たとえば、TCP ヘッダーは 20 バイトよりも長くなる可能性があり、可変長であり、接続と終了のハンドシェイク、ACK なども考慮していない可能性があります。

于 2012-07-03T02:32:11.640 に答える