http 二進制_淺談HTTP協議

a4637ecfb136d0f79a05202d53c0f8b4.png

HTTP

一、HTTP協議

http協議,是超文本傳輸協議,此協議是基于TCP/IP的協議,是互聯網上應用最為廣泛的一直網絡協議是一種無狀態協議,默認端口為80,。設計HTTP的最初目的是為了提供一種發布和接受HTML頁面的方法。通過HTTP或者HTTPS協議請求的資源由統一資源標識符(URI)來標識。

通常HTTP消息包括客戶機向服務器的請求消息和服務器向客戶機的響應消息。這兩種類型的消息由一個起始行,一個或者多個頭域,一個指示頭域結束的空行和可選的消息體組成。HTTP的頭域包括通用頭,請求頭,響應頭和實體頭四個部分。每個頭域由一個域名,冒號(:)和域值三部分組成。域名是大小寫無關的,域值前可以添加任何數量的空格符,頭域可以被擴展為多行,在每行開始處,使用至少一個空格或制表符。

二、各版本的http對比

1、HTTP/0.9

HTTP 0.9是第一個版本的HTTP協議,1991年發布。它的組成極其簡單,只允許客戶端發送GET這一種請求,且不支持MIME類型和請求頭。由于沒有協議頭,造成了HTTP 0.9協議只支持一種內容,即純文本。不過網頁仍然支持用HTML語言格式化,同時無法插入圖片。

HTTP 0.9具有典型的無狀態性,每個事務獨立進行處理,事務結束時就釋放這個連接。由此可見,HTTP協議的無狀態特點在其第一個版本0.9中已經成型。一次HTTP 0.9的傳輸首先要建立一個由客戶端到Web服務器的TCP連接,由客戶端發起一個請求,然后由Web服務器返回頁面內容,然后連接會關閉。如果請求的頁面不存在,也不會返回任何錯誤碼。

2、HTTP/1.0

HTTP/1.0是在1996年發布,在原來HTTP/0.9的版本上添加了許多方法,各種HTTP首部,以及對多媒體對象的處理,是請求和響應消息的協議版本。除了GET命令,還引入了POST命令。HTTP的請求和回應格式也變了,除了數據部分,每次通信都必須包含頭信息(HTTP Header),用來描敘一些元數據。相對于HTTP/0.9,HTTP/1.0也支持了MIME,使HTTP協議擴大了處理的數據類型,支持對多媒體流信息的處理。

雖然,HTTP/1.0相對于HTTP/0.9有了革命性的改變,但HTTP/1.0依然有一些缺點,主要就是每個TCP連接只能發生一個請求,發送數據完畢之后連接就會自動關閉,如果還要再請求其他的資源,就要再創建一個連接。有些瀏覽器為了解決這個問題,用了一個非標準的Connection頭部,也就是Keep-Alive模式(Connection:Keep-Alive)來避免了重新建立連接。但這個不是標準頭部,各個瀏覽器和服務器實現可能不一致,因此不是根本解決辦法。

3、HTTP/1.1

HTTP/1.1在1999年正式發布,是目前用得最廣泛的協議版本。

HTTP1.1在HTTP1.0的基礎上實現的一次飛躍,主要的改進集中在性能、安全、數據類型處理等方面提出Server端緩沖 對象的概念,是減少網絡上相同類型內容的反復傳送,提高訪問速度。默認的是Keep-Alive模式(持久連接),提高了性能。同時還增加了以下功能

  • Host協議頭: 在HTTP1.0中認為每臺服務器都綁定一個唯一的IP地址,因此,請求消息中的URL并沒有傳遞主機名。但隨著虛擬主機技術的發展,在一臺物理服務器上可以存在多個虛擬主機,并且它們共享一個IP地址。因此,Host頭的引入就很有必要了。
  • Range分段請求: 請求頭中,指定第一個字節的位置和最后一個字節的位置。用于告訴服務器自己想取對象的哪部分。如果服務器能夠正常響應的話,服務器會返回 206 Partial Content 的狀態碼及說明。如果不能處理這種Range的話,就會返回整個資源以及響應狀態碼為 200 OK。
  • 分塊傳輸編碼(chucked):該編碼將實體分塊傳送并逐塊標明長度,直到長度為0塊表示傳輸結束, 這在實體長度未知時特別有用(比如由數據庫動態產生的數據)
  • 緩存處理等:HTTP/1.1在1.0的基礎上加入了一些cache的新特性,新增更為強大的Cache-Control頭。
  • 請求的流水線處理:在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲。例如,一個包含有許多圖像的網頁文件的多個請求和應答可以在一個連接中傳輸,但每個單獨網頁文件的請求和應答仍需要使用各自的連接。HTTP/1.1還允許客戶端不用等待上一次請求結果的返回,就可以發出下一次請求,但服務器端必須按照請求的先后順序一次返回響應的結果,以保證客戶端能夠區分出每次請求的響應內容。

