http協議
http協議
1.定義:
HTTP 是 Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫。HTTP 協議是用於從 WWW 服務器傳輸超文本到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示(如文本先於圖形)等。HTTP 是一種無狀態的協議,無狀態是指 Web 瀏覽器和 Web 服務器之間不需要建立持久的連接,這意味著當一個客戶端向服務器端發出請求,然後 Web 服務器返回響應(response),連接就被關閉了,在服務器端不保留連接的有關信息。HTTP 遵循請求(Request) / 應答(Response)模型。Web 瀏覽器向 Web 服務器發送請求,Web 服務器處理請求並返回適當的應答。
2.工作流程
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/test/test.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 連接在發送後將仍然保持打開狀態。於是,瀏覽器可以繼續通過相同的連接發送請求。
3.HTTP 請求格式
當瀏覽器向 Web 服務器發出請求時,它向服務器傳遞了一個數據塊,也就是請求信息,HTTP 請求信息由 3 部分組成:
(1)請求方法 URI 協議/版本
(2)請求頭(Request Header)
(3)請求正文
下面是一個 HTTP 請求的例子:
GET/test/test.jsp HTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=XXX&password=****
說明:
(1)請求方法 URI 協議/版本
以上代碼中 “GET” 代表請求方法,“/test/test.jsp” 表示 URI,“HTTP/1.1“ 代表協議和協議的版本。
(2)請求頭(Request Header)
請求頭包含許多有關的客戶端環境和請求正文的有用信息。例如,請求頭可以聲明瀏覽器所用的語言,請求正文的長度等。
Accept:image/gif.image/jpeg.*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate
(3)請求正文
請求頭和請求正文之間是一個空行,這個空行非常重要,它表示請求頭已經結束,接下來的是請求正文。請求正文中可以包含客戶端提交的查詢字符串信息:
例如:username=XXX&password=****
在以上的例子中,請求的正文只有一行內容。當然,在實際應用中,HTTP 請求正文可以包含更多的內容。
請求頭常用字段說明:
Accept:瀏覽器可接受的MIME類型;
Accept-Charset:瀏覽器可接受的字符集;
Accept-Encoding:瀏覽器能夠進行解碼的數據編碼方式,比如gzip。Servlet 能夠向支持 gzip 的瀏覽器返回經 gzip 編碼的 HTML 頁面。許多情形下這可以減少5到10倍的下載時間;
Accept-Language:瀏覽器所希望的語言種類,當服務器能夠提供一種以上的語言版本時要用到;
Authorization:授權信息,通常出現在對服務器發送的 WWW-Authenticate 頭的應答中;
Connection:表示是否需要持久連接。如果 Servlet 看到這裡的值為 “Keep-Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認進行持久連接),它就可以利用持久連接的優點,當頁面包含多個元素時(例如 Applet,圖片),顯著地減少下載所需要的時間。要實現這一點,Servlet 需要在應答中發送一個 Content-Length 頭。最簡單的實現方法是:
先把內容寫入ByteArrayOutputStream,然後在正式寫出內容之前計算它的大小;
Content-Length:表示請求消息正文的長度;
Cookie:這是最重要的請求頭信息之一;
From:請求發送者的 email 地址,由一些特殊的 Web 客戶程序使用,瀏覽器不會用到它;
Host:初始 URL 中的主機和端口;
If-Modified-Since:只有當所請求的內容在指定的日期之後又經過修改才返回它,否則返回 304“Not Modified” 應答;
Pragma:指定 “no-cache” 值表示服務器必須返回一個刷新後的文檔,即使它是代理服務器而且已經有了頁面的本地拷貝;
Referer:包含一個 URL,用戶從該 URL 代表的頁面出發訪問當前請求的頁面。
User-Agent:瀏覽器類型,如果 Servlet 返回的內容與瀏覽器類型有關則該值非常有用;
UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的 IE 瀏覽器所發送的非標準的請求頭,表示屏幕大小、顏色深度、操作系統和CPU類型;
HTTP 應答與 HTTP 請求相似,HTTP 響應也由 3 個部分構成,分別是:
(1)協議狀態版本代碼描述
(2)響應頭(Response Header)
(3)響應正文
下面是一個 HTTP 響應的例子:
HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112
<html>
<head>
<title>HTTP 響應示例<title>
</head>
<body>
Hello World!
</body>
</html>
說明:
(1)協議狀態代碼描述 HTTP 響應的第一行類似於 HTTP 請求的第一行,它表示通信所用的協議是 HTTP1.1, 服務器已經成功的處理了客戶端發出的請求(200 表示成功)。
(2)響應頭(Response Header)響應頭也和請求頭一樣包含許多有用的信息,例如服務器類型、日期時間、內容類型和長度等。
(3)響應正文就是服務器返回的 HTML 頁面。響應頭和正文之間也必須用空行分隔。
響應頭常用字段說明:
Allow:服務器支持哪些請求方法(如 GET、POST 等);
Content-Encoding:文檔的編碼(Encode)方法。只有在解碼之後才可以得到 Content-Type 頭指定的內容類型。利用 gzip 壓縮文檔能夠顯著地減少 HTML 文檔的下載時間。Servlet 可以通過查看 Accept-Encoding 頭來檢查瀏覽器是否支持 gzip,為支持 gzip 的瀏覽器返回經 gzip 壓縮的 HTML 頁面,為其他瀏覽器返回普通頁面;
Content-Length:表示內容長度。只有當瀏覽器使用持久 HTTP 連接時才需要這個數據。如果你想要利用持久連接的優勢,可以把輸出文檔寫入 ByteArrayOutputStram,完成後查看其大小,然後把該值放入 Content-Length 頭,最後通過byteArrayStream.writeTo(response.getOutputStream() 發送內容;
Content-Type: 表示後面的文檔屬於什麼 MIME 類型。Servlet 默認為 text/plain,但通常需要顯式地指定為 text/html。由於經常要設置 Content-Type,因此 HttpServletResponse 提供了一個專用的方法 setContentType。 可在 web.xml 文件中配置擴展名和 MIME 類型的對應關係;
Date:當前的 GMT 時間。你可以用 setDateHeader 來設置這個頭以避免轉換時間格式的麻煩;
Expires:指明應該在什麼時候認為文檔已經過期,從而不再緩存它。
Last-Modified:文檔的最後改動時間;
Location:表示客戶端應當到哪裡去提取文檔。Location 通常不是直接設置的,而是通過 HttpServletResponse 的 sendRedirect 方法,該方法同時設置狀態代碼為302;
Refresh:表示瀏覽器應該在多少時間之後刷新文檔,以秒計。除了刷新當前文檔之外,你還可以通過 setHeader("Refresh", "5; URL=http://host/path") 讓瀏覽器讀取指定的頁面。注意這種功能通常是通過設置 HTML 頁面 HEAD 區的 <META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path"> 實現,這是因為,自動刷新或重定向對於那些不能使用 CGI 或 Servlet 的HTML 編寫者十分重要。但是,對於 Servlet 來說,直接設置 Refresh 頭更加方便。注意 Refresh 的意義是“N 秒之後刷新本頁面或訪問指定頁面”,而不是“每隔 N 秒刷新本頁面或訪問指定頁面”。因此,連續刷新要求每次都發送一個 Refresh 頭,而發送 204 狀態代碼則可以阻止瀏覽器繼續刷新,不管是使用 Refresh 頭還是 <META HTTP-EQUIV="Refresh" ...>。注意 Refresh 頭不屬於 HTTP 1.1正式規範的一部分,而是一個擴展。
4.HTTP 請求方式
(1)GET 向特定的資源發出請求。注意:GET方法不應當被用於產生“副作用”的操作中,應該是冪等的。
(2)POST 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。
(3)PUT 用於修改某個內容,向指定資源位置上傳其最新內容。
(4)DELETE 請求服務器刪除 Request-URI 所標識的資源。
(5)OPTIONS 返回服務器針對特定資源所支持的 HTTP 請求方法。也可以利用向 Web 服務器發送 '*' 的請求來測試服務器的功能性。
(6)HEAD 向服務器索要與GET請求相一致的響應,只不過響應體將不會被返回。這一方法可以在不必傳輸整個響應內容的情況下,就可以獲取包含在響應消息頭中的元信息。
(7)TRACE 回顯服務器收到的請求,主要用於測試或診斷。
(8)CONNECT HTTP/1.1協議中預留給能夠將連接改為管道方式的代理服務器。
5.HTTP 狀態響應碼
(1)1**:請求收到,繼續處理
100——客戶端必須繼續發出請求
101——客戶端要求服務器根據請求轉換 HTTP 協議版本
(2)2**:操作成功收到,分析、接受
200——交易成功
201——提示知道新文件的 URL
202——接受和處理、但處理未完成
203——返回信息不確定或不完整
204——請求收到,但返回信息為空
205——服務器完成了請求,用戶代理必須復位當前已經瀏覽過的文件
206——服務器已經完成了部分用戶的 GET 請求
(3)3**:完成此請求必須進一步處理
300——請求的資源可在多處得到
301——刪除請求數據
302——在其他地址發現了請求數據
303——建議客戶端訪問其他 URL 或訪問方式
304——客戶端已經執行了 GET,但文件未變化
305——請求的資源必須從服務器指定的地址得到
306——前一版本 HTTP 中使用的代碼,現行版本中不再使用
307——申明請求的資源臨時性刪除
(4)4**:請求包含一個錯誤語法或不能完成
400——錯誤請求,如語法錯誤
401——未授權
401.1 - 未授權:登錄失敗
401.2 - 未授權:服務器配置問題導致登錄失敗
401.3 - ACL 禁止訪問資源
401.4 - 未授權:授權被篩選器拒絕
401.5 - 未授權:ISAPI 或 CGI 授權失敗
402——保留有效 ChargeTo 頭響應
403——禁止訪問
403.1 - 禁止訪問:禁止可執行訪問
403.2 - 禁止訪問:禁止讀訪問
403.3 - 禁止訪問:禁止寫訪問
403.4 - 禁止訪問:要求 SSL
403.5 - 禁止訪問:要求 SSL 128
403.6 - 禁止訪問:IP 地址被拒絕
403.7 - 禁止訪問:要求客戶證書
403.8 - 禁止訪問:禁止站點訪問
403.9 - 禁止訪問:連接的用戶過多
403.10 - 禁止訪問:配置無效
403.11 - 禁止訪問:密碼更改
403.12 - 禁止訪問:映射器拒絕訪問
403.13 - 禁止訪問:客戶證書已被吊銷
403.15 - 禁止訪問:客戶訪問許可過多
403.16 - 禁止訪問:客戶證書不可信或者無效
403.17 - 禁止訪問:客戶證書已經到期或者尚未生效
404——沒有發現文件、查詢或 URl
405——用戶在 Request-Line 字段定義的方法不允許
406——根據用戶發送的 Accept ,請求資源不可訪問
407——類似 401,用戶必須首先在代理服務器上得到授權
408——客戶端沒有在用戶指定的時間內完成請求
409——對當前資源狀態,請求不能完成
410——服務器上不再有此資源且無進一步的參考地址
411——服務器拒絕用戶定義的 Content-Length 屬性請求
412——一個或多個請求頭字段在當前請求中錯誤
413——請求的資源大於服務器允許的大小
414——請求的資源 URL 長於服務器允許的長度
415——請求資源不支持請求項目格式
416——請求中包含 Range 請求頭字段,在當前請求資源範圍內沒有 range 指示值,請求也不包含 If-Range 請求頭字段
417——服務器不滿足請求 Expect 頭字段指定的期望值,如果是代理服務器,可能是下一級服務器不能滿足請求長。
(5)5**:服務器執行一個完全有效請求失敗
500 - 內部服務器錯誤
500.10 - 內部服務器錯誤 - ASP 錯誤
500.11 - 服務器關閉
500.12 - 應用程序重新啟動
500.13 - 服務器太忙
500.14 - 應用程序無效
500.15 - 不允許請求 global.asa
501 - 未實現
502 - 網關錯誤