为什么要研究一个请求需要多少流量?
某天,办公室WIFI挂了,然后就开启热点用了一天,手机流量直接耗光50多个G。
后来排查发现有个任务每分钟成百上千个请求,所以才开始想到研究一下每个请求到底消耗了多少流量。以便在今后的工作中,某些场景下需要节约流量时如何处理。
目录
操作系统: MacOs Sonoma 14.0
网络分析工具:Wireshark
Wireshark下载地址:
随机发一个请求,以度娘为例,先获取度娘ip:
发一次请求命令 curl www.baidu.com:
Wireshark抓包如下:
如上图所示分析,分为三个阶段:
TCP三次握手和四次挥手图解详见:TCP三次握手和四次挥手(彻底弄明白)_小贤java的博客-CSDN博客TCP,全称 Transmission Control Protocal。从名字可以知道这是一个用于 控制传输 的位于传输层的协议。TCP 位于 TCP/IP 和 OSI 模型的传输层。我们最常使用的 HTTP 协议,底层通常使用的就是 TCP 协议。如果要在客户端和服务端创建 TCP 连接,我们需要在开始的时候发送三个请求确认双方的通信能力正常,这三次连接就被称为 TCP 的三次握手。建立 TCP 连接一段时间后,如果要断开 TCP 连接,就会进行 TCP 四次挥手过程完成断开操作。https://cxian.blog.csdn.net/article/details/133679493
首先是三次握手,毕竟 HTTP 也是基于TCP的,所以需要先建立TCP连接:

然后是数据传输:

最后是结束阶段四次挥手:
异常流量:
一次TCP Spurious Retransmission(No4535)、一次TCP retransmission(No4536)和一次TCP Dup ACK(No4540):总共消耗流量 1395字节(服务端) + 66字节(客户端) + 66字节(服务端) = 1527字节
异常情况分析说明:
经过前现的分析, 基本上已经可能确定消耗了多少流量,这里合计一下,一次http请求消耗流量如下表:
| CS/阶段 | TCP3次握手 | 正常业务数据传输 | TCP四次挥手 | 异常情况流量 | 总计 |
| Client | 132字节 | 184字节 | 120字节 | 66字节 | 502字节 |
| Server | 78字节 | 2943字节 | 108字节 | 1461字节 | 4590字节 |
从表中可以看到,发起一次度娘的HTTP请求,客户端消耗了502字节,服务端消耗流量4590字节,总共5090字节。
业务数据: 184字节 + 2943字节 = 3127字节,占比3127 / 5092 * 100% = 61.41%。
非业务数据: 5092字节 - 3127字节 = 1965字节,占比3127 / 5090 * 100% = 38.59%。
客户端:502 / 5092 * 100% = 9.86%
服务端:4590 / 5092 * 100% = 90.14%
假设一天请求度娘100万次http请求。
不计算异常情况一次HTTP请求总流量为 5092字节 - 66字节 - 1461字节 = 3565字节,即3565B。
那么100万次就是 1000000 * 3565 = 3565000000B = 3481445.31KB = 3399.85MB = 3.32GB。
业务流量: 3399.85MB * 87.71% = 2982.01MB = 2.91GB
非业务流量: 3399.85MB - 2982.01MB = 417.84 = 0.408GB (浪费的流量)
假设100万次http请求中我们只建立一次TCP三次握手和一次TCP四次挥手(即开启长连接,保持长连接也是消耗流量的),那么可以节省的流量有:438B * 1000000 = 438000000B = 427734.375KB = 417.71MB = 0.4079GB (就可以节省这些流量,当然还要减去长连接的流量)
这里不再抓HTTPS包了,感兴趣的同学可以按以上步骤亲手操作抓包看看。HTTPS还会有额外的消耗(TLS握手消耗),所以理论上HTTP肯定是比HTTPS快的,但是HTTPS多了TLS层极大增强了安全性,会更加的安全。
PS:若大佬有更多的方案解决流量相关问题的想法,欢迎评论区留言交流或留言交流。