第十二章 http協議
12.1 http協議簡介
http(HyperText Transfer Protocol,超文本傳輸協議)是互聯網上應用最為廣泛的一種網絡協議。所有的www文件都必須遵守這個標準。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。1960年美國人Ted Nelson構思了一種通過計算機處理文本信息的方法,並稱之為超文本(hypertext)。這成為HTTP超文本傳輸協議標準架構的發展根基。
超文本就是帶有超鏈接的文本,超鏈接就是基於一些鏈接實現文檔間跳轉的文本。
http協議是一種無狀態的協議(stateless):
服務器無法持續追蹤訪問者來源,為了解決此問題引入了cookie和session,實現追蹤與保存用戶的行為
12.2 http技術架構
http是一個客戶端和服務器端請求和應答的標準(TCP)。客戶端是終端用戶,服務器端是網站。
通過使用web瀏覽器、網絡爬蟲或者其它的工具,客戶端發起一個到服務器上指定端口(默認端口為80)的HTTP請求。
這個客戶端被稱作用戶代理(User Agent)。
應答的服務器上存儲著一些資源,比如HTML文件和圖像,這個應答服務器被稱作源服務器(Origin Server)。
在用戶代理和源服務器中間可能存在多個中間層,比如代理,網關,或者隧道。盡管TCP/IP協議是互聯網上最流行的應用,HTTP協議並沒有規定必須使用它和基於它支持的層。事實上,HTTP可在任何其他互聯網協議上,或者在其他網絡上實現。HTTP只假定其下層協議提供可靠的傳輸,任何能夠提供這種保證的協議都可以被其使用。
通常,由HTTP客戶端發起一個請求,建立一個到服務器指定端口的TCP連接。HTTP服務器則在那個端口監聽客戶端發送過來的請求。一旦收到請求,服務器向客戶端發回一個狀態行,比如“HTTP/1.1 200 OK”和響應的消息,消息的消息團體可能是請求的文件、錯誤消息或者其它一些信息。HTTP使用TCP而不是UDP的原因在於打開一個網頁必須傳送很多數據,而TCP協議提供傳輸控制,按順序組織數據和錯誤糾正。
通過HTTP或者HTTPS協議請求的資源由統一資源標示符(Uniform Resource Identifiers)來標識。
12.3 http協議功能
http協議是用於從www服務器傳輸超文本到本地瀏覽器的傳輸協議。它可以使瀏覽器更加高效,使網絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分以及哪些部分內容首先顯示(如文本先於圖形)等。
http是客戶端瀏覽器或其他程序與web服務器之間的應用層通信協議。在internet上的web服務器上存放的都是超文本信息,客戶機需要通過http協議傳輸所要訪問的超文本信息。http包含命令和傳輸信息,不僅可用於web訪問,也可以用於其他因特網/內聯網應用系統之間的通信,從而實現各類應用資源超媒體訪問的集成。
我們在瀏覽器的地址欄裏輸入的網站地址叫做URL(Uniform Resource Locator,統一資源定位符)。就像每家每戶都有一個門牌地址一樣,每個網頁也都有一個internet地址。當你在瀏覽器的地址框中輸入一個URL或是單擊一個超鏈接時,URL就確定了林瀏覽的地址。瀏覽器通過HTTP將web服務器上站點的網頁代碼提取出來,並翻譯成漂亮的網頁。
12.4 http協議版本
超文本傳輸協議已經演化出了很多版本,它們中的大部分都是向下兼容的。在RFC 2145中描述了HTTP版本號的用法。客戶端在請求的開始告訴服務器它采用的協議版本號,而後者則在響應中采用相同或者更早的協議版本。
http協議的版本主要有以下這些:
HTTP/0.9:最原始版本,功能簡陋。只接受GET一種請求方法,沒有在通訊中指定版本號,且不支持請求頭。由於該版本不支持POST方法,所以客戶端無法向服務器傳遞太多信息。
HTTP/1.0:這是第一個在通訊中指定版本號的HTTP協議版本,至今仍被廣泛采用,特別是在代理服務器中。支持MIME。
HTTP/1.1:增加了緩存功能,引入了長連接(默認采用),能很好的配合代理服務器工作 ,支持以管理方式同時發送多個請求,以便降低線路負載,提高傳輸速度。
HTTP/2.0:大幅度提升了web性能,減少網絡延遲,通常用於https
HTTP/1.1相較於 HTTP/1.0 協議的區別主要體現在:
a) 緩存處理
b) 帶寬優化及網絡連接的使用
c) 錯誤通知的管理
d) 消息在網絡中的發送
e) 互聯網地址的維護
f) 安全性及完整性
12.5 名詞解釋
HTML:HyperText Mark Language,超文本標記語言
URI:Uniform Resource Indentifier,統一資源標識符。用於定義全局範圍內(包括但不僅限於互聯網)去標記唯一的、定位一種資源訪問路徑的方式,或者命名方式,被稱作統一資源標識符。這裏的統一指的是路徑格式上的統一。
URL:Uniform Resource Location,統一資源定位符,是URI的一個子集,用於描述在互聯網上互聯網資源的統一表示格式(protocol://host:port/path/to/file)
URL基本語法:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
params:參數,如http://www.idfsoft.com/bbs/index.html;gender=f,這裏的gender=f就是一個參數
query:傳遞給關系型數據庫頁面的特定行為。如http://www.idfsoft.com/bbs/item.php?username=tom&title=abc,這個URL表示要查詢的是username=name並且title=abc的條目
frag:用來定義一個較大頁面中的某一個位置,而不是頁面的開始處。說白點就是位置錨定
URN:Uniform Resource Naming,統一資源命名符,也是URI的一個子集
MIME:Multipurpose Internet Mail Extension,多用途互聯網郵件擴展。
MIME可以將非文本數據在傳輸前重新編碼為文本格式再傳輸給對方,接收方能夠用相反的方式將其重新還原為原來的格式,還能夠調用相應的程序來打開此文件
http事務:http協議的一次請求(request)和響應(response)的過程就稱之為http事務
動態網頁:包含靜態內容和動態內容(動態內容需要執行)
服務器端存儲的不是HTML文檔,而是編程語言開發的腳本,腳本接受參數之後在服務器端運行一次,運行完成之後會生成HTML格式的文檔,並把生成好的HTML文檔傳給客戶端
Web資源:web resource。
靜態文件:.jpg,.gif,.html,.txt,.js,.css,.mp3,.avi
動態文件:.php,.jsp
PV:Page View,打開了多少頁面
UV:User View,獨立IP量
12.6 http協議報文
http協議采用了請求/響應模型。客戶端向服務器發送一個請求,請求頭包含請求的方法、URL、協議版本以及包含請求修飾符、客戶信息和內容的類似於MIME的消息結構。服務器以一個狀態行作為響應,響應的內容包括消息協議的版本,成功或者錯誤編碼加上包含服務器信息、實體元信息以及可能的實體內容。
http協議的報文有請求報文和響應報文2種,其語法樣式如下:
請求報文語法:
<method> <request-URL> <version> <headers> <entity-body>
響應報文語法:
<version> <status> <reason-phrass> <headers> <entity-body>
報文的第一行通常稱作報文“起始行(start line)”,後面的標簽格式的內容稱作首部域(Header Field),每個首部域由名稱(name)和值(value)組成,中間用逗號分隔。
另外,響應報文通常還有一個稱作Body的信息主體,即響應給客戶端的內容。
method:請求方法,標明客戶端希望服務器對資源執行的動作,常見的有以下幾種:
GET:從服務器獲取一個資源
HEAD:只從服務器獲取文檔的響應首部,而不會發送響應內容。當我們只需要查看某個頁面的狀態的時候,使用HEAD是非常高效的
POST:向服務器發送要處理的數據。服務器端通常通過提供一個表單,客戶端填入數據時會把內容放入entity-body中提交提交給服務器端
PUT:將請求的主體部分存儲在服務器上。說白點就是上傳數據
DELETE:請求刪除服務器上指定的文檔
TRACE:追蹤請求到達服務器中間經過的代理服務器
OPTIONS:請求服務器返回對指定資源支持使用的請求方法
version:http的協議版本,格式如HTTP/<major>.<minor>
status:響應狀態碼,用於標記請求處理過程中發生的情況,常見的響應狀態碼有以下幾種:
1xx:100-101,純信息提示
100:服務器僅接收到部分請求,但是一旦服務器並沒有拒絕該請求,客戶端應該繼續發送其余的請求,響應狀態碼為"Continue"
101:服務器轉換協議,服務器將遵從客戶的請求轉換到另外一種協議,響應狀態碼為"Switching Protocols"
2XX:200-206,“成功”類的信息
200:請求資源正常。請求的所有數據通過響應報文的entity-body部分發送,響應狀態碼為“OK”
201:請求被創建完成,同時新的資源被創建,響應狀態碼為"Created"
202:供處理的請求已被接受,但處理未完成,響應狀態碼為"Accepted"
203:文檔已經正常地返回,但一些應答頭可能不正確,因為使用的是文檔的拷貝,響應狀態碼為"Non-authoritative information"
204:沒有新文檔。瀏覽器應該繼續顯示原來的文檔。響應狀態碼為"No Content"
205:沒有新文檔。但瀏覽器應該重置它所顯示的內容。用來強制瀏覽器清除表單輸入內容,響應狀態碼為"Reset Content"
206:客戶發送了一個帶有Range頭的GET請求,服務器完成了它
3XX:300-305,“重定向”類的信息
301:永久重定向,響應狀態碼為“Moved Permanently”
請求的URL指向的資源已經被刪除,但在響應報文中通過首部Location指明了資源現在所處的新位置,客戶端需要請求新位置的資源
302:臨時重定向,我這裏正忙,你要的資源在另一個地方也有,你先去那裏要,響應狀態碼為“Found”
與301相似,但在響應報文中通過Location指明資源現在所處的臨時新位置
304:客戶端發出了條件式請求,但服務器端發現客戶端請求的資源已被客戶端緩存過且未發生改變,讓客戶端直接到緩存裏去取。響應狀態碼為“Not Modified”
4XX:400-415,“客戶端錯誤”類的信息
400:由於客戶端請求有語法錯誤,不能被服務器所理解,響應狀態碼為“Bad Request”
401:需要輸入帳號和密碼認證方能訪問資源,響應狀態碼為“Unauthorized”
403:請求被禁止,響應狀態碼為“Forbidden”
404:服務器無法找到客戶端請求的資源,響應狀態碼為“Not Found”
5XX:500-505,“服務端錯誤”類的信息
500:服務器內部錯誤,響應狀態碼為“Internal Server Error”
502:代理服務器從後端服務器收到了一條偽響應,響應狀態碼為“Bad Gateway”
503:服務器當前不能夠處理客戶端的請求,在一段時間之後,響應狀態碼為“Service”
reason-phrass:解釋status狀態碼的情況,你成功了,是什麽成功了,你失敗了,是什麽失敗了,是獲取文件成功/失敗還是上傳文件成功/失敗等等。
headers:用來標記請求或響應的屬性
每個請求或響應報文可包含任意個首部;
每個首部都有首部名稱,後面跟一個冒號,而後跟上一個可選空格,接著是一個值
格式:Name: Value
首部的分類:
通用首部:可用在請求報文和響應報文中,常見的內容如下:
Date:報文的創建時間
Connection:連接狀態,如keep-alive,close等
Via:顯示報文經過的中間節點
Cache-Control:控制緩存的生效方法和機制
請求首部:只能在請求報文中使用,常見的內容如下:
Accept:通知服務器客戶端可以接受的媒體類型
Accept-Charset:通知服務器客戶端可以接受的字符集
Accept-Encoding:通知服務器客戶端可以接受的內容編碼格式,如gzip
Accept-Language:通知服務器客戶端可以接受的語言
Client-IP:客戶端的IP
Host:請求的服務器名稱和端口號
Referer:包含當前正在請求的資源的上一級資源
User-Agent:客戶端代理
條件式請求首部:
Expect:期望服務器端發什麽信息
If-Modified-Since:自從此處指定的時間之後請求的資源是否發生修改
If-Unmodified-Since:自從此處指定的時間之後請求的資源是否未發生修改
If-None-Match:本地緩存中存儲的文檔的ETag標簽是否與服務器文檔的ETag不匹配
If-Match:本地緩存中存儲的文檔的Etag是否與服務器文檔的Etag匹配
安全請求首部:
Authorization:向服務器發送認證信息,如帳號和密碼
Cookie/Cookie2:客戶端向服務器發送cookie
代理請求首部:
Proxy-Authorization:向代理服務器認證
響應首部:只能在響應報文中使用
信息性:
Age:響應持續時長
Server:服務器程序軟件名稱和版本
協商首部:某資源有多種表示方法時使用
Accept-Ranges:服務器可接受的請求範圍類型
Vary:服務器查看的其它首部列表
安全響應首部:
Set-Cookie:向客戶端設置cookie
Set-Cookie2:向客戶端設置cookie2
WWW-Authenticate:來自服務器的對客戶端的質詢認證表單
實體首部:標識實體的相關信息
Allow:列出對此實體可使用的請求方法
Location:告訴客戶端真正的實體位於何處
Content-Encoding:內容的編碼格式
Content-Language:內容使用的語言
Content-Length:主體的長度
Content-Location:實體真正所處的位置
Content-Type:主體的對象類型
緩存相關:
ETag:實體的擴展標簽
Expires:實體的過期時間
Last-Modified:最後一次修改的時間
擴展首部
entity-body:請求時附加的數據或響應時附加的數據,有可能為空
請求報文示例:
GET / HTTP/1.1 HOST:www.baidu.com Connection:keep-alive
響應報文示例:
HTTP/1.1 200 OK X-Powered-By:PHP/5.2.17 Vary:Accept-Encoding,Cookie,User-Agent Cache-Control:max-age=3,must-revalidate Content-Encoding:gzip Content-Length:6931
12.7 http周邊
常見的協議查看、分析的工具:
tcpdump
tshark
wireshark
常見的http服務器程序:
httpd(apache)
nginx
lighttpd
應用程序服務器:可以處理動態文件
IIS
tomcat,jetty,jboss,resin
webshpere,weblogic,oc4j
常用的http壓力測試工具:
ab:
語法:ab [options] URL
-n:總的請求數
-c:模擬的並發數
-k:以持久連接模式測試
webbench
http_load
jmeter
loadrunner
tcpcopy
ulimit -n #:調整當前用戶所能夠同時打開的文件數
web服務器資源路徑映射方式:
docroot
alias
虛擬主機docroot
用戶家目錄docroot
並發訪問響應模型(Web I/O):此處假定每個進程內只有一個線程
單進程I/O結構:啟動一個進程處理請求,而且一次只處理一個,多個請求被串行響應
多進程I/O結構:並行啟動多個進程,每個進程響應一個請求
復用I/O結構:一個進程響應多個請求
多線程模型:一個進程生成多個線程,每個線程響應一個用戶請求
事件驅動
復用的多進程I/O結構:啟動多個(m)進程,每個進程響應n個請求
12.8 https
https其實就是將ssl或tls應用於http協議的結果,https監聽於tcp/443端口
ssl會話的簡化過程如下:
(1)客戶端發送可供選擇的加密方式,並向服務器請求證書
(2)服務器端發送證書以及選定的加密方式給客戶端
(3)客戶端取得證書並進行證書驗證
如果信任給其發證書的CA:
a) 驗證證書來源的合法性:用CA的公鑰解密證書上的數字簽名
b) 驗證證書內容的合法性:完整性驗證
c) 檢查證書的有效期限
d) 檢查證書是否被吊銷
e) 證書中擁有者的名字,與訪問的目標主機要一致
(4)客戶端生成臨時會話密鑰(對稱密鑰),並使用服務器端的公鑰加密此數據發送給服務器,完成密鑰交換
(5)服務器用密鑰加密用戶請求的資源,響應給客戶端
註意:SSL會話是基於IP地址創建,所以單IP的主機上,僅可以使用一個https虛擬主機
WEB服務器的主要操作:
建立連接——接受或拒絕客戶端連接請求;
接收請求——通過網絡讀取HTTP請求報文;
處理請求——解析請求報文並做出相應的動作;
訪問資源——訪問請求報文中相應的資源;
構建響應——使用正確的首部生成HTTP響應報文;
發送響應——向客戶端發送生成的響應報文;
記錄日誌——當已經完成的HTTP事務記錄進日誌文件
本文出自 “忘情居” 博客,請務必保留此出處http://itchentao.blog.51cto.com/5168625/1931364
第十二章 http協議