http協議知多少

http簡介

HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網(WWW:World Wide Web )服務器傳輸超文本到本地瀏覽器的傳送協議。。

http工作原理

HTTP協議定義Web客戶端如何從Web服務器請求Web頁面,以及服務器如何把Web頁面傳送給客戶端。HTTP協議採用了請求/響應模型。客戶端向服務器發送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求數據。服務器以一個狀態行作爲響應,響應的內容包括協議的版本、成功或者錯誤代碼、服務器信息、響應頭部和響應數據。

  1. 客戶端連接到Web服務器
    一個HTTP客戶端,通常是瀏覽器,與Web服務器的HTTP端口(默認爲80)建立一個TCP套接字連接。如www.rqlyy.top

  2. 發送HTTP請求
    通過TCP套接字,客戶端向Web服務器發送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數據4部分組成。

  3. 服務器接受請求並返回HTTP響應
    Web服務器解析請求,定位請求資源。服務器將資源複本寫到TCP套接字,由客戶端讀取。一個響應由狀態行、響應頭部、空行和響應數據4部分組成。

  4. 釋放連接TCP連接
    若connection 模式爲close,則服務器主動關閉TCP連接,客戶端被動關閉連接,釋放TCP連接;若connection 模式爲keepalive,則該連接會保持一段時間,在該時間內可以繼續接收請求;

  5. 客戶端瀏覽器解析HTML內容
    客戶端瀏覽器首先解析狀態行,查看錶明請求是否成功的狀態代碼。然後解析每一個響應頭,響應頭告知以下爲若干字節的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,並在瀏覽器窗口中顯示。

在遊覽器上輸入URL(www.rqlyy.top)點擊回車確認後。會經歷以下過程:
查找本地緩存或者本地host文件或者dns服務器將URL(www.rqlyy.top)解析成IP地址;
解析的ip建立起tcp與服務器連接;
瀏覽器發出讀取文件(URL 中域名後面部分對應的文件)的HTTP 請求,該請求報文作爲 TCP 三次握手的第三個報文的數據發送給服務器;
服務器對瀏覽器請求作出響應,並把對應的 html 文本發送給瀏覽器;
釋放tcp連接
遊覽器在解析html渲染顯示在界面

在這裏插入圖片描述
CGI(Common Gateway Interface) 是 HTTP 服務器與你的或其它機器上的程序進行“交談”的一種工具,其程序須運行在網絡服務器上。

絕大多數的 CGI 程序被用來解釋處理來自表單的輸入信息,並在服務器產生相應的處理,或將相應的信息反饋給瀏覽器。CGI 程序使網頁具有交互功能。

http結構

客戶端發送一個HTTP請求到服務器的請求消息包括以下格式:請求行(request line)、請求頭部(header)、空行和請求數據四個部分組成
在這裏插入圖片描述HTTP響應也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文。
http響應

HTTP 請求方法

根據 HTTP 標準,HTTP 請求可以使用多種請求方法。

HTTP1.0 定義了三種請求方法: GET, POST 和 HEAD方法。
HTTP1.1 新增了六種請求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

請求方法 作用
GET 請求指定的頁面信息,並返回實體主體
POST 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST 請求可能會導致新的資源的建立和/或已有資源的修改
HEAD 類似於 GET 請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
PUT 從客戶端向服務器傳送的數據取代指定的文檔的內容
DELETE 請求服務器刪除指定的頁面
CONNECT HTTP/1.1 協議中預留給能夠將連接改爲管道方式的代理服務器
OPTIONS 允許客戶端查看服務器的性能
TRACE 回顯服務器收到的請求,主要用於測試或診斷
PATCH 是對 PUT 方法的補充,用來對已知資源進行局部更新

http請求頭

每個頭域由一個域名,冒號(:)和域值三部分組成。域名是大小寫無關的,域值前可以添加任何數量的空格符,頭域可以被擴展爲多行,在每行開始處,使用至少一個空格或製表符。

Transport 頭域

Connection:
作用:表示是否需要持久連接。
如果服務器看到這裏的值爲“Keep-Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認進行持久連接),它就可以利用持久連接的優點,當頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。要實現這一點,服務器需要在應答中發送一個Content-Length頭,最簡單的實現方法是:先把內容寫入 ByteArrayOutputStream,然後在正式寫出內容之前計算它的大小;
例如: Connection: keep-alive 當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的 網頁,會繼續使用這一條已經建立的連接
例如:Connection: close 代表一個Request完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP連接會關閉, 當客戶端再次發送Request,需要重新建立TCP連接。

