1. 程式人生 > >HTTP相關知識點

HTTP相關知識點

一、HTTP協議的特點

1.HTTP協議是無狀態的

就是說每次HTTP請求都是獨立的,任何兩個請求之間沒有什麼必然的聯絡。但是在實際應用當中並不是完全這樣的,引入了Cookie和Session機制來關聯請求。

2.多次HTTP請求

在客戶端請求網頁時多數情況下並不是一次請求就能成功的,服務端首先是響應HTML頁面,然後瀏覽器收到響應之後發現HTML頁面還引用了其他的資源,例如,CSS,JS檔案,圖片等等,還會自動傳送HTTP請求這些需要的資源。現在的HTTP版本支援管道機制,可以同時請求和響應多個請求,大大提高了效率。

3.基於TCP協議

HTTP協議目的是規定客戶端和服務端資料傳輸的格式和資料互動行為,並不負責資料傳輸的細節。底層是基於TCP實現的。現在使用的版本當中是預設持久連線的,也就是多次HTTP請求使用一個TCP連線。

二、一次完整的HTTP請求所經歷的7個步驟

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連線在傳送後將仍然保持開啟狀態,於是,瀏覽器可以繼續通過相同的連線傳送請求。保持連線節省了為每個請求建立新連線所需的時間,還節約了網路頻寬。

建立TCP連線->傳送請求行->傳送請求頭->(到達伺服器)傳送狀態行->傳送響應頭->傳送響應資料->斷開TCP連線

三、HTTP請求報文與響應報文格式

請求報文包含三部分:

a、請求行:包含請求方法、URI、HTTP版本資訊
b、請求首部欄位
c、請求內容實體

                        

GET /wxisme HTTP/1.1  
Host: www.cnblogs.com 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0  
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5  
Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3  
Accept-Encoding: gzip,deflate  
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7  
Keep-Alive: 300  
Proxy-Connection: keep-alive  
Cookie: ASP.NET_SessionId=ey5drq45lsomio55hoydzc45
Cache-Control: max-age=0

簡單來說請求報文就是由請求行、請求頭、內容實體組成的,注意,每一行的末尾都有回車和換行,在內容實體和請求頭之間另有一個空行。其中請求行指定的是請求方法、請求URL、協議版本;請求頭是鍵值對的形式存在的,就是欄位名:值;內容實體就是要傳輸的資料。

響應報文包含三部分:

a、狀態行:包含HTTP版本、狀態碼、狀態碼的原因短語
b、響應首部欄位
c、響應內容實體

                    

HTTP/1.1 200 OK
Date: Tue, 12 Jul 2016 21:36:12 GMT
Content-Length: 563
Content-Type: text/html

<html>
    <body>
    Hello http!
    </body>
</html>

簡單來說響應報文由狀態行、響應首部欄位(響應頭)、響應實體組成,其中第一行是狀態行,依次包含HTTP版本,狀態碼和狀態短語組成;在一個回車換行之後是響應頭,也是鍵值對的形式,欄位名:值;然後會有一個空行也包含回車換行,之後是響應實體,就是要傳輸的資料。在上面的例子當中就是一個非常簡單的HTML頁面。 

四、常見的HTTP相應狀態碼

2XX成功   3XX重定向 4XX客戶端錯誤 5XX服務端錯誤

  • 200:請求被正常處理
  • 204:請求被受理但沒有資源可以返回
  • 206:客戶端只是請求資源的一部分,伺服器只對請求的部分資源執行GET方法,相應報文中通過Content-Range指定範圍  的資源。
  • 301:永久性重定向
  • 302:臨時重定向
  • 303:與302狀態碼有相似功能,只是它希望客戶端在請求一個URI的時候,能通過GET方法重定向到另一個URI上
  • 304:傳送附帶條件的請求時,條件不滿足時返回,與重定向無關
  • 307:臨時重定向,與302類似,只是強制要求使用POST方法
  • 400:請求報文語法有誤,伺服器無法識別
  • 401:請求需要認證
  • 403:請求的對應資源禁止被訪問
  • 404:伺服器無法找到對應資源
  • 500:伺服器內部錯誤
  • 503:伺服器正忙

五、常見HTTP首部欄位

a、通用首部欄位(請求報文與響應報文都會使用的首部欄位)

Date:建立報文時間

Connection:連線的管理  1.控制不在轉發給代理的首部欄位;2管理持久連線

