[網絡]HTTP

HTTP

HTTP 簡介

  HTTP 協議是 Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網(WWW:World Wide Web)服務器傳輸超文本到本地瀏覽器的傳送協議。

  HTTP 是基於 TCP/IP 通信協議來傳輸數據(HTML 文件,圖片文件,查詢結果等)。

  HTTP 是面向事務的應用層協議。

  所謂面向事務就是指一系列的信息交換,這些交換的信息是一個整體,要麼這些信息全部交換,要麼就不交換。

  HTTP 不僅能傳送文本跳轉所必須的信息,而且也能傳輸任何能在互聯網上得到的信息。

  HTTP 協議主要就是用來進行客戶端和服務器端之間進行通信的標準協議。HTTP 主要規定了客戶端如何與服務器端建立鏈接,客戶端如何從服務器請求數據,服務器如何響應請求,以及最後連接如何關閉。

  每個萬維網網點都有一個服務器進程,用來監視 TCP 的端口 80,以便發現是否有瀏覽器向它發出建立連接請求,一旦監聽到需要建立 TCP 連接,瀏覽器就會向萬維網發出瀏覽某個頁面的請求,而萬維網對這個請求的頁面做出響應,最後,TCP 連接釋放。在瀏覽器和服務器之間的請求與響應的交互,必須按照一定的格式和規則,這些格式和規則就是超文本傳輸協議 HTTP。

HTTP 工作原理

  HTTP 協議工作於客戶端-服務端架構上。瀏覽器作爲 HTTP 客戶端通過 URL 向 HTTP 服務端發送所有請求。

  Web 服務器有:Apache 服務器,IIS 服務器(Internet Information Service)等。

  Web 服務器根據接收到的請求後,向客戶端發送響應信息。

  HTTP 默認端口號爲 80,也可以改爲 8080 或者其他端口。

一次網絡請求的過程:

  1. 瀏覽器向 DNS 服務器請求解析該 URL 中的域名所對應的 IP 地址。
  2. 解析出 IP 地址後,根據該 IP 地址和默認端口 80,和服務器建立 TCP 連接。
  3. 瀏覽器發出讀取文件(URL 中域名後面部分對應的文件)的 HTTP 請求,該請求報文作爲 TCP 三次握手的第三個報文的數據發送給服務器。
  4. 服務器對瀏覽器請求作出響應,並把對應的 html 文本發送給瀏覽器。
  5. 釋放 TCP 連接
  6. 瀏覽器將該 html 文本顯示內容

HTTP 三點注意事項:

  • HTTP 是無連接:無連接的含義是限制每次連接只處理一個請求。服務端處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。雖然 HTTP 需要用到 TCP 作爲傳輸層協議,但是在通信雙方交換 HTTP 報文之前不需要建立 HTTP 連接。
  • HTTP 是媒體獨立的:這意味着,只要客戶端和服務端知道如何處理的數據內容,任何類型的數據都可以通過 HTTP 發送。客戶端以及服務端指定使用合適的 MIME-type 內容類型。
  • HTTP 是無狀態:HTTP 協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

  下圖是 HTTP 協議通信流程:

  瀏覽器顯示的內容都有 HTML、XML、GIF、FLASH 等,瀏覽器是通過 MIME Type 區分它們,決定用什麼內容什麼形式來顯示。

  MIME Type 是該資源的媒體類型,MIME Type 不是個人指定的,是通過互聯網( IETF )組織協商,以 RFC( 是一系列以編號排定的文件,幾乎所有的互聯網標準都有收錄在其中 ) 的形式作爲建議的標準發佈在網上的,大多數的 Web 服務器和用戶代理都會支持這一規範( 順便說一句,Email 附件的類型也是通過 MIME Type 指定的 )。

  媒體類型通常通過 HTTP 協議,由 Web 服務器告知瀏覽器的,更準確的說,是通過 Content-Type 來表示的。

  如果是某個客戶端自己定義的格式,MIME Type 一點只能以 application/x- 開頭。

