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

前言

仍是老樣子,新博客開始前老是想先囉嗦幾句...HTTP協議其實在當初學習java時老師就有提過...可是...反正就那麼過去了...html

這段時間公司的項目正好要求作https的轉換和遷移,而後本身思考了一下,好像本身對於http連只知其一;不知其二都算不上...更不提http與https的區別...想一想做爲一個將來的大前端工程師,豈能不去研究這些東西?前端

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

 

什麼是HTTP?

如下來自度娘最爲專業的解釋:web

超文本傳輸協議(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。ajax

 

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的區別

 

一、https協議須要到ca申請證書,通常免費證書較少,於是須要必定費用。

 

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

 

三、http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。

 

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

 

3.https的工做流程

一、客戶端發起HTTPS請求

這個沒什麼好說的,就是用戶在瀏覽器裏輸入一個https網址,而後鏈接到server的443端口。

二、服務端的配置

採用HTTPS協議的服務器必需要有一套數字證書,能夠本身製做,也能夠向組織申請,區別就是本身頒發的證書須要客戶端驗證經過,才能夠繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面(startssl就是個不錯的選擇,有1年的免費服務)。這套證書其實就是一對公鑰和私鑰,若是對公鑰和私鑰不太理解,能夠想象成一把鑰匙和一個鎖頭,只是全世界只有你一我的有這把鑰匙,你能夠把鎖頭給別人,別人能夠用這個鎖把重要的東西鎖起來,而後發給你,由於只有你一我的有這把鑰匙,因此只有你才能看到被這把鎖鎖起來的東西。

三、傳送證書

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

四、客戶端解析證書

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

五、傳送加密信息

這部分傳送的是用證書加密後的隨機值,目的就是讓服務端獲得這個隨機值,之後客戶端和服務端的通訊就能夠經過這個隨機值來進行加密解密了。

六、服務段解密信息

服務端用私鑰解密後,獲得了客戶端傳過來的隨機值(私鑰),而後把內容經過該值進行對稱加密,所謂對稱加密就是,將信息和私鑰經過某種算法混合在一塊兒,這樣除非知道私鑰,否則沒法獲取內容,而正好客戶端和服務端都知道這個私鑰,因此只要加密算法夠彪悍,私鑰夠複雜,數據就夠安全。

七、傳輸加密後的信息

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

八、客戶端解密信息

客戶端用以前生成的私鑰解密服務段傳過來的信息,因而獲取瞭解密後的內容,整個過程第三方即便監聽到了數據,也一籌莫展。

 

總結

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

完結撒花~

相關文章
相關標籤/搜索