Host:(發送請求時,該報文頭域是必需的)
Host請求報文頭域主要用於指定被請求資源的Internet主機和端口號,它通常從HTTP URL中提取出來的。
例如:http://;localhost/index.html
瀏覽器發送的請求消息中,就會包含Host請求報頭域,如下:
Host:localhost
此處使用缺省端口號80,若指定了端口號8080,則變成:Host:localhost:8080

Client 頭域

Accept:
作用:瀏覽器可以接受的媒體類型(MIME類型),
例如:Accept: text/html 代表瀏覽器可以接受服務器回發的類型爲 text/html 也就是我們常說的html文檔, 如果服務器無法返回text/html類型的數據,服務器應該返回一個406錯誤(non acceptable)。
通配符 * 代表任意類型。例如 Accept: / 代表瀏覽器可以處理所有類型,(一般瀏覽器發給服務器都是發這個)

Accept-Encoding:
作用:瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支持壓縮,支持什麼壓縮方法(gzip,deflate),(注意:這不是隻字符編碼);
例如:Accept-Encoding: gzip, deflate。Server能夠向支持gzip/deflate的瀏覽器返回經gzip或者deflate編碼的HTML頁面。許多情形下這可以減少5到10倍的下載時間,也節省帶寬。

Accept-Language:
作用:瀏覽器申明自己接收的語言。
語言跟字符集的區別:中文是語言,中文有多種字符集,比如big5,gb2312,gbk等等;
例如:Accept-Language:zh-cn 。如果請求消息中沒有設置這個報頭域,服務器假定客戶端對各種語言都可以接受。

User-Agent:
作用:告訴HTTP服務器, 客戶端使用的操作系統和瀏覽器的名稱和版本.
我們上網登陸論壇的時候,往往會看到一些歡迎信息,其中列出了你的操作系統的名稱和版本,你所使用的瀏覽器的名稱和版本,這往往讓很多人感到很神奇,實際上, 服務器應用程序就是從User-Agent這個請求報頭域中獲取到這些信息User-Agent請求報頭域允許客戶端將它的操作系統、瀏覽器和其它屬性告訴服務器。
例如:User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)

Accept-Charset:
作用:瀏覽器申明自己接收的字符集,這就是本文前面介紹的各種字符集和字符編碼,如gb2312,utf-8(通常我們說Charset包括了相應的字符編碼方案);
例如:Accept-Charset:iso-8859-1,gb2312.如果在請求消息中沒有設置這個域,缺省是任何字符集都可以接受。

Authorization:授權信息,通常出現在對服務器發送的WWW-Authenticate頭的應答中;
Authorization請求報頭域主要用於證明客戶端有權查看某個資源。當瀏覽器訪問一個頁面時,如果收到服務器的響應代碼爲401(未授權),可以發送一個包含Authorization請求報頭域的請求,要求服務器對其進行驗證。

Cookie/Login 頭域

Cookie:
作用:最重要的header, 將cookie的值發送給HTTP 服務器

Entity頭域

Content-Length
作用:發送給HTTP服務器數據的長度。即請求消息正文的長度;
例如:Content-Length: 38

Content-Type:
作用:指定Body的類型。
例如:Content-Type: application/x-www-form-urlencoded
Content-Type主要有四類:
1.text/html
請求Web頁面時返回響應的類型,Body中返回html文本。
2.x-www-form-urlencoded
Web頁面純文本表單的提交方式。
3.multitype/form-data
Web頁面含有二進制文件時的提交方式。
4.application/json,image/jpeg,application/zip…
單項內容(文本或非文本都可以),用於Web Api的響應或者POST/PUT的請求。

Miscellaneous 頭域

Referer:
作用:提供了Request的上下文信息的服務器,告訴服務器我是從哪個鏈接過來的,比如從我主頁上鍊接到一個朋友那裏, 他的服務器就能夠從HTTP Referer中統計出每天有多少用戶點擊我主頁上的鏈接訪問他的網站。
例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT

Cache 頭域

If-Modified-Since:
作用:把瀏覽器端緩存頁面的最後修改時間發送到服務器去,服務器會把這個時間與服務器上實際文件的最後修改時間進行對比。如果時間一致,那麼返回304,客戶端就直接使用本地緩存文件。如果時間不一致,就會返回200和新的文件內容。客戶端接到之後,會丟棄舊文件,把新文件緩存起來,並顯示在瀏覽器中。
例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT。