4、HTTP/2

HTTP/2是最新的HTTP協議,與2015年5月發布,谷歌、IE11以及火狐等瀏覽器已經支持HTTP/2協議了。

注意是HTTP/2而不是HTTP/2.0,因為IEFT(互聯網工程任務組)認為HTTP/2已經很成熟了,沒有必要再發布子版本了,以后要是有重大改動就直接發布HTTP/3。而HTTP/2與HTTP/1.1也存在著挺大的差別,下面我們來看看HTTP/2獨有的特性。

1、二進制協議

我們都知道,HTTP/1.1是超文本傳輸協議,而HTTP/2是采用二進制協議。相比 HTTP/1.1 的純文本數據,二進制數據一個顯而易見的好處是:更小的傳輸體積。這就意味著更低的負載。二進制的幀也更易于解析而且不易出錯,純文本幀在解析的時候還要考慮處理空格、大小寫、空行和換行等問題,而二進制幀就不存在這個問題。

消息頭和消息體均采用二進制格式,并成為(Frame)。目前有10個Frame,由Type字段來區分,各個Frame都有自己的二進制格式,都封裝在Frame Payload中。其中有兩個重要的Frame:Header Frame(Type=0x1)和Date Frame(Type=0x0),分別對應HTTP/1.1中的消息頭(Header)和消息體(Body),由此可見語義并沒有太大變化,而是文本格式變成二進制的Frame。兩者的轉換關系如下圖:

f5227340a6822f9152dd1d92ad1e3e12.png

此外,HTTP/2中還有流(Stream)和消息(Message)的概念,通過Strame Identifier(流ID)字段來標識,流ID一樣的是同一個流,流中包含消息,這個消息對于HTTP/1.x的請求消息或者響應消息,消息是通過幀來傳輸的,響應消息比較大時,可能由多個Data Frame來傳輸

2、多路復用

每個http2連接上傳輸的幀都關聯到一個“流”。流是一個邏輯上的結合,一個獨立的,雙向的幀序列。它在客戶端和服務器端中間通過http2連接進行幀交換。每個單獨的http2連接都可以包含多個并發的流,任何一端都可以交錯地插入幀。流既可以被客戶端/服務器端單方面的建立、使用,也可以被雙方共享。同時,兩邊都可以關閉流。

也就是說,在一個TCP連接里,客戶端和服務器端都可以同時發生多個請求或者響應,對于HTTP/1.x來說各個請求和響應都是有嚴格的次序要求的,而在HTTP/2中,不用按照次序一一對應,而且并發的多個請求或者響應中任何一個請求阻塞了不會影響其他的請求或者響應,這樣也就避免了"隊頭阻塞"。

3、頭部壓縮

HTTP是無狀態協議。簡而言之,這意味著每個請求必須要攜帶服務器需要的所有細節,而不是讓服務器保存住之前請求的元數據。因為http2沒有改變這個范式,所以它也需要這樣(攜帶所有細節),因此 HTTP 請求的頭部需要包含用于標識身份的數據比如 cookies和User Agent,而這些數據的量也在隨著時間增長。每一個請求的頭部都包含這些大量的重復數據,無疑是一種很大的負擔。對請求頭部進行壓縮,將會大大減輕這種負擔,尤其對移動端來說,性能提高非常明顯。

而HTTP/2則是采樣HPACK格式進行壓縮傳輸,而HPACK簡單的說,就是使用2個索引表(靜態索引表和動態索引表)來把頭部映射到索引值,并對不存在的頭部使用 huffman 編碼,并動態緩存到索引,從而達到壓縮頭部的效果。也就是說客戶端和服務器端都需要維護一個索引表,相同的消息頭只要發送索引號,從而提高效率和速度。

