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 |