大前端學習筆記整理【七】HTTP協議以及http與https的區別


前言

還是老樣子,新博客開始前總是想先啰嗦幾句...HTTP協議其實在當初學習java時老師就有提過...但是...反正就那么過去了...

這段時間公司的項目正好要求做https的轉換和遷移,然后自己思考了一下,好像自己對於http連一知半解都算不上...更不提http與https的區別...想想作為一個未來的大前端工程師,豈能不去研究這些東西?

好吧,廢話就到這里...正文開始

 

什么是HTTP?

以下來自度娘最為專業的解釋:

超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最為廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標准。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。1960年美國人Ted Nelson構思了一種通過計算機處理文本信息的方法,並稱之為超文本(hypertext),這成為了HTTP超文本傳輸協議標准架構的發展根基。Ted Nelson組織協調萬維網協會(World Wide Web Consortium)和互聯網工程工作小組(Internet Engineering Task Force )共同合作研究,最終發布了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1。

 

HTTP的特點

1.支持客戶/服務器模式。(C/S模式)


2.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯系的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。


3.靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。


4.無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。


5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快

 

HTTP的工作流程

第一步:建立TCP/IP連接,客戶端與服務器通過Socket三次握手進行連接

第二步:客戶端向服務端發起HTTP請求(例如:POST/login.html http/1.1)

第三步:客戶端發送請求頭信息,請求內容,最后會發送一空白行,標示客戶端請求完畢

第四步:服務器做出應答,表示對於客戶端請求的應答,例如:HTTP/1.1 200 OK

第五步:服務器向客戶端發送應答頭信息

第六步:服務器向客戶端發送請求頭信息后,也會發送一空白行,標示應答頭信息發送完畢,接着就以Content-type要求的數據格式發送數據給客戶端

第七步:服務端關閉TCP連接,如果服務器或者客戶端增Connection:keep-alive就表示客戶端與服務器端繼續保存連接,在下次請求時可以繼續使用這次的連接

 

HTTP請求詳解

借助Chrome的Developer Tools,以下的例子都是前段時間完成的一個小項目中與后台交互時的請求分析

在谷歌瀏覽器中按 F12激活了開發者工具后,點擊紅框中的位置,就可以開始對請求進行抓包。因為是首頁,可能附加資源有點多,為了方便后續的觀看,我過濾掉了其他的內容,只保留了與服務端的HTTP請求。

然后再看下面這張圖,通過工具,我們能很清晰的看到客戶端請求發出后的,包含於請求中的所有信息;以及服務響應后返回給客戶端的信息

下面,我們來解釋其中各種眼花繚亂的參數及其有什么作用吧!

首先第一塊 General

Request URL:就是客戶端請求服務端的url路徑;

Request Method:請求的類型。這里多說幾句,請求類型分為8種:GET/POST/DELETE/TRACE/PUT/CONNECT/HEAD/OPTION,但其實,我們在開發中常用的就只有get/post,其他的請求類型也可以通過這兩種間接的去實現出來。如何實現暫時與本文無關,暫不贅述;

Status Code:也就是服務器響應了客服端的請求后,給出一個code,標示請求的狀態,根據字面意義理解就叫狀態碼。狀態碼太過繁多,感覺與本文沒有太大聯系,這里也不再做過多解釋;

Remote Address:直譯過來叫做遠程地址,其實怎么理解呢?也就是說的是你請求發出的那個地址...

我覺得按照HTTP的工作流程,應該先說明下第三塊和第四塊,最后再來說明第二塊。至於為什么?我們繼續往下看。

第三塊:Request Header 請求頭

這塊中包含了當客戶端發出一個請求后請求頭中的所有信息,來看看具體有些啥:

Host:服務端的服務器主機地址

Proxy-Connection: 其實這里應該是Connetion,因為我這邊使用了Fiddler做了下代理,所以這里變成了Proxy-Connection。Connection參數是指允許發送指定連接的選項。例如指定連接是連續,或者指定“close”選項,通知服務器,在響應完成后,關閉連接。

Accept: 指定客戶端接受哪些類型的信息

X-Requested-With: 說明請求的請求方式,是同步還是異步,如果參數是null,說明是傳統的同步請求,如果是XMLHttpRequest,則說明是ajax的異步請求

User-Agent: 我們上網登陸論壇的時候,往往會看到一些歡迎信息,其中列出了你的操作系統的名稱和版本,你所使用的瀏覽器的名稱和版本,這往往讓很多人感到很神奇,實際上,服務器應用程序就是從User-Agent這個請求報頭域中獲取到這些信息。User-Agent請求報頭域允許客戶端將它的操作系統、瀏覽器和其它屬性告訴服務器。不過,這個報頭域不是必需的,如果我們自己編寫一個瀏覽器,不使用User-Agent請求報頭域,那么服務器端就無法得知我們的信息了。

