首页 > 其他分享 >curl测试HTTP请求各阶段时间

curl测试HTTP请求各阶段时间

时间:2023-10-10 10:48:41浏览次数:46  
标签:HTTP pretransfer 耗时 connect 测试 time curl

# 使用CURL检测Clinet侧发起的HTTP请求各阶段时间,命令参考:
curl -o /dev/null -s -w

curl -o /dev/null -s -w time_namelookup:"\t"%{time_namelookup}"\n"time_connect:"\t\t"%{time_connect}"\n"time_appconnect:"\t"%{time_appconnect}"\n"time_pretransfer:"\t"%{time_pretransfer}"\n"time_starttransfer:"\t"%{time_starttransfer}"\n"time_total:"\t\t"%{time_total}"\n"time_redirect:"\t\t"%{time_redirect}"\n" https://www.baidu.com/

 

# 讲解一:

**第一、HTTP请求的过程介绍**

一个HTTP请求,涉及多个阶段
1、DNS解析域名
2、请求从Clinet路由至Server,Clinet与Server建立TCP连接
3、如果使用了HTTPS,还涉及SSL连接的建立
4、server开始准备数据,开始逻辑计算、调后端接口、查数据库缓存等
5、server开始传递数据,数据准备完成,开始给client传数据
6、数据传输完毕
7、整个过程可能还涉及多次重定向

**第二、关于CURL的介绍**

CURL是利用URL语法在命令行方式下工作的开源数据传输工具。
支持:DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, Telnet and TFTP. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, HTTP/2, cookies, user+password authentication (Basic, Plain, Digest, CRAM-MD5, NTLM, Negotiate and Kerberos), file transfer resume, proxy tunneling 等

最新版的curl稳定版为8.3.0(截止20231009)
源代码: https://github.com/curl/curl

**第三:用CURL检测Clinet侧发起的HTTP请求各阶段时间,简要说明**

 

 1、TCP建立连接的耗时:

CONNECT-NAMELOOKUP

2、建立TCP连接到server返回client第一个字节的时间:
STARTTRANSFER-CONNECT

3、SERVER处理数据的时间:
可以用STARTTRANSFER - PRETRANSFER计算得到

4、CLIENT接收数据的耗时(开始接收至接收完成):
TOTAL-STARTTRANSFER

**第四、例子**

curl -o /dev/null -s -w time_namelookup:"\t"%{time_namelookup}"\n"time_connect:"\t\t"%{time_connect}"\n"time_appconnect:"\t"%{time_appconnect}"\n"time_pretransfer:"\t"%{time_pretransfer}"\n"time_starttransfer:"\t"%{time_starttransfer}"\n"time_total:"\t\t"%{time_total}"\n"time_redirect:"\t\t"%{time_redirect}"\n" https://www.yqb.com/

 

1、DNS解析耗时:0.008s

2、TCP建立连接的耗时:0.059-0.008=0.051s

3、SSL握手完成耗时:0.228-0.059=0.169s
169ms,多了一层SSL还是很耗时的

4、server处理数据的时间:0.287-0.228=0.059
59ms,说明服务器处理很快

5、总体的耗时:0.228s

6、整个过程没有redirect,所以redirect的耗时为0

再举一例:

 

服务器处理数据的耗时:2.305-0.014=2.291s

这就说明server端的性能是值得研究的。

对于server端而言,有需要分析它的耗时:

防火墙->负载均衡->应用->缓存和DB

需要深入去分析这个时间消耗在哪个环节,有针对性的优化。

**第五、详细说明**

NAMELOOKUP:从开始计算,域名解析完成的耗时
CURLINFO_NAMELOOKUP_TIME. The time it took from the start until the name resolving was completed.

CONNECT:从开始计算,TCP建立完成的耗时
CURLINFO_CONNECT_TIME. The time it took from the start until the connect to the remote host (or proxy) was completed.