Cache-Control:快取的控制

Transfer-Encoding:報文主體的傳輸編碼方式

b、請求首部欄位(請求報文會使用的首部欄位)

Host:請求資源所在伺服器

Accept:可處理的媒體型別,比如文字檔案、圖片檔案、視訊檔案等等

Accept-Charset:可接收的字符集

Accept-Encoding:可接受的內容編碼

Accept-Language:可接受的自然語言

c、響應首部欄位(響應報文會使用的首部欄位)

Accept-Ranges:可接受的位元組範圍

Location:令客戶端重新定向到的URI

Server:HTTP伺服器的安裝資訊

d、實體首部欄位(請求報文與響應報文的的實體部分使用的首部欄位)

Allow:資源可支援的HTTP方法

Content-Type:實體主體內物件的媒體型別

Content-Encoding:實體主體適用的編碼方式

Content-Language:實體主體的自然語言

Content-Length:實體主體的的位元組數

Content-Range:能告知客戶端作為響應返回的實體的哪個部分符合範圍請求。欄位值以位元組為單位,表示當前傳送部分及整個                              實體大小

六、HTTP請求方法

請求方法是客戶端用來告知伺服器其動作意圖的方法。就像下達命令一樣。在HTTP1.1版本中支援GET、POST等近10種方法。需要注意的是方法名區分大小寫,需要用大寫字母。下面詳細說明。

1.GET:獲取資源

GET方法用來請求訪問已被URI識別的資源。也就是指定了伺服器處理請求之後響應的內容。

2.POST:傳輸實體主體

POST方法用來傳輸實體主體。POST與GET的區別之一就是目的不同,二者之間的區別會在文章的最後詳細說明。雖然GET方法也可以傳輸,但是一般不用,因為GET的目的是獲取,POST的目的是傳輸。

3.PUT:傳輸檔案

PUT方法用來傳輸檔案。類似FTP協議,檔案內容包含在請求報文的實體中,然後請求儲存到URL指定的伺服器位置。

4.HEAD:獲得報文首部

HEAD方法類似GET方法,但是不同的是HEAD方法不要求返回資料。用於確認URI的有效性及資源更新時間等。

5.DELETE:刪除檔案

DELETE方法用來刪除檔案,是與PUT相反的方法。DELETE方法請求URI刪除指定的資源。

6.OPTIONS:詢問支援的方法

因為並不是所有的伺服器都支援規定的方法,為了安全有些伺服器可能會禁止掉一些方法例如DELETE、PUT等。那麼OPTIONS就是用來詢問伺服器支援的方法。

7.TRACE:追蹤路徑

TRACE方法是讓Web伺服器將之前的請求通訊環回給客戶端的方法。這個方法並不常用。

8.CONNECT:要求用隧道協議連線代理

CONNECT方法要求在與代理伺服器通訊時建立隧道,實現用隧道協議進行TCP通訊。主要使用SSL/TLS協議對通訊內容加密後傳輸。

七、GET和POST的區別

  • 從字面意思和HTTP的規範來看,GET用於獲取資源資訊而POST是用來更新資源資訊。
  • GET提交請求的資料實體會放在URL的後面,用?來分割,引數用&連線,舉個栗子:/index.html?name=wang&login=1
  • 對引數的資料型別,GET只接受ASCII字元,而POST沒有限制。
  • GET提交的資料長度是有限制的,因為URL長度有限制,具體的長度限制視瀏覽器而定。而POST沒有。
  • GET引數通過URL傳遞,POST放在Request body中。
  • GET提交的資料不安全,因為引數都會暴露在URL上。
  • GET請求只能進行url編碼,而POST支援多種編碼方式。
  • GET請求會被瀏覽器主動cache,而POST不會,除非手動設定。
  • get請求引數會被完整保留在瀏覽歷史記錄裡,而post中的引數不會被保留。

大牛解答:https://www.cnblogs.com/logsharing/p/8448446.html#!comments

八、Cookie和Session的區別及使用

HTTP是一種無狀態的協議,為了分辨連結是誰發起的,需自己去解決這個問題。不然有些情況下即使是同一個網站每開啟一個頁面也都要登入一下。而Session和Cookie就是為解決這個問題而提出來的兩個機制。

應用場景

登入網站,今輸入使用者名稱密碼登入了,第二天再開啟很多情況下就直接打開了。這個時候用到的一個機制就是cookie。

