目前網路應用都是用TCP/IP協議進行通訊的。而在網路通訊中使用最多的web協議就是基於TCP的HTTP協議,由此可見http的重要性。
TCP協議與HTTP協議
首先我們先分別來了解一下,TCP協議和HTTP協議
TCP協議
TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連線(連線導向)的、可靠的、 基於IP的傳輸層協議,是網際網路的基礎。許多應用層協議都是基於TCP構建,典型的是HTTP、SMIP等協議。
TCP在OSI模型中屬於傳輸協議。首先來看看OSI的七層模型:
HTTP協議
HTTP全稱是HyperText Transfer Protocol,即:超文字傳輸協議,從1990年開始就在WWW上廣泛應用,是現今在WWW上應用最多的協議, Http是應用層協議,當你上網瀏覽網頁的時候,瀏覽器和Web伺服器之間就會通過HTTP在Internet上進行資料的傳送和接收。
HTTP它是屬於TCP上層的協議,但是本身並無會話的特點,它是一個基於請求/響應模式的、無狀態的協議,以一問一答的方式實現服務。即我們通常所說的Request/Response。
那麼TCP與HTTP協議兩者之間究竟在網路通訊中起到什麼作用以及有什麼聯絡呢?下面我們通過 一張圖展示在瀏覽器上訪問一個網頁,各種協議在裡面起的作用就能找到答案。
HTTP請求報文
一個請求報文有以下四個部分組成:請求行(request line)
、訊息頭部(header)
、空行
、請求正文
如下請求報文:
POST /index.html HTTP/1.1
HOST: www.XXX.com
User-Agent: Mozilla/5.0(Windows NT 6.1;rv:15.0) Firefox/15.0
Username=admin&password=admin
複製程式碼
1. 請求行
請求行由請求方法
、URL
和HTTP協議版本
3個欄位組成,它們用空格分隔。
例如:
GET /index.html HTTP/1.1
複製程式碼
HTTP協議的請求方法有:
- GET 獲取資源
- POST 向伺服器端傳送資料,傳輸實體主體
- PUT 傳輸檔案
- HEAD 獲取報文首部
- DELETE 刪除檔案
- OPTIONS 詢問支援的方法
- TRACE 追蹤路徑
2. 請求頭部
請求頭部由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號“:”分隔。請求頭部通知伺服器有關於客戶端請求的資訊,
- 通用首部(General Header)
- 請求首部(Request Header)
- 響應首部(Response Header)
- 實體首部(Entity Header Fields)
如下圖:
其中典型的請求頭有:
User-Agent:產生請求的瀏覽器型別。
Accept:客戶端可識別的內容型別列表。
Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機。
複製程式碼
3. 空行
最後一個請求頭之後是一個空行,傳送回車符和換行符,通知伺服器以下不再有請求頭。
4. 請求資料
請求資料不在GET方法中使用,而是在POST方法中使用。POST方法適用於需要客戶填寫表單的場合。與請求資料相關的最常使用的請求頭是Content-Type和Content-Length。
HTTP響應報文
HTTP響應也由四個部分組成,分別是:響應行
、響應頭
、空行
、響應體
。
如下響應報文所示:
HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<body>
<p>this is http response</p>
</body>
</html>
複製程式碼
正如你所見,在響應中唯一真正的區別在於第一行中用狀態資訊代替了請求資訊。狀態行(status line)通過提供一個狀態碼來說明所請求的資源情況。
1. 狀態行
狀態行 : HTTP-Version Status-Code Reason-Phrase CRLF
- HTTP-Version 伺服器HTTP協議的版本
- Status-Code 伺服器發回的響應狀態程式碼
- Reason-Phrase 狀態程式碼的文字描述
狀態碼 :狀態碼負責表示客戶端請求的返回結果、標記伺服器端是否正常、通知出現的錯誤。狀態程式碼由三位數字組成,第一個數字定義了響應的類別,且有
五種
可能取值
狀態碼 | 含義 |
---|---|
1xx | 指示資訊--表示請求已接收,繼續處理 |
3xx | 重定向--要完成請求必須進行更進一步的操作 |
4xx | 客戶端錯誤--請求有語法錯誤或請求無法實現 |
5xx | 伺服器端錯誤--伺服器未能實現合法的請求 |
3xx | 重定向--要完成請求必須進行更進一步的操作 |
常見狀態程式碼、狀態描述的說明如下。 200 OK:客戶端請求成功。 400 Bad Request:客戶端請求有語法錯誤,不能被伺服器所理解。 401 Unauthorized:請求未經授權,這個狀態程式碼必須和WWW-Authenticate報頭域一起使用。 403 Forbidden:伺服器收到請求,但是拒絕提供服務。 404 Not Found:請求資源不存在,舉個例子:輸入了錯誤的URL。 500 Internal Server Error:伺服器發生不可預期的錯誤。 503 Server Unavailable:伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常,舉個例子:HTTP/1.1 200 OK(CRLF)。
- 2XX 成功
狀態碼 | 含義 |
---|---|
200 | OK 客戶端發過來的資料被正常處理 |
204 | Not Content 正常響應,沒有實體 |
206 | Partial Content範圍請求,返回部分資料,響應報文中由Content-Range指定實體內容 |
- 3XX 重定向功
狀態碼 | 含義 |
---|---|
301 | Moved Permanently 永久重定向 |
302 | Found 臨時重定向,規範要求方法名不變,但是都會改變 |
303 | See Other 和302類似,但必須用GET方法 |
304 | Not Modified 狀態未改變 配合(If-Match、If-Modified-Since、If-None_Match、If-Range、If-Unmodified-Since) |
307 | Temporary Redirect 臨時重定向,不該改變請求方法 |
- 4XX 客戶端錯誤
狀態碼 | 含義 |
---|---|
400 | Bad Request 請求報文語法錯誤 |
401 | unauthorized 需要認證 |
403 | Forbidden 伺服器拒絕訪問對應的資源 |
404 | Not Found 伺服器上無法找到資源 |
- 5XX 伺服器端錯誤
狀態碼 | 含義 |
---|---|
500 | Internal Server Error 伺服器故障 |
503 | Service Unavailable 伺服器處於超負載或正在停機維護 |
HTTP首部
- 通用首部欄位
首部欄位名 | 說明 |
---|---|
Cache-Control | 控制快取行為 |
Connection | 連結的管理 |
Date | 報文日期 |
Pragma | 報文指令 |
Trailer | 報文尾部的首部 |
Trasfer-Encoding | 指定報文主體的傳輸編碼方式 |
Upgrade | 升級為其他協議 |
Via | 代理伺服器資訊 |
Warning | 錯誤通知 |
- 請求首部欄位
首部欄位名 | 說明 |
---|---|
Accept | 使用者代理可處理的媒體型別 |
Accept-Charset | 優先的字符集 |
Accept-Encoding | Accept-Encoding |
Accept-Langulage | 優先的語言 |
Authorization | Web認證資訊 |
Expect | 期待伺服器的特定行為 |
From | 使用者的電子郵箱地址 |
Host | 請求資源所在的伺服器 |
If-Match | 比較實體標記 |
If-Modified-Since | 比較資源的更新時間 |
If-None-Match | 比較實體標記 |
If-Range | 資源未更新時傳送實體Byte的範圍請求 |
If-Unmodified-Since | 比較資源的更新時間(和If-Modified-Since相反) |
Max-Forwards | 最大傳輸跳數 |
Proxy-Authorization | 代理伺服器需要客戶端認證 |
Range | 實體位元組範圍請求 |
Referer | 請求中的URI的原始獲取方 |
TE | 傳輸編碼的優先順序 |
User-Agent | HTTP客戶端程式的資訊 |