APPCONNECT:从开始计算,应用层(SSL,在TCP之上的应用层)连接/握手完成的耗时
CURLINFO_APPCONNECT_TIME. The time it took from the start until the SSL connect/handshake with the remote host was completed. (Added in in 7.19.0)

PRETRANSFER:从开始计算,准备开始传输数据的耗时
CURLINFO_PRETRANSFER_TIME. The time it took from the start until the file transfer is just about to begin. This includes all pre-transfer commands and negotiations that are specific to the particular protocol(s) involved.

STARTTRANSFER:从开始计算,开始传输数据的耗时(libcurl接收到第一个字节)
CURLINFO_STARTTRANSFER_TIME. The time it took from the start until the first byte is received by libcurl.

TOTAL:总的耗时
CURLINFO_TOTAL_TIME. Total time of the previous request.

REDIRECT:整个过程重定向的耗时,如果整个过程没有重定向,这个时间为0
CURLINFO_REDIRECT_TIME. The time it took for all redirection steps include name lookup, connect, pretransfer and transfer before final transaction was started. So, this is zero if no redirection took place.

另:python也有一个pycurl模块,大家可以尝试。

参考:
https://curl.haxx.se/libcurl/c/curl_easy_getinfo.html

参考原文地址:http://blog.51cto.com/h2ofly/1957171

 

# 讲解二:
curl是一个非常好用的命令行工具,经常被用来测试网站能否正常访问、网站URL响应什么状态码,上传和下载文件,以及调试API接口等。在我的工作中,也是经常用到curl。
但curl的功能远不止如此,curl还能记录http请求的耗时时间,根据这些信息我们可以分析性能瓶颈,这也是本次关注的重点。

首先配置curl的输出格式,打开~/.curlrc,输入以下内容。

-w "dnslookup: %{time_namelookup} | connect: %{time_connect} | appconnect: %{time_appconnect} | pretransfer: %{time_pretransfer} | starttransfer: %{time_starttransfer} | total: %{time_total}\n"


curl输出格式详解。

time_namelookup:dns解析总共消耗的时间
time_connect:从开始dns解析到tcp建联成功之间总共消耗的时间
time_appconnect:从开始dns解析到ssl握手成功之间总共消耗的时间,以收到Finished包为准
time_pretransfer:从开始dns解析到发起http请求之间总共消耗的时间
time_starttransfer:从开始dns请求到服务器响应首个字节之间总共消耗的时间
time_total:整个请求所消耗的时间,包含dns解析、tcp握手和ssl握手的时间


curl发起https请求,输出的内容是各阶段所消耗的时间,单位为秒。

root@k8s-master1:~# cat ~/.curlrc
-w "dnslookup: %{time_namelookup} | connect: %{time_connect} | appconnect: %{time_appconnect} | pretransfer: %{time_pretransfer} | starttransfer: %{time_starttransfer} | total: %{time_total}\n"
root@k8s-master1:~#
root@k8s-master1:~# curl -so /dev/null https://www.example.com
dnslookup:1.510|connect:1.757|appconnect:2.256|pretransfer:2.259|starttransfer:2.506|total:3.001
root@k8s-master1:~#

 

看得出来时间是递增的,例如time_connect包含了time_namelookup,time_appconnect包含了time_connect。
time_namelookup是dns解析总共消耗的时间,跟服务器性能没啥关系。主要关注的是除了dns解析以外的耗时,根据上面的信息,各阶段的耗时都已经整理好了。

dns解析耗时:1.510s
tcp建联耗时:1.757s - 1.510s = 0.247s
ssl握手耗时:2.256s - 1.757s = 0.499s
http首包耗时:2.506s - 2.259s = 0.247s
http传输耗时:3.001s - 2.506s = 0.495s
http总共耗时:3.001s - 2.259s = 0.742s


总共3秒的请求,dns解析占用了50%,其他的耗时貌似也不太理想。

