一次HTTP请求流量分析详解(很详细一看就懂)

news2024/11/17 14:44:21

为什么要研究一个请求需要多少流量?

某天,办公室WIFI挂了,然后就开启热点用了一天,手机流量直接耗光50多个G。

后来排查发现有个任务每分钟成百上千个请求,所以才开始想到研究一下每个请求到底消耗了多少流量。以便在今后的工作中,某些场景下需要节约流量时如何处理。

目录

一、本地环境

二、抓包分析

2.1 TCP三次握手

2.2 正常业务数据传输

2.3 TCP四次挥手

2.4 异常情况

三、流量统计分析总结

3.1 痛点

四、扩展


一、本地环境

操作系统: MacOs Sonoma 14.0

网络分析工具:Wireshark

Wireshark下载地址:

  • windows下载地址:Wireshark
  • Mac下载地址:Wireshark · Go Deep
  • 本地环境安装包4.0.8下载资源地址:https://download.csdn.net/download/imwucx/88399757
  • 安装:一直点下一步即可。

二、抓包分析

随机发一个请求,以度娘为例,先获取度娘ip:

发一次请求命令 curl www.baidu.com:

Wireshark抓包如下:

  • 上部分窗口:为数据包概要信息窗口
  • 左下角窗口:为数据包解析窗口
    • Frame:表示该帧数据的整体信息
    • Ethernet:数据链路层
    • Internet:网络层
    • Transmission Control Protocol:传输控制协议
    • Hypertext transfer protocol:超文本传输协议
  • 右下角窗口:为数据包数据窗口

如上图所示分析,分为三个阶段:

  • No 4526, No 4527, No 4528 是TCP三次握手
  • No 4529 ~ No 4533 数据传输
  • No 4534, No 4537, No 4538, No 4539 是TCP四次挥手

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

2.1 TCP三次握手

首先是三次握手,毕竟 HTTP 也是基于TCP的,所以需要先建立TCP连接:

  • 客户端:发送两次请求(No 4526和 No 4528)总共 78字节 + 54字节 = 132字节,
  • 服务端:一次请求(No 4527)共 78 字节。

2.2 正常业务数据传输

然后是数据传输:

  • 客户端:发起两次消耗流量分别是 130字节 + 54字节 = 184字节
  • 服务端:发起三次消耗流量分别是 54字节 + 1494字节 + 1395字节 = 2943字节

2.3 TCP四次挥手

最后是结束阶段四次挥手:

  • 客户端:发起两次消耗流量分别是 54字节 + 66字节 = 120字节
  • 服务器:发起两次消耗流量分别是 54字节 + 54字节 = 108字节

2.4 异常情况

异常流量:

一次TCP Spurious Retransmission(No4535)、一次TCP retransmission(No4536)和一次TCP Dup ACK(No4540):总共消耗流量 1395字节(服务端) + 66字节(客户端) + 66字节(服务端) = 1527字节

  • TCP Spurious Retransmission(No 4525):意味着发送端认为发送的包已经丢失了,然后就重传了,尽管此时接收端已经发送了对这些包的确认(确认还没收到或者已经丢失了)
  • TCP retransmission(No 4536 客户端做的应答):如果一个包真的丢了,又没有后续包可以在接收方触发[Dup Ack],就不会快速重传。这种情况下发送方只好等到超时了再重传,此类重传包就会被Wireshark标上[TCP Retransmission]。
  • TCP Dup ACK(No4540):当乱序或丢包发生时,接收方会收到一些 Seq 号比期望值大的包。没收到一个这种包就会 Ack 一次期望的 Seq 值,提现发送方。