session一個場景是購物車,添加了商品之後客戶端處可以知道添加了哪些商品,而伺服器端如何判別呢,所以也需要儲存一些資訊就用到了session。

Cookie

通俗講,是訪問某些網站後在本地儲存的一些網站相關資訊,下次訪問時減少一些步驟。更準確的說法是:Cookies是伺服器在本地機器上儲存的小段文字並隨每一個請求傳送至同一伺服器,是在客戶端保持狀態的方案。

Cookie的主要內容包括:名字,值,過期時間,路徑和域。使用Fiddler抓包就可以看見。

儲存形式是key, value形式。過期時間可設定的,如不設,則瀏覽器關掉就消失了,儲存在記憶體當中,否則就按設定的時間來儲存在硬碟上的,過期後自動清除,比方說開關機關閉再開啟瀏覽器後他都會還存在,前者稱之為Session cookie 又叫 transient cookie,後者稱之為Persistent cookie 又叫 permenent cookie。路徑和域就是對應的域名,a網站的cookie自然不能給b用。

Session

存在伺服器的一種用來存放使用者資料的類HashTable結構。

瀏覽器第一次傳送請求時,伺服器自動生成了一HashTable和一Session ID來唯一標識這個HashTable,並將其通過響應傳送到瀏覽器。瀏覽器第二次傳送請求會將前一次伺服器響應中的Session ID放在請求中一併傳送到伺服器上,伺服器從請求中提取出Session ID,並和儲存的所有Session ID進行對比,找到這個使用者對應的HashTable。 

一般這個值會有個時間限制,超時後毀掉這個值,預設30分鐘。

當用戶在應用程式的 Web頁間跳轉時,儲存在 Session 物件中的變數不會丟失而是在整個使用者會話中一直存在下去。

Session的實現方式和Cookie有一定關係。建立一個連線就生成一個session id,開啟幾個頁面就好幾個了,這裡就用到了Cookie,把session id存在Cookie中,每次訪問的時候將Session id帶過去就可以識別了。

兩者的區別

一個在客戶端一個在服務端。因Cookie在客戶端所以可以編輯偽造,不是十分安全。

Session過多時會消耗伺服器資源,大型網站會有專門Session伺服器,Cookie存在客戶端沒問題。

域的支援範圍不一樣,比方說a.com的Cookie在a.com下都能用,而www.a.com的Session在api.a.com下都不能用,解決這個問題的辦法是JSONP或者跨域資源共享。

cookie與session如何聯絡與通訊的

使用者首次與Web伺服器建立連線的時候,伺服器會給使用者分發一個 SessionID作為標識。SessionID是一個由24個字元組成的隨機字串。使用者每次提交頁面,瀏覽器都會把這個SessionID包含在 HTTP頭中提交給Web伺服器,這樣Web伺服器就能區分當前請求頁面的是哪一個客戶端。這個SessionID就是儲存在客戶端的,屬於客戶端Session。其實客戶端Session預設是以cookie的形式來儲存的。

當然我們客戶端可以禁用cookie,這時候伺服器端就拿不到sessionID。

另外一個辦法:使用url方式儲存sessionID;但是一般都不推薦使用,因為可以偽造url。

九、HTTP和HTTPS

HTTP和HTTPS的基本概念

HTTP:是網際網路上應用最為廣泛的一種網路協議,是一個客戶端和伺服器端請求和應答的標準(TCP),用於從WWW伺服器傳輸超文字到本地瀏覽器的傳輸協議,它可以使瀏覽器更加高效,使網路傳輸減少。

HTTPS:是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。

HTTPS協議的主要作用可以分為兩種:一種是建立一個資訊保安通道,來保證資料傳輸的安全;另一種就是確認網站的真實性。

HTTP與HTTPS有什麼區別?

1.http是超文字傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議。

2.http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。

3.http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。

HTTPS的工作原理

客戶端在使用HTTPS方式與Web伺服器通訊時有以下幾個步驟,如圖所示。

1.客戶使用https的URL訪問Web伺服器,要求與Web伺服器建立SSL連線。

2.Web伺服器收到客戶端請求後,會將網站的證書資訊(證書中包含公鑰)傳送一份給客戶端。

3.客戶端的瀏覽器與Web伺服器開始協商SSL連線的安全等級,也就是資訊加密的等級。

