那些冷門的HTTP知識點
稍微了解過Web開發相關技術的人都對於HTTP協議都不會陌生,HTTP是個簡單易上手的文本協議,以至於可能很多人做了很久web開發,依然對於很多HTTP協議的知識點不慎了解,本文就討論下那些關於HTTP協議的出鏡率不那麼高的一些知識點。
關於URL,可以把網站的網址URL分為三部分:
以 http://marvinio.com/2018/03/ubuntu-init-config/ 為例
Scheme:大家現在都對http習以為常,但是在更遙遠的年代,比如我的大學時代,大家更喜歡使用ftp協議去伺服器down各種資源,ftp也是類似http一種scheme,scheme會告知web客戶端怎樣訪問伺服器資源。
域名:域名是告訴客戶端伺服器在哪裡,域名經過DNS伺服器轉換為IP,IP定位到伺服器,80埠定位到Web應用。
資源路徑:/2018/03/ubuntu-init-config/,找到了伺服器之後,還有具體定位到資源的詳細位置,這個由資源路徑來指明,當然通過web伺服器的重寫(rewrite),用戶客戶端上看到的資源路徑可能未必是真實的。
HTTP的性能聚焦區域:TCP協議
TCP連接建立握手;
TCP慢啟動擁塞控制;
數據聚集的Nagle演算法;
用於捎帶確認的TCP延遲確認演算法;
TIME_WAIT時延和埠耗盡。
Web伺服器都做了什麼
建立連接——接受一個客戶端連接,或者如果不希望與這個客戶端建立連接,就將其關閉。
接收請求——從網路中讀取一條HTTP請求報文。
處理請求——對請求報文進行解釋,並採取行動。
訪問資源——訪問報文中指定的資源。
構建響應——創建帶有正確首部的HTTP響應報文。
發送響應——將響應回送給客戶端。
記錄事務處理過程——將與已完成事務有關的內容記錄在一個日誌文件中。
代理與網關的對比
嚴格來說,代理連接的是兩個或多個使用相同協議的應用程序。
網關連接的則是兩個或多個使用不同協議的端點。網關扮演的是「協議轉換器」的角色,即使客戶端和伺服器使用的是不同的協議,客戶端也可以通過它完成與伺服器之間的事務處理。
HTTP緩存的處理步驟(以一個GET報文的基本緩存處理過程為例)
接收——緩存從網路中讀取抵達的請求報文。
解析——緩存對報文進行解析,提取出URL和各種首部。
查詢——緩存查看是否有本地副本可用,如果沒有,就獲取一份副本(並將其保存在本地)。
新鮮度檢測——緩存查看已緩存副本是否足夠新鮮,如果不是,就詢問伺服器是否有任何更新。
創建響應——緩存會用新的首部和已緩存的主體來構建一條響應報文。
發送——緩存通過網路將響應發回給客戶端。
日誌——緩存可選地創建一個日誌文件條目來描述這個事務。
Content-Length與持久連接
Content-Length首部對於持久連接是必不可少的。如果響應通過持久連接傳送,就可能有另一條HTTP響應緊隨其後。客戶端通過Content-Length首部就可以知道報文在何處結束,下一條報文從何處開始。因為連接是持久的,客戶端無法依賴連接關閉來判別報文的結束。
如果主體進行了內容編碼,Content-Length首部說明的就是編碼後(encoded)的主體的位元組長度,而不是未編碼的原始主體的長度。
TAG:MarvinIO |