協議の那些事兒——HTTP和HTTPS

一、HTTP的概況

Web的應用層協議是超文本傳輸協議(HyperText Transfer Protocol,HTTP),它是Web的核心。HTTP由一個客戶程序一個服務器程序組成,客戶程序和服務器程序運行在不同的端系統,通過交換HTTP報文進行會話。
Web頁面由對象組成,多數的Web頁面含有一個HTML基本文件以及幾個引用對象(如JPEG圖形),Web瀏覽器實現了HTTP的客戶端,Web服務器實現了HTTP的服務端。

二、HTTP的發展

HTTP協議是基於TCP的應用層協議,不用關係數據傳輸的細節,只是規定客戶端和服務端的數據傳輸格式,最初是用來向客戶端傳輸HTML文件內容的,默認端口是80。

1.HTTP0.9版本 1991年
這是HTTP誕生的第一個版本,只有一個GET命令,服務器返回客戶端一個HTML頁面,沒有其他格式。

2.HTTP1.0版本 1996年
1.0版本不僅可以傳輸HTML文本頁面,還可以傳輸其他二進制文件,圖片視頻等,增加了POST和HEAD命令,並且開始支持cache,當客戶端在規定時間訪問同一網站,可以直接訪問cache。最重要的是它增加了狀態碼和版本號,但是它是非持續連接,每次請求都要經歷TCP的三次握手,四次揮手,不支持keep alive。

3.HTTP1.1版本 1997年
這個版本增加了持續連接,並且引入了管道機制,一個TCP連接裏面可以同時發送多個HTTP請求,不必等待上一個請求響應成功再發送,增加了併發性,並且增加了PUT,PATCH,HEAD,OPTIONS,DELETE等命令。但是存在如下問題:服務端是按隊列順序處理請求的,假如一個請求處理時間很長,則導致後邊的請求無法及時處理,造成對頭阻塞問題,同時HTTP是無狀態的連接,每次請求都需要添加重複的字段,降低了帶寬的利用率。

4.HTTP/2版本 2015年(爲了節約兩個字符空間,之後的命名都以一個數字。)
雖然1.1版本有了管道機制,但是正在服務端還是要請求進行排隊處理。/2版本可以多工處理增加了頭信息壓縮和服務器主動推送,就是增加了雙工模式,不僅客戶端能夠同時發送多個請求,服務端也能同時處理多個請求,解決了對頭阻塞問題。
HTTP請求和響應,狀態行和請求/響應首部都是信息字段,沒有真正的數據,在/2版本中所有的信息字段構建成一張表,爲每個字段建立索引,客戶端和服務端共享該表,避免了舊版本的重複繁瑣的字段,並以壓縮的方式傳輸,提高利用率。(增加了服務器推送功能,不經請求服務端主動向客戶端發送數據)

三、非持續連接和持續連接

1.非持續連接:每個請求/響應對是經一個單獨的TCP連接發送的。
缺點:
①必須爲每一個請求對象建立一個全新的連接,每個連接都要分配TCP緩衝區和保持TCP變量,需要消耗大量的資源。
②每個對象要經受2倍的RTT交付時延,一個RTT用於TCP的連接請求,一個RTT用於對象的請求接收(TCP的三次握手花費1.5RTT,客戶端接收文件花費0.5RTT)

2.持續連接:所有的請求及其響應是經過相同的TCP連接發送的客戶對對象的多個請求和響應能通過相同的連接進行傳送,不必等待對未決請求的回答,減少了很多創建連接的時間

四、HTTP的報文格式

HTTP的報文有兩種:請求報文和響應報文

1.請求報文

GET /somedir/page.html HTTP/1.1
Host:www.someschool.edu
Connection:close
User-agent:Mozilla/5.0
Accept-language:fr

HTTP請求報文的第一行是請求行,後繼的行叫做首部行,一個請求報文至少爲一行,可以具有更多行。
請求行有三個字段:方法字段,URL字段,和HTTP版本字段。其中方法字段有:

