有个手机软件需要很频繁的调用服务器端接口,你知道的,每个字节都是钱呀,钱呀钱,命相连呀。本来已经有个现成的tomcat的http(get/post)的接口,但是担心流量消耗太大,需要做个评估,看是采用http接口,还是使用多线程的socket udp接口,于是就有了下面这一出。
相关工具:
序号 |
工具 |
描述 |
1. |
Nc |
Linux下的著名socket调试瑞士军刀,系统自带 |
2. |
Tcpdump |
Linux下抓包工具,系统自带,不过需要root权限 |
3. |
Wget |
Linux下http的调用工具,系统自带 |
4. |
Sockettools |
Wins绿色版本的socket调试工具,这个在上次讲loadrunner的socket脚本录制里面提到过使用方法 |
5. |
WiresharkPortable.exe |
Wins下的抓包及分析工具,我只下载了一个绿色版本的分析工具,不能抓包 |
6. |
WinSCP.exe |
Ssh连接linux,使用sftp协议传回抓包文件 |
第一部分:
SOCKET(UDP)通讯过程消耗字节数测试方案:
1. Linux上开启抓包:sudotcpdump -i eth0 -n -vv -v -s 0 -w xxxx.cap
2. Linux(nc)启动udp服务器端:nc -4 -u-l 2389
3. Window7家庭版32bit启动sockettools.exe启动udp客户端建立连接;
4. 客户端发送24个字节;例如:[ 0319B38ED7, 056243F315, 1A56AEF715]
5. 客户端中断连接;
6. 停止抓包
7. 使用winscp传回数据包进行分析。
来,看看结果吧:
用WiresharkPortable.exe打开数据包,先得过滤一下:
过滤条件表达式:ip.src == xxx and ip.dst == yyy and ip.proto == 17
ip.proto == 17 这个就是udp协议,将xxx和yyy替换成你的源和目标地址
结果:
就一个udp数据包:52+24=76个字节,也就是说如果你发送24个字节,附带上包头什么的一共76个字节,没数据就52个字节。
第二部分:
HTTP通讯过程消耗字节数测试方案:
1. Linux上进行抓包:sudotcpdump -i eth0 -n -vv -v -s 0 -w xxxx.cap
2. Linux上wget调用url:wget url
3. 停止抓包;
4. 使用winscp传回数据包进行分析
结果:
过滤条件表达式1:ip.src == xxx and ip.dst == yyy
TCP发出7个包,有1个数据包(因为是附带的HTTP包头,所以不能省略):
SYN:74
ACK:66
PSH,ACK:241
ACK:66
ACK:66
FIN,ACK:66
ACK:66
合计:
74+66+241+66+66+66+66=645
过滤条件表达式2:ip.src == yyy and ip.dst == xxx
TCP 收到5个包,有两个数据包:
SYN,ACK:74
ACK:66
PSH,ACK:1090:数据包:假定只带和上次一样的http包头,计为241个字节
PSH,ACK:785:数据包
FIN,ACK:66
合计(如果不包含数据):
74+66+241+66=447
如果不包含数据总共:645+447=1092
最后结论:
http接口底层是tcp协议的,设计就是稳定可靠的传输,加上包上了http一层,每次调用的流量比简单的udp调用要大很多,简单的说就是:1092/52=21,刚好21倍。调用1次http接口相当于调用21次udp接口。
假定手机每5秒调用一次接口,一分钟12次,每天调用2个小时,那么每个月消耗:
UDP: 52*12*60*2*30=2246400=2.246m
HTTP: 2246400*21=47174400=47.174m
如果你的手机软件打算节约流量,就用多线程的udp做后台服务吧;
如果你的手机软件打算尽可能多的消耗流量,就别用udp了。
这个是纯理论推导的,可能真到用的时候,电量消耗比流量消耗还要命。