HTTP 的版本

  HTTP/1.0 的主要缺點:每當請求一個文檔,就需要兩倍的 RTT ( Round-Trip Time,往返時延,是指數據從網絡一端傳到另一端所需的時間) 的開銷(一個 RTT 時用來 TCP 的連接,另一個 RTT 用來請求和接收萬維網文檔),如果有很多個對象需要建立連接,那麼每一次連接都需要 2* RTT 的時間開銷。另一方面,每一次請求都需要建立 TCP 連接,並且萬維網通常都服務於大量的請求,所以這種非持續性的連接會導致萬維網的負荷過大。HTTP/1.0 中瀏覽器與服務器只保持短暫的連接,連接無法複用。也就說每個 TCP 連接只能發送一個請求。發送數據完畢,連接就關閉,如果還要請求其他資源,就必須再新建一個連接。

  HTTP/1.1 採用的是持續連接,就是在建立連接後的一段時間內仍然保持連接,使用同一個客戶和服務器傳送後續的請求和響應。客戶端和服務器發現對方一段時間沒有活動,就可以主動關閉連接。或者客戶端在最後一個請求時,主動告訴服務端要關閉連接。HTTP/1.1 版還引入了管道機制(pipelining) ,即在同一個 TCP 連接裏面,客戶端可以同時發送多個請求。但是對於執行者來說,還是需要按照順序,先執行完一件事以後再執行另外一件事。

  HTTP/2 採用了多路複用,即在一個連接裏,客戶端和瀏覽器都可以同時發送多個請求或迴應,而且不用按照順序一一對應。能這樣做有一個前提,就是 HTTP/2 進行了二進制分幀,即 HTTP/2 會將所有傳輸的信息分割爲更小的消息和幀(frame),並對它們採用二進制格式的編碼。除此之外,還有一些其他的優化,比如做 Header 壓縮、服務端推送等。

  持續連接有兩種工作方式,非流水線和流水線。

  非流水線:客戶在收到上一個響應才能發出下一個請求。缺點:服務器在發送了一個對象後,TCP 處於空閒狀態,浪費資源。

  流水線:客戶在收到 HTTP 的響應報文之前,就能夠接着發送新的請求。

HTTP 消息結構

  HTTP 是基於客戶端/服務端(C/S)的架構模型,通過一個可靠的鏈接來交換信息,是一個無狀態的請求/響應協議。

  一個 HTTP “客戶端”是一個應用程序(Web 瀏覽器或其他任何客戶端),通過鏈接服務器達到發送一個或多個 HTTP 的請求的目的。

  一個 HTTP “服務器”同樣也是一個應用程序(通常是一個 Web 服務,如 Apache Web 服務器或 IIS 服務器等),通過接收客戶端的請求並向客戶端發送 HTTP 響應數據。

  HTTP 使用統一資源標識符(Uniform Resource Identifiers,URL) 來傳輸數據和建立連接。

  一旦建立連接後,數據消息就通過類似 Internet 郵件所適用的格式和多用途 Internet 郵件擴展(MIME)來傳送。

客戶端請求消息

  客戶端發送一個 HTTP 請求到服務器的請求消息包括以下格式:請求行(request line)(方法+URL+版本)、請求頭部(header)、空行和請求數據四個部分組成,下圖給出了請求報文的一般格式:

  請求行:用來說明請求類型,要訪問的資源以及所使用的 HTTP 版本。

  請求頭部:緊接着請求行之後的部分,用來說明服務器要使用的附加信息。

  空行:請求頭部後面的空行是必須的。

  請求數據:也稱爲請求主體,可以添加任意的其他數據。

  請求頭部的首部字段名和含義:

字段名含義
Accept 瀏覽器可接受的 MIME 類型。
Accept-Charset 瀏覽器可接受的字符集。
Accept-Encoding 瀏覽器能夠進行解碼的數據編碼方式,比如 gzip。Servlet 能夠向支持 gzip 的瀏覽器返回經 gzip 編碼的 HTML 頁面。許多情形下這可以減少 5 到 10 倍的下載時間。
Accept-Language 瀏覽器所希望的語言種類,當服務器能夠提供一種以上的語言版本時要用到。
Authorization 授權信息,通常出現在對服務器發送的 WWW-Authorizate 頭的應答中。
Content-Length 表示請求消息正文的長度。
Host 客戶機通過這個頭告訴服務器,要訪問的主機名。Host 頭域指定請求資源的 Intenet 主機和端口號,必須表示請求 url 的原始服務器或網管的位置。HTTP/1.1 請求必須包含主機頭域,否則系統會以 400 狀態碼返回。
If-Modified-Since 客戶機通過這個頭告訴服務器,資源的緩存時間。只有當所請求的內容在指定的時間後又經過修改才返回它,否則返回 304 “Not Modified” 應答。
Referer 客戶機通過這個頭告訴服務器,它是從哪個資源來訪問服務器的(防盜鏈)。包含一個 URL,用戶從該 URL 代表的頁面出發訪問當前請求的頁面。
User-Agent User-Agent 頭域的內容包含發出請求的用戶信息。瀏覽器類型,如果 Servlet 返回的內容與瀏覽器類型有關則該值非常有用。
Cookie 客戶機通過這個頭可以向服務器帶數據,這是最重要的請求頭信息之一。
Pragma 指定 “no-cache” 值表示服務器必須返回一個刷新後的文檔,即使它是代理服務器而且已經有了頁面的本地拷貝。
From 請求發送者的 email 地址,由一些特殊的 Web 客戶程序使用,瀏覽器不會用到它。
Connection 處理完這次請求後是否斷開連接還是繼續保持連接。如果 Servlet 看到這裏的值爲 “Keep-Alive” ,或者看到請求使用的是 HTTP 1.1(HTTP 1.1 默認進行持久連接),它就可以利用持久連接的優點,當頁面包含多個元素時(例如 Applet、圖片),顯著地減少下載所需要的時間。要實現這一點,Servlet 需要在應答中發送一個 Content-Length 頭,最簡單的實現方法是:先把內容寫入 ByteArrayOutputStream,然後在正式寫出內容之前計算它的大小。
Range Range 頭域可以請求實體的一個或者多個子範圍,例如,表示頭 500 個字節:bytes=0-499,表示第二個 500 字節:bytes=500-999,表示最後 500 個字節:bytes=-500,表示 500 字節以後的範圍:bytes=500-,第一個和最後一個字節:bytes=0-0,-1,同時指定幾個範圍:bytes=500-600,601-999,但是服務器可以忽略此請求頭,如果無條件 GET 包含 Range 請求頭,響應會以狀態嗎 206(PartialContent)返回而不是以 200(OK)。
UA-Pixels,UA-Color,UA-OS,UA-CPU 由某些版本的 IE 瀏覽器所發送的非標準的請求頭,表示屏幕大小、屏幕深度、操作系統和 CPU 類型。

服務器響應消息

  HTTP 響應也由四個部分組成,分別是:狀態行(版本+狀態+短語)、消息報頭、空行和響應正文。

  狀態行:由 HTTP 協議版本號、狀態碼、狀態消息三部分組成。

  消息報頭:用來說明客戶端要使用的一些附加信息。

  空行:消息報頭後面的空行是必須的。

  響應正文:服務器返回給客戶端的文本信息。

實例

  下面實例是一些典型的使用 GET 來傳遞數據的實例:

  客戶端請求:

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

  輸出結果:

Hello World! My payload includes a trailing CRLF.

HTTP 請求方法

  根據 HTTP 標準,HTTP 請求可以使用多種請求方法。

  HTTP 1.0 定義了三種請求方法:GET、POST 和 HEAD 方法。

  HTTP 1.1 新增了六種請求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

方法描述
GET(獲取資源) 請求指定的頁面信息,並返回實體主體。
HEAD(獲取報文首部) 類似於 GET 請求,只不過返回的響應中沒有具體的內容,用於獲取報頭。
POST(傳輸實體文本) 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST 請求可能會導致新的資源的建立或已有資源的修改。
PUT(傳輸文件) 從客戶端向服務器傳送的數據取代指定的文檔的內容。
DELETE(刪除文件) 請求服務器刪除指定的頁面。
CONNECT(要求用隧道協議連接代理) HTTP/1.1 協議中預留給能夠將連接改爲管道方式的代理服務器。要求在與代理服務器通信時建立隧道,實現用隧道協議進行 TCP 通信。主要使用 SSL(安全套接層)和 TSL(傳輸層安全)協議把通信內容加密後經網絡隧道傳輸。
OPTIONS(詢問支持的方法) 允許客戶算查看服務器的性能。用於查詢針對請求 URL 指定資源支持的方法(客戶端詢問服務器可以提交哪些請求方法)。
TRACE(追蹤路徑) 回顯服務器收到的請求,主要用於測試或診斷。
PATCH(補充) 是對 PUT 方法的補充,用來對已知資源進行局部更新。

  GET 方法用來請求已被 URL 識別的資源。指定的資源經服務器端解析後返回響應內容(也就是說,如果請求的資源是文本,那就保持原樣返回;如果是 CGI[通用網關接口]那樣的程序,則返回經過執行後的輸出結果)。

  POST 方法用來傳輸實體的主體。雖然用 GET 方法也可以傳輸實體的主體,但一般不用 GET 方法進行傳輸,而是用 POST 方法;雖然 GET 方法和 POST 方法很相似,但是 POST 的主要目的並不是獲取相應的主體內容。

  GET 方法和 POST 方法的區別:

  1. GET 方法用於信息獲取,它是安全的(安全:指非修改信息,如數據庫方面的信息),而 POST 方法是用於修改服務器上資源的請求;
  2. GET 請求的數據會附在 URL 之後,而 POST 方法提交的數據則放置在 HTTP 報文實體的主體裏,所以 POST 方法的安全性比 GET 方法要高;
  3. GET 方法傳輸的數據量一般限制在 2 KB,其原因在於:GET 是通過 URL 提交數據,而 URL 本身對於數據沒有限制,但是不同的瀏覽器對於 URL 是有限制的,比如 IE 瀏覽器對於 URL 的限制爲 2 KB,而 chrome,FireFox 瀏覽器理論上對於 URL 是沒有限制的,它真正的限制取決於操作系統本身;POST 方法對於數據大小是無限制的,真正影響到數據大小的是服務器處理程序的能力。

  HEAD 方法與 GET 方法的區別:GET 方法有實體,HEAD 方法無實體。

  HEAD 方法的主要用途:1.判斷類型;2.查看響應中的狀態碼,看對象是否存在(響應:請求執行成功了,但是無數據返回);3.測試資源是否被修改過。