异常情况分析说明:

  • Packet size limited during capture:标记了的包没抓全
  • TCP Previous segment not captured:Wireshark 发现后一个包的 Seq 大于 Seq+Len,就知道中间缺失了一段。
  • TCP ACKed unseen segment:发现被 Ack 的那个包没被抓到,就会提示。
  • TCP Out-of-Order:后一个包的 Seq 号小于前一个包的 Seq+Len 时。
  • TCP Dup  ACK:当乱序或丢包发生时,接收方会收到一些 Seq 号比期望值大的包。没收到一个这种包就会 Ack 一次期望的 Seq 值,提现发送方。
  • TCP Fast Retransmission:三次DUP ACK之后出发快速重传。
  • TCP Retransmission:发送方只好等到超时了再重传。
  • TCP zerowindow:0窗口懂得都懂!没法再收。
  • TCP window Full:窗口耗尽。没法再发!
  • Time-to-live exceeded:分片无法正常组装

三、流量统计分析总结

经过前现的分析, 基本上已经可能确定消耗了多少流量,这里合计一下,一次http请求消耗流量如下表: 

CS/阶段TCP3次握手正常业务数据传输TCP四次挥手异常情况流量总计
Client132字节184字节120字节66字节502字节
Server78字节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%

3.1 痛点

假设一天请求度娘100万次http请求。

不计算异常情况一次HTTP请求总流量为 5092字节 - 66字节 - 1461字节 = 3565字节,即3565B。

  • 业务流量:2943字节 + 184字节 = 3127字节,即占87.71%
  • 非业务流量:132字节 + 78字节 + 120字节 + 108字节 = 438字节,即占12.29%

那么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包了,感兴趣的同学可以按以上步骤亲手操作抓包看看。HTTPS还会有额外的消耗(TLS握手消耗),所以理论上HTTP肯定是比HTTPS快的,但是HTTPS多了TLS层极大增强了安全性,会更加的安全。

PS:若大佬有更多的方案解决流量相关问题的想法,欢迎评论区留言交流或留言交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1077631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

orangepi 香橙派-实时时钟模块使用DS1307/DS3231/PCF8563

香橙派断电后,不带电池,所以时间也没法保持,需要增加模块进行时间处理 支持三种模块 DS1307/DS3231/PCF8563 在某宝上面可以买到 例子 I2cConnectionSettings settings new I2cConnectionSettings(1, Ds1307.DefaultI2cAddress); I2cDevi…

Java每日笔试题错题分析(2)

Java每日笔试题错题分析(2) 一、错题知识点前瞻第31题第24题第29题第10题 二、错题展示及其解析第31题第24题第29题第10题 一、错题知识点前瞻 第31题 三目运算符类型转换 在三目运算符java开发的环境下可以简单理解为双目运算符的类型转换问题&#xf…

基于YOLOv5、YOLOv8的烟雾报警检测(超实用项目)

目录 1.简介 2.YOLO算法 3.基于YOLOv5、YOLOv8的烟雾检测报警系统 3.1gui界面主代码 3.2YOLOv5主代码 视频已上传b站 YOLOv5、YOLOv8检测-烟雾检测报警系统_哔哩哔哩_bilibili 本文为系列专栏,包括各种YOLO检测算法项目、追踪算法项目、双目视觉、深度结构…

idea提示:无法下载源代码,找不到此对象的源代码

最近在入门消息队列,在项目里新引入了一个RabbitMQ的依赖,新建完Channel对象之后,调用该对象的方法queueDeclare想创建队列,结果发现方法里的参数都没有提示。遂点进去看,卧槽,源码下载不下来,这…

系统打印服务已关闭,竟然是它的问题!

故障现象: 一台电脑不能打印文件,一点打印就弹出对话框提示打印服务已关闭。手动开启打印服务后,大约不到1分钟打印服务又自动关闭了。 故障检修: 电脑重新启动后再次重启打印服务,打印服务依然还是会自动关闭。估计是…

【C刷题】day4

