標籤:瀏覽器 互連網 cookie 伺服器 電腦
12.1 http協議簡介
http(HyperText Transfer Protocol,超文字傳輸通訊協定 (HTTP))是互連網上應用最為廣泛的一種網路通訊協定。所有的www檔案都必須遵守這個標準。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。1960年美國人Ted Nelson構思了一種通過電腦處理文本資訊的方法,並稱之為超文本(hypertext)。這成為HTTP超文字傳輸通訊協定 (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協議版本
超文字傳輸通訊協定 (HTTP)已經演化出了很多版本,它們中的大部分都是向下相容的。在RFC 2145中描述了HTTP版本號碼的用法。用戶端在請求的開始告訴伺服器它採用的協議版本號碼,而後者則在響應中採用相同或者更早的協議版本。
http協議的版本主要有以下這些:
HTTP/0.9:最原始版本,功能簡陋。只接受GET一種要求方法,沒有在通訊中指定版本號碼,且不支援要求頭。由於該版本不支援POST方法,所以用戶端無法向伺服器傳遞太多資訊。
HTTP/1.0:這是第一個在通訊中指定版本號碼的HTTP協議版本,至今仍被廣泛採用,特別是在Proxy 伺服器中。支援MIME。
HTTP/1.1:增加了緩衝功能,引入了長串連(預設採用),能很好的配合Proxy 伺服器工作 ,支援以管理方式同時發送多個請求,以便降低線路負載,提高傳輸速度。
HTTP/2.0:大幅度提升了web效能,減少網路延遲,通常用於https
HTTP/1.1相較於 HTTP/1.0 協議的區別主要體現在:
a) 緩衝處理
b) 頻寬最佳化及網路連接的使用
c) 錯誤通知的管理
d) 訊息在網路中的發送
e) 互連網地址的維護
f) 安全性及完整性
12.5 名詞解釋
HTML:HyperText Mark Language,超文字標記語言 (HTML)
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:追蹤請求到達伺服器中間經過的Proxy 伺服器
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:Proxy 伺服器從後端伺服器收到了一條偽響應,響應狀態代碼為“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:向Proxy 伺服器認證
響應首部:只能在響應報文中使用
資訊性:
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.1HOST:www.baidu.comConnection:keep-alive
響應報文樣本:
HTTP/1.1 200 OKX-Powered-By:PHP/5.2.17Vary:Accept-Encoding,Cookie,User-AgentCache-Control:max-age=3,must-revalidateContent-Encoding:gzipContent-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協議