HTTP 響應頭信息

  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.write(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=”Refrsh”… > 。注意 Refrsh 頭不屬於 HTTP 1.1 正式規範的一部分,而是一個擴展,但 Netscape 和 IE 都支持它。
Server 服務器名字。Servlet 一般不設置這個值,而是由 Web 服務器自己設置。
Set-Cookie 設置和頁面關聯的 Cookie。Servlet 不應使用 response.setHeader(“Set-Cookie”,…),而是應使用 HttpServletResponse 提供的專用方法 addCookie。
WWW-Authenticate 客戶應該在 Authorization 頭中提供什麼類型的授權信息?在包含 401 (Unauthorized) 狀態行的應答中這個頭是必須的。例如,response.setHeader(“WWW-Authenticate”,”BASIC realm=”executives”)。注意 Servlet 一般不進行這方面的處理,而是讓 Web 服務器的專門機制來控制受密碼保護頁面的訪問(例如 htaccess)。

HTTP 狀態碼

  當瀏覽器訪問一個網頁時,瀏覽者的瀏覽器會向網頁所在服務器發出請求。當瀏覽器接收並顯示網頁前,此網頁所在的服務器會返回一個包含 HTTP 狀態碼的信息頭(server header)用以響應瀏覽器的請求。

  下面是常見的 HTTP 狀態碼:

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

HTTP 狀態碼分類

  HTTP 狀態碼由三個十進制數字組成,第一個十進制數字定義了狀態碼的類型,後兩個數字沒有分類的作用。HTTP 狀態碼共分爲 5 種類型:

  HTTP 狀態碼分類:

分類分類描述
1xx 信息,服務器收到請求,需要請求者繼續執行操作
2xx 成功,操作被成功接收並處理
3xx 重定向,需要進一步的操作以完成請求
4xx 客戶端錯誤,請求包含語法錯誤或無法完成請求
5xx 服務器錯誤,服務器在處理請求的過程中發生了錯誤

  HTTP 狀態碼列表:

狀態碼狀態碼英文名稱中文描述
100 Continue 繼續,客戶端應繼續其請求
101 Switching Protocols 切換協議。服務器根據客戶端的請求切換協議。只能切換到更高級的協議,例如,切換到 HTTP 的新版本協議
200 OK 請求成功。一般用於 GET 與 POST 請求
201 Created 已創建。成功請求並創建了新的資源
202 Accepted 已接受。已經接受請求,但未處理完成
203 Non-Authoritative Information 非授權信息。請求成功。但返回的 meta 信息不在原始的服務器,而是一個副本
204 No Content 無內容。服務器成功處理,但未返回內容。在未更新網頁的情況下,可確保瀏覽器繼續顯示當前文檔
205 Reset Content 重置內容。服務器處理成功,用戶終端(例如:瀏覽器)應重置文檔視圖。可通過此返回碼清楚瀏覽器的表單域
206 Partial Content 部分內容。服務器成功處理了部分 GET 請求
300 Multiple Choices 多種選擇。請求的資源可包括多個位置,相應可返回一個資源特徵與地址的列表用於用戶終端(例如瀏覽器)選擇
301 Moved Permanently 永久移動。請求的資源已被永久的移動到新 URL,返回信息會包括新的 URL,瀏覽器會自動定向到新 URL。今後任何新的請求都應使用新的 URL 代替。
302 Found 臨時移動。與 301 類似。但資源只是臨時被移動。客戶端應繼續使用原有 URL
303 See Other 查看其他地址。與 301 類似。使用 GET 和 POST 請求查看
304 Not Modified 未修改。所請求的資源未修改,服務器返回此狀態碼時,不會返回任何資源。客戶端通常會緩存訪問過的資源,通過提供一個頭信息指出客戶端希望只返回在指定日期之後修改的資源
305 Use Proxy 使用代理。所請求的資源必須通過代理訪問
306 Unused 已經被廢棄的 HTTP 狀態碼
307 Temporary Redirect 臨時重定向。與 302 類似。使用 GET 請求重定向
400 Bad Request 客戶端請求的語法錯誤,服務器無法理解
401 Unauthorized 請求要求用戶的身份認證
402 Payment Required 保留,將來使用
403 Forbidden 服務器理解請求客戶端的請求,但是拒絕執行此請求
404 Not Found 服務器無法根據客戶端的請求找到資源(網頁)。通過此代碼,網站設計人員可設置“您所請求的資源無法找到”的個性頁面
405 Method Not Allowed 客戶端請求中的方法被禁止
406 Not Acceptable 服務器無法根據客戶端請求的內容特性完成請求
407 Proxy Authentication required 請求要求代理的身份認證,與 401 類似,但請求者應當使用代理進行授權
408 Request Timeout 服務端等待客戶端發送的請求時間過長,超時
409 Conflict 服務器完成客戶端的 PUT 請求時可能返回此代碼,服務器處理請求時發生了衝突
410 Gone 客戶端請求的資源已經不存在。410 不同於 404,如果資源以前有現在被永久刪除了可使用 404 代碼,網站設計人員可通過 301 代碼指定資源的位置
411 Length Required 服務器無法處理客戶端發送的不帶 Content-Length 的請求信息
412 Precondition Failed 客戶端請求信息的先決條件錯誤
413 Request Enity Too Large 由於請求的實體過大,服務器無法處理,因此拒絕請求。爲防止客戶端的連續請求,服務器可能會關閉連接。如果只是服務器暫時無法處理,則會包含一個 Retry-After 的響應信息
414 Request-URL Too Large 請求的 URL(URL 通常爲網址)過長,服務器無法處理
415 Unsupported Media Type 服務器無法處理請求附帶的媒體格式
416 Requested rang not satisfiable 客戶端請求的範圍無效
417 Expectation Failed 服務器無法滿足 Expect 的請求頭信息
500 Internal Server Error 服務器內部錯誤,無法完成請求
501 Not Implemented 服務器不支持請求的功能,無法完成請求
502 Bad Gateway 作爲網關或者代理服務器嘗試執行請求時,從遠程服務器接收到了一個無效的響應
503 Service Unavailable 由於超載或系統維護,服務器暫時的無法處理客戶端的請求。延時的長度可包含在服務器的 Retry-After 頭信息中
504 Gateway Timeout 充當網關或代理的服務器,未及時從遠程服務器獲取請求
505 HTTP Version not supported 服務器不支持請求的 HTTP 協議的版本,無法完成處理

HTTP content-type

  Content-Type (內容類型),一般是指網頁中存在的 Content-Type,用來定義網絡文件的類型和網頁的編碼,決定瀏覽器將以什麼形式、什麼編碼讀取這個文件,這就是經常看到一些 PHP 網頁點擊的結果卻是下載一個文件或一張圖片的原因。

  Content-Type 標頭告訴客戶端實際返回的內容的內容類型。

  語法格式:

Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something

  實例:

  常見的媒體格式類型如下:

  • text/html:HTML 格式
  • text/plain:純文本格式
  • text/xml:XML 格式
  • image/gif:gif 圖片格式
  • image/jpeg:jpg 圖片格式
  • image/png:png 圖片格式

  以 application 開頭的媒體格式類型:

  • application/xhtml+xml:XHTML 格式
  • application/xml:XML 數據格式
  • application/auto+xml:Atom XML 聚合格式
  • application/json:JSON 數據格式
  • application/pdf:pdf 格式
  • application/msword:Word 文檔格式
  • application/octet-stream:二進制流數據(如常見的文件下載)
  • application/x-www-form-urlencoded:< form encType=””>種默認的 encType,form 表單數據被編碼爲 key/value 格式發送到服務器(表單默認的提交數據的格式)

  另外一種常見的媒體格式是上傳文件之時使用的:

  • multipart/form-data:需要在表單中進行文件上傳時,就需要使用該格式。

HTTP content-type 對照表

文件擴展名Content-Type(Mime-Type)文件擴展名Content-Type(Mime-Type)
.*( 二進制流,不知道下載文件類型) application/octet-stream .tif image/tiff
.001 application/x-001 .301 application/x-301
.323 text/h323 .906 application/x-906
.907 drawing/907 .a11 application/x-a11
.acp audio/x-mei-aac .ai application/postscript
.aif audio/aiff .aifc audio/aiff
.aiff audio/aiff .anv application/x-anv
.asa text/asa .asf video/x-ms-asf
.asp text/asp .asx video/x-ms-asf
.au audio/basic .avi video/avi
.awf application/vnd.adobe.workflow .biz text/xml
.bmp application/x-bmp .bot application/x-bot
.c4t application/x-c4t .c90 application/x-c90
.cal application/x-cals .cat application/vnd.ms-pki.seccat
.cdf application/x-netcdf .cdr application/x-cdr
.cel application/x-cel .cer application/x-x509-ca-cert
.cg4 application/x-g4 .cgm application/x-cgm
.cit application/x-cit .class java/*
.cml text/xml .cmp application/x-cmp
.cmx application/x-cmx .cot application/x-cot
.crl application/pkix-crl .crt application/x-x509-ca-cert
.csi application/x-csi .css text/css
.cut application/x-cut .dbf application/x-dbf
.dbm application/x-dbm .dbx application/x-dbx
.dcd text/xml .dcx application/x-dcx
.der application/x-x509-ca-cert .dgn application/x-dgn
.dib application/x-dib .dll application/x-msdownload
.doc application/msword .dot application/msword
.drw application/x-drw .dtd text/xml
.dwf Model/vnd.dwf .dwf application/x-dwf
.dwg application/x-dwg .dxb application/x-dxb
.dxf application/x-dxf .edn application/vnd.adobe.edn
.emf application/x-emf .eml message/rfc822
.ent text/xml .epi application/x-epi
.eps application/x-ps .eps application/postscript
.etd application/x-ebx .exe application/x-msdownload
.fax image/fax .fdf application/vnd.fdf
.fif application/fractals .fo text/xml
.frm application/x-frm .g4 application/x-g4
.gbr application/x-gbr . application/x-
.gif image/gif .gl2 application/x-gl2
.gp4 application/x-gp4 .hgl application/x-hgl
.hmr application/x-hmr .hpg application/x-hpgl
.hpl application/x-hpl .hqx application/mac-binhex40
.hrf application/x-hrf .hta application/hta
.htc text/x-component .htm text/html
.html text/html .htt text/webviewhtml
.htx text/html .icb application/x-icb
.ico image/x-icon .ico application/x-ico
.iff application/x-iff .ig4 application/x-g4
.igs application/x-igs .iii application/x-iphone
.img application/x-img .ins application/x-internet-signup
.isp application/x-internet-signup .IVF video/x-ivf
.java java/* .jfif image/jpeg
.jpe image/jpeg .jpe application/x-jpe
.jpeg image/jpeg .jpg image/jpeg
.jpg application/x-jpg .js application/x-javascript
.jsp text/html .la1 audio/x-liquid-file
.lar application/x-laplayer-reg .latex application/x-latex
.lavs audio/x-liquid-secure .lbm application/x-lbm
.lmsff audio/x-la-lms .ls application/x-javascript
.ltr application/x-ltr .m1v video/x-mpeg
.m2v video/x-mpeg .m3u audio/mpegurl
.m4e video/mpeg4 .mac application/x-mac
.man application/x-troff-man .math text/xml
.mdb application/msaccess .mdb application/x-mdb
.mfp application/x-shockwave-flash .mht message/rfc822
.mhtml message/rfc822 .mi application/x-mi
.mid audio/mid .midi audio/mid
.mil application/x-mil .mml text/xml
.mnd audio/x-musicnet-download .mns audio/x-musicnet-stream
.mocha application/x-javascript .movie video/x-sgi-movie
.mp1 audio/mp1 .mp2 audio/mp2
.mp2v video/mpeg .mp3 audio/mp3
.mp4 video/mpeg4 .mpa video/x-mpg
.mpd application/vnd.ms-project .mpe video/x-mpeg
.mpeg video/mpg .mpg video/mpg
.mpga audio/rn-mpeg .mpp application/vnd.ms-project
.mps video/x-mpeg .mpt application/vnd.ms-project
.mpv video/mpg .mpv2 video/mpeg
.mpw application/vnd.ms-project .mpx application/vnd.ms-project
.mtx text/xml .mxp application/x-mmxp
.net image/pnetvue .nrf application/x-nrf
.nws message/rfc822 .odc text/x-ms-odc
.out application/x-out .p10 application/pkcs10
.p12 application/x-pkcs12 .p7b application/x-pkcs7-certificates
.p7c application/pkcs7-mime .p7m application/pkcs7-mime
.p7r application/x-pkcs7-certreqresp .p7s application/pkcs7-signature
.pc5 application/x-pc5 .pci application/x-pci
.pcl application/x-pcl .pcx application/x-pcx
.pdf application/pdf .pdf application/pdf
.pdx application/vnd.adobe.pdx .pfx application/x-pkcs12
.pgl application/x-pgl .pic application/x-pic
.pko application/vnd.ms-pki.pko .pl application/x-perl
.plg text/html .pls audio/scpls
.plt application/x-plt .png image/png
.png application/x-png .pot application/vnd.ms-powerpoint
.ppa application/vnd.ms-powerpoint .ppm application/x-ppm
.pps application/vnd.ms-powerpoint .ppt application/vnd.ms-powerpoint
.ppt application/x-ppt .pr application/x-pr
.prf application/pics-rules .prn application/x-prn
.prt application/x-prt .ps application/x-ps
.ps application/postscript .ptn application/x-ptn
.pwz application/vnd.ms-powerpoint .r3t text/vnd.rn-realtext3d
.ra audio/vnd.rn-realaudio .ram audio/x-pn-realaudio
.ras application/x-ras .rat application/rat-file
.rdf text/xml .rec application/vnd.rn-recording
.red application/x-red .rgb application/x-rgb
.rjs application/vnd.rn-realsystem-rjs .rjt application/vnd.rn-realsystem-rjt
.rlc application/x-rlc .rle application/x-rle
.rm application/vnd.rn-realmedia .rmf application/vnd.adobe.rmf
.rmi audio/mid .rmj application/vnd.rn-realsystem-rmj
.rmm audio/x-pn-realaudio .rmp application/vnd.rn-rn_music_package
.rms application/vnd.rn-realmedia-secure .rmvb application/vnd.rn-realmedia-vbr
.rmx application/vnd.rn-realsystem-rmx .rnx application/vnd.rn-realplayer
.rp image/vnd.rn-realpix .rpm audio/x-pn-realaudio-plugin
.rsml application/vnd.rn-rsml .rt text/vnd.rn-realtext
.rtf application/msword .rtf application/x-rtf
.rv video/vnd.rn-realvideo .sam application/x-sam
.sat application/x-sat .sdp application/sdp
.sdw application/x-sdw .sit application/x-stuffit
.slb application/x-slb .sld application/x-sld
.slk drawing/x-slk .smi application/smil
.smil application/smil .smk application/x-smk
.snd audio/basic .sol text/plain
.sor text/plain .spc application/x-pkcs7-certificates
.spl application/futuresplash .spp text/xml
.ssm application/streamingmedia .sst application/vnd.ms-pki.certstore
.stl application/vnd.ms-pki.stl .stm text/html
.sty application/x-sty .svg text/xml
.swf application/x-shockwave-flash .tdf application/x-tdf
.tg4 application/x-tg4 .tga application/x-tga
.tif image/tiff .tif application/x-tif
.tiff image/tiff .tld text/xml
.top drawing/x-top .torrent application/x-bittorrent
.tsd text/xml .txt text/plain
.uin application/x-icq .uls text/iuls
.vcf text/x-vcard .vda application/x-vda
.vdx application/vnd.visio .vml text/xml
.vpg application/x-vpeg005 .vsd application/vnd.visio
.vsd application/x-vsd .vss application/vnd.visio
.vst application/vnd.visio .vst application/x-vst
.vsw application/vnd.visio .vsx application/vnd.visio
.vtx application/vnd.visio .vxml text/xml
.wav audio/wav .wax audio/x-ms-wax
.wb1 application/x-wb1 .wb2 application/x-wb2
.wb3 application/x-wb3 .wbmp image/vnd.wap.wbmp
.wiz application/msword .wk3 application/x-wk3
.wk4 application/x-wk4 .wkq application/x-wkq
.wks application/x-wks .wm video/x-ms-wm
.wma audio/x-ms-wma .wmd application/x-ms-wmd
.wmf application/x-wmf .wml text/vnd.wap.wml
.wmv video/x-ms-wmv .wmx video/x-ms-wmx
.wmz application/x-ms-wmz .wp6 application/x-wp6
.wpd application/x-wpd .wpg application/x-wpg
.wpl application/vnd.ms-wpl .wq1 application/x-wq1
.wr1 application/x-wr1 .wri application/x-wri
.wrk application/x-wrk .ws application/x-ws
.ws2 application/x-ws .wsc text/scriptlet
.wsdl text/xml .wvx video/x-ms-wvx
.xdp application/vnd.adobe.xdp .xdr text/xml
.xfd application/vnd.adobe.xfd .xfdf application/vnd.adobe.xfdf
.xhtml text/html .xls application/vnd.ms-excel
.xls application/x-xls .xlw application/x-xlw
.xml text/xml .xpl audio/scpls
.xq text/xml .xql text/xml
.xquery text/xml .xsd text/xml
.xsl text/xml .xslt text/xml
.xwd application/x-xwd .x_b application/x-x_b
.sis application/vnd.symbian.install .sisx application/vnd.symbian.install
.x_t application/x-x_t .ipa application/vnd.iphone
.apk application/vnd.android.package-archive .xap application/x-silverlight-app

  在網站中,http 請求時無狀態的。也就是說即使第一次和服務器連接後並且登陸成功後,第二次請求服務器依然不能知道當前請求是哪個用戶。cookie 的出現就是爲了解決這個問題,第一次登陸後服務器返回一個數據(cookie)給瀏覽器,然後瀏覽器保存在本地,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的 cookie 數據自動的攜帶給服務器,服務器通過瀏覽器攜帶的數據就能判斷當前用戶是哪個了。cookie 存儲的數據量有限,不同的瀏覽器有不同的存儲大小,但一般不超過 4KB。因此使用 cookie 只能存儲一些小量的數據。

session 是什麼

  session 和 cookie 的作用有點類似,都是爲了存儲用戶相關的信息。不同的是,cookie 是存儲在本地瀏覽器,而 session 存儲在服務器。存儲在服務器的數據會更加的安全,不容易被竊取。但存儲在服務器也有一定的弊端,就是會佔用服務器的資源。

  session 的目的:彌補 HTTP 無狀態特性,服務器可以利用 session 存儲客戶端在同一個會話期間的一些操作記錄。

  在如今的市場或者企業裏,一般有兩種存儲方式:

  1. 存儲在服務端:通過 cookie 存儲一個 session_id,然後具體的數據則是保存在 session 中。如果用戶已經登陸,則服務器會在 cookie 中保存一個 session_id,下次再次請求的時候,會把該 session_id 攜帶上來,服務器根據 session_id 在 session 庫中獲取用戶的 session 數據,就能知道該用戶到底是誰,以及之前保存的一些狀態信息。這種專業術語叫做 server side session。
  2. 將 session 數據加密,然後存儲在 cookie 中。這種專業術語叫做 client side session。

session 的實現機制

  1. 服務器如何判斷客戶端發送過來的請求術語同一個會話?

  用 session id 區分;session id 相同即認爲是同一個會話。

  在 tomcat 中 session id 中用 JSESSIONID 來表示。

  1. 服務器、客戶端如何獲取 sessionID?SessionID 在期間是如何傳輸的?

  服務器第一次接收到請求時,開闢了一塊 Session 空間(創建了 Session 對象),同時生成一個 Session id,並通過響應頭的 Set-Cookie:“JSESSIONID=XXXXXXX”命令,向客戶端發送要求設置 cookie 的響應;客戶端收到響應後,在本機客戶端設置了一個 JSESSIONID=XXXXXXX 的 cookie 信息,該 cookie 的過期時間爲瀏覽器會話結束。

  接下來客戶端每次向同一個網站發送請求時,請求頭都會帶上該 cookie 信息(包含 Session id);然後,服務器通過讀取請求頭中的 Cookie 信息,獲取名稱爲 JSESSIONID 的值,得到此次請求的 Session id。

  注意:服務器只會在客戶端第一次請求響應的時候,在響應頭上添加 Set-Cookie:”JSESSIONID=XXXXXXX” 信息,接下來在同一個會話的第二第三次響應頭裏,是不會添加 Set-Cookie:”JSESSIONID=XXXXXXX” 信息的;而客戶端是會在每次請求頭的 cookie 中帶上 JSESSION 信息。

  1. cookie 以文本文件格式存儲在瀏覽器中,而 session 存儲在服務端。
  2. cookie 的存儲限制了數據量,只允許 4kb,而 session 是無限量的。
  3. 可以輕鬆訪問 cookie 值,但無法輕鬆訪問 session,因爲 session 更安全。
  4. 設置 cookie 時間可以使 cookie 過期,但是使用 session-destory(),將會銷燬會話。

  如果需要經常登陸一個站點,最好用 cookie 來保存信息,不然每次登陸會特別麻煩,但是對於需要安全性高的站點以及控制數據的能力時需要用 session 效果更佳。

參考文章

  1. HTTP 教程 - 詳細內容
  2. 網絡:HTTP - 介紹
  3. 網絡之 HTTP 協議 - 介紹
  4. session 與 cookie 之間的關係 - 簡單介紹
  5. cookie 與 session 的區別是什麼 - 區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章