1. 程式人生 > >應用層協議:HTTP與HTTPS協議詳解、二者的區別

應用層協議:HTTP與HTTPS協議詳解、二者的區別

http協議詳解

1、HTTP協議:超文字傳輸協議

是一種分散式、合作式、多媒體資訊系統服務,面向應用層的協議。是一種通用的,不分狀態的協議。是一種請求/應答協議。

1.1、HTTP/1.0和HTTP/1.1的比較

RFC 1945定義了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定義了今天普遍使用的一個版本——HTTP 1.1 。HTTP1.0 與HTTP1.1 向後相容,也就是說執行1.1版本的瀏覽器可以和1.0 版本的伺服器進行“對話”。

1.2 Host域

HTTP1.1在Request訊息頭裡頭多了一個Host域, HTTP1.0則沒有這個域。
eg:
    GET /pub/WWW/TheProject.html HTTP/1.1
    Host: www.w3.org
可能HTTP1.0的時候認為,建立TCP連線的時候已經指定了IP地址,這個IP地址上只有一個host。

1.3日期時間戳

    (接收方向)

無論是HTTP1.0還是HTTP1.1,都要能解析下面三種date/time stamp:

    Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
    Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
    Sun Nov 6 08:49:37 1994       ; ANSI C's asctime() format
    (傳送方向)

    HTTP1.0要求不能生成第三種asctime格式的date/time stamp;

1.4狀態響應碼

狀態響應碼100 (Continue) 狀態程式碼的使用,允許客戶端在發request訊息body之前先用request header試探一下server,看server要不要接收request body,再決定要不要發request body。

客戶端在Request頭部中包含

Expect: 100-continue
Server看到之後如果回100 (Continue) 這個狀態程式碼,客戶端就繼續發request body。這個是HTTP1.1才有的。

另外在HTTP/1.1中還增加了101、203、205等等性狀態響應碼 

1.5請求方式

HTTP1.1增加了OPTIONS, PUT, DELETE, TRACE, CONNECT這些Request方法.

Method         = "OPTIONS"                ; Section 9.2

| "GET"                    ; Section 9.3

| "HEAD"                   ; Section 9.4

| "POST"                   ; Section 9.5

| "PUT"                    ; Section 9.6

| "DELETE"                 ; Section 9.7

| "TRACE"                  ; Section 9.8

| "CONNECT"                ; Section 9.9

| extension-method

extension-method = token

2、HTTP協議的重要概念

1、連線(connection):一個傳輸層的實際環流,它建立在兩個相互通訊的應用程式之間。
2、訊息(message):HTTP協議通訊的基本單位,它包括一個結構化的八元族序列並通過連線傳輸。
3、請求(request):一個從客戶端到伺服器的請求資訊,它包括應用於資源的方法、資源的識別符號和協議的版本號。
4、響應(response):一個從伺服器返回的資訊,包括HTTP協議的版本號、請求的狀態和文件的MIME(多用途網際網路郵件擴充套件)型別。
5、資源(resource):由URI(統一資源識別符號,URL就是URI的一種)標識的網路資料物件或服務。
6、實體(Entity):資料資源或來自服務資源的迴應的一種特殊表示方法,他可能被包圍在一個請求或響應資訊中。一個實體包括實體頭資訊和實體的本身內容。
7、客戶機(client):一個為傳送請求的目的而建立連線的應用程式。
8、使用者代理(User agent):初始化一個請求的客戶機。他們是瀏覽器、編輯器或其它使用者工具。
9、伺服器版(server):一個接受連線並對請求返回資訊的應用程式。
10、源伺服器(origin server):是一個給定資源可以在其上駐留或被建立的伺服器。
11、代理(proxy):一箇中間程式,它可以充當一個伺服器,也可以充當一個客戶機,為其它客戶機建立請求。
12、閘道器(gateway):一個作為其他伺服器中間媒介的伺服器。與代理不同的是,閘道器對被請求的資源來說他就是源伺服器;傳送請求的客戶機並沒有意識到他在同網管打交道。閘道器通常作為通過防火牆的伺服器的門戶,閘道器還可以作為一個協議翻譯器以便於存取哪些儲存在非HTTP系統的資源。
13、通道(tunnel):是作為兩個連線中繼的中介程式。一旦啟用,通道便被認為不屬於HTTP通訊,儘管通道可能是被一個HTTP請求初始化的。當被中繼的連線兩端關閉時,通道便消失。
14、快取(Cache):資訊的局域儲存。