一、选择题 1、设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是( ) A: n0;while(chgetchar()!\n)n; B: n0;while(getchar()!\n)n; C: for(n0;getchar()!\n…

加密市场波动:地缘政治与美股走弱引发不确定性!

伴随着国庆假期的结束,多日波动率维持低位的加密市场也似乎开始苏醒。近期多次突破28000美元未果的比特币,于9日15:00开始从27800美元附近下跌,最低跌至27260美元,同期以太坊也至1550美元左右,创近半个月来新低。 Coin…

JVM 虚拟机面试知识脑图 初高级

导图下载地址 https://mm.edrawsoft.cn/mobile-share/index.html?uuid3f88d904374599-src&share_type1 类加载器 双亲委派模型 当一个类收到类加载请求,它首先把类加载请求交给父类(如果还有父类,继续往上递交请求).如果父类无法加载该类,再交给子类加载 防止内存中出现…

[LeetCode]链式二叉树相关题目(c语言实现)

文章目录 LeetCode965. 单值二叉树LeetCode100. 相同的树LeetCode101. 对称二叉树LeetCode144. 二叉树的前序遍历LeetCode94. 二叉树的中序遍历LeetCode145. 二叉树的后序遍历LeetCode572. 另一棵树的子树 LeetCode965. 单值二叉树 题目 Oj链接 思路 一棵树的所有值都是一个…

mysql面试题33:Blob和text有什么区别

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Blob和text有什么区别 Blob和text是数据库中存储大文本数据的两种数据类型&#…

都2023年了,你必须知道的几款主流性能测试工具!

市面上流行的压力/负载/性能测试工具多是来自国外,近年来国内的性能测试工具也如雨后春笋崛起。同时由于开发的目的和侧重点不同,其功能也有很大差异,下面就为您简单介绍10款目前最常见的测试产品。 1、kylinTOP测试与监控平台(商…

Transformer为什么如此有效 | 通用建模能力,并行

目录 1 更强更通用的建模能力 2 并行计算 3 大规模训练数据 4 多训练技巧的集成 Transformer是一种基于自注意力机制的网络,在最近一两年年可谓是大放异彩,我23年入坑CV的时候,我看到的CV工作似乎还没有一个不用到Transformer里的一些组…

毕业设计项目选题Java高考志愿咨询平台 高考志愿填报助手系统源码+调试+开题+lw

💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…

Netty 介绍

1 Netty 原理 Netty 是一个高性能、异步事件驱动的 NIO 框架,基于 JAVA NIO 提供的 API 实现。它提供了对TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-Listener 机制&…

jQuery 模版

一、安装 <script type"text/javascript" src"http://ajax.microsoft.com/ajax/jquery /jquery-1.4.min.js"></script> 二、元素隐藏/显示 &#xff0c;jQuery toggle() 通过 jQuery&#xff0c;可以使用 toggle() 方法来切换 hide() 和 sh…

关于系统/网络运维面试经验总结

一. 熟悉Linux命令 1. 最最最常问到的是 如何查看系统内存占用情况&#xff1f; ① free命令&#xff1a;free [-h][-m] 显示系统的内存使用情况&#xff0c;包括总内存、已使用内存、空闲内存等信息。其中&#xff0c;-m选项是以MB为单位来展示内存使用信息&#xff1b;-h选…

一些常见的测度

见 知乎 https://zhuanlan.zhihu.com/p/615270645

Linux添加新硬盘并挂载(mount)到目录下

首先列出文件系统的整体磁盘空间使用情况&#xff0c;可以用来查看磁盘已被使用多少空间和还剩余多少空间。 df -h 然后列出块设备信息&#xff1a;以树形展示你的磁盘以及磁盘分区信息 lsblk 现在有一块 3T 的磁盘 vdb&#xff0c;我们现在将它进行 磁盘分区 fdisk /dev/vd…

jdk的bin目录下的工具

Java Development Kit (JDK) 的 bin 目录包含了许多与 Java 开发和运行相关的命令。 以下是 bin 目录下一些常见的命令&#xff0c;包括 jps&#xff1a; java - 启动 Java 应用程序的命令。javac - Java 编译器&#xff0c;用于将 Java 源代码编译成字节码文件。javap - Java …

基于springboot实现家具销售电商平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现家具销售电商平台管理系统演示 摘要 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的交易方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&am…