具體關于HPACK的介紹請參考: http://www.jianshu.com/p/f44b930cfcac

4.服務器推送

服務器推送就是說在HTTP/2中服務器未經請求可以直接把資源推送給客戶。而在HTTP/1.1中,對服務器請求一個頁面,等頁面解析之后會再去請求和這個頁面有關的css或者js等資源。而HTTP/2則是在響應了某個頁面進行請求之后,會順便把和這個頁面有關的css和js等資源推送到到瀏覽器,當瀏覽器解析了響應的頁面之后發現要請求的有關這個頁面的一些css和js等資源就已經在本地之后,就會直接引用,而不會說再次去請求服務器。這就節省了兩次請求所花的網絡時間,大大提高了網絡性能和用戶體驗。

三、HTTPS

超文本傳輸協議HTTP協議被用于在Web瀏覽器和網站服務器之間傳遞信息。HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息,因此HTTP協議不適合傳輸一些敏感信息,比如信用卡號、密碼等。

為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS。為了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,并為瀏覽器和服務器之間的通信加密。其主要用途如下:

1.認證用戶和服務器,確保數據發送到正確的客戶機和服務器

2.加密數據以防止數據中途被竊取

3.維護數據的完整性,確保數據在傳輸過程中不被改變。

SSL存在三個特性:

1.機密性:SSL使用密鑰加密通信數據

2.可靠性:服務器和客戶都會被認證,客戶的認證是可選的

3.完整性:SSL協議會對傳輸的數據進行完整性檢查

HTTPS和HTTP的區別主要為以下四點:

一、https協議需要到ca申請證書,一般免費證書很少,需要交費。

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

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374311.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374311.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374311.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

登陸注冊

登陸注冊,注冊的賬號存在服務器的數據庫里,成功了就給你返回成功,失敗了就返回失敗 有三種登陸方式:普通注冊,手機號注冊,第三方注冊轉載于:https://www.cnblogs.com/SensenCoder/p/4885606.html

Java并發教程–線程池

Java 1.5中提供的最通用的并發增強功能之一是引入了可自定義的線程池。 這些線程池使您可以對諸如線程數,線程重用,調度和線程構造之類的東西進行大量控制。 讓我們回顧一下。 首先,線程池。 讓我們直接進入java.util.concurrent.ExecutorSer…

HTTPPost/AFNetWorking/JSONModel/NSPredicate

