码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 一次HTTP请求流量分析详解(很详细一看就懂)


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

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

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

    目录

    一、本地环境

    二、抓包分析

    2.1 TCP三次握手

    2.2 正常业务数据传输

    2.3 TCP四次挥手

    2.4 异常情况

    三、流量统计分析总结

    3.1 痛点

    四、HTTPS


    一、本地环境

    操作系统: 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:若大佬有更多的方案解决流量相关问题的想法,欢迎评论区留言交流或留言交流。

  • 相关阅读:
    AndroidStudio连不上adb报错ADB Connection Error
    2024年,计算机相关专业还值得选择吗?
    【ML-SVM案例学习】002梯度下降之求解最优解
    2021数学建模C题目– 生产企业原材料的订购与运输
    Spring Cloud Alibaba【Sentinel控制台环境安装基于Linux、将应用接入Sentinel、流量控制概述、流控模式之直接模式、流控模式之关联模式 】(六)
    【每日一题】咒语和药水的成功对数
    vue修饰符的用法
    爬虫Python
    基于单片机的多功能智能小车设计
    Install CUnit test framework on ubuntu
  • 原文地址:https://blog.csdn.net/imwucx/article/details/133753989
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号