一次完整的請求+響應被稱為http事務,在http事務中有一系列的資訊交換,這些資訊交換是乙個不可分割的整體,也就是說,要麼所有的資訊全部交換完,要麼一次交換也不進行。(畢竟事務的特性擱那擺著)
http事務有以下四個部分組成:
客戶端與伺服器建立連線。http是基於tcp協議,這裡的連線可以理解為tcp連線;如果我們只知道伺服器的網域名稱,還需要在建立連線前發起dns解析,tcp的socket通訊需要伺服器的ip位址;建立連線的過程需要三次握手。
客戶端向伺服器傳送請求。在建立tcp連線之後,客戶端給伺服器傳送乙個http請求報文,請求報文中包含有客戶端需要的資源等資訊,例如最簡單的html文件。
伺服器給客戶端乙個響應。伺服器收到客戶端的請求後,可以拒絕客戶端的請求,也可以向客戶端傳送乙個http響應報文;這個響應中包含了客戶端請求的html文件。
客戶端與伺服器斷開連線。在客戶端收到伺服器響應後,可以選擇與伺服器斷開連線,也可以選擇繼續保持連線(http持續連線),以供下乙個http事務使用;客戶端和伺服器都可以發起關閉連線,關閉tcp連線需要四次揮手。
在學習http事務的過程中發現有的部落格中的將http事務解釋為下面這幾個步驟:
網域名稱解析
發起tcp的3次握手
建立tcp連線後發起http請求
伺服器端響應http請求,瀏覽器得到html**
瀏覽器解析html**,並請求html**中的資源
瀏覽器對頁面進行渲染呈現給使用者
在最後一步中,大多文章都寫的是瀏覽器渲染頁面,然後就沒了。個人理解,還是應該有關閉tcp連線這一步,在http/1.1中http報文中可以通過connection:close
來關閉連線。
剛開始,我也比較疑惑,是不是應該加上瀏覽器渲染頁面,如果加上這一步,瀏覽器到底是先渲染頁面還是先關閉tcp連線呢?不少網友認為在不考慮持續連線的前提下,服務端響應完http請求後,就會斷開連線,渲染是瀏覽器的事,和http協議並沒有關係。
如果有同樣疑惑可以看一看這兩篇文章:到底是瀏覽器渲染頁面還是先關閉tcp連線 和 an http transaction再者說,瀏覽器在http事務中僅僅是執行在客戶端上的乙個軟體,我們同樣可以使用一些其他的方式來發起http請求,例如使用 fiddler 可以模擬http請求,也可以通過網路程式設計來實現。而瀏覽器在http響應之後將html文件渲染成頁面反饋給了使用者,這和http事務關係不大。
如果有不同觀點,感謝指正!
在ubuntu環境下,可以使用crul
來獲取www.baidu.com
的首頁,然後可以通過tcpdump
抓包工具來獲取http事務的資訊交換過程。
curl
和tcpdump
這倆命令可以使用apt-get install
安裝。
2、使用curl獲取www.baidu.com的首頁
抓包記錄中的 flags 含義如下:tcpflags are some combination of s (syn), f (fin), p (push), r (rst),u (urg), w (ecn cwr), e (ecn-echo) or 『.』 (ack), or 『none』比如: flags[s]同步syn,flags[s.]syn確認報文
tcpdump命令詳解
tcpdump flags的含義
一次完整的HTTP事務
http通訊機制是在一次完整的http通訊過程中,web瀏覽器與web伺服器之間將完成下列7個步驟 1.建立tcp連線 在http工作開始之前,web瀏覽器首先要通過網路與web伺服器建立連線,該連線是通過tcp來完成的,該協議與ip協議共同構建internet,即著名的tcp ip協議族,因此in...
一次完整的HTTP請求
一次完整的http請求過程從tcp三次握手建立連線成功後開始,客戶端按照指定的格式開始向服務端傳送http請求,服務端接收請求後,解析http請求,處理完業務邏輯,最後返回乙個http的響應給客戶端,http的響應內容同樣有標準的格式。無論是什麼客戶端或者是什麼服務端,大家只要按照http的協議標準...
一次完整的HTTP請求
一次完整的http請求過程從tcp三次握手建立連線成功後開始,客戶端按照指定的格式開始向服務端傳送http請求,服務端接收請求後,解析http請求,處理完業務邏輯,最後返回乙個http的響應給客戶端,http的響應內容同樣有標準的格式。無論是什麼客戶端或者是什麼服務端,大家只要按照http的協議標準...