http首包耗时是客户端开始发起http请求(time_pretransfer)到服务器响应首个字节(time_starttransfer)之间总共消耗的时间,不包含tcp建立和ssl握手时间。
另外这是以客户端角度来统计的耗时,以服务器的角度统计的耗时可能稍微有些差距。

参考原文地址:https://www.jianshu.com/p/6deb1335e296

# 其他:
-i/--include 使输出信息中包含 HTTP-header 的内容,比如 server-name、HTTP-version 等。

例子:
curl -i https://www.baidu.com

 

标签:HTTP,pretransfer,耗时,connect,测试,time,curl
From: https://www.cnblogs.com/JereLei/p/17754009.html

相关文章

  • shell_条件判断_条件变量测试
    条件测试变量测试变量测试就是把字符串信息,写入到变量中注意!!!对变量测试,必须加双引号[root@localhosttmp]#[-e"$file1"]&&echo"该文件存在"||echo"$file1文件不存在"风景.jpg文件不存在[root@localhosttmp]#touch风景.jpg[root@localhosttmp]#[-e"$file1......
  • RK3588平台产测之ArmSoM-W3软硬件重启测试
    1.简介专栏总目录ArmSoM团队在产品量产之前都会对产品做几次专业化的功能测试以及性能压力测试,以此来保证产品的质量以及稳定性优秀的产品都要进行多次全方位的功能测试以及性能压力测试才能够经得起市场的检验2.ArmSoM-W3软硬件重启测试方案软件方式重启系统3000......
  • 新手如何快速上手HTTP爬虫IP?
    对于刚接触HTTP爬虫IP的新手来说,可能会感到有些困惑。但是,实际上HTTP爬虫IP并不复杂,只要掌握了基本的操作步骤,就可以轻松使用。本文将为新手们提供一个快速上手HTTP爬虫IP的入门指南,帮助您迅速了解HTTP爬虫IP的基本概念和操作方法。第一步:了解HTTP爬虫IP的基本概念HTTP爬虫IP是一种......
  • 接口测试工具PostMan安装教程
    为了验证接口能否被正常访问,我们常常需要使用测试工具,来对数据接口进行检测。好处:接口测试工具能让我们在不写任何代码的情况下,对接口进行调用和调试。下载并安装PostMan首先,下载并安装PostMan,请访问PostMan的官方下载网址:https://www.getpostman.com/downloads/下载所需......
  • 10.9课堂测试
      ......
  • HTTP和HTTPS区别
    HTTP(HyperTextTransferProtocol)和HTTPS(HTTPSecure)都是用于在计算机之间传输数据的协议.但是,HTTPS在传输数据时使用了安全套接层(SSL)或者传输层安全(TLS)协议来加密数据,以防止第三方拦截或窃取数据。主要区别如下:1.安全性:HTTPS在传输过程中使用了加密技术,而HTTP......
  • 课上测试
     ......
  • 【Https异常】This request has been blocked; the content must be served over HTTP
    参考:https://www.cnblogs.com/756623607-zhang/p/11790283.html一、问题出现场景项目从http升级到https后,jsp页面存在发送http请求的情况下就会出现该异常。因为HTTPS是HTTPoverSecureSocketLayer,以安全为目标的HTTP通道,所以在HTTPS承载的页面上不允许出现http请求......
  • RK3588平台产测之ArmSoM-W3 DDR压力测试
    简介RK3588从入门到精通ArmSoM团队在产品量产之前都会对产品做几次专业化的功能测试以及性能压力测试,以此来保证产品的质量以及稳定性优秀的产品都要进行多次全方位的功能测试以及性能压力测试才能够经得起市场的检验环境介绍硬件环境:ArmSoM-W3RK3588开发板软件版本:OS......
  • Unity使用https请求握手失败的处理方案
    Unity使用https请求握手失败的处理方案HandshakefailedUNITYTLS_INTERNALS解决方案varhandler=newHttpClientHandler();//需要加这句handler.ClientCertificateOptions=ClientCertificateOption.Manual;//需要加这句using(HttpCli......