If-None-Match:
作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。當用戶再次請求該資源時,將在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服務器驗證資源的ETag沒有改變(該資源沒有更新),將返回一個304狀態告訴客戶端使用本地緩存文件。否則將返回200狀態和新的資源和Etag. 使用這樣的機制將提高網站的性能
例如: If-None-Match: “03f2b33c0bfcc1:0”

Pragma:
作用:防止頁面被緩存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一樣
Pargma只有一個用法, 例如:Pragma: no-cache
注意: 在HTTP/1.0版本中,只實現了Pragema:no-cache, 沒有實現Cache-Control

Cache-Control:
作用: 這個是非常重要的規則。這個用來指定Response-Request遵循的緩存機制。各個指令含義如下
Cache-Control:Public 可以被任何緩存所緩存()
Cache-Control:Private 內容只緩存到私有緩存中
Cache-Control:no-cache 所有內容都不會被緩存

http響應

http響應格式
在這裏插入圖片描述
響應頭部:

Date:
作用:生成消息的具體時間和日期,即當前的GMT時間。
例如: Date: Sun, 17 Mar 2013 08:12:54 GMT

Expires:
作用: 瀏覽器會在指定過期時間內使用本地緩存,指明應該在什麼時候認爲文檔已經過期,從而不再緩存它。
例如: Expires: Thu, 19 Nov 1981 08:52:00 GMT

Vary
作用:指示不可緩存的請求頭列表;
例如: Vary: Accept-Encoding

Cookie/Login 頭域

P3P
作用: 用於跨域設置Cookie, 這樣可以解決iframe跨域訪問cookie的問題
例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

Set-Cookie
作用:非常重要的header, 用於把cookie 發送到客戶端瀏覽器, 每一個寫入cookie都會生成一個Set-Cookie.
例如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3;

path=/
作用: 用於跨域設置Cookie, 這樣可以解決iframe跨域訪問cookie的問題
例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

Set-Cookie
作用:非常重要的header, 用於把cookie 發送到客戶端瀏覽器, 每一個寫入cookie都會生成一個Set-Cookie.
例如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/

Entity實體頭域

實體內容的屬性,包括實體信息類型,長度,壓縮方法,最後一次修改時間,數據有效性等。

ETag:
作用: 和If-None-Match 配合使用。(實例請看上節中If-None-Match的實例)
例如: ETag: “03f2b33c0bfcc1:0”

Last-Modified:
作用:用於指示資源的最後修改日期和時間。(實例請看上節的If-Modified-Since的實例)
例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT

Content-Type:
作用:WEB服務器告訴瀏覽器自己響應的對象的類型和字符集,
例如:
Content-Type: text/html; charset=utf-8
  Content-Type:text/html;charset=GB2312
Content-Type: image/jpeg

Content-Length:
指明實體正文的長度,以字節方式存儲的十進制數字來表示。在數據下行的過程中,Content-Length的方式要預先在服務器中緩存所有數據,然後所有數據再一股腦兒地發給客戶端。
  例如: Content-Length: 19847

Content-Encoding:
作用:文檔的編碼(Encode)方法。一般是壓縮方式。
WEB服務器表明自己使用了什麼壓縮方法(gzip,deflate)壓縮響應中的對象。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載時間。
例如:Content-Encoding:gzip

Content-Language:
作用:WEB服務器告訴瀏覽器自己響應的對象的語言者
例如:Content-Language:da

Miscellaneous 頭域

Server:
作用:指明HTTP服務器的軟件信息
例如:Apache/2.2.8 (Win32) PHP/5.2.5

X-Powered-By:
作用:表示網站是用什麼技術開發的
例如:X-Powered-By: PHP/5.2.5

Transport頭域

Location:
作用:用於重定向一個新的位置, 包含新的URL地址
實例請看304狀態實例

響應正文就是服務器返回的資源的內容,響應頭和正文之間是一個回車和一個換行符隔開的。

http狀態碼

狀態代碼有三位數字組成,第一個數字定義了響應的類別,共分五種類別:

1xx:指示信息–表示請求已接收,繼續處理

2xx:成功–表示請求已被成功接收、理解、接受

3xx:重定向–要完成請求必須進行更進一步的操作

4xx:客戶端錯誤–請求有語法錯誤或請求無法實現

5xx:服務器端錯誤–服務器未能實現合法的請求

常見狀態碼:

在這裏插入圖片描述

參考

https://www.runoob.com/http/
https://www.cnblogs.com/an-wen/p/11180076.html
https://www.cnblogs.com/qdhxhz/p/8468913.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章