天天看點

《通信協定》——HTTP協定(2)

前言

通過初識的學習,我們已經知道網絡通信協定主要是分為7層(或者4層、五層),其中應用層主要就有http協定,廢話不多說,下面就來了解一下http協定吧。

HTTP簡介

HTTP協定是Hyper Text Transfer Protocol(超文本傳輸協定)的縮寫,是用于從網際網路(WWW:World Wide Web )伺服器傳輸超文本到本地浏覽器的傳送協定。(具體可以看百度百科)

HTTP工作原理

HTTP協定工作于用戶端-服務端架構上,也就是我們所說的C/S架構,即浏覽器作為HTTP用戶端通過URL(位址)向HTTP服務端即WEB伺服器(Apache伺服器,IIS伺服器等)發送請求,當web伺服器接收到請求之後會向用戶端發送響應資訊。HTTP預設端口号為80,但是你也可以改為8080或者其他端口。

HTTP特點

  • HTTP是無連接配接:無連接配接的含義是限制每次連接配接隻處理一個請求。伺服器處理完客戶的請求,并收到客戶的應答後,即斷開連接配接。采用這種方式可以節省傳輸時間。
  • HTTP是媒體獨立的:這意味着,隻要用戶端和伺服器知道如何處理的資料内容,任何類型的資料都可以通過HTTP發送。用戶端以及伺服器指定使用适合的MIME-type内容類型。
  • HTTP是無狀态:HTTP協定是無狀态協定。無狀态是指協定對于事務處理沒有記憶能力。缺少狀态意味着如果後續處理需要前面的資訊,則它必須重傳,這樣可能導緻每次連接配接傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。

HTTP消息結構

HTTP使用統一資源辨別符(Uniform Resource Identifiers, URI)來傳輸資料和建立連接配接。一旦建立連接配接後,資料消息就通過類似Internet郵件所使用的格式[RFC5322]和多用途Internet郵件擴充(MIME)[RFC2045]來傳送。

  • 用戶端請求

    用戶端發送一個HTTP請求到伺服器的請求消息包括以下格式:請求行(request line)、請求頭部(header)、空行和請求資料四個部分組成。

    《通信協定》——HTTP協定(2)
  • 伺服器端響應

    HTTP響應也由四個部分組成,分别是:狀态行、消息報頭、空行和響應正文。

    《通信協定》——HTTP協定(2)
  • 舉例說明
//用戶端
GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
//伺服器端
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
           

HTTP請求方法

序号 方法 描述
1 GET 請求指定的頁面資訊,并傳回實體主體。
2 HEAD 類似于get請求,隻不過傳回的響應中沒有具體的内容,用于擷取報頭
3 POST 向指定資源送出資料進行處理請求(例如送出表單或者上傳檔案)。資料被包含在請求體中。POST請求可能會導緻新的資源的建立和/或已有資源的修改。
4 PUT 從用戶端向伺服器傳送的資料取代指定的文檔的内容。
5 DELETE 請求伺服器删除指定的頁面。
6 CONNECT HTTP/1.1協定中預留給能夠将連接配接改為管道方式的代理伺服器。
7 OPTIONS 允許用戶端檢視伺服器的性能。
8 TRACE 回顯伺服器收到的請求,主要用于測試或診斷。

HTTP響應頭資訊

應答頭 說明
Allow 伺服器支援哪些請求方法(如GET、POST等)。
Content-Encoding 文檔的編碼(Encode)方法。隻有在解碼之後才可以得到Content-Type頭指定的内容類型。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載下傳時間。Java的GZIPOutputStream可以很友善地進行gzip壓縮,但隻有Unix上的Netscape和Windows上的IE 4、IE 5才支援它。是以,Servlet應該通過檢視Accept-Encoding頭(即request.getHeader(“Accept-Encoding”))檢查浏覽器是否支援gzip,為支援gzip的浏覽器傳回經gzip壓縮的HTML頁面,為其他浏覽器傳回普通頁面。
Content-Length 表示内容長度。隻有當浏覽器使用持久HTTP連接配接時才需要這個資料。如果你想要利用持久連接配接的優勢,可以把輸出文檔寫入 ByteArrayOutputStream,完成後檢視其大小,然後把該值放入Content-Length頭,最後通過byteArrayStream.writeTo(response.getOutputStream()發送内容。
Content-Type 表示後面的文檔屬于什麼MIME類型。Servlet預設為text/plain,但通常需要顯式地指定為text/html。由于經常要設定Content-Type,是以HttpServletResponse提供了一個專用的方法setContentType。
Date 目前的GMT時間。你可以用setDateHeader來設定這個頭以避免轉換時間格式的麻煩。
Expires 應該在什麼時候認為文檔已經過期,進而不再緩存它?
Last-Modified 文檔的最後改動時間。客戶可以通過If-Modified-Since請求頭提供一個日期,該請求将被視為一個條件GET,隻有改動時間遲于指定時間的文檔才會傳回,否則傳回一個304(Not Modified)狀态。Last-Modified也可用setDateHeader方法來設定。
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正式規範的一部分,而是一個擴充,但Netscape和IE都支援它。
Server 伺服器名字。Servlet一般不設定這個值,而是由Web伺服器自己設定。
Set-Cookie 設定和頁面關聯的Cookie。Servlet不應使用response.setHeader(“Set-Cookie”, …),而是應使用HttpServletResponse提供的專用方法addCookie。參見下文有關Cookie設定的讨論。
WWW-Authenticate 客戶應該在Authorization頭中提供什麼類型的授權資訊?在包含401(Unauthorized)狀态行的應答中這個頭是必需的。例如,response.setHeader(“WWW-Authenticate”, “BASIC realm=\“executives\””)。注意Servlet一般不進行這方面的處理,而是讓Web伺服器的專門機制來控制受密碼保護頁面的通路(例如.htaccess)。

HTTP狀态碼

當浏覽者通路一個網頁時,浏覽者的浏覽器會向網頁所在伺服器送出請求。當浏覽器接收并顯示網頁前,此網頁所在的伺服器會傳回一個包含HTTP狀态碼的資訊頭(server header)用以響應浏覽器的請求。HTTP狀态碼的英文為HTTP Status Code。

下面是常見的HTTP狀态碼:(關于狀态碼更加具體的分類有興趣可以自行查閱)

  • 200 - 請求成功
  • 301 - 資源(網頁等)被永久轉移到其它URL
  • 404 - 請求的資源(網頁等)不存在
  • 500 - 内部伺服器錯誤

HTTP content-typeundefined

Content-Type,内容類型,一般是指網頁中存在的Content-Type,用于定義網絡檔案的類型和網頁的編碼,決定浏覽器将以什麼形式、什麼編碼讀取這個檔案,這就是經常看到一些Asp網頁點選的結果卻是下載下傳到的一個檔案或一張圖檔的原因。(對照表略,有興趣自行檢視)

總結

其實在日常開發中基本上不會涉及到http協定深層的東西,可能隻需要知道有這個東西,以及怎麼去用它,至于它到底是怎樣運轉的不需要我們去考慮,如果你有興趣請自行查閱相關資料。

參考

菜鳥教程網、百度百科、CSDN部落格

繼續閱讀