4.客戶端的瀏覽器根據雙方同意的安全等級,建立會話金鑰,然後利用網站的公鑰將會話金鑰加密,並傳送給網站。

5.Web伺服器利用自己的私鑰解密出會話金鑰。

6.Web伺服器利用會話金鑰加密與客戶端之間的通訊。

http切換到HTTPS

這裡需要將頁面中所有的連結,例如js,css,圖片等等連結都由http改為https。例如:http://www.baidu.com改為https://www.baidu.com

BTW,這裡雖然將http切換為了https,還是建議保留http。所以我們在切換的時候可以做http和https的相容,具體實現方式是,去掉頁面連結中的http頭部,這樣可以自動匹配http頭和https頭。例如:將http://www.baidu.com改為//www.baidu.com。然後當用戶從http的入口進入訪問頁面時,頁面就是http,如果使用者是從https的入口進入訪問頁面,頁面即使https的。

HTTP

TCP/IP協議與HTTP協議

TPC/IP協議是傳輸層協議,主要解決資料如何在網路中傳輸,而HTTP是應用層協議,主要解決如何包裝資料。關於TCP/IP和HTTP協議的關係,網路有一段比較容易理解的介紹:“我們在傳輸資料時,可以只使用(傳輸層)TCP/IP協議,但是那樣的話,如果沒有應用層,便無法識別資料內容,如果想要使傳輸的資料有意義,則必須使用到應用層協議,應用層協議有很多,比如HTTP、FTP、TELNET等,也可以自己定義應用層協議。WEB使用HTTP協議作應用層協議,以封裝HTTP 文字資訊,然後使用TCP/IP做傳輸層協議將它發到網路上。”

什麼是長連線、短連線?

 在HTTP/1.0中,預設使用的是短連線。也就是說,瀏覽器和伺服器每進行一次HTTP操作,就建立一次連線,但任務結束就中斷連線。如果客戶端瀏覽器訪問的某個HTML或其他型別的 Web頁中包含有其他的Web資源,如JavaScript檔案、影象檔案、CSS檔案等;當瀏覽器每遇到這樣一個Web資源,就會建立一個HTTP會話。

但從 HTTP/1.1起,預設使用長連線,用以保持連線特性。使用長連線的HTTP協議,會在響應頭有加入這行程式碼: 
Connection:keep-alive

在使用長連線的情況下,當一個網頁開啟完成後,客戶端和伺服器之間用於傳輸HTTP資料的 TCP連線不會關閉,如果客戶端再次訪問這個伺服器上的網頁,會繼續使用這一條已經建立的連線。Keep-Alive不會永久保持連線,它有一個保持時間,可以在不同的伺服器軟體(如Apache)中設定這個時間。實現長連線要客戶端和服務端都支援長連線。
HTTP協議的長連線和短連線,實質上是TCP協議的長連線和短連線。

http是無狀態協議

HTTP無狀態協議,是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。

HTTP協議其完整的工作過程可分為四步:

1.連線:首先客戶機與伺服器需要建立連線(由TCP/IP握手連線實現)。只要單擊某個超級連結,HTTP的工作開始;

2.請求:建立連線後,客戶機發送一個請求給伺服器,請求方式的格式為:統一資源識別符號(URL)、協議版本號,後邊是MIME資訊包括請求修飾符、客戶機資訊和可能的內容;

3.應答:伺服器接到請求後,給予相應的響應資訊,其格式為一個狀態行,包括資訊的協議版本號、一個成功或錯誤的程式碼,後邊是MIME資訊包括伺服器資訊、實體資訊和可能的內容。客戶端接收伺服器所返回的資訊通過瀏覽器顯示在使用者的顯示屏上;

4.關閉:當應答結束後,瀏覽器和伺服器關閉連線,以保證其他瀏覽器可以與伺服器進行連線。

更完整的過程可能如下:

域名解析 --> 發起TCP的3次握手 --> 建立TCP連線後發起http請求 --> 伺服器響應http請求,瀏覽器得到html程式碼 --> 瀏覽器解析html程式碼,並請求html程式碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現給使用者。

如果在以上過程中的某一步出現錯誤,那麼產生錯誤的資訊將返回到客戶端,有顯示屏輸出。對於使用者來說,這些過程是由HTTP自己完成的,使用者只要用滑鼠點選,等待資訊顯示就可以了。