3、協議特點

1.支援客戶/伺服器模式。
2.簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與伺服器聯絡的型別不同。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通訊速度很快。
3.靈活:HTTP允許傳輸任意型別的資料物件。正在傳輸的型別由Content-Type加以標記。
4.無連線:無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。
5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。

4、在協議棧上的位置

HTTP協議通常承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了我們常說的HTTPS。如下圖所示:

協議棧

HTTP通訊通常發生在TCP/IP連線上,HTTP僅僅期望可靠傳輸:任何提供這種保證的協議都可以使用,預設HTTP的埠號為80,HTTPS的埠號為443。

5、HTTP工作流程

HTTP協議是一種請求/應答協議。與主機建立連線之後,客戶機以請求方法,URI和協議版本的形式向伺服器傳送請求,其中包括請求修改、客戶資訊和可能的正文內容。

在HTTP中,客戶端總是通過一個連線與傳送一個HTTP請求來發起一個事務。伺服器不能主動和客戶機聯絡,也不能給客戶機發送一個回叫連線。客戶端和伺服器都可以提前中斷。eg:當瀏覽器下載一個檔案時,使用者可以取消下載,關閉與HTTP的連線。

一次HTTP操作稱為一個事務,其工作過程可分為四步

HTTP協議工作原理

1)連線:首先客戶機與伺服器需要建立連線。只要單擊某個超級連結,HTTP的工作開始。

2)請求:建立連線後,客戶機發送一個請求給伺服器,請求方式的格式為:統一資源識別符號(URL)、協議版本號,後邊是MIME資訊包括請求修飾符、客戶機資訊和可能的內容。

3)響應:伺服器接到請求後,給予相應的響應資訊,其格式為一個狀態行,包括資訊的協議版本號、一個成功或錯誤的程式碼,後邊是MIME資訊包括伺服器資訊、實體資訊和可能的內容。

4)關閉連線:客戶端接收伺服器所返回的資訊通過瀏覽器顯示在使用者的顯示屏上,然後客戶機與伺服器斷開連線。

如果在以上過程中的某一步出現錯誤,那麼產生錯誤的資訊將返回到客戶端,有顯示屏輸出。對於使用者來說,這些過程是由HTTP自己完成的,使用者只要用滑鼠點選,等待資訊顯示就可以了。

HTTP既可以使用持久連線(HTTP/1.1),也可以使用非持久連線(HTTP/1.0)
非持久連線缺點:首先客戶得為每個待請求的物件建立並維護一個新的連線。對於每個這樣的連線,TCP得在客戶端和伺服器端分配TCP緩衝區,並維持TCP變數,對於同時來自數百個客戶的請求提供服務的伺服器是嚴重的負擔。

持久連線優點:在持久連線的情況下,伺服器在發出響應後讓TCP連線繼續開啟 同一客戶/伺服器之間的後續請求和響應可以通過這個連線傳送。HTTP/1.1的預設模式使用帶流水線的持久連線,這種情況下,HTTP客戶每碰到一個引用就立即傳送一個請求,因而HTTP客戶可以挨個傳送各個引用物件的請求。與非持久連線相比,持久連線中伺服器等待請求的時間較少,降低了響應延遲。

6、URL

  http(超文字傳輸協議)是一個基於請求與響應模式的、無狀態的、應用層的協議,常基於TCP的連線方式,HTTP1.1版本中給出一種持續連線的機制,絕大多數的Web開發,都是構建在HTTP協議之上的Web應用。

HTTP URL (URL是一種特殊型別的URI,包含了用於查詢某個資源的足夠的資訊)的格式如下:
http://host[":"port][abs_path]
http表示要通過HTTP協議來定位網路資源;host表示合法的Internet主機域名或者IP地址;port指定一個埠號,為空則使用預設埠80;abs_path指定請求資源的URI;如果URL中沒有給出abs_path,那麼當它作為請求URI時,必須以“/”的形式給出,通常這個工作瀏覽器自動幫我們完成。
eg:
1、輸入:www.guet.edu.cn
瀏覽器自動轉換成:http://www.guet.edu.cn/
2、http:192.168.0.116:8080/index.jsp 

