你瞭解HTTP協議嗎??

1、什麼是HTTP協議

現在的web程序的開發技術比較多,ASP.NET, PHP, JSP,Perl, AJAX 等等。 無論Web技術在未來如何發展,理解Web程序之間通信的基本協議相當重要, 因爲它讓我們理解了Web應用程序的內部工作. 本文將對HTTP協議進行詳細的實例講解,希望以下內容對大家的開發工作或者測試工作有所幫助。

 

協議是指計算機通信網絡中兩臺計算機之間進行通信所必須共同遵守的規定或規則,超文本傳輸協議(HTTP)是一種通信協議,它允許將超文本標記語言(HTML)文檔從Web服務器傳送到客戶端的瀏覽器,目前我們使用的是HTTP/1.1 版本


2、Web服務器,瀏覽器,代理服務器

當我們打開瀏覽器,在地址欄中輸入URL,然後我們就看到了網頁。 原理是怎樣的呢?實際上我們輸入URL後,我們的瀏覽器給Web服務器發送了一個Request, Web服務器接到Request後進行處理,生成相應的Response,然後發送給瀏覽器, 瀏覽器解析Response中的HTML,這樣我們就看到了網頁,過程如下圖所示


 



我們的Request 有可能是經過了代理服務器,最後纔到達Web服務器的。

過程如下圖所示




代理服務器就是網絡信息的中轉站,有什麼功能呢?

1. 提高訪問速度,大多數的代理服務器都有緩存功能。

2. 突破限制,也就是FQ了

3. 隱藏身份。

3、URL詳解

URL(Uniform Resource Locator) 地址用於描述一個網絡上的資源,  基本格式如下

schema://host[:port#]/path/.../[?query-string][#anchor]

scheme       指定低層使用的協議(例如:http, https, ftp)

host             HTTP服務器的IP地址或者域名

port            HTTP服務器的默認端口是80,這種情況下端口號可以省略。如果使用了別的端口,必須指明,例如 http://www.cnblogs.com:8080/

path                   訪問資源的路徑

query-string       發送給http服務器的數據

anchor-             錨

URL的一個例子

http://www.mywebsite.com/sj/test/test.aspx?name=sviergn&x=true#stuff

 

Schema:        http

host:           www.mywebsite.com

path:           /sj/test/test.aspx

Query String:    name=sviergn&x=true

Anchor:         stuff

 

4、HTTP協議是無狀態的

http協議是無狀態的,同一個客戶端的這次請求和上次請求是沒有對應關係,對http服務器來說,它並不知道這兩個請求來自同一個客戶端。 爲了解決這個問題, Web程序引入了Cookie機制來維護狀態.


5、打開一個網頁需要瀏覽器發送很多次Request

1. 當你在瀏覽器輸入URL http://www.cnblogs.com 的時候,瀏覽器發送一個Request去獲取 http://www.cnblogs.com 的html.  服務器把Response發送回給瀏覽器.

2. 瀏覽器分析Response中的 HTML,發現其中引用了很多其他文件,比如圖片,CSS文件,JS文件。

3. 瀏覽器會自動再次發送Request去獲取圖片,CSS文件,或者JS文件。

4. 等所有的文件都下載成功後。 網頁就被顯示出來了。

6、HTTP消息的結構

先看Request 消息的結構,   Request 消息分爲3部分,第一部分叫Request line, 第二部分叫Request header, 第三部分是body. header和body之間有個空行, 結構如下圖




第一行中的Method表示請求方法,比如"POST","GET",  Path-to-resoure表示請求的資源, Http/version-number 表示HTTP協議的版本號

當使用的是"GET" 方法的時候, body是爲空的


比如我們打開博客園首頁的request 如下

GET http://www.cnblogs.com/ HTTP/1.1

Host: www.cnblogs.com

抽象的東西,難以理解,所謂眼見爲實, 實際見到的東西,我們才能理解和記憶。 我們今天用Fiddler,實際的看看Request和Response.


下面我們打開Fiddler 捕捉一個Request 然後分析下它的結構, 在Inspectors tab下以Raw的方式可以看到完整的Request的消息,   如下圖


我們再看Response消息的結構, 和Request消息的結構基本一樣。 同樣也分爲三部分,第一部分叫Response line, 第二部分叫Response header,第三部分是body. header和body之間也有個空行,  結構如下圖




7、Get和Post方法的區別

Http協議定義了很多與服務器交互的方法,最基本的有4種,分別GET,POST,PUT,DELETE. 一個URL地址用於描述一個網絡上的資源,而HTTP中的GET, POST, PUT, DELETE就對應着對這個資源的查,改,增,刪4個操作。 我們最常見的就是GET和POST了。GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息.


我們看看GET和POST的區別

1. GET提交的數據會放在URL之後,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456.  POST方法是把提交的數據放在HTTP包的Body中.

