1. 程式人生 > >http協議詳解及htt面試題目,常見的http狀態碼

http協議詳解及htt面試題目,常見的http狀態碼

HTTP報文是面向文字的,報文中的每一個欄位都是一些ASCII碼串,各個欄位的長度是不確定的。HTTP有兩類報文:請求報文和響應報文。

HTTP請求報文

一個HTTP請求報文由請求行(request line)、請求頭部(header)、空行請求資料4個部分組成,下圖給出了請求報文的一般格式。


or

<request-line>

<headers>

<blank line>

[<request-body>

1.請求行

請求行請求方法欄位URL欄位和HTTP協議版本欄位3個欄位組成,它們用空格分隔。例如,GET /index.html HTTP/1.1

HTTP協議的請求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。


而常見的有如下幾種:

1).GET

最常見的一種請求方式,當客戶端要從伺服器中讀取文件時,當點選網頁上的連結或者通過在瀏覽器的位址列輸入網址來瀏覽網頁的,使用的都是GET方式。GET方法要求伺服器將URL定位的資源放在響應報文的資料部分,回送給客戶端。使用GET方法時,請求引數和對應的值附加在URL後面,利用一個問號(“?”)代表URL的結尾與請求引數的開始,傳遞引數長度受限制。例如,/index.jsp?id=100&op=bind,這樣通過GET方式傳遞的資料直接表示在地址中,所以我們可以把請求結果以連結的形式傳送給好友。以用google搜尋domety為例,Request格式如下:

複製程式碼
GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1  
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, 
application/msword, application/x-silverlight, application/x-shockwave-flash, */*  
Referer: <a href="http://www.google.cn/"
>http://www.google.cn/</a> Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld) Host: <a href="http://www.google.cn">www.google.cn</a> Connection: Keep-Alive Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y- FxlRugatx63JLv7CWMD6UB_O_r
複製程式碼

可以看到,GET方式的請求一般不包含”請求資料”部分,請求資料以地址的形式表現在請求行。地址連結如下:

<a href="http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=">http://www.google.cn/search?hl=zh-CN&source=hp
&q=domety&aq=f&oq=</a> 

地址中”?”之後的部分就是通過GET傳送的請求資料,我們可以在位址列中清楚的看到,各個資料之間用”&”符號隔開。顯然,這種方式不適合傳送私密資料。另外,由於不同的瀏覽器對地址的字元限制也有所不同,一般最多隻能識別1024個字元,所以如果需要傳送大量資料的時候,也不適合使用GET方式

2).POST

對於上面提到的不適合使用GET方式的情況,可以考慮使用POST方式,因為使用POST方法可以允許客戶端給伺服器提供資訊較多。POST方法將請求引數封裝在HTTP請求資料中,以名稱/值的形式出現,可以傳輸大量資料,這樣POST方式對傳送的資料大小沒有限制,而且也不會顯示在URL中。還以上面的搜尋domety為例,如果使用POST方式的話,格式如下:

複製程式碼
POST /search HTTP/1.1  
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, 
application/msword, application/x-silverlight, application/x-shockwave-flash, */*  
Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>  
Accept-Language: zh-cn  
Accept-Encoding: gzip, deflate  
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)  
Host: <a href="http://www.google.cn">www.google.cn</a>  
Connection: Keep-Alive  
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; 
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r  

hl=zh-CN&source=hp&q=domety                       //資料
複製程式碼

可以看到,POST方式請求行中不包含資料字串,這些資料儲存在”請求內容”部分,各資料之間也是使用”&”符號隔開

參照上面get:

GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1  

POST方式大多用於頁面的表單中。因為POST也能完成GET的功能,因此多數人在設計表單的時候一律都使用POST方式,其實這是一個誤區。GET方式也有自己的特點和優勢,我們應該根據不同的情況來選擇是使用GET還是使用POST。

3).HEAD

