HTTP簡介
HTTP(超文字傳輸協議)是網路上最為廣泛的傳輸協議,被用於在web瀏覽器和網站伺服器之間的傳輸協議。HTTP是一個簡單的請求-響應協議,它通常執行在TCP之上。它指定了客戶端可能傳送給伺服器什麼樣的訊息以及得到什麼樣的響應。請求和響應訊息的頭以ASCII形式給出;而訊息內容則具有一個類似MIME的格式。這個簡單模型是早期Web成功的有功之臣,因為它使開發和部署非常地直截了當。
HTTP是應用層協議,同其他應用層協議一樣,是為了實現某一類具體應用的協議,並由某一執行在使用者空間的應用程式來實現其功能。HTTP是一種協議規範,這種規範記錄在文件上,為真正通過HTTP進行通訊的HTTP的實現程式。
報文格式
HTTP協議的特點
1.HTTP協議是無狀態的
就是說每次HTTP請求都是獨立的,任何兩個請求之間沒有什麼必然的聯絡。但是在實際應用當中並不是完全這樣的,引入了Cookie和Session機制來關聯請求。
2.多次HTTP請求
在客戶端請求網頁時多數情況下並不是一次請求就能成功的,服務端首先是響應HTML頁面,然後瀏覽器收到響應之後發現HTML頁面還引用了其他的資源,例如,CSS,JS檔案,圖片等等,還會自動傳送HTTP請求這些需要的資源。現在的HTTP版本支援管道機制,可以同時請求和響應多個請求,大大提高了效率。
3.基於TCP協議
HTTP協議目的是規定客戶端和服務端資料傳輸的格式和資料互動行為,並不負責資料傳輸的細節。底層是基於TCP實現的。現在使用的版本當中是預設持久連線的,也就是多次HTTP請求使用一個TCP連線。
HTTP請求方法
請求方法是客戶端用來告知伺服器其動作意圖的方法。就像下達命令一樣。在HTTP1.1版本中支援GET、POST等近10種方法。
方法 | 描述 |
GET | 獲取資源GET方法用來請求訪問已被URI識別的資源。也就是指定了伺服器處理請求之後響應的內容。 |
POST |
傳輸實體主體POST方法用來傳輸實體主體。POST與GET的區別之一就是目的不同,二者之間的區別會在文章的最後詳細說明。雖然GET方法也可以傳輸,但是一般不用,因為GET的目的是獲取,POST的目的是傳輸。 |
PUT |
傳輸檔案PUT方法用來傳輸檔案。類似FTP協議,檔案內容包含在請求報文的實體中,然後請求儲存到URL指定的伺服器位置 |
HEAD |
獲得報文首部HEAD方法類似GET方法,但是不同的是HEAD方法不要求返回資料。用於確認URI的有效性及資源更新時間等 |
DELETE |
刪除檔案DELETE方法用來刪除檔案,是與PUT相反的方法。DELETE是要求返回URL指定的資源 |
OPTIONS |
詢問支援的方法因為並不是所有的伺服器都支援規定的方法,為了安全有些伺服器可能會禁止掉一些方法例如DELETE、PUT等。那麼OPTIONS就是用來詢問伺服器支援的方法 |
TRACE |
追蹤路徑TRACE方法是讓Web伺服器將之前的請求通訊環回給客戶端的方法。這個方法並不常用 |
CONNECT |
要求用隧道協議連線代理CONNECT方法要求在與代理伺服器通訊時建立隧道,實現用隧道協議進行TCP通訊。主要使用SSL/TLS協議對通訊內容加密後傳輸。 |
HTTPS簡介
HTTPS(安全套接字層超文字傳輸協議)是以安全為目標的HTTP通道。
為什麼要使用https
首先了解一下HTTP的缺點:
- 通訊使用明文傳輸
- 不驗證通訊方身份
- 無法驗證報文的完整性
這時為了解決該缺陷需要使用另一種協議:HTTPS。為了資料傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證伺服器的身份,併為瀏覽器和伺服器之間的通訊加密。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL,http+加密+認證+完整性保護=https。
HTTP工作原理
HTTPS和HTTP的主要區別
- HTTPS協議需要到CA申請證書,一般免費證書較少,因而需要一定費用。
- HTTP是超文字傳輸協議,資訊是明文傳輸,HTTPS則是具有安全性的ssl/tls加密傳輸協議。
- HTTP和HTTPS使用的是完全不同的連線方式
- HTTP埠:80,HTTPS埠:443
- HTTP的連線無狀態的;HTTPS協議是由SSL/TLS+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比HTTP協議安全。
HTTPS的缺點
HTTPS也並不是沒有缺點的:
- 雖然HTTPS加了一層安全保護,但並不是絕對安全, 掌握根證書的機構、掌握加密演算法的組織同樣可以進行中間人形式的攻擊
- HTTPS協議握手階段比較費時,增加耗電和載入時間
- HTTPS連線快取遜色於HTTP,會增加資料開銷和功耗,甚至已有的安全措施也會因此而受到影響
- CA證書需要錢,功能越強大的證書費用越高(白嫖黨直接哭泣)
- SSL通常需要繫結IP,不能在同一IP上繫結多個域名,IPv4資源非常難以支撐該消耗
注:
狀態碼:
訊息
|
描述
|
---|---|
100 Continue
|
伺服器僅接收到部分請求,但是一旦伺服器並沒有拒絕該請求,客戶端應該繼續傳送其餘的請求。
|
101 Switching Protocols
|
伺服器轉換協議:伺服器將遵從客戶的請求轉換到另外一種協議。
|
訊息
|
描述
|
---|---|
200 OK
|
請求成功(其後是對GET和POST請求的應答文件。)
|
201 Created
|
請求被建立完成,同時新的資源被建立。
|
202 Accepted
|
供處理的請求已被接受,但是處理未完成。
|
203 Non-authoritative Information
|
文件已經正常地返回,但一些應答頭可能不正確,因為使用的是文件的拷貝。
|
204 No Content
|
沒有新文件。瀏覽器應該繼續顯示原來的文件。如果使用者定期地重新整理頁面,而Servlet可以確定使用者文件足夠新,這個狀態程式碼是很有用的。
|
205 Reset Content
|
沒有新文件。但瀏覽器應該重置它所顯示的內容。用來強制瀏覽器清除表單輸入內容。
|
206 Partial Content
|
客戶傳送了一個帶有Range頭的GET請求,伺服器完成了它。
|
訊息
|
描述
|
---|---|
300 Multiple Choices
|
多重選擇。連結列表。使用者可以選擇某連結到達目的地。最多允許五個地址。
|
301 Moved Permanently
|
所請求的頁面已經轉移至新的url。
|
302 Found
|
所請求的頁面已經臨時轉移至新的url。
|
303 See Other
|
所請求的頁面可在別的url下被找到。
|
304 Not Modified
|
未按預期修改文件。客戶端有緩衝的文件併發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文件)。伺服器告訴客戶,原來緩衝的文件還可以繼續使用。
|
305 Use Proxy
|
客戶請求的文件應該通過Location頭所指明的代理伺服器提取。
|
306 Unused
|
此程式碼被用於前一版本。目前已不再使用,但是程式碼依然被保留。
|
307 Temporary Redirect
|
被請求的頁面已經臨時移至新的url。
|
訊息
|
描述
|
---|---|
400 Bad Request
|
伺服器未能理解請求。
|
401 Unauthorized
|
被請求的頁面需要使用者名稱和密碼。
|
401.1
|
登入失敗。
|
401.2
|
伺服器配置導致登入失敗。
|
401.3
|
由於ACL對資源的限制而未獲得授權。
|
401.4
|
篩選器授權失敗。
|
401.5
|
ISAPI/CGI應用程式授權失敗。
|
401.7
|
訪問被Web伺服器上的URL授權策略拒絕。這個錯誤程式碼為IIS 6.0所專用。
|
402 Payment Required
|
此程式碼尚無法使用。
|
403 Forbidden
|
對被請求頁面的訪問被禁止。
|
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.14
|
拒絕目錄列表。
|
403.15
|
超出客戶端訪問許可。
|
403.16
|
客戶端證書不受信任或無效。
|
403.17
|
客戶端證書已過期或尚未生效。
|
403.18
|
在當前的應用程式池中不能執行所請求的URL。這個錯誤程式碼為IIS 6.0所專用。
|
403.19
|
不能為這個應用程式池中的客戶端執行CGI。這個錯誤程式碼為IIS 6.0所專用。
|
403.20
|
Passport登入失敗。這個錯誤程式碼為IIS 6.0所專用。
|
404 Not Found
|
伺服器無法找到被請求的頁面。
|
404.0
|
(無)–沒有找到檔案或目錄。
|
404.1
|
無法在所請求的埠上訪問Web站點。
|
404.2
|
Web服務擴充套件鎖定策略阻止本請求。
|
404.3
|
MIME對映策略阻止本請求。
|
405 Method Not Allowed
|
請求中指定的方法不被允許。
|
406 Not Acceptable
|
伺服器生成的響應無法被客戶端所接受。
|
407 Proxy Authentication Required
|
使用者必須首先使用代理伺服器進行驗證,這樣請求才會被處理。
|
408 Request Timeout
|
請求超出了伺服器的等待時間。
|
409 Conflict
|
由於衝突,請求無法被完成。
|
410 Gone
|
被請求的頁面不可用。
|
411 Length Required
|
"Content-Length"未被定義。如果無此內容,伺服器不會接受請求。
|
412 Precondition Failed
|
請求中的前提條件被伺服器評估為失敗。
|
413 Request Entity Too Large
|
由於所請求的實體的太大,伺服器不會接受請求。
|
414 Request-url Too Long
|
由於url太長,伺服器不會接受請求。當post請求被轉換為帶有很長的查詢資訊的get請求時,就會發生這種情況。
|
415 Unsupported Media Type
|
由於媒介型別不被支援,伺服器不會接受請求。
|
416 Requested Range Not Satisfiable
|
伺服器不能滿足客戶在請求中指定的Range頭。
|
417 Expectation Failed
|
執行失敗。
|
423
|
鎖定的錯誤。
|
訊息
|
描述
|
---|---|
500 Internal Server Error
|
請求未完成。伺服器遇到不可預知的情況。
|
500.12
|
應用程式正忙於在Web伺服器上重新啟動。
|
500.13
|
Web伺服器太忙。
|
500.15
|
不允許直接請求Global.asa。
|
500.16
|
UNC授權憑據不正確。這個錯誤程式碼為IIS 6.0所專用。
|
500.18
|
URL授權儲存不能開啟。這個錯誤程式碼為IIS 6.0所專用。
|
500.100
|
內部ASP錯誤。
|
501 Not Implemented
|
請求未完成。伺服器不支援所請求的功能。
|
502 Bad Gateway
|
請求未完成。伺服器從上游伺服器收到一個無效的響應。
|
502.1
|
CGI應用程式超時。
|
502.2
|
CGI應用程式出錯。
|
503 Service Unavailable
|
請求未完成。伺服器臨時過載或當機。
|
504 Gateway Timeout
|
閘道器超時。
|
505 HTTP Version Not Supported
|
伺服器不支援請求中指明的HTTP版本。
|
請求頭:
Header | 解釋 | 示例 |
---|---|---|
Accept | 指定客戶端能夠接收的內容型別 | Accept: text/plain, text/html |
Accept-Charset | 瀏覽器可以接受的字元編碼集。 | Accept-Charset: iso-8859-5 |
Accept-Encoding | 指定瀏覽器可以支援的web伺服器返回內容壓縮編碼型別。 | Accept-Encoding: compress, gzip |
Accept-Language | 瀏覽器可接受的語言 | Accept-Language: en,zh |
Accept-Ranges | 可以請求網頁實體的一個或者多個子範圍欄位 | Accept-Ranges: bytes |
Authorization | HTTP授權的授權證書 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Cache-Control | 指定請求和響應遵循的快取機制 | Cache-Control: no-cache |
Connection | 表示是否需要持久連線。(HTTP 1.1預設進行持久連線) | Connection: close |
Cookie | HTTP請求傳送時,會把儲存在該請求域名下的所有cookie值一起傳送給web伺服器。 | Cookie: $Version=1; Skin=new; |
Content-Length | 請求的內容長度 | Content-Length: 348 |
Content-Type | 請求的與實體對應的MIME資訊 | Content-Type: application/x-www-form-urlencoded |
Date | 請求傳送的日期和時間 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
Expect | 請求的特定的伺服器行為 | Expect: 100-continue |
From | 發出請求的使用者的Email | From: user@email.com |
Host | 指定請求的伺服器的域名和埠號 | Host: www.zcmhi.com |
If-Match | 只有請求內容與實體相匹配才有效 | If-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Modified-Since | 如果請求的部分在指定時間之後被修改則請求成功,未被修改則返回304程式碼 | If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
If-None-Match | 如果內容未改變返回304程式碼,引數為伺服器先前傳送的Etag,與伺服器回應的Etag比較判斷是否改變 | If-None-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Range | 如果實體未改變,伺服器傳送客戶端丟失的部分,否則傳送整個實體。引數也為Etag | If-Range: “737060cd8c284d8af7ad3082f209582d” |
If-Unmodified-Since | 只在實體在指定時間之後未被修改才請求成功 | If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
Max-Forwards | 限制資訊通過代理和閘道器傳送的時間 | Max-Forwards: 10 |
Pragma | 用來包含實現特定的指令 | Pragma: no-cache |
Proxy-Authorization | 連線到代理的授權證書 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Range | 只請求實體的一部分,指定範圍 | Range: bytes=500-999 |
Referer | 先前網頁的地址,當前請求網頁緊隨其後,即來路 | Referer: http://www.zcmhi.com/archives/71.html |
TE | 客戶端願意接受的傳輸編碼,並通知伺服器接受接受尾加頭資訊 | TE: trailers,deflate;q=0.5 |
Upgrade | 向伺服器指定某種傳輸協議以便伺服器進行轉換(如果支援) | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
User-Agent | User-Agent的內容包含發出請求的使用者資訊 | User-Agent: Mozilla/5.0 (Linux; X11) |
Via | 通知中間閘道器或代理伺服器地址,通訊協議 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 關於訊息實體的警告資訊 | Warn: 199 Miscellaneous warning |