深入淺出HTTP

2021-09-11 14:47:06 字數 3585 閱讀 7024

我們知道目前很多應用系統中的內容傳輸協議採用的http協議,因此不管你是前端人員、後端人員、運維人員,甚至是管理人員,都需要掌握http知識!!

該版本只有乙個命令get;沒有header等描述資料的資訊; 伺服器傳送完畢,就關閉tcp連線。

該版本增加了很多命令;增加status code 和header;多字符集支援、多部分傳送、許可權、快取等。

該版本增加了持久連線pipeline,增加host和其他一些命令。持久連線會在http特性中介紹;如果沒有pipeline,那麼web伺服器就需要序列處理請求,而有了pipeline,web伺服器就並行處理請求;而增加host實現了一台物理裝置可以執行多個web服務。

所有資料以二進位制傳輸,之前版本使用字串進行傳輸;同乙個連線 裡面傳送多個請求不再需要按照順序來;頭資訊壓縮以及推送等提高效率的功能。

為什麼要三次握手?因為網路是有可能延遲的,當客戶端沒有收到服務端的確認包,如果沒有第三次握手,那麼服務端不知道上次傳輸是不是被客戶端正常接收了,如果沒有接收,服務端的這個埠也是開啟的,這就比較浪費資源。

http報文分為請求報文響應報文,請求報文和響應報文分為起始行、首部(header)和主體(body),請求報文的首部包括三部分,分別是http方法、資源目錄和協議,而響應報文的首部包括協議版本、狀態碼和狀態嗎對應的意思,比如200狀態的意思是ok。需要注意的是:http header和http body之間以一行分隔。

http方法定義對資源的操作,常用的有get、post等,這就就不詳細展開了。

http code用於定義伺服器對請求的處理結果,各個區間的code有不用的語義。1xx  表示資訊響應類,表示接收到請求並且繼續處理;2xx 表示成功;3xx 表示重定向;4xx 表示客戶端出錯;5xx 表示伺服器出錯。

同源策略,也就是說當兩個請求的url的協議、host和埠都相同的情況下,我們才認為這兩個請求是同域的即同源,而只要協議、host和埠只要有一項是不同的,我們就認為是不同源的,即跨域,例如:

80上述兩個請求就是跨域請求。需要注意的是跨域請求不是說瀏覽器限制了發起跨站請求,瀏覽器只是將返回結果攔截下來,最好的例子就是csrf跨站指令碼攻擊。如果我們想讓瀏覽器放行返回結果,則通過以下方法:

服務端設定access-control-allow-origin引數為允許,例如'access-control-allow-origin' : '*'

三標籤中的請求是允許跨域的,這也是jsonp的跨域做法。

對於靜態資源,比如說image、js等,它們是不會經常方式變更的,而且它們的容量比較大,如果我們每次訪問都要從伺服器從獲取相應資料,那麼效能就會變得比較差,因此http協議定義一些和快取相關的引數。

可快取性,表示在哪些地方可以快取,比如說客戶端瀏覽器、**伺服器等,它有三個常用的引數:public、private、no-cache。public 表明響應可以被任何物件快取,包括傳送請求的客戶端瀏覽器、**伺服器等等;private 表示響應只能被單個使用者快取,不能作為共享快取,即**伺服器不能快取它;no-cache表明強制所有快取了該響應的快取使用者,在使用已儲存的快取之前,傳送帶驗證器的請求到源始伺服器。

到期,max-age=,設定快取儲存的最大週期,超過這個時間快取就被認為過期。s-maxage= 它的作用域僅在共享快取(比如各個**)。max-stale= 表明客戶端願意接收乙個已過期的資源。

驗證,must-revalidate,快取必須在使用之前驗證舊資源的狀態,並且不可使用過期資源。proxy-revalidate,與must-revalidate作用相同,但它僅適用於共享快取(例如**),並被私有快取忽略。

其他。no-store,客戶端和**伺服器不儲存任何快取,而是直接從伺服器獲取內容。no-transform:不得對資源進行轉換或轉變。content-encoding, content-range, content-type等http頭不能由**修改。例如,非透明**可以對影象格式進行轉換,以便節省快取空間或者減少緩慢鏈路上的流量。 no-transform指令不允許這樣做。

服務端通過set-cookie將相關資料儲存到瀏覽器中,而這些相關資料就是cookie,那麼,下次在同域的請求中就會帶上這些cookie,cookie是鍵值對,可以設定多個。cookie中通過max-age和expires設定過期時間,secure值在https的時候傳送,httponly無法通過document.cookie訪問。具體可以參考session 和 cookie。

在cache control中我們介紹當設定no-cache引數時,表明每次請求都要到伺服器驗證,驗證結果表明可以讀取本地快取才可以從本地讀取快取。只有到資料發生修改時,我們才需要從服務端讀取最新資料,否則從本地讀取快取。此時,判斷資料是否發生修改就變得尤為重要,通常我們採用last-modfied和etag兩個驗證頭來驗證資料是否發生修改。其中last-modifed 通常配合if-modified-since或者if-unmodified-since使用,而etag 通常配合if-match或者if-non-match使用。為了幫助大家理解,我舉乙個栗子。假設我們訪問mudedada.com返回頭資訊包含:

last-modified:888

etag:123

下一次訪問mukedada.com的請求頭中就會包含:

if-modified-since:888

if-non-match:123

伺服器會比較請求頭中的last-modified、etag 和伺服器中的對應值是否相同,如果不相同則重新獲取,否則從本地快取中獲取。

我們知道乙個http需要建立乙個tcp連線,完成之後就關閉tcp連線,這個成本比較高(因為建立乙個tcp連線需要通過三次握手),所以在http/1.1開始支援長連線,請求頭標識是connection:keep-alive。如下圖所示,同乙個connection id表示同乙個連線。需要注意的是同乙個連線只能是同域請求。

資料協商指的是客戶端向服務端傳送請求時,客戶端會宣告它希望服務端返回個格式是什麼?服務端根據客戶端的宣告來判斷返回什麼要的資料。其中客戶端通過accept、accept-encoding等引數進行設定,而服務端通過content-type等引數進行設定。

accept指定返回資料型別;

accept-encoding指定服務端的資料壓縮方式,目前服務端的壓縮演算法有gzip, deflate, br等;

accept-language指定返回資料的語言,例如 accept-language:  zh-cn,zh;q=0.9,en;q=0.8,其中q表示的是權重,也就是說瀏覽器更希望伺服器返回的是中文;

user-agent表示瀏覽器的相關資訊,它能區分是移動端瀏覽器還是pc端瀏覽器,從而返回特定的頁面。

content-type指的是服務端返回的資料型別;

content-encoding對應客戶端的accept-encoding,指的是資料壓縮方式;

content-language服務端語言。

深入淺出http協議 學習筆記

參考資料 http是一套計算機通過網路進行通訊的規則,目前http協議是1.1,http是一種無狀態的協議 即web瀏覽器與web伺服器不需要建立持久的鏈結,遵循request response模型。http通訊機制 1.建立tcp連線 在http開始工作前,web瀏覽器首先通過網路與web伺服器建...

深入淺出sizeof

int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...

深入淺出ShellExecute

ipconfig c log.txt應如何處理?二樓的朋友,開啟拔號網路這樣 shellexecute null,open c windows rundll32.exe shell32.dll,control rundll c windows system telephon.cpl null,sw ...