2. GET提交的數據大小有限制(因爲瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.

3. GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值。

4. GET方式提交數據,會帶來安全問題,比如一個登錄頁面,通過GET方式提交數據時,用戶名和密碼將出現在URL上,如果頁面可以被緩存或者其他人可以訪問這臺機器,就可以從歷史記錄獲得該用戶的賬號和密碼.


8、狀態碼

Response 消息中的第一行叫做狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。

狀態碼用來告訴HTTP客戶端,HTTP服務器是否產生了預期的Response.

HTTP/1.1中定義了5類狀態碼, 狀態碼由三位數字組成,第一個數字定義了響應的類別


1XX  提示信息 - 表示請求已被成功接收,繼續處理

2XX  成功 - 表示請求已被成功接收,理解,接受

3XX  重定向 - 要完成請求必須進行更進一步的處理

4XX  客戶端錯誤 -  請求有語法錯誤或請求無法實現

5XX  服務器端錯誤 -   服務器未能實現合法的請求


下面列舉一些常見的狀態碼

200 OK  最常見的就是成功響應狀態碼200了, 這表明該請求被成功地完成,所請求的資源發送回客戶端


302 Found   重定向,新的URL會在response 中的Location中返回,瀏覽器將會自動使用新的URL發出新的Request。如果你不想使用本地緩存可以用Ctrl+F5 強制刷新頁面


304 Not Modified  代表上次的文檔已經被緩存了, 還可以繼續使用,例如打開常用的網頁, 發現很多Response 的status code 都是304

400 Bad Request  客戶端請求與語法錯誤,不能被服務器所理解

403 Forbidden 服務器收到請求,但是拒絕提供服務


404 Not Found 請求資源不存在(例如輸錯了URL)

500 Internal Server Error 服務器發生了不可預期的錯誤

503 Server Unavailable 服務器當前不能處理客戶端的請求,一段時間後可能恢復正常

 

9、HTTP Request header

使用Fiddler 能很方便的查看Reques header, 點擊Inspectors tab ->Request tab-> headers  如下圖所示.

 



Cache 頭域

If-Modified-Since

作用: 把瀏覽器端緩存頁面的最後修改時間發送到服務器去,服務器會把這個時間與服務器上實際文件的最後修改時間進行對比。如果時間一致,那麼返回304,客戶端就直接使用本地緩存文件。如果時間不一致,就會返回200和新的文件內容。客戶端接到之後,會丟棄舊文件,把新文件緩存起來,並顯示在瀏覽器中.


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這個請求報頭域中獲取到這些信息User-Agent請求報頭域允許客戶端將它的操作系統、瀏覽器和其它屬性告訴服務器。

例如: 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(通常我們說Charset包括了相應的字符編碼方案);

Cookie/Login 頭域

Cookie:

作用: 最重要的header, 將cookie的值發送給HTTP 服務器

Entity頭域

Content-Length

作用:發送給HTTP服務器數據的長度。

例如: Content-Length: 38


Content-Type

作用:

例如:Content-Type: application/x-www-form-urlencoded

Miscellaneous 頭域

Referer:

作用: 提供了Request的上下文信息的服務器,告訴服務器我是從哪個鏈接過來的,比如從我主頁上鍊接到一個朋友那裏,他的服務器就能夠從HTTP Referer中統計出每天有多少用戶點擊我主頁上的鏈接訪問他的網站。

例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT


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:指定端口號


10、HTTP Response header


 



我們也按照Fiddler那樣把header 進行分類,這樣比較清晰也容易記憶。

Cache頭域

Date

作用:  生成消息的具體時間和日期

例如: Date: Sat, 03 Feb 2018 11:35:14 GMT 


Expires

作用: 瀏覽器會在指定過期時間內使用本地緩存

例如: Expires: Sat, 10 Feb 2018 11:35:14 GMT


Cookie/Login 頭域

P3P

作用: 用於跨域設置Cookie, 這樣可以解決iframe跨域訪問cookie的問題

Set-Cookie

作用: 非常重要的header, 用於把cookie 發送到客戶端瀏覽器, 每一個寫入cookie都會生成一個Set-Cookie.

例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com


Entity頭域

ETag

作用:  和If-None-Match 配合使用。

例如: ETag: "03f2b33c0bfcc1:0"

Last-Modified:

作用: 用於指示資源的最後修改日期和時間。

例如: Last-Modified: Wed, 21 Dec 2017 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


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


Transport頭域

Connection

例如: Connection: keep-alive   當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接

例如:  Connection: close  代表一個Request完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP連接會關閉, 當客戶端再次發送Request,需要重新建立TCP連接。


Location頭域

Location

作用: 用於重定向一個新的位置, 包含新的URL地址

 

HTTP是客戶端瀏覽器或其他程序與Web服務器之間的應用層通信協議。在Internet上的Web服務器上存放的大部分是超文本信息,客戶機需要通過HTTP協議傳輸所要訪問的超文本信息。HTTP包含命令和傳輸信息,不僅可用於Web訪問,也可以用於其他因特網/內聯網應用系統之間的通信,從而實現各類應用資源超媒體訪問的集成。希望上述的內容能夠對大家有所幫助。



發佈了116 篇原創文章 · 獲贊 60 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章