Referer:當瀏覽器向web服務器發送請求的時候,一般會帶上Referer,告訴服務器我是從哪個頁面鏈接過來的,服務器基此可以獲得一些信息用於處理。

Accept-Encoding:用於指定可接受的內容編碼

Accept-Language:用於指定一種自然語言,如果請求消息中沒有設置這個,服務器假定客戶端對各種語言都可以接受。

第四塊:Query String Parameters

這塊其實沒有啥好說的,因為這塊屬於非必需的部分,因為有些請求需要客戶端向服務端發起請求時攜帶一些參數,有些時候也並不需要。攜帶參數的時候這里會展示所攜帶的參數。

我們倒回來看看第三塊,也就是Response Headers響應頭

在HTTP請求發送到服務端之后,服務端響應了這個請求,並向客戶端發送了響應信息。響應頭包含在響應信息中。接下來我們來看看參數:

Date:這個就不用多說了吧?表明了響應的時間

Content-Type: 發送給客戶端的實體正文的媒體類型

Transfer-Encoding:定義請求的傳輸編碼

Connection:允許客戶端或服務器中任何一方關閉底層的連接雙方都會要求在處理請求后關閉或者保持它們的TCP連接。

Vary:告訴下游代理是使用緩存響應還是從原始服務器請求

X-Powered-By: 自定義響應頭

Cache-Control: 這個字段用於指定所有緩存機制在整個請求/響應鏈中必須服從的指令。這些指令指定用於阻止緩存對請求或響應造成不利干擾的行為。這些指令通常覆蓋默認緩存算法。緩存指令是單向的,即請求中存在一個指令並不意味着響應中將存在同一個指令。

 

HTTP與HTTPS的區別

1.什么是HTTPS

HTTPS,全名叫安全的超文本傳輸協議(HyperText Transfer Protocol Secure),為啥是安全的超文本傳輸協議呢?看一張圖:

其實HTTPS就是在常規的TCP協議層之上加入了一層TLS或者SSL協議。所以其端口也不是常規的HTTP的80端口,變成了443端口

2.http與https的區別

 

1、https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。

 

2、http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議。

 

3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。

 

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

 

3.https的工作流程

1、客戶端發起HTTPS請求

這個沒什么好說的,就是用戶在瀏覽器里輸入一個https網址,然后連接到server的443端口。

2、服務端的配置

采用HTTPS協議的服務器必須要有一套數字證書,可以自己制作,也可以向組織申請,區別就是自己頒發的證書需要客戶端驗證通過,才可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面(startssl就是個不錯的選擇,有1年的免費服務)。這套證書其實就是一對公鑰和私鑰,如果對公鑰和私鑰不太理解,可以想象成一把鑰匙和一個鎖頭,只是全世界只有你一個人有這把鑰匙,你可以把鎖頭給別人,別人可以用這個鎖把重要的東西鎖起來,然后發給你,因為只有你一個人有這把鑰匙,所以只有你才能看到被這把鎖鎖起來的東西。

3、傳送證書

這個證書其實就是公鑰,只是包含了很多信息,如證書的頒發機構,過期時間等等。

4、客戶端解析證書

這部分工作是有客戶端的TLS來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那么就生成一個隨機值,然后用證書對該隨機值進行加密,就好像上面說的,把隨機值用鎖頭鎖起來,這樣除非有鑰匙,不然看不到被鎖住的內容。

5、傳送加密信息

這部分傳送的是用證書加密后的隨機值,目的就是讓服務端得到這個隨機值,以后客戶端和服務端的通信就可以通過這個隨機值來進行加密解密了。

6、服務段解密信息

服務端用私鑰解密后,得到了客戶端傳過來的隨機值(私鑰),然后把內容通過該值進行對稱加密,所謂對稱加密就是,將信息和私鑰通過某種算法混合在一起,這樣除非知道私鑰,不然無法獲取內容,而正好客戶端和服務端都知道這個私鑰,所以只要加密算法夠彪悍,私鑰夠復雜,數據就夠安全。

7、傳輸加密后的信息

這部分信息是服務段用私鑰加密后的信息,可以在客戶端被還原。

8、客戶端解密信息

客戶端用之前生成的私鑰解密服務段傳過來的信息,於是獲取了解密后的內容,整個過程第三方即使監聽到了數據,也束手無策。

 

總結

細細想想好像沒啥總結的了...這篇博客也只是為了幫助我自己更好的去理解HTTP與HTTPS...嗯...就這樣吧。

完結撒花~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM