HTTP協議
HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用于從萬維網(WWW:World Wide Web )服務器傳輸超文本到本地瀏覽器的傳送協議。HTTP是一個基于TCP/IP通信協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等)。HTTP協議工作于客戶端-服務端架構之上。瀏覽器作為HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求。Web服務器根據接收到的請求后,向客戶端發送響應信息。
HTTP協議的版本
-
http/0.9:已過時。只接受 GET 一種請求方法,沒有在通訊中指定版本號,且不支持請求頭。由于該版本不支持 POST 方法,所以客戶端無法向服務器傳遞太多信息。
-
http/1.0:這是第一個在通訊中指定版本號的HTTP 協議版本,至今仍被廣泛采用,特別是在代理服務器中。
-
http/1.1:當前版本。持久連接被默認采用,并能很好地配合代理服務器工作。還支持以管道方式同時發送多個請求,以便降低線路負載,提高傳輸速度。
-
http/2.0:IETF會讓所有互聯網通路默認選擇的方式來引入加密,互聯網專家們將新一代加密協議稱為“HTTP 2.0”。
HTTP之URL
HTTP使用統一資源標識符(Uniform Resource Identifiers, URI)來傳輸數據和建立連接。URL是一種特殊類型的URI,包含了用于查找某個資源的足夠的信息。URL,全稱是UniformResourceLocator, 中文叫統一資源定位符,用于描述服務器某特定資源的位置。
以下面這個URL為例,介紹下普通URL的各部分組成:
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
-
1、.協議部分:該URL的協議部分為“http:”,這代表網頁使用的是HTTP協議。在Internet中可以使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議。在"HTTP"后面的“//”為分隔符。
-
2、域名部分:該URL的域名部分為“www.aspxfans.com”。一個URL中,也可以使用IP地址作為域名使用。
-
3、端口部分:跟在域名后面的是端口,域名和端口之間使用“:”作為分隔符。端口不是一個URL必須的部分,如果省略端口部分,將采用默認端口。
-
4、虛擬目錄部分:從域名后的第一個“/”開始到最后一個“/”為止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例中的虛擬目錄是“/news/”。
-
5、文件名部分:從域名后的最后一個“/”開始到“?”為止,是文件名部分,如果沒有“?”,則是從域名后的最后一個“/”開始到“#”為止,是文件部分,如果沒有“?”和“#”,那么從域名后的最后一個“/”開始到結束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的文件名。
-
6、錨部分:從“#”開始到最后,都是錨部分。本例中的錨部分是“name”。錨部分也不是一個URL必須的部分。
-
7、參數部分:從“?”開始到“#”為止之間的部分為參數部分,又稱搜索部分、查詢部分。本例中的參數部分為“boardID=5&ID=24618&page=1”。參數可以允許有多個參數,參數與參數之間用“&”作為分隔符。
HTTP請求消息Request
客戶端發送一個HTTP請求到服務器的請求消息包括請求行(request line)、請求頭部(header)、空行和請求數據四個部分組成。
1、請求行
由3部分組成,分別為:請求方法(method)、URL以及協議版本(version),之間由空格分隔。
method:請求方法,標明客戶端希望服務器對資源執行的動作。
-
GET:從服務器獲取一個資源
-
HEAD:只從服務器獲取文檔的響應首部
-
POST:向服務器發送要處理的數據
-
PUT:將請求的主體部分存儲在服務器上
-
DELETE:請求刪除服務器上指定的文檔
-
TRACE:追蹤請求到達服務器中間經過的代理服務器
-
OPTIONS:請求服務器返回對指定資源支持使用的請求方法
協議版本(version)的格式為:HTTP/主版本號.次版本號,常用的有HTTP/1.0和HTTP/1.1
2、請求頭部
請求頭部為請求報文添加了一些附加信息,由“名/值”對組成,每行一對,名和值之間使用冒號分隔。
3、請求數據
請求數據也叫主體,可以添加任意的其他數據
HTTP響應消息Response
一般情況下,服務器接收并處理客戶端發過來的請求后會返回一個HTTP的響應消息。HTTP響應也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文。
1、狀態行
由3部分組成,分別為:協議版本,狀態碼(status),狀態碼描述,之間由空格分隔。
status:狀態代碼為3位數字,200~299的狀態碼表示成功,300~399的狀態碼指資源重定向,400~499的狀態碼指客戶端請求出錯,500~599的狀態碼指服務端出錯(HTTP/1.1向協議中引入了信息性狀態碼,范圍為100~199)
常用的狀態碼:
-
200:成功,請求的所有數據通過響應報文的entity-body部分發送:ok
-
301:請求的URL指向的資源已經被刪除,但在響應報文中通過首部Location指明了資源下載所處的新位置:Moved Permanently
-
302:與301相似,但在響應報文中通過Location指明資源限制所處臨時新位置:Found
-
304:客戶端發出了條件式請求,但服務器上的額資源未曾發送改變,則通過響應此響應狀態碼通知客戶端:Not Modified
-
401:需要輸入賬號和密碼認證方能訪問資源:Unauthorized
-
403:請求被禁止,Forbidden
-
404:服務器無法找到客戶端請求的資源:Not Found
-
500:服務器內部錯誤:Internal Server Error
-
502:代理服務器從后端服務器收到了一條偽響應:Bad Gateway
首部的分類
1、通用首部:
-
Date:報文的創建時間
-
Connection:連接狀態,如keep-alive,close
-
Via:顯示報文經過的中間節點
-
Cache-Control:控制緩存
2、請求首部
-
Accept:通過分期自己可接受的媒體類型
-
Accept-Charset:接受的字符集
-
Accept-Encoding:接受的編碼格式,如gzip
-
Accept-Language:接受的語言
-
Host:請求的服務器名稱的端口號
-
Referer:包含當前正在請求的資源的上一級資源
-
User-Agent:客戶端代理
條件式請求首部:
-
If-Modified-Since:自從指定的時間之后,請求的資源是否發生過修改
-
f-None-Match:本地緩存中存儲的文檔的ETag標簽是否與服務器文檔的ETag不匹配
安全請求首部:
-
Authorization:向服務器發送認證信息,如賬號密碼
-
Cookie:客戶端向服務器發送cookie
代理請求首部:
-
Proxy-Authorization::向代理服務器認證
3、響應首部:
信息性:
-
Age:響應持續時長
-
Server:服務器程序軟件名稱和版本
協商首部:某資源有多種表示方法時使用
-
Accept-Ranges:服務器可接受的請求范圍類型
-
Vary:服務器查看的其它首部列表
安全響應首部:
-
Set-Cookie:向客戶端設置cookie
-
WWW-Authwenticate:來自服務器對客戶端的質詢認證表單
4、實體首部:
-
Allow:列出此實體可使用的請求方法
-
Location:告訴客戶端真正的實體位于何處
-
Content-Encoding:內容的實體格式
-
Content-Language:內容的語言
-
Content-Length:主體的長度
-
Content-Location:實體正則所處位置
-
Content-Type:主機的對象類型
緩存相關:
-
ETag:實體的擴展標簽
-
Expires:實體的過期時間
-
Last-Modified:最后一次修改的時間
一次完整的http請求處理過程
HTTP通信機制是在一次完整的HTTP通信過程中,Web瀏覽器與Web服務器之間將完成下列7個步驟:
1、 建立TCP連接
在HTTP工作開始之前,Web瀏覽器首先要通過網絡與Web服務器建立連接,該連接是通過TCP來完成的,該協議與IP協議共同構建Internet,即著名的TCP/IP協議族,因此Internet又被稱作是TCP/IP網絡。HTTP是比TCP更高層次的應用層協議,根據規則,只有低層協議建立之后才能進行更高層協議的連接,因此,首先要建立TCP連接,一般TCP連接的端口號是80。
2、Web瀏覽器向Web服務器發送請求命令
一旦建立了TCP連接,Web瀏覽器就會向Web服務器發送請求命令。例如:GET/sample/hello.jsp HTTP/1.1。
3、Web瀏覽器發送請求頭信息
瀏覽器發送其請求命令之后,還要以頭信息的形式向Web服務器發送一些別的信息,之后瀏覽器發送了一空白行來通知服務器,它已經結束了該頭信息的發送。
4、Web服務器應答
客戶機向服務器發出請求后,服務器會客戶機回送應答, HTTP/1.1 200 OK ,應答的第一部分是協議的版本號和應答狀態碼。
5、 Web服務器發送應答頭信息
正如客戶端會隨同請求發送關于自身的信息一樣,服務器也會隨同應答向用戶發送關于它自己的數據及被請求的文檔。
6、Web服務器向瀏覽器發送數據
Web服務器向瀏覽器發送頭信息后,它會發送一個空白行來表示頭信息的發送到此為結束,接著,它就以Content-Type應答頭信息所描述的格式發送用戶所請求的實際數據。
7、Web服務器關閉TCP連接
一般情況下,一旦Web服務器向瀏覽器發送了請求數據,它就要關閉TCP連接,然后如果瀏覽器或者服務器在其頭信息加入了這行代碼:Connection:keep-alive,TCP連接將在發送后將仍然保持打開狀態,于是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了為每個請求建立新連接所需的時間,還節約了網絡帶寬。
原創文章,作者:641348038@qq.com,如若轉載,請注明出處:http://www.www58058.com/68039
非常贊的http總結,這部分常被面試問到,尤其是http2.0相關的知識,結合ssl實現全站https。