這篇文章主要講解了“如何使用curl工具分析HTTP請求網絡時延”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何使用curl工具分析HTTP請求網絡時延”吧!
curl 是一個非常優秀的網絡測試工具,也是目前使用最廣泛的網絡測試工具之一,特別是在HTTP協議的支持上,可以算是最優秀、使用最廣泛的工具,沒有之一。curl提供命令行工具與API庫,開發者可以在腳本中集成命令行工具、在應用程序中集成庫。curl可以抓取到網絡與通信協議傳輸中各個階段的耗時數據,在分析網絡性能的時候特別好用。<!--more-->
在當前互聯網應用架構上,一個典型的HTTP請求流,從客戶端發起請求,通過LocalDNS解析域名得到負載均衡服務的IP地址,訪問負載均衡服務的IP地址,負載均衡服務完成證書卸載,將請求轉發到后端服務。
Client LocalDNS LoadBalancer BackendService | | | | |--1.1 DNS Req---| | | time_namelookup |<-1.2 DNS Resp--| | | | | | |---------2.1 TCP SYNC--------------->| | |<--------2.2 TCP ACK/SYNC------------| | time_connect |---------2.3 TCP ACK---------------->| | | | | |--3.1 SSL ClientHello--------------->| | |<-3.2 SSL ServerHello/Certificate----| | |--3.3 SSL ClientKeyEx/ChangeCipher-->| | time_appconnect |<-3.4 SSL ChangeCipher/Finished------| | | | | time_pretransfer |--4.1 HTTP Request------------------>| | |<-4.2 HTTP StatusCode 100 Continue---| | |--4.3 HTTP Request Complete--------->| | | |--4.4 HTTP Request-------->| | |<-4.5 HTTP Response--------| time_starttransfer|<-4.6 HTTP Response------------------| | time_total | | |
通過上述HTTP請求流程拆解,可以得出HTTP請求的4個大段:
DNS解析
TCP建連
SSL握手
HTTP協議交互
通過curl工具作為客戶端,向服務端發起HTTP請求,可以采集上述4個分段的時延。
curl 命令通過 -w, --write-out <format> 選項可以獲取到上述4個分段的時延數據。 -w 的參數格式為 -w "...${var}..." ,其中 ${var} 是由 curl 提供的變量,通過這些變量就可以獲得到時延數據。
需要注意的是,curl輸出的每個變量值,是包含所有分段時延總值,因此計算每個分段時候需要做減法。
通過變量 time_namelookup 獲取DNS解析時延。
time_namelookup The time, in seconds, it took from the start until the name resolving was completed.
通過變量 time_connect 獲取TCP連接時延,此值包含了DNS解析的時延time_namelookup。因此,
TCP連接時延 = (time_connect - time_namelookup)
time_connect The time, in seconds, it took from the start until the TCP connect to the remote host (or proxy) was completed.
RTT(Round Trip Time) 是一個重要的網絡參數指標,TCP連接時延可以約等于RTT。
RTT ~= TCP連接時延
通過變量 time_appconnect 獲取SSL握手時延,此值包含了time_connect。因此,
SSL握手時延 = (time_appconnect-time_connect)
time_appconnect The time, in seconds, it took from the start until the SSL/SSH/etc connect/handshake to the remote host was completed. (Added in 7.19.0).
通過變量time_pretransfer獲取客戶端開始發送HTTP請求時延。 通過time_starttransfer獲取客戶端開始接收HTTP響應的第一個字節時延,也就是 TTFB(Time to First Byte)。 通過time_total獲取整個HTTP通信的時延。
HTTP協議交互時延 = (time_total-time_pretransfer)
HTTP數據傳輸時延 = (time_total-time_starttransfer),根據此值與響應消息包大小可以計算出帶寬。
time_pretransfer The time, in seconds, it took from the start until the file transfer was just about to begin. This includes all pre-transfer commands and negotiations that are specific to the particular protocol(s) involved.
time_starttransfer The time, in seconds, it took from the start until the first byte was just about to be transferred. This includes time_pretransfer and also the time the server needed to calculate the result.
time_total The total time, in seconds, that the full operation lasted.
curl 發送POST請求的Body大于1024字節的時候,默認會在HTTP請求頭中增加Expect: 100-continue,那么此時負載均衡服務會回復一個狀態碼為100的響應,此時time_starttransfer 的值是 curl接收狀態碼為100的響應時間,而不是實際開始接收后端服務響應數據的時間,如果負載均衡服務與后端服務地理位置分離部署,這個值就會差別很大。
為了避免這種情況,可以在curl命令行中顯示禁用Expect: 100-continue消息頭:
curl -H 'Expect:' ...
感謝各位的閱讀,以上就是“如何使用curl工具分析HTTP請求網絡時延”的內容了,經過本文的學習后,相信大家對如何使用curl工具分析HTTP請求網絡時延這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。