HEAD就像GET,只不過服務端接受到HEAD請求後只返回響應頭,而不會發送響應內容。當我們只需要檢視某個頁面的狀態的時候,使用HEAD是非常高效的,因為在傳輸的過程中省去了頁面內容。

2.請求頭部

請求頭部由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號“:”分隔。請求頭部通知伺服器有關於客戶端請求的資訊,典型的請求頭有:

User-Agent:產生請求的瀏覽器型別。

Accept:客戶端可識別的內容型別列表。

Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機。

3.空行

最後一個請求頭之後是一個空行,傳送回車符和換行符,通知伺服器以下不再有請求頭

4.請求資料

請求資料不在GET方法中使用而是在POST方法中使用。POST方法適用於需要客戶填寫表單的場合。與請求資料相關的最常使用的請求頭是Content-Type和Content-Length。

HTTP報文

HTTP響應也由三個部分組成,分別是:狀態行、訊息報頭、響應正文。

如下所示,HTTP響應的格式與請求的格式十分類似:

<status-line>

<headers>

<blank line>

[<response-body>]

 正如你所見,在響應中唯一真正的區別在於第一行中用狀態資訊代替了請求資訊。狀態行(status line)通過提供一個狀態碼來說明所請求的資源情況。

狀態行格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF

協議版本         響應狀態碼     狀態碼描述

下面給出一個HTTP響應報文例子

複製程式碼
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122

<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>
複製程式碼

其中,HTTP-Version表示伺服器HTTP協議的版本;Status-Code表示伺服器發回的響應狀態程式碼;Reason-Phrase表示狀態程式碼的文字描述。狀態程式碼由三位數字組成,第一個數字定義了響應的類別,且有五種可能取值。

  • 1xx:指示資訊--表示請求已接收,繼續處理。
  • 2xx:成功--表示請求已被成功接收、理解、接受。
  • 3xx:重定向--要完成請求必須進行更進一步的操作。
  • 4xx:客戶端錯誤--請求有語法錯誤或請求無法實現。
  • 5xx:伺服器端錯誤--伺服器未能實現合法的請求。
總之:
1XX:訊息
2XX:成功
3XX:重定向
4XX:請求錯誤
5XX、6XX:伺服器錯誤
常見狀態程式碼、狀態描述的說明如下。
  • 200 OK:客戶端請求成功。
  • 400 Bad Request:客戶端請求有語法錯誤,不能被伺服器所理解。
  • 401 Unauthorized:請求未經授權,這個狀態程式碼必須和WWW-Authenticate報頭域一起使用。
  • 403 Forbidden:伺服器收到請求,但是拒絕提供服務。
  • 404 Not Found:請求資源不存在,舉個例子:輸入了錯誤的URL。
  • 500 Internal Server Error:伺服器發生不可預期的錯誤。
  • 503 Server Unavailable:伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常,舉個例子:HTTP/1.1 200 OK(CRLF)。

 

關於HTTP請求GET和POST的區別

1.GET提交,請求的資料會附在URL之後(就是把資料放置在HTTP協議頭<request-line>中),以?分割URL和傳輸資料,多個引數用&連線;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果資料是英文字母/數字,原樣傳送,如果是空格,轉換為+,如果是中文/其他字元,則直接把字串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進製表示的ASCII。

POST提交:把提交的資料放置在是HTTP包的包體<request-body>中。上文示例中紅色字型標明的就是實際的傳輸資料

  因此,GET提交的資料會在位址列中顯示出來,而POST提交,位址列不會改變