7、HTTP請求報文

請求報文
HTTP請求由三部分組成:請求行、訊息報頭、請求正文
1)請求行以一個方法符號開頭,以空格分開,後面跟著請求的URI和協議的版本

eg: Method Request-URI HTTP-Version CRLF

其中 Method表示請求方法;Request-URI是一個統一資源識別符號;HTTP-Version表示請求的HTTP協議版本;CRLF表示回車和換行(除了作為結尾的CRLF外,不允許出現單獨的CR或LF字元)。

請求方法(所有方法全為大寫)有多種,各個方法的解釋如下:

1>GET     請求獲取Request-URI所標識的資源
2>POST    在Request-URI所標識的資源後附加新的資料
3>HEAD    請求獲取由Request-URI所標識的資源的響應訊息報頭
4>PUT     請求伺服器儲存一個資源,並用Request-URI作為其標識
5>DELETE  請求伺服器刪除Request-URI所標識的資源
6>TRACE   請求伺服器回送收到的請求資訊,主要用於測試或診斷
7>CONNECT 保留將來使用
8>OPTIONS 請求查詢伺服器的效能,或者查詢與資源相關的選項和需求

應用舉例:

1)GET方法:在瀏覽器的位址列中輸入網址的方式訪問網頁時,瀏覽器採用GET方法向伺服器獲取資源。
    eg:
    GET /form.html HTTP/1.1 (CRLF)

2)POST方法要求被請求伺服器接受附在請求後面的資料,常用於提交表單。

    eg:
    POST /reg.jsp HTTP/ (CRLF)
    Accept:image/gif,image/x-xbit,... (CRLF)
    ...
    HOST:www.guet.edu.cn (CRLF)
    Content-Length:22 (CRLF)
    Connection:Keep-Alive (CRLF)
    Cache-Control:no-cache (CRLF)
    (CRLF) //該CRLF表示訊息報頭已經結束,在此之前為訊息報頭
    user=jeffrey&pwd=1234  //此行以下為提交的資料

3)HEAD方法與GET方法幾乎是一樣的,對於HEAD請求的迴應部分來說,它的HTTP頭部中包含的資訊與通過GET請求所得到的資訊是相同的。利用這個方法,不必傳輸整個資源內容,就可以得到Request-URI所標識的資源的資訊。該方法常用於測試超連結的有效性,是否可以訪問,以及最近是否更新。

