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 序列化始终是相同的大小。可以减少发送量的一件事是您之前在同一流上发送的内容。例如,如果您将对象写入现有流,则它可能比您单独将其写入文件时要小。

于 2012-07-02T16:19:17.213 回答
0

显然,您还没有考虑所有 TCP 开销。例如,TCP 标头可以长到 20 个字节,它们是可变长度的,也许您还没有考虑连接和关闭握手、ACK 等。

于 2012-07-03T02:32:11.640 回答