一、http相關知識點:
1、http協議:是一種無狀態(stateless)協議。
一次http事務(一次請求-響應的完成)結束後,鏈接立即斷開;可見每次請求都要進行3次握手,4次斷開,效率太低。
2、加速方式:
(1)、並行請求:瀏覽器一次發多個請求,服務器一次返回多個響應。現在的瀏覽器都是多線程的,都支持並行請求。
並行鏈接有缺陷:每個事務都會打開/關閉一條新的鏈接,會耗費時間和帶寬。由於TCP的慢啓動特性,每條新鏈接的性能都會有所降低。可打開的並行鏈接數實際上是有上限的。
(2)、持久鏈接也叫保持鏈接:一次請求後不立即斷開連接,等此頁面的所有請求都得到響應後在斷開。
持久鏈接的缺陷:如果持久時間過長,會導致其他請求被堵塞,造成其他客戶端的請求一直無法訪問,因此需要設置斷開持久鏈接的條件超時和最大請求數,只要滿足任何一個就會斷開持久鏈接。
對於http/1.0,要想使用KeepAlive特性,在請求時必須手動指定Connection :keep-alive;
對於http/1.1,在請求時默認Connection :keep-alive,無需手動指定。
3、http協議的版本:
(1)、http/0.9:1991年的版本。
A、僅用於傳輸html文本文檔。
B、不可傳輸圖片、聲音等二進制文件。
(2)、http/1.0:
A、引入了MIME(Multipurpose Internet Mail Extension) 採用base64編碼,
base64能將二進制數據(圖片、聲音、視頻等)編碼成文本發送,並能夠讓
接收方還原爲原來的格式。
B、可見1.0已經支持多媒體數據的處理。
C、開始引入緩存功能,不過緩存控制較差。
D、並引入了keep-alive(保持鏈接)。
(3)、http/1.1:支持更多的請求方法,更精細的緩存控制,並支持持久鏈接。
注意:對於http/1.0要想使用KeepAlive特性,在請求時必須手動指定Connection :keep-alive
對於http/1.1,在請求時默認Connection :keep-alive,無需手動指定。
4、http的請求方法:
(1)、安全的方法:GET、HEAD
(2)、POST
(3)、PUT、DELETE、TRACE
(4)、擴展方法:LOCK、COPY、MOVE
(5)、部分請求詳解:
GET:請求獲取一個資源,需要服務器發送
HEAD:跟GET相似,但其不需要服務發送資源而僅傳送響應首部。
POST:支持HTML表單提交。
PUT:跟GET相反,向服務寫入文檔,例如上傳文件、發佈系統等。
DELETE:請求刪除URL指向的資源,“危險”。
TRACE:跟蹤請求要經過的防火牆,代理或者網關等。
5、http的狀態碼:
(1)、1**:信息狀態碼,很少見到。
(2)、2**:成功狀態碼。
200:成功
(3)、3**:重定向狀態碼。
(4)、4**:客戶端類錯誤。
403 :Forbidden 無權限,請求被服務器拒絕。
404 :Not Found 不存在
405 :Method Not Allowed ,不允許使用此方法請求相應的URL
(5)、5**:服務器類錯誤。
500:Internal Server Error:服務器內部錯誤。
502:Bad Gateway,代理服務器錯誤。
503:Service Unavailable,服務器此時無法響應。
6、http報文格式:
(1)、http事務:一次請求以及與其對應的響應。
(2)、http方法:GET、PUT、HEAD、POST、DELETE等。
(3)、http請求:客戶端發送http請求報文。請求報文格式如下:
<method><request-URL><version>
<headers>(請求首部,其格式爲Name:Value)
空白行
<entity-body>(請求主題)
(4)、http響應:服務器端返回http響應報文。響應報文格式如下:
<version><status>(響應的狀態碼)<reason-phrase>(狀態碼的說明信息)
<headers>
空白行
<entity-body>
7、http首部:
(1)、通用首部:請求和響應都可以使用的首部。
A、Connection:定義C/S之間關於請求/響應的相關選項。
對於http/1.0要想使用KeepAlive特性,在請求時必須手動指定Connection :keep-alive
對於http/1.1,在請求時默認Connection :keep-alive,無需手動指定。
B、Via:顯示了報文經過的中間節點。
C、Cache-Control:緩存指示(能否緩存,緩存多久)。
D、Pragma:
(2)、請求首部:請求可以使用的首部。
A、Client-IP:客戶端IP
B、Host:請求的主機名和端口號,虛擬主機環境下用到。
C、Referer:用於指明瞭當前資源的上一個資源的URL,常用於"防盜鏈"。
例如:一個頁面a.html中有一個超鏈接的href爲b.html;
如果在a.html頁面中點擊b.html則b.html的Referer爲a.html
D、User-Agent:用戶代理,使用什麼工具發出的請求。
如IE瀏覽器,FireFox瀏覽器以及搜索引起的爬蟲等等。
E、Accept請求首部:用戶標明客戶自己更傾向於支持的方式。
Accept-Charset:支持使用的字符集。
Accept-Encoding:支持使用的編碼方式。
Accept-Language:支持使用的語言。
F、條件請求首部:
Expect:期望的格式
If-Modified-Since:是否在指定時間以來修改過此資源,如果修改過發新資源。
If-None-Match
G、跟安全相關的請求首部:
Authorization:客戶端提交給服務器端的認證數據,如賬號和密碼。
Cookie:客服端發送給服務器端的身份標識。
(3)、響應首部:響應可以使用的首部。
A、Age:響應持續時間。
B、Server:向客戶端標明服務器程序名稱和版本。
C、Accept-Ranges:
對當前資源來講,服務器所能接受的範圍類型,如壓縮,有的瀏覽器支持壓縮、有的不支持壓縮。
D、Set-Cookie:
服務器端在某客戶端第一次請求時發給的令牌。
(4)、擴展首部:
非標準首部,可能是由程序開發者創建的,例如:X-Forward-For
(5)、實體首部:
用來指定實體屬性。
location:資源的新位置。
Allow:告訴客戶端允許對此資源使用的請求方法。
Expires:過期期限
Last-Modified:上次修改時間
二、一次web請求的基本過程:
由客戶端發起請求,進而由內核空間接收請求,進而由內核交給用戶空間處理請求,處理過程中內核訪問資源,交由用戶空間來構建響應,進而交由內核空間發送響應,並記錄日誌。可見整個過程中經歷了由內核空間到用戶空間,再有用戶空間變爲內核空間的。訪問的資源時是由內核空間完成的。爲了提高效率可以減少資源內核空間和用戶空間間的轉換。
1、建立連接
2、接收請求
3、處理請求
4、訪問資源
5、構建響應
6、發送響應
7、記錄日誌
注:通過分析日誌記錄可以獲得UV(User View)和PV(Page View);
UV:在單位時間內多少個獨立IP訪問;
PV:在單位時間內訪問頁面的次數。
三、Web服務器I/O結構:處理的是一次web請求的基本過程的“接收請求”。
1、單進程I/O結構:
Http服務器只有一個進程即單進程,所以一次只能服務一個請求,其他請求必須排隊。
可見效率低下。
2、多進程I/O結構:
爲了服務多個請求,http服務器啓動多個進程,能滿足多個用戶的請求,但服務器資源有限,所以啓動的多進程數量有限,可見也不能處理太多請求。
3、複用的I/O結構:
單個進程響應多個請求(單進程開啓多個線程來響應多個請求)。
4、複用多進程I/O結構:
多個進程,每個進程響應多個請求,是複用的I/O結構的擴展。
四、http的Client、Server、Application Server:
1、http-Client:IE、Firefox、chrome、Opera、Safari等。
2、http-Server:Httpd、Nginx、lighttpd、gws等,主要負責靜態頁面。
3、http-Application Server:IIS、tomcat、jetty、resin等,主要負責動態頁面。
注:訪問http://www.netcraft.com 查看http-Server市場調查軟件佔有率。
五、傳輸層協議:
1、Tcp:面向連接的協議。
虛連接:需三次捂手、四次斷開。
2、UDP:無連接的協議。
無需三次捂手、四次斷開,用在及時通訊如QQ、MSN聊天以及DNS解析、發電報等。