一個URL為“http://test.com/ask.asp?name=liyang”的GET請求報文例子如下:
Get http://test.com/ask.asp?name=liyang HTTP/1.1
Accept:*/*
Accept-Language:zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible;MSIE 6.0;
Windows NT 5.1; SVl; .NET CLR 2.0.50727;
Host: www.test.com
Connection: Keep-Alive;

報頭見下文

8、響應報文

響應報文
在接收和解釋請求訊息後,伺服器返回一個HTTP響應訊息。

HTTP響應也是由三個部分組成,分別是:狀態行、訊息報頭、響應正文
1、狀態行格式如下:
    HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示伺服器HTTP協議的版本;Status-Code表示伺服器發回的響應狀態程式碼;Reason-Phrase表示狀態程式碼的文字描述。

狀態程式碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:
1xx:指示資訊--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:伺服器端錯誤--伺服器未能實現合法的請求

常見狀態程式碼、狀態描述、說明:

1**:請求收到,繼續處理

100——客戶必須繼續發出請求

101——客戶要求伺服器根據請求轉換HTTP協議版本

2**:操作成功收到,分析、接受

200——交易成功

201——提示知道新檔案的URL

202——接受和處理、但處理未完成

203——返回資訊不確定或不完整

204——請求收到,但返回資訊為空

205——伺服器完成了請求,使用者代理必須復位當前已經瀏覽過的檔案

206——伺服器已經完成了部分使用者的GET請求

3**:完成此請求必須進一步處理

300——請求的資源可在多處得到

301——刪除請求資料

302——在其他地址發現了請求資料

303——建議客戶訪問其他URL或訪問方式

304——客戶端已經執行了GET,但檔案未變化

305——請求的資源必須從伺服器指定的地址得到

306——前一版本HTTP中使用的程式碼,現行版本中不再使用

307——申明請求的資源臨時性刪除

 4**:請求包含一個錯誤語法或不能完成

400——錯誤請求,如語法錯誤

401——未授權

HTTP 401.1 - 未授權:登入失敗

  HTTP 401.2 - 未授權:伺服器配置問題導致登入失敗

  HTTP 401.3 - ACL 禁止訪問資源

  HTTP 401.4 - 未授權:授權被篩選器拒絕

HTTP 401.5 - 未授權:ISAPI 或 CGI 授權失敗

402——保留有效ChargeTo頭響應

403——禁止訪問

HTTP 403.1 禁止訪問:禁止可執行訪問

  HTTP 403.2 - 禁止訪問:禁止讀訪問

  HTTP 403.3 - 禁止訪問:禁止寫訪問

  HTTP 403.4 - 禁止訪問:要求 SSL

  HTTP 403.5 - 禁止訪問:要求 SSL 128

  HTTP 403.6 - 禁止訪問:IP 地址被拒絕

  HTTP 403.7 - 禁止訪問:要求客戶證書

  HTTP 403.8 - 禁止訪問:禁止站點訪問

  HTTP 403.9 - 禁止訪問:連線的使用者過多

  HTTP 403.10 - 禁止訪問:配置無效

  HTTP 403.11 - 禁止訪問:密碼更改

  HTTP 403.12 - 禁止訪問:對映器拒絕訪問

  HTTP 403.13 - 禁止訪問:客戶證書已被吊銷

  HTTP 403.15 - 禁止訪問:客戶訪問許可過多

  HTTP 403.16 - 禁止訪問:客戶證書不可信或者無效

HTTP 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**:伺服器執行一個完全有效請求失敗

  HTTP 500 - 內部伺服器錯誤

  HTTP 500.100 - 內部伺服器錯誤 - ASP 錯誤

  HTTP 500-11 伺服器關閉

  HTTP 500-12 應用程式重新啟動

  HTTP 500-13 - 伺服器太忙

  HTTP 500-14 - 應用程式無效

  HTTP 500-15 - 不允許請求 global.asa

Error 501 - 未實現

HTTP 502 - 閘道器錯誤
503 Server Unavailable  //伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常
eg:HTTP/1.1 200 OK (CRLF)

一個請求URL為"http://test.com/ask.asp?name=liyang "的應答報文例子如下:

HTTP/1.1 200 OK  
Connection: keep-alive  
Date: Thu, 26 Jul 2010 14:00:02 GMT  
Server: Microsoft-IIS/6.0  
X-Powered-By: ASP.NET  
Content-Length: 280  
Content-Type: text/html  
Set-Cookie: ASPSESSIONIDSAATTCSQ=JOPPKDCAMHHBEOICJPGPBJOB; path=/  
Cache-control: private  
<html> 
<head> 
<title>一網精深</title> 
</head> 
<body> 
<b>HTTP響應報文<br></b> 
<b>測試<br></b> 
</body> 

9、HTTP訊息報頭

 HTTP訊息由客戶端到伺服器的請求和伺服器到客戶端的響應組成。請求訊息和響應訊息都是由開始行(對於請求訊息,開始行就是請求行,對於響應訊息,開始行就是狀態行),訊息報頭(可選),空行(只有CRLF的行),訊息正文(可選)組成。

HTTP訊息報頭包括普通報頭、請求報頭、響應報頭、實體報頭。
每一個報頭域都是由名字+“:”+空格+值 組成,訊息報頭域的名字是大小寫無關的。

1、普通報頭
在普通報頭中,有少數報頭域用於所有的請求和響應訊息,但並不用於被傳輸的實體,只用於傳輸的訊息。
eg:
Cache-Control   用於指定快取指令,快取指令是單向的(響應中出現的快取指令在請求中未必會出現),且是獨立的(一個訊息的快取指令不會影響另一個訊息處理的快取機制),HTTP1.0使用的類似的報頭域為Pragma。

請求時的快取指令包括:no-cache(用於指示請求或響應訊息不能快取)、no-store、max-age、max-stale、min-fresh、only-if-cached;
響應時的快取指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.
eg:為了指示IE瀏覽器(客戶端)不要快取頁面,伺服器端的JSP程式可以編寫如下:response.sehHeader("Cache-Control","no-cache");
//response.setHeader("Pragma","no-cache");作用相當於上述程式碼,通常兩者//合用
這句程式碼將在傳送的響應訊息中設定普通報頭域:Cache-Control:no-cache

Date普通報頭域表示訊息產生的日期和時間

Connection普通報頭域允許傳送指定連線的選項。例如指定連線是連續,或者指定“close”選項,通知伺服器,在響應完成後,關閉連線

2、請求報頭
請求報頭允許客戶端向伺服器端傳遞請求的附加資訊以及客戶端自身的資訊。
常用的請求報頭
Accept
Accept請求報頭域用於指定客戶端接受哪些型別的資訊。eg:Accept:image/gif,表明客戶端希望接受GIF圖象格式的資源;Accept:text/html,表明客戶端希望接受html文字。

Accept-Charset
Accept-Charset請求報頭域用於指定客戶端接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312.如果在請求訊息中沒有設定這個域,預設是任何字符集都可以接受。

Accept-Encoding
Accept-Encoding請求報頭域類似於Accept,但是它是用於指定可接受的內容編碼。eg:Accept-Encoding:gzip.deflate.如果請求訊息中沒有設定這個域伺服器假定客戶端對各種內容編碼都可以接受。

Accept-Language
Accept-Language請求報頭域類似於Accept,但是它是用於指定一種自然語言。eg:Accept-Language:zh-cn.如果請求訊息中沒有設定這個報頭域,伺服器假定客戶端對各種語言都可以接受。

Authorization
Authorization請求報頭域主要用於證明客戶端有權檢視某個資源。當瀏覽器訪問一個頁面時,如果收到伺服器的響應程式碼為401(未授權),可以傳送一個包含Authorization請求報頭域的請求,要求伺服器對其進行驗證。

Host(傳送請求時,該報頭域是必需的)
Host請求報頭域主要用於指定被請求資源的Internet主機和埠號,它通常從HTTP URL中提取出來的,eg:
我們在瀏覽器中輸入:http://www.guet.edu.cn/index.html
瀏覽器傳送的請求訊息中,就會包含Host請求報頭域,如下:
Host:www.guet.edu.cn
此處使用預設埠號80,若指定了埠號,則變成:Host:www.guet.edu.cn:指定埠號

User-Agent
我們上網登陸論壇的時候,往往會看到一些歡迎資訊,其中列出了你的作業系統的名稱和版本,你所使用的瀏覽器的名稱和版本,這往往讓很多人感到很神奇,實際上,伺服器應用程式就是從User-Agent這個請求報頭域中獲取到這些資訊。User-Agent請求報頭域允許客戶端將它的作業系統、瀏覽器和其它屬性告訴伺服器。不過,這個報頭域不是必需的,如果我們自己編寫一個瀏覽器,不使用User-Agent請求報頭域,那麼伺服器端就無法得知我們的資訊了。

請求報頭舉例:
GET /form.html HTTP/1.1 (CRLF)
Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)
Accept-Language:zh-cn (CRLF)
Accept-Encoding:gzip,deflate (CRLF)
If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)
If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)
User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)
Host:www.guet.edu.cn (CRLF)
Connection:Keep-Alive (CRLF)
(CRLF)

3、響應報頭
響應報頭允許伺服器傳遞不能放在狀態行中的附加響應資訊,以及關於伺服器的資訊和對Request-URI所標識的資源進行下一步訪問的資訊。
常用的響應報頭
Location
Location響應報頭域用於重定向接受者到一個新的位置。Location響應報頭域常用在更換域名的時候。

Server
Server響應報頭域包含了伺服器用來處理請求的軟體資訊。與User-Agent請求報頭域是相對應的。下面是
Server響應報頭域的一個例子:
Server:Apache-Coyote/1.1

WWW-Authenticate
WWW-Authenticate響應報頭域必須被包含在401(未授權的)響應訊息中,客戶端收到401響應訊息時候,併發送Authorization報頭域請求伺服器對其進行驗證時,服務端響應報頭就包含該報頭域。

eg:WWW-Authenticate:Basic realm="Basic Auth Test!"  //可以看出伺服器對請求資源採用的是基本驗證機制。


4、實體報頭
請求和響應訊息都可以傳送一個實體。一個實體由實體報頭域和實體正文組成,但並不是說實體報頭域和實體正文要在一起傳送,可以只發送實體報頭域。實體報頭定義了關於實體正文(eg:有無實體正文)和請求所標識的資源的元資訊。
常用的實體報頭
Content-Encoding
Content-Encoding實體報頭域被用作媒體型別的修飾符,它的值指示了已經被應用到實體正文的附加內容的編碼,因而要獲得Content-Type報頭域中所引用的媒體型別,必須採用相應的解碼機制。Content-Encoding這樣用於記錄文件的壓縮方法,eg:Content-Encoding:gzip

Content-Language
Content-Language實體報頭域描述了資源所用的自然語言。沒有設定該域則認為實體內容將提供給所有的語言閱讀
者。eg:Content-Language:da
Content-Length
Content-Length實體報頭域用於指明實體正文的長度,以位元組方式儲存的十進位制數字來表示。

Content-Type
Content-Type實體報頭域用語指明發送給接收者的實體正文的媒體型別。eg:
Content-Type:text/html;charset=ISO-8859-1
Content-Type:text/html;charset=GB2312

Last-Modified
Last-Modified實體報頭域用於指示資源的最後修改日期和時間。

Expires
Expires實體報頭域給出響應過期的日期和時間。為了讓代理伺服器或瀏覽器在一段時間以後更新快取中(再次訪問曾訪問過的頁面時,直接從快取中載入,縮短響應時間和降低伺服器負載)的頁面,我們可以使用Expires實體報頭域指定頁面過期的時間。
eg:Expires:Thu,15 Sep 2006 16:23:12 GMT
HTTP1.1的客戶端和快取必須將其他非法的日期格式(包括0)看作已經過期。eg:為了讓瀏覽器不要快取頁面,我們也可以利用Expires實體報頭域,設定為0,jsp中程式如下:response.setDateHeader("Expires","0");

10、HTTP協議的特點及應用

1、基礎:
高層協議有:檔案傳輸協議FTP、電子郵件傳輸協議SMTP、域名系統服務DNS、網路新聞傳輸協議NNTP和HTTP協議等
中介有三種:代理(Proxy)、閘道器(Gateway)和通道(Tunnel),一個代理根據URI的絕對格式來接受請求,重寫全部或部分訊息,通過 URI的標識把已格式化過的請求傳送到伺服器。閘道器是一個接收代理,作為一些其它伺服器的上層,並且如果必須的話,可以把請求翻譯給下層的伺服器協議。一 個通道作為不改變訊息的兩個連線之間的中繼點。當通訊需要通過一箇中介(例如:防火牆等)或者是中介不能識別訊息的內容時,通道經常被使用。

2、協議分析的優勢—HTTP分析器檢測網路攻擊以模組化的方式對高層協議進行分析處理,將是未來入侵檢測的方向。
HTTP及其代理的常用埠80、3128和8080在network部分用port標籤進行了規定

3、HTTP協議Content Lenth限制漏洞導致拒絕服務攻擊
使用POST方法時,可以設定ContentLenth來定義需要傳送的資料長度,例如ContentLenth:999999999,在傳送完成前,內 存不會釋放,攻擊者可以利用這個缺陷,連續向WEB伺服器傳送垃圾資料直至WEB伺服器記憶體耗盡。這種攻擊方法基本不會留下痕跡。
http://www.cnpaf.net/Class/HTTP/0532918532667330.html

4、利用HTTP協議的特性進行拒絕服務攻擊的一些構思
伺服器端忙於處理攻擊者偽造的TCP連線請求而無暇理睬客戶的正常請求(畢竟客戶端的正常請求比率非常之小),此時從正常客戶的角度看來,伺服器失去響應,這種情況我們稱作:伺服器端受到了SYNFlood攻擊(SYN洪水攻擊)。
而Smurf、TearDrop等是利用ICMP報文來Flood和IP碎片攻擊的。本文用“正常連線”的方法來產生拒絕服務攻擊。
19埠在早期已經有人用來做Chargen攻擊了,即Chargen_Denial_of_Service,但是!他們用的方法是在兩臺Chargen 伺服器之間產生UDP連線,讓伺服器處理過多資訊而DOWN掉,那麼,幹掉一臺WEB伺服器的條件就必須有2個:1.有Chargen服務2.有HTTP 服務
方法:攻擊者偽造源IP給N臺Chargen傳送連線請求(Connect),Chargen接收到連線後就會返回每秒72位元組的字元流(實際上根據網路實際情況,這個速度更快)給伺服器。

5、Http指紋識別技術
   Http指紋識別的原理大致上也是相同的:記錄不同伺服器對Http協議執行中的微小差別進行識別.Http指紋識別比TCP/IP堆疊指紋識別複雜許 多,理由是定製Http伺服器的配置檔案、增加外掛或元件使得更改Http的響應資訊變的很容易,這樣使得識別變的困難;然而定製TCP/IP堆疊的行為 需要對核心層進行修改,所以就容易識別.
      要讓伺服器返回不同的Banner資訊的設定是很簡單的,象Apache這樣的開放原始碼的Http伺服器,使用者可以在原始碼裡修改Banner資訊,然 後重起Http服務就生效了;對於沒有公開原始碼的Http伺服器比如微軟的IIS或者是Netscape,可以在存放Banner資訊的Dll檔案中修 改,相關的文章有討論的,這裡不再贅述,當然這樣的修改的效果還是不錯的.另外一種模糊Banner資訊的方法是使用外掛。
常用測試請求:
1:HEAD/Http/1.0傳送基本的Http請求
2:DELETE/Http/1.0傳送那些不被允許的請求,比如Delete請求
3:GET/Http/3.0傳送一個非法版本的Http協議請求
4:GET/JUNK/1.0傳送一個不正確規格的Http協議請求
Http指紋識別工具Httprint,它通過運用統計學原理,組合模糊的邏輯學技術,能很有效的確定Http伺服器的型別.它可以被用來收集和分析不同Http伺服器產生的簽名。

6、其他:為了提高使用者使用瀏覽器時的效能,現代瀏覽器還支援併發的訪問方式,瀏覽一個網頁時同時建立多個連線,以迅速獲得一個網頁上的多個圖示,這樣能更快速完成整個網頁的傳輸。
HTTP1.1中提供了這種持續連線的方式,而下一代HTTP協議:HTTP-NG更增加了有關會話控制、豐富的內容協商等方式的支援,來提供更高效率的連線。

11、HTTP測試

在Windows下,可使用命令視窗進行http簡單測試。

輸入cmd進入命令視窗,在命令列鍵入如下命令後按回車:

telnet www.baidu.com 80
而後在視窗中按下“Ctrl+]”後按回車可讓返回結果回顯。

接著開始發請求訊息,例如傳送如下請求訊息請求baidu的首頁訊息,使用的HTTP協議為HTTP/1.1:

GET /index.html HTTP/1.1
注意:copy如上的訊息到命令視窗後需要按兩個回車換行才能得到響應的訊息,第一個回車換行是在命令後鍵入回車換行,是HTTP協議要求的。第二個是確認輸入,傳送請求。

可看到返回了200 OK的訊息,如下圖所示:

HTTP/1.1

可看到,當採用HTTP/1.1時,連線不是在請求結束後就斷開的。若採用HTTP1.0,在命令視窗鍵入:

GET /index.html HTTP/1.0
此時可以看到請求結束之後馬上斷開。

HTTP/1.0

HTTP/1.0

讀者還可以嘗試在使用GET或POST等時,帶上頭域資訊,例如鍵入如下資訊:

GET /index.html HTTP/1.1
connection: close
Host: www.baidu.com

GET

12、HTTP協議與HTTPS協議的區別

HTTP/HTTPS

HTTPS(Secure Hypertext Transfer Protocol)安全超文字傳輸協議: 

它是一個安全通訊通道,它基於HTTP開發,用於在客戶計算機和伺服器之間交換資訊,它使用安全套接字層(SSL)進行資訊交換,簡單來說它是HTTP的安全版。它是由Netscape開發並內置於其瀏覽器中,用於對資料進行壓縮和解壓操作,並返回網路上傳送回的結果。HTTPS實際上應用了Netscape的安全全套接字層(SSL)作為HTTP應用層的子層。(HTTPS使用埠443,而不是象HTTP那樣使用埠80來和TCP/IP進行通訊。)SSL使用40 位關鍵字作為RC4流加密演算法,這對於商業資訊的加密是合適的。HTTPS和SSL支援使用X.509數字認證,如果需要的話使用者可以確認傳送者是誰。總的來說,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議要比http協議安全。

https協議主要針對解決http協議以下不足:
1.通訊使用明文(不加密),內容可能會被竊聽
2.不驗證通訊方身份,應此可能遭遇偽裝
3.無法證明報文的完整性(即準確性),所以可能已遭篡改
http+加密+認證+完整性保護=https

SSL是獨立於HTTP協議的,所以不光是http協議,其他執行在應用層的協議,如smtp和telnet協議,也可配合ssl協議使用。
https採用共享金鑰加密和公開金鑰加密兩種混合加密機制。(共享金鑰一般傳送金鑰會被竊聽;公開金鑰加密,如果根據密文和公開金鑰恢復資訊原文是異常困難的,必須通過私有金鑰才能辦到)
https並非是應用層的一種新協議,只是http通訊介面部分用SSL(Secure socket Layer)和TLS(Transport Layer Security)協議代替而已。通常,http是直接和tcp通訊的,當使用SSL時,則演變成先和SSL通訊,再由SSL和TCP通訊了。

  在URL前加https://字首表明是用SSL加密的,你的電腦與伺服器之間收發的資訊傳輸將更加安全。 Web伺服器啟用SSL需要獲得一個伺服器證書並將該證書與要使用SSL的伺服器繫結。 


HTTPS和HTTP的區別: 
  https協議需要到ca申請證書,一般免費證書很少,需要交費。 
  http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。 
  http和https使用的是完全不同的連線方式用的埠也不一樣,前者是80,後者是443。 
  http的連線很簡單,是無狀態的。 
  HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議 要比http協議安全。 

HTTPS解決的問題:

1 . 信任主機的問題.

   採用https 的server 必須從CA 申請一個用於證明伺服器用途型別的證書. 改證書只有用於對應的server 的時候,客戶度才信任此主機. 所以目前所有的銀行系統網站,關鍵部分應用都是https 的. 客戶通過信任該證書,從而信任了該主機. 其實這樣做效率很低,但是銀行更側重安全. 這一點對我們沒有任何意義,我們的server ,採用的證書不管自己issue 還是從公眾的地方issue, 客戶端都是自己人,所以我們也就肯定信任該server. 

2 . 通訊過程中的資料的洩密和被竄改 
   1) 一般意義上的https, 就是 server 有一個證書. 
     a) 主要目的是保證server 就是他聲稱的server. 這個跟第一點一樣. 
     b) 服務端和客戶端之間的所有通訊,都是加密的. 
        i. 具體講,是客戶端產生一個對稱的金鑰,通過server 的證書來交換金鑰. 一般意義上的握手過程. 
        ii. 所有的資訊往來就都是加密的. 第三方即使截獲,也沒有任何意義.因為他沒有金鑰. 當然竄改也就沒有什麼意義了. 
   2). 少許對客戶端有要求的情況下,會要求客戶端也必須有一個證書. 
     a) 這裡客戶端證書,其實就類似表示個人資訊的時候,除了使用者名稱/密碼, 還有一個CA 認證過的身份. 應為個人證書一般來說別人無法模擬的,所有這樣能夠更深的確認自己的身份. 
     b) 目前少數個人銀行的專業版是這種做法,具體證書可能是拿U盤作為一個備份的載體. 

3.HTTPS 一定是繁瑣的. 
   a) 本來簡單的http協議,一個get一個response. 由於https 要還金鑰和確認加密演算法的需要.單握手就需要6/7 個往返. 
     i. 任何應用中,過多的round trip 肯定影響效能. 
   b) 接下來才是具體的http協議,每一次響應或者請求, 都要求客戶端和服務端對會話的內容做加密/解密. 
     i. 儘管對稱加密/解密效率比較高,可是仍然要消耗過多的CPU,為此有專門的SSL 晶片. 如果CPU 信能比較低的話,肯定會降低效能,從而不能serve 更多的請求. 
     ii. 加密後資料量的影響. 所以,才會出現那麼多的安全認證提示