HTTP学习笔记:HTTP的消息结构
Request 消息結構:
Response消息結構:
?
請求方法:
一個URL地址用于描述一個網絡上的資源,而HTTP中的GET, POST, PUT, DELETE就對應著對這個資源的查,改,增,刪4個操作。 其中最常見的就是GET和POST了。
GET一般用于獲取/查詢資源信息;而POST一般用于更新資源信息。以下是二者的區別:
狀態碼:
Response 消息中的第一行叫做狀態行,由HTTP協議版本號、狀態碼、狀態消息三部分組成,狀態碼用來告訴HTTP客戶端,HTTP服務器是否產生了預期的Response。
HTTP/1.1中定義了5類狀態碼,狀態碼由三位數字組成,第一個數字定義了響應的類別:
1XX? 提示信息-表示請求已被成功接收,繼續處理;
2XX? 成功-表示請求已被成功接收,理解,接受;
3XX? 重定向-要完成請求必須進行更進一步的處理;
4XX? 客戶端錯誤-請求有語法錯誤或請求無法實現;
5XX? 服務器端錯誤-服務器未能實現合法的請求;
常見狀態碼:
200 OK:表明該請求被成功地完成,所請求的資源發送回客戶端;
302 Found:重定向,新的URL會在response中的Location中返回,瀏覽器將會使用新的URL重新發出Request;
304 Not Modified:表明上次的文檔已經被緩存了,還可以繼續使用(如果你不想使用本地緩存可以用Ctrl+F5強制刷新頁面);
400 Bad Request:客戶端請求與語法錯誤,不能被服務器所理解;
403 Forbidden:服務器收到請求,但是拒絕提供服務;
500 Internal Server Error:服務器發生了不可預期的錯誤;
503 Server Unavailable:服務器當前不能處理客戶端的請求,一段時間后可能恢復正常;
404 Not Found:請求資源不存在(輸錯了URL);
HTTP Request header:
header有很多,可進行適當分類:
1.Cache 頭域
If-Modified-Since:把瀏覽器端緩存頁面的最后修改時間發送到服務器去,服務器會把這個時間與服務器上實際文件的最后修改時間進行對比。如果時間一致,那么返回304,客戶端就直接使用本地緩存文件。如果時間不一致,就會返回200和新的文件內容。客戶端接到之后,會丟棄舊文件,把新文件緩存起來,并顯示在瀏覽器中。
例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT
? ? ? ?If-None-Match:If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 當用戶再次請求該資源時,將在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服務器驗證資源的ETag沒有改變(該資源沒有更新),將返回一個304狀態告訴客戶端使用本地緩存文件。否則將返回200狀態和新的資源和Etag,使用這樣的機制將提高網站的性能。
例如: If-None-Match: "03f2b33c0bfcc1:0"
? ? ?Pragma:防止頁面被緩存,在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一樣,Pargma只有一個用法:Pragma: no-cache(注意: 在HTTP/1.0版本中,只實現了Pragema:no-cache, 沒有實現Cache-Control;
Cache-Control:這個是非常重要的規則。用來指定Response-Request遵循的緩存機制。各個指令含義如下:
Cache-Control:Public ?可以被任何緩存所緩存;
Cache-Control:Private ?內容只緩存到私有緩存中;
Cache-Control:no-cache ?所有內容都不會被緩存;
? ? ?。。。。
2.Client 頭域:
? ? ?Accept:瀏覽器端可以接受的媒體類型;
例如:Accept: text/html,代表瀏覽器可以接受服務器回發的類型為 text/html,也就是我們常說的html文檔,如果服務器無法返回text/html類型的數據,服務器應該返回一個406錯誤(non acceptable);
通配符*代表任意類型;
例如 ?Accept: */* ,代表瀏覽器可以處理所有類型,(一般瀏覽器發給服務器都是發這個)。
? ? ?Accept-Encoding:瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支持壓縮,支持什么壓縮方法(gzip,deflate),(注意:這不是只字符編碼);
例如: Accept-Encoding: gzip, deflate;
? ? ?Accept-Language:瀏覽器申明自己接收的語言,語言跟字符集的區別:中文是語言,中文有多種字符集,比如big5,gb2312,gbk等等;
例如: Accept-Language: en-us;
? ? ?User-Agent:告訴HTTP服務器,客戶端使用的操作系統和瀏覽器的名稱和版本。
例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)
? ? ?Accept-Charset:瀏覽器申明自己接收的字符集,這就是本文前面介紹的各種字符集和字符編碼,如gb2312,utf-8;
3.Cookie/Login 頭域
Cookie:最重要的header, 將cookie的值發送給HTTP服務器;
4.Entity頭域
Content-Length:發送給HTTP服務器數據的長度;
例如: Content-Length: 38
Content-Type:表示后面的文檔屬于什么MIME類型,是返回消息中非常重要的內容,例如最常見的就是text/html,它的意思是說返回的內容是文本類型,這個文本又是HTML格式的。原則上瀏覽器會根據Content-Type來決定如何顯示返回的消息體內容。
例如:Content-Type: application/x-www-form-urlencoded
5.Miscellaneous 頭域
Referer:提供了Request的上下文信息的服務器,告訴服務器我是從哪個鏈接過來的。
例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT
6.Transport 頭域
Connection:
例如:Connection: keep-alive?? 當一個網頁打開完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接;
例如:Connection: close? 代表一個Request完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接會關閉, 當客戶端再次發送Request,需要重新建立TCP連接。
Host(發送請求時,該報頭域是必需的):請求報頭域主要用于指定被請求資源的Internet主機和端口號,它通常從HTTP URL中提取出來的
例如: 我們在瀏覽器中輸入:http://www.guet.edu.cn/index.html
瀏覽器發送的請求消息中,就會包含Host請求報頭域,如下:
Host:http://www.guet.edu.cn
此處使用缺省端口號80,若指定了端口號,則變成:Host:指定端口號;
HTTP Response header
適當分類:
1.Cache頭域
Date:生成消息的具體時間和日期;
例如: Date: Sat, 11 Feb 2012 11:35:14 GMT?
Expires:瀏覽器會在指定過期時間內使用本地緩存;
例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT
Vary:服務器支持壓縮的網頁都有Vary頭,意思是說squid要把客戶端傳來的某個頭區別對待,譬如Vary:Accept-Encoding,客戶端發來Accept-Encoding:gzip(MSIE), deflate時squid會為gzip, deflate做一個存檔;如果客戶端沒發來Accept-Encoding這個頭(wget),squid又會為無Accept-Encoding做另一個存檔;這兩個存檔的內容是不一樣的,gzip, deflate的是壓縮后的內容,一堆亂碼,無Accept-Encoding的則是網頁源碼。知道了Vary的原理,剩下的事就容易了,在網頁輸出時加上Vary:User-Agent,意味著squid要為每一種User-Agent存一個存檔,nginx里這樣配置即可:add_header Vary Accept-Encoding,這時網頁的response header會有Vary:Vary:Accept-Encoding;
例如: Vary: Accept-Encoding
2.Cookie/Login 頭域
P3P:用于跨域設置Cookie, 這樣可以解決iframe跨域訪問cookie的問題;
例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR
Set-Cookie:非常重要的header, 用于把cookie 發送到客戶端瀏覽器,每一個寫入cookie都會生成一個Set-Cookie;
例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com
3.Entity頭域
ETag:和If-None-Match 配合使用。 (實例請看上節中If-None-Match的實例)
例如: ETag: "03f2b33c0bfcc1:0"
Last-Modified:用于指示資源的最后修改日期和時間。(實例請看上節的If-Modified-Since的實例)
例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT
Content-Type:WEB服務器告訴瀏覽器自己響應的對象的類型和字符集;
例如:
Content-Type: text/html; charset=utf-8
Content-Type:text/html;charset=GB2312
Content-Type: image/jpeg
Content-Length:指明實體正文的長度,以字節方式存儲的十進制數字來表示。在數據下行的過程中,Content-Length的方式要預先在服務器中緩存所有數據,然后所有數據再一股腦兒地發給客戶端。
例如: Content-Length: 19847
Content-Encoding:WEB服務器表明自己使用了什么壓縮方法(gzip,deflate)壓縮響應中的對象。
例如:Content-Encoding:gzip
Content-Language:WEB服務器告訴瀏覽器自己響應的對象的語言;
例如: Content-Language:da
4.Miscellaneous 頭域
Server:指明HTTP服務器的軟件信息;
例如:Server: Microsoft-IIS/7.5
X-AspNet-Version:如果網站是用ASP.NET開發的,這個header用來表示ASP.NET的版本
例如: X-AspNet-Version: 4.0.30319
X-Powered-By:表示網站是用什么技術開發的;
例如:X-Powered-By: ASP.NET
5.Transport頭域
Connection:
例如: Connection: keep-alive?? 當一個網頁打開完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接
例如:? Connection: close? 代表一個Request完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接會關閉, 當客戶端再次發送Request,需要重新建立TCP連接。
6.Location頭域
Location:用于重定向一個新的位置,包含新的URL地址(實例請看304狀態實例)。
?
HTTP協議是無狀態的和Connection: keep-alive的區別
無狀態是指協議對于事務處理沒有記憶能力,服務器不知道客戶端是什么狀態。從另一方面講,打開一個服務器上的網頁和你之前打開這個服務器上的網頁之間沒有任何聯系。
HTTP是一個無狀態的面向連接的協議,無狀態不代表HTTP不能保持TCP連接,更不能代表HTTP使用的是UDP協議(無連接)。
從HTTP/1.1起,默認都開啟了Keep-Alive,保持連接特性,簡單地說,當一個網頁打開完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接。
Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務器軟件(如Apache)中設定這個時間。
轉載于:https://www.cnblogs.com/renzhigang/archive/2013/03/16/2963766.html
總結
以上是生活随笔為你收集整理的HTTP学习笔记:HTTP的消息结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这几天又看了Gosu,发现也是蛮有意思
- 下一篇: js 操作 select option