1.GET:獲取資源
GET方法用來請求訪問已被URI識別的資源,指定了服務器處理請求後響應的內容

2.POST:傳輸實體主體
POST方法用來傳輸實體主體,POST和GET的的目的不同,get是獲取,post是發送

3.HEAD:獲得報文首部
HEAD方法和GET類似,不同的是,HEAD方法不要求返回數據,用於確認URI的有效性以及資源更新時間,通常用來調試跟蹤。

4.PUT:傳輸文件
PUT方法用來傳輸文件,文件內容包含在請求報文的實體中,然後請求保存到URL指定的服務器位置

5.DELETE:刪除文件
與PUT相反的方法,DELETE要求返回URL指定的資源

6.OPTIONS:詢問支持的方法
並不是所有的服務器支持規定的方法,爲了安全有些服務器可能會禁止掉一些方法,OPTION就是用來查詢服務器支持哪些方法

從上面這個例子中可以發現瀏覽器正在請求/somedir/page.html 這個對象,使用的是HTTP1.1/版本,使用的是GET方法。
首部行:Host:www.someschool.edu指明瞭對象所在的主機
Connection:close指示服務器不要使用持續連接,發送完請求對象後可以關閉連接
User-agent:Mozilla/5.0指明用戶代理
Accept-language:fr指明瞭使用的語言

在這裏插入圖片描述

2.響應報文

HTTP/1.1 200 OK
Connection:  close
Date: Tue,18,Aug 2015 15:44:06 GMT
Server: Apache /2.2.3 (CentOs)
Last-Modified:Tue,18,Aug 2015 15:11:09 GMT
Connection-Length:6821
Connect-Type: text/html
(data,data,,,,,,data)

響應報文有三個部分:狀態行,6個首部行,實體體
狀態行有三個字段:協議版本字段,狀態碼,相應狀態信息

常見的狀態碼
1XX :指示信息,表示請求已經接收正在處理
2XX :請求成功處理完畢
3XX :重定位,要完成請求必須進行更近一部的操作
4XX :客戶端有問題,服務器無法處理請求
5XX :服務器有問題,服務器處理請求出錯

200 OK:請求成功
301 Moved Permanently:請求對象被永久轉移
302 Found:表示臨時重定向,表示請求的資源已經被分配了新的URL,但是隻是臨時的,這個URL可能會發生改變,如果保存爲書籤就不會更新。
400 Bad Request:請求不能被服務器理解,存在語法錯誤,需要修改再次發送
404 Not Found:被請求的文檔不在服務器上
500 Internel Server Error:表明服務端在執行請求時發生了錯誤,可能服務端程序的Bug或者臨時故障。
505 HTTP Version Not Support:服務器不支持請求報文使用的HTTP版本

在這裏插入圖片描述

五、Web客戶與服務器交互

客戶請求一個Web頁面,首先瀏覽器向服務器發出一個包含對象的HTTP
請求報文,服務器收到請求並用包含這些對象的HTTP響應報文響應。HTTP是用TCP協議進行可靠數據傳輸的,所以HTTP協議不用擔心數據的丟失。
注意:服務器向客戶機發送請求的文件,但是不存儲任何關於客戶的狀態信息,也就是說HTTP協議是一個無狀態協議。

無狀態協議:假如某個客戶在短時間內連續幾次請求同一個文件,服務器並不會因爲剛剛爲客戶提供了對象而不做任何迴應,反而會重新發送對象,它把每一次請求都作爲一次全新的,完全不會保留之前的任何信息。

瀏覽器中輸入一串URL,按下回車的經歷

