我正在尝试测量程序用于通过网络发送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个字节用于计算TCP报头(~250个数据包),tcpdump在报告长度时不考虑这些报告。 grep部分是忽略任何流量,因为我对此不感兴趣。
使用此方法,我发现总网络流量比磁盘上的文件大小少10%。由于磁盘上的文件没有TCP标头,因此这是一个意外的结果。我做错了吗?
答案 0 :(得分:0)
无论目标如何,Java序列化始终具有相同的大小。可以减少发送量的一件事是您之前在同一个流上发送的内容。例如如果你把一个对象写入一个现有的流,它可能比你单独写一个文件要小。
答案 1 :(得分:0)
显然你没有考虑到所有的TCP开销。例如,TCP标头可以长20个字节,它们是可变长度的,也许你还没有考虑连接和关闭握手,ACK等。