第1、HTTP請求的過程介紹html
一個HTTP請求,涉及多個階段python
一、DNS解析域名git
二、請求從Clinet路由至Server,Clinet與Server創建TCP鏈接github
三、若是使用了HTTPS,還涉及SSL鏈接的創建數據庫
四、server開始準備數據後端
開始邏輯計算、調後端接口、查數據庫緩存等緩存
五、server開始傳遞數據服務器
數據準備完成,開始給client傳數據cookie
六、數據傳輸完畢app
七、整個過程可能還涉及屢次重定向
第2、關於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穩定版爲7.55.1(截止20170817)
源代碼:https://github.com/curl/curl
第三:用CURL檢測Clinet側發起的HTTP請求各階段時間,簡要說明
一、TCP創建鏈接的耗時:CONNECT-NAMELOOKUP
二、創建TCP鏈接到server返回client第一個字節的時間:
STARTTRANSFER-CONNECT
三、SERVER處理數據的時間:
能夠用STARTTRANSFER - PRETRANSFER計算獲得
四、CLIENT接收數據的耗時(開始接收至接收完成):
TOTAL-STARTTRANSFER
第4、例子:
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/
一、DNS解析耗時:0.008s
二、TCP創建鏈接的耗時:0.059-0.008=0.051s
三、SSL握手完成耗時:0.228-0.059=0.169s
169ms,多了一層SSL仍是很耗時的
四、server處理數據的時間:0.287-0.228=0.059
59ms,說明服務器處理很快
五、整體的耗時:0.228s
六、整個過程沒有redirect,因此redirect的耗時爲0
再舉一例:
服務器處理數據的耗時:2.305-0.014=2.291s
這就說明server端的性能是值得研究的。
對於server端而言,有須要分析它的耗時:
防火牆->負載均衡->應用->緩存和DB
須要深刻去分析這個時間消耗在哪一個環節,有針對性的優化。
第5、詳細說明
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