1.輸入url先解析url,檢測url是否合法。
2.瀏覽器先查看瀏覽器緩存->系統緩存->路由器緩存->ISP緩存,如果命中,直接顯示否則進入(3)
3.在發送http請求前需要DNS解析,獲取相應的IP地址
4.瀏覽器向服務器發起TCP三次握手發起連接
5.握手成功後瀏覽器發送http請求
6.服務器收到瀏覽器請求並處理,將數據返回瀏覽器
7.瀏覽器收到響應
8.解碼響應,若可以緩存,則存入緩存中
9.瀏覽器請求獲取頁面資源
10.瀏覽器發送異步請求
11.頁面渲染結束

六、HTTPS工作原理

HTTP的缺點:
1.通信使用明文不加密內容可能被竊聽
2.不驗證通信方身份信息
3.無法驗證報文的完整性

將HTTP加密,認證並加上完整性驗證就誕生了HTTPS協議

  1. 客戶端發起https請求
  2. 服務端生成證書
  3. 客戶端對證書的有效性,合法性,域名是否與請求的域名一致,證書公鑰(RSA加密)等進行校驗;
  4. 客戶端如果校驗通過後,根據證書的公鑰的有效性生成隨機數,隨機數使用公鑰進行加密(RSA加密)傳送該加密信息;
  5. 發送給服務端,此時只有服務端(RSA私鑰)能解密解密得到的隨機數與傳送內容用AES加密,作爲祕鑰傳送。
  6. 客戶端用之前生成的私鑰解密服務端傳送的消息
    在這裏插入圖片描述

思考

1.什麼是HTTP協議無狀態協議?怎麼解決HTTP協議無狀態協議???

答:無狀態協議在上文已經提到,就是對事物處理沒有記憶功能,沒有新舊的概念
解決辦法:
1.使用cookie,cookie相當於一個通行證,第一次訪問的時候給客戶端發送一個cookie,下一次訪問的時候帶着cookie,服務器就能知道這個客戶端之前訪問過。
2.使用session會話保存,瀏覽器請求服務器時,程序爲客戶端的請求創建一個session,服務器首先檢查這個請求是否包含session id,如果包含,說明該客戶之前訪問過。要注意,session ID在響應中返回到客戶端保存。

cookie和session的區別:
cookie用戶數據信息記錄在客戶端(類比會員卡,用戶消費的時候出示會員卡,該卡是保留在用戶手中的),可以減輕服務器的壓力,但是也存在一定的安全隱患,容易進行cookie欺騙(卡被別人使用)。
session用戶數據信息保存在服務端(類比有些店鋪註冊會員只需要登記手機號,下次報手機號碼就可以查詢是否是會員),相對安全,但是會佔用服務器較多的資源。

2.URI和URL的區別

URI(uniform resource identifier)是統一標識符,用來唯一的標識一個資源
URL(uniform resource locator)是統一資源定位器,它是一種具體的URI,即URL可以用來標識一個資源,而且還可以指明如何定位這個資源

3.GET和POST的區別

get和post是http協議中的兩種發送請求的方法,因爲http的低層是TCP/IP協議,所以get和post都是TCP連接,並無本質區別,但是他們的表現形式有直觀的不同。

  1. get把參數包含在url中,非常不安全,而post通過request body傳參。如果要給get加上request body,post加上url參數在技術上也是可行的,這只是http的一個行爲標準。
  2. get產生一個TCP數據包,瀏覽器將http header和data一起發送,服務器響應200 ok(返回數據);post要產生兩個TCP,瀏覽器先發送header,服務器響應100(continue),然後瀏覽器再發送data,服務器響應200 ok(返回數據)注意:不是所有瀏覽器在post中都發送兩次包,如火狐就一次

4.HTTP與HTTPS的區別

  1. HTTP的URL是以http://開頭,而HTTPS的URL是以https://開頭
  2. HTTP是不安全的,無法對數據進行加密;而HTTPS是安全的,會對傳輸的數據進行加密
  3. HTTP標準端口是80,而HTTPS的標準端口是443
  4. 在OSI模型中,HTTP位於應用層,而HTTPS的安全機制是在傳輸層
  5. HTTP無需證書,而HTTPS需要CA機構頒發的SSL證書
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章