一.概述
1.web應用的核心是http協議(HyperText Transfer Protocol),http協議的由兩部分組成,客戶端程序和服務器端程序,通過交換http報文進行會話。web頁面則是由對象(也叫資源)組成的,對象直白的說就是一個個的文件,而這些對象可以通過URL引用,URL由兩部分組成,存放對象的主機名和對象的文件路徑,而這些對象都存儲在web服務器之上。http協議以tcp作為他的支撐,一旦建立連接,用戶的瀏覽器進程就能通過套接字接口訪問TCP服務,這意味著客戶端咩發出一個http請求都能完整的到達服務器,而http是一個無狀態協議,因為服務器向客戶端發送數據時并不存儲任何有關客戶端的狀態信息,即使客戶端在很短時間內對同一個資源做出請求,服務器端也會發送兩次該資源,就像之前什么也沒發生一樣。
2.持久連接與非持久連接
當客戶端與服務器端進行長時間的通信時,客戶端會發出一系列的請求,服務器端要這些請求一一進行響應,而http協議基于tcp協議建立連接,于是對這一系列的請求和響應可以每次經過一個單獨的tcp連接發送,也可以都經過同一個tcp連接進行發送;每次都經過不同的tcp進行發送的方式就叫做非持久連接,每次都經過同一個tcp連接發送的方式叫做持久連接。
假設我們請求一個包含10個資源的web頁面,這里所說是http的基本形態,并不包括cookie,session等機制。
(1)對于非持久連接,整個過程是:
1.http客戶端向服務器發起一個tcp連接,完成tcp的三次握手,建立連接 |
2.http客戶端向服務器端發送一個http請求報文 |
3.http服務器端接受報文,經過在web服務器中進行資源檢索,構建http響應報文,并發送給客戶端 |
4.http服務器端斷開tcp連接,但是要等到客戶端確認已經完整的接受響應報文 |
5.http客戶端接受響應報文,關閉tcp連接,從而完成一次http會話。 |
注意:每個tcp連接只只傳輸一個一個請求報文和一個響應報文,因此要請求10個資源需要建立10個tcp連接。
(2)對于持久連接,整個過程是:
1.http客戶端向服務器發起一個tcp連接,完成tcp的三次握手,建立連接 |
2.http客戶端向服務器端發送一個http請求報文 |
3.http服務器端接受報文,經過在web服務器中進行資源檢索,構建http響應報文,并發送給客戶端 |
4.http服務器端斷開tcp連接,但是要等到客戶端確認已經完整的接受響應報文 |
5.http客戶端接受響應報文,關閉tcp連接,從而完成一次http會話。 |
所不同的是:必須為每個會話維護同一個連接,客戶端和服務器端都要分配TCP的緩沖區,對于短時間之內的資源的發送,可以一個接一個的發出,在單個tcp連接上進行,http默認使用流水線的方式持久連接。
3.web緩存
web緩存服務器也叫代理服務器,他能代表初始web服務器來滿足http請求的資源,web緩存服務器有自己的存儲空間,存儲著最近請求過的web資源的拷貝,當有web緩存服務器之后,當客戶端通過瀏覽器請求資源以后,整個過程為:
1.瀏覽器與緩存服務器建立tcp連接,并向緩存服務器發送一個http請求 |
2.web緩存服務器檢查本地是否存儲了該資源的拷貝,如果有則直接響應 |
3.如果緩存服務器里沒有該資源,則該服務器向后端初始服務器建立tcp連接,并幫助客戶端去請求該資源 |
4.當緩存服務器接受到來自初始服務器的資源以后,現在本地緩存一份,然后構建響應報文給客戶端 |
我們看到,這個過程中,緩存服務器即是客戶端又是服務器,web緩存能從整體上降低網絡中的web流量,加快對客戶端請求的響應速度。
二.http報文
http報文分為請求報文和響應報文
1.http的請求報文
報文中各個字段分別為:
(1)方法:指明客戶端對web資源的操作,常用的方法有
GET:從服務器獲取資源 |
HEAD:從服務器獲取文檔的響應首部 |
POST:提交數據給服務器 |
PUT:將報文中主體部分指定的資源存儲在服務器中 |
DELETE:刪除服務器中的資源 |
TRACE:跟蹤請求到達初始服務器經經過的代理服務器 |
OPTIONS:請求服務器返回對指定資源支持的使用方法 |
(2).URL:指明所要獲取資源的位置
(3)版本:http的第一個版本是http/0.9,然后是http/1.0,http/1.1,直到今天的http/2.0
(4)首部:分為通用首部,請求首部,響應首部,實體首部,擴展首部,其格式為: Name Value
通用首部:
Date:報文創建的時間 |
Connection:連接狀態 |
Via:顯示報文經過的中間節點 |
Cache-Control:緩存控制信息 |
Pragma:編譯控制信息 |
Upgrade:用于檢測HTTP協議及其他協議是否可以使用更高版本進行通信 |
Warning:告知用戶一些與緩存相關問題的警告 |
實體首部:
Allow:列出對此實體使用的請求方法 |
Location:客戶端正真的實體所處的位置 |
Content-Encoding:內容的編碼格式 |
Content-Language:內容所能接受的語言 |
Conntent-length:主體的長度 |
Content-Location:服務器端真正的主體所處的位置 |
Content-Type:主體對象的類型 |
緩存相關的標記 ETag:實體擴展標簽 Expires:緩存的過期時間 Last-Modified:緩存最后一次修改的時間 |
Content-MD5:加密了的字符串,用于檢驗傳輸過程中首部信息的完整性 |
請求首部:
Accept:告訴務器用戶代理可處理的媒體類型及媒體類型的優先級 |
Accept-Charset告訴服務器用戶代理支持的字符集及字符集的優先級,可一次性指定多個字符集 |
Accept-Encoding:告訴服務器用戶代理支持的內容編碼及內容編碼優先級順序,可一次性指定多種內容編碼 |
Accept-Language:告訴服務器用戶代理能夠處理的自然語言集,以及其相對有限集,可一次指定多種自然語言集 |
Client-IP:指明客戶端自己的地址 |
Host:告訴服務器請求的資源所處的互聯網主機名和端口號 |
Referer:告訴服務器原始鏈接的URI |
User-Agent:指明用戶代理的信息 |
Max-Forwards:發送包含該字段的請求時,該字段以十進制整數形式指定可經過的服務器最大數目 |
條件式請求首部 Except:告訴服務器期望出現的行為 If-Modified-Since:指明自從指定時間開始資源是否方式改變 If-Unmodified-Since:指明自從指定時間開始資源是否沒有發生改變 If-None-Match:本地緩存中存儲的ETag是否與服務器文檔的ETag不匹配 If-Match:服務器收到請求,只有判定條件為真時,才會執行請求 If-Range:告訴服務器若指定的值和請求資源的值一致,則作為范圍請求處理,反之,則返回全部資源 |
安全請求首部 Authorization:向服務器發送認證信息,包括帳號和密碼 Cookie:客戶端向服務器端發送的cookie信息 Cookie2:cookie2是cookie的升級版 |
代理請求首部:Proxy-Authorization:向代理服務器發送認證信息 |
2.http的響應報文
(1)版本:http/1.1 ,http/2.0等根據使用的版本
(2)狀態碼:
1xx:提示類信息 |
2xx:成功響應客戶端所請求資源的信息,200成功響應 |
3xx:資源被重定向的信息; 301:所請求的資源被刪除,但是通過響應報文的location指明新位置 302:與301類似,通過響應報文的location指明資源現在所處的臨時位置 304:客戶端發出條件式請求,但在服務器中未曾發送改變 |
4xx:客戶端錯誤信息 401:需要用戶輸入帳號和密碼認證才能訪問的資源,顯示為Unauthorized 403:客戶端所請求的資源被禁止,顯示為Forbidden 404:服務器無法找到客戶端所請求的資源,顯示為Not Found |
5xx:服務器端錯誤信息 500:服務器端內部錯誤,顯示為Internal Server Error 502:代理服務器從后端服務器收到一條偽響應,顯示為Bad Gateway |
(3)響應首部
信息類 Age:響應持續的時長 Server:服務器軟件的名稱和版本 |
協商首部: Accept-Ranges:服務器可以接受的請求范圍類型 Vary:服務器查看的其他首部列表 |
安全響應首部 Set-Cookie:向客戶端發送cookie信息 Set-Cookie2:向客戶端發送cooki2信息 www-Authenticate:對客戶端的質詢認證列表 |
原創文章,作者:zhangbao,如若轉載,請注明出處:http://www.www58058.com/57120