2.傳輸資料的大小:

   首先宣告,HTTP協議沒有對傳輸的資料大小進行限制,HTTP協議規範也沒有對URL長度進行限制。 而在實際開發中存在的限制主要有:

   GET:特定瀏覽器和伺服器對URL長度有限制,例如IE對URL長度的限制是2083位元組(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於作業系統的支援。

   因此對於GET提交時,傳輸資料就會受到URL長度的限制。

   POST:由於不是通過URL傳值,理論上資料不受限。但實際各個WEB伺服器會規定對post提交資料大小進行限制,Apache、IIS6都有各自的配置。

3.安全性:

    POST的安全性要比GET的安全性高。注意:這裡所說的安全性和上面GET提到的“安全”不是同個概念。上面“安全”的含義僅僅是不作資料修改,而這裡安全的含義是真正的Security的含義,比如:通過GET提交資料,使用者名稱和密碼將明文出現在URL上,因為(1)登入頁面有可能被瀏覽器快取, (2)其他人檢視瀏覽器的歷史紀錄,那麼別人就可以拿到你的賬號和密碼了。

1.一次完整的HTTP請求所經歷的7個步驟

HTTP通訊機制是在一次完整的HTTP通訊過程中,Web瀏覽器與Web伺服器之間將完成下列7個步驟: 

1. 建立TCP連線

在HTTP工作開始之前,Web瀏覽器首先要通過網路與Web伺服器建立連線,該連線是通過TCP來完成的,該協議與IP協議共同構建 Internet,即著名的TCP/IP協議族,因此Internet又被稱作是TCP/IP網路。HTTP是比TCP更高層次的應用層協議,根據規則, 只有低層協議建立之後才能,才能進行更層協議的連線,因此,首先要建立TCP連線,一般TCP連線的埠號是80。

2. Web瀏覽器向Web伺服器傳送請求行

一旦建立了TCP連線,Web瀏覽器就會向Web伺服器傳送請求命令。例如:GET /sample/hello.jsp HTTP/1.1。

3. Web瀏覽器傳送請求頭

瀏覽器傳送其請求命令之後,還要以頭資訊的形式向Web伺服器傳送一些別的資訊,之後瀏覽器傳送了一空白行來通知伺服器,它已經結束了該頭資訊的傳送。 

4. Web伺服器應答 

客戶機向伺服器發出請求後,伺服器會客戶機回送應答, HTTP/1.1 200 OK ,應答的第一部分是協議的版本號和應答狀態碼。

5. Web伺服器傳送應答頭

正如客戶端會隨同請求傳送關於自身的資訊一樣,伺服器也會隨同應答向用戶傳送關於它自己的資料及被請求的文件。 

6. Web伺服器向瀏覽器傳送資料 

Web伺服器向瀏覽器傳送頭資訊後,它會發送一個空白行來表示頭資訊的傳送到此為結束,接著,它就以Content-Type應答頭資訊所描述的格式傳送使用者所請求的實際資料。

7. Web伺服器關閉TCP連線 

一般情況下,一旦Web伺服器向瀏覽器傳送了請求資料,它就要關閉TCP連線,然後如果瀏覽器或者伺服器在其頭資訊加入了這行程式碼:

Connection:keep-alive 

TCP連線在傳送後將仍然保持開啟狀態,於是,瀏覽器可以繼續通過相同的連線傳送請求。保持連線節省了為每個請求建立新連線所需的時間,還節約了網路頻寬。

建立TCP連線->傳送請求行->傳送請求頭->(到達伺服器)傳送狀態行->傳送響應頭->傳送響應資料->斷TCP連線

===================================================================================

常見面試題:

1、常用的HTTP方法有哪些?
GET:
用於請求訪問已經被URI(統一資源識別符號)識別的資源,可以通過URL傳參給伺服器
POST:用於傳輸資訊給伺服器,主要功能與GET方法類似,但一般推薦使用POST方式。
PUT: 傳輸檔案,報文主體中包含檔案內容,儲存到對應URI位置。
HEAD: 獲得報文首部,與GET方法類似,只是不返回報文主體,一般用於驗證URI是否有效。
DELETE:刪除檔案,與PUT方法相反,刪除對應URI位置的檔案。
OPTIONS:查詢相應URI支援的HTTP方法。


2、GET方法與POST方法的區別
區別一:

get重點在從伺服器上獲取資源,post重點在向伺服器傳送資料;
區別二:
get傳輸資料是通過URL請求,以field(欄位)= value的形式,置於URL後,並用"?"連線,多個請求資料間用"&"連線,如http://127.0.0.1/Test/login.action?name=admin&password=admin,這個過程使用者是可見的;
post傳輸資料通過Http的post機制,將欄位與對應值封存在請求實體中傳送給伺服器,這個過程對使用者是不可見的;
區別三:
Get傳輸的資料量小,因為受URL長度限制,但效率較高;
Post可以傳輸大量資料,所以上傳檔案時只能用Post方式;
區別四:
get是不安全的,因為URL是可見的,可能會洩露私密資訊,如密碼等;
post較get安全性較高;
區別五:
get方式只能支援ASCII字元,向伺服器傳的中文字元可能會亂碼。
post支援標準字符集,可以正確傳遞中文字元。


3、HTTP請求報文與響應報文格式
請求報文包含三部分:

a、請求行:包含請求方法、URI、HTTP版本資訊
b、請求首部欄位
c、請求內容實體
響應報文包含三部分:
a、狀態行:包含HTTP版本、狀態碼、狀態碼的原因短語
b、響應首部欄位
c、響應內容實體


4、常見的HTTP相應狀態碼
200:
請求被正常處理
204:請求被受理但沒有資源可以返回
206:客戶端只是請求資源的一部分,伺服器只對請求的部分資源執行GET方法,相應報文中通過Content-Range指定範圍的資源。
301:永久性重定向
302:臨時重定向
303:與302狀態碼有相似功能,只是它希望客戶端在請求一個URI的時候,能通過GET方法重定向到另一個URI上
304:傳送附帶條件的請求時,條件不滿足時返回,與重定向無關
307:臨時重定向,與302類似,只是強制要求使用POST方法
400:請求報文語法有誤,伺服器無法識別
401:請求需要認證
403:請求的對應資源禁止被訪問
404:伺服器無法找到對應資源
500:伺服器內部錯誤
503:伺服器正忙


5、HTTP1.1版本新特性
a、預設持久連線節省通訊量,只要客戶端服務端任意一端沒有明確提出斷開TCP連線,就一直保持連線
,可以傳送多次HTTP請求

b、管線化,客戶端可以同時發出多個HTTP請求,而不用一個個等待響應



6、常見HTTP首部欄位
a、通用首部欄位
(請求報文與響應報文都會使用的首部欄位)
Date:建立報文時間
Connection:連線的管理
Cache-Control:快取的控制
Transfer-Encoding:報文主體的傳輸編碼方式
b、請求首部欄位(請求報文會使用的首部欄位)
Host:請求資源所在伺服器
Accept:可處理的媒體型別
Accept-Charset:可接收的字符集
Accept-Encoding:可接受的內容編碼
Accept-Language:可接受的自然語言
c、響應首部欄位(響應報文會使用的首部欄位)
Accept-Ranges:可接受的位元組範圍
Location:令客戶端重新定向到的URI
Server:HTTP伺服器的安裝資訊
d、實體首部欄位(請求報文與響應報文的的實體部分使用的首部欄位)
Allow:資源可支援的HTTP方法
Content-Type:實體主類的型別
Content-Encoding:實體主體適用的編碼方式
Content-Language:實體主體的自然語言
Content-Length:實體主體的的位元組數
Content-Range:實體主體的位置範圍,一般用於發出部分請求時使用


7、HTTP的缺點與HTTPS
a、通訊使用明文
不加密,內容可能被竊聽
b、
不驗證通訊方身份,可能遭到偽裝
c、
無法驗證報文完整性,可能被篡改

HTTPS就是HTTP加上加密處理(一般是SSL安全通訊線路)+認證+完整性保護

8、HTTP優化


狀態行格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF

協議版本         響應狀態碼     狀態碼描述