一、HTTPPost 1. POST方式發送請求 HTTP協議下默認數據發送請求方法是GET方式,若需要使用POST方法,則需要對發送的請求也就是request對象,進行屬性設置。 步驟如下: > 要發送的請求對象,需要使用可變請求對象 [[NSM…

C語言代碼規范(八)使用const修飾值不允許改變的變量

使用const限定一個變量的值不允許被改變,從而保護被修飾的東西,防止意外,提高程序的可靠性和安全性。

教育小思

父母的時代是“攢錢,買房,生子,終老”,而現在的時代是“教育,創造,傳承,成長”。 改變世界,從教育起步。 傳統教育的不足之處: 1. 學習體驗不佳,學習者被迫…

linux redis客戶端_為什么單線程Redis能那么快?

我們通常說,Redis 是單線程,主要是指 Redis 的網絡 IO 和鍵值對讀寫是由一個線程來完成的,這也是 Redis 對外提供鍵值存儲服務的主要流程。但 Redis 的其他功能,比如持久化、異步刪除、集群數據同步等,其實是由額外的線…

servlet中文亂碼處理

servlet中文亂碼處理 如果是post設置req.setCharacterEncoding("utf-8");如果是get,不去修改服務器配置的情況下new String(name.getBytes("iso-8859-1"),"utf-8")數據庫亂碼?useUnicodetrue&characterEncodingUTF-8轉載于:http…

C語言開發筆記(七)const和指針

const修飾變量是常用的&#xff0c;不容易犯錯&#xff0c;而const和指針一起使用時很容易混淆。 (一)const int *p #include <stdio.h>int main(void) {int a 10;int b 20;const int *p &a;*p b;return 0; } const在int *的左側&#xff0c;即指針指向內容為…

從JavaFX 1.3遷移到JavaFX 2.0

幾天前&#xff0c;我完成了將Modellus的源代碼從JavaFX 1.3腳本遷移到JavaFX 2.0 Java語言的過程。 因此&#xff0c;我認為寫關于我在此過程中學到的知識會很好。 我想指出&#xff0c;如果您想繼續在JavaFX 2.0中使用JavaFX腳本&#xff0c;則可以使用Visage&#xff1a; ht…

九度OJ 1034:尋找大富翁 (排序)

時間限制&#xff1a;1 秒 內存限制&#xff1a;32 兆 特殊判題&#xff1a;否 提交&#xff1a;5925 解決&#xff1a;2375 題目描述&#xff1a;浙江桐鄉烏鎮共有n個人,請找出該鎮上的前m個大富翁.輸入&#xff1a;輸入包含多組測試用例.每個用例首先包含2個整數n&#xff08…

ubuntu php 無法執行exec_利用webhook使php項目自動部署

php中文網最新課程每日17點準時技術干貨分享1.先來講一下自動部署的原理&#xff0c;一般在我們push代碼的時候&#xff0c;可以自動請求webhook中設置的url&#xff0c;完成一次請求與響應。那么只要我們設置的url地址請求的php文件內容是執行命令行git push命令&#xff0c;則…

android-verticalseekbar——Android可視化SeekBar類庫

android-verticalseekbar——Android可視化SeekBar類庫轉載于:https://www.cnblogs.com/zhujiabin/p/5706246.html

C語言開發筆記(八)static

在C語言中&#xff0c;static有3個作用&#xff1a; &#xff08;1&#xff09;在函數體&#xff0c;一個被聲明為靜態的變量在這一函數體內被調用的過程中維持其值不變。 #include <stdio.h>void test(void) {static int i 0;printf("%d\n", i); }int main…

ppt修復無法讀取_移動硬盤故障分析以及建議修復方法

移動硬盤中存儲了大量的重要數據&#xff0c;一旦出現什么問題&#xff0c;會讓人急得焦頭爛額。換個硬盤倒是件小事&#xff0c;但其中資料、數據的丟失更令人懊惱。而在硬盤使用的過程中&#xff0c;由于使用者一時的不注意&#xff0c;往往就很容易造成意外的問題。接下來&a…

(原創)c#學習筆記04--流程控制01--布爾邏輯03--運算符優先級

轉載于:https://www.cnblogs.com/wodehao0808/p/4896018.html

一些定義–測試技術9

我認為我即將結束有關測試技術的博客系列&#xff0c;感覺好像已經過去了。 對我來說更清楚的一件事是&#xff0c;測試方法仍處于起步階段&#xff0c;因此是開發人員之間爭執或討論的明確來源&#xff0c;這是一件好事。 我懷疑我們正處于職業發展史上的某個時刻&#xff0c;…

百度谷歌面試題目

全新整理&#xff1a;微軟、谷歌、百度等公司經典面試100題[第101-160題] 整理:July、二零一一年三月九日。應網友承諾與要求&#xff0c;全新整理。轉載&#xff0c;請注明出處。博主說明&#xff1a;此100題V0.2版&#xff0c;本人不再保證&#xff0c;還會提供答案。-------…

C學習雜記(三)筆試題:字符串大小寫字母切換

字符串大小寫轉換&#xff0c;大寫轉小寫&#xff0c; 小寫轉大寫 #include <stdio.h> #include <string.h>int tramsform(char str[]) {int i 0;int strLen strlen(str);for(i 0; i < strLen; i){if( (str[i] > A) && (str[i] < Z) ){str[i]…

m.2接口和nvme區別_NVMe/SATA SSD有啥不一樣?萌新怎么選

隨著NAND技術的升級迭代&#xff0c;堆棧層數不斷提高使得SSD單位容量成本不斷下降&#xff0c;消費級市場基本已經成為了SSD的天下。目前主流的SSD大致有兩種接口&#xff0c;分別是M.2和SATA兩種類型。NVMe/SATA有啥區別SATA接口的SSD執行的AHCI協議標準&#xff0c;是目前較…

javascript 高級特性探討A4-A5(call和原型.對象復制)

在js中&#xff0c;call和apply是二個神奇的方法&#xff0c;但同時也是容易令人迷惑的二個方法&#xff0c;call和apply的功能是以不同的對象作為上下文來調用某個函數的&#xff0c;簡而言之&#xff0c;就是允許一個對象去調用另一個對象的成員函數&#xff0c;咋一看似乎很…