HTTP協議web開發知識點


 

HTTP協議那些事兒(Web開發補充知識點)

 

HTTP協議

HTTP協議簡介

超文本傳輸協議(英文:HyperText Transfer Protocol,縮寫:HTTP)是一種用於分布式、協作式和超媒體信息系統的應用層協議。HTTP是萬維網的數據通信的基礎。

HTTP的發展是由蒂姆·伯納斯-李於1989年在歐洲核子研究組織(CERN)所發起。HTTP的標准制定由萬維網協會(World Wide Web Consortium,W3C)和互聯網工程任務組(Internet Engineering Task Force,IETF)進行協調,最終發布了一系列的RFC,其中最著名的是1999年6月公布的 RFC 2616,定義了HTTP協議中現今廣泛使用的一個版本——HTTP 1.1

2014年12月,互聯網工程任務組(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小組將HTTP/2標准提議遞交至IESG進行討論,於2015年2月17日被批准。 HTTP/2標准於2015年5月以RFC 7540正式發表,取代HTTP 1.1成為HTTP的實現標准。

HTTP協議概述

HTTP是一個客戶端終端(用戶)和服務器端(網站)請求和應答的標准(TCP)。通過使用網頁瀏覽器、網絡爬蟲或者其它的工具,客戶端發起一個HTTP請求到服務器上指定端口(默認端口為80)。我們稱這個客戶端為用戶代理程序(user agent)。應答的服務器上存儲着一些資源,比如HTML文件和圖像。我們稱這個應答服務器為源服務器(origin server)。在用戶代理和源服務器中間可能存在多個“中間層”,比如代理服務器、網關或者隧道(tunnel)。

盡管TCP/IP協議是互聯網上最流行的應用,HTTP協議中,並沒有規定必須使用它或它支持的層。事實上,HTTP可以在任何互聯網協議上,或其他網絡上實現。HTTP假定其下層協議提供可靠的傳輸。因此,任何能夠提供這種保證的協議都可以被其使用。因此也就是其在TCP/IP協議族使用TCP作為其傳輸層。

通常,由HTTP客戶端發起一個請求,創建一個到服務器指定端口(默認是80端口)的TCP連接。HTTP服務器則在那個端口監聽客戶端的請求。一旦收到請求,服務器會向客戶端返回一個狀態,比如"HTTP/1.1 200 OK",以及返回的內容,如請求的文件、錯誤消息、或者其它信息。

HTTP工作原理

HTTP協議定義Web客戶端如何從Web服務器請求Web頁面,以及服務器如何把Web頁面傳送給客戶端。HTTP協議采用了請求/響應模型。客戶端向服務器發送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求數據。服務器以一個狀態行作為響應,響應的內容包括協議的版本、成功或者錯誤代碼、服務器信息、響應頭部和響應數據。

以下是 HTTP 請求/響應的步驟:

1. 客戶端連接到Web服務器
一個HTTP客戶端,通常是瀏覽器,與Web服務器的HTTP端口(默認為80)建立一個TCP套接字連接。例如,http://www.luffycity.com。

2. 發送HTTP請求
通過TCP套接字,客戶端向Web服務器發送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數據4部分組成。

3. 服務器接受請求並返回HTTP響應
Web服務器解析請求,定位請求資源。服務器將資源復本寫到TCP套接字,由客戶端讀取。一個響應由狀態行、響應頭部、空行和響應數據4部分組成。

4. 釋放連接TCP連接
若connection 模式為close,則服務器主動關閉TCP連接,客戶端被動關閉連接,釋放TCP連接;若connection 模式為keepalive,則該連接會保持一段時間,在該時間內可以繼續接收請求;

5. 客戶端瀏覽器解析HTML內容
客戶端瀏覽器首先解析狀態行,查看表明請求是否成功的狀態代碼。然后解析每一個響應頭,響應頭告知以下為若干字節的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,並在瀏覽器窗口中顯示。

例如:在瀏覽器地址欄鍵入URL,按下回車之后會經歷以下流程:

  1. 瀏覽器向 DNS 服務器請求解析該 URL 中的域名所對應的 IP 地址;
  2. 解析出 IP 地址后,根據該 IP 地址和默認端口 80,和服務器建立TCP連接;
  3. 瀏覽器發出讀取文件(URL 中域名后面部分對應的文件)的HTTP 請求,該請求報文作為 TCP 三次握手的第三個報文的數據發送給服務器;
  4. 服務器對瀏覽器請求作出響應,並把對應的 html 文本發送給瀏覽器;
  5. 釋放 TCP連接;
  6. 瀏覽器將該 html 文本並顯示內容;  

 

  

  

 

  http協議是基於TCP/IP協議之上的應用層協議。

  基於  請求-響應 的模式

    HTTP協議規定,請求從客戶端發出,最后服務器端響應該請求並 返回。換句話說,肯定是先從客戶端開始建立通信的,服務器端在沒有 接收到請求之前不會發送響應

    

  無狀態保存

    HTTP是一種不保存狀態,即無狀態(stateless)協議。HTTP協議 自身不對請求和響應之間的通信狀態進行保存。也就是說在HTTP這個 級別,協議對於發送過的請求或響應都不做持久化處理。

    

    使用HTTP協議,每當有新的請求發送時,就會有對應的新響應產 生。協議本身並不保留之前一切的請求或響應報文的信息。這是為了更快地處理大量事務,確保協議的可伸縮性,而特意把HTTP協議設計成 如此簡單的。可是,隨着Web的不斷發展,因無狀態而導致業務處理變得棘手 的情況增多了。比如,用戶登錄到一家購物網站,即使他跳轉到該站的 其他頁面后,也需要能繼續保持登錄狀態。針對這個實例,網站為了能 夠掌握是誰送出的請求,需要保存用戶的狀態。HTTP/1.1雖然是無狀態協議,但為了實現期望的保持狀態功能, 於是引入了Cookie技術。有了Cookie再用HTTP協議通信,就可以管 理狀態了。有關Cookie的詳細內容稍后講解。

  無連接

    無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間,並且可以提高並發性能,不能和每個用戶建立長久的連接,請求一次相應一次,服務端和客戶端就中斷了。但是無連接有兩種方式,早期的http協議是一個請求一個響應之后,直接就斷開了,但是現在的http協議1.1版本不是直接就斷開了,而是等幾秒鍾,這幾秒鍾是等什么呢,等着用戶有后續的操作,如果用戶在這幾秒鍾之內有新的請求,那么還是通過之前的連接通道來收發消息,如果過了這幾秒鍾用戶沒有發送新的請求,那么就會斷開連接,這樣可以提高效率,減少短時間內建立連接的次數,因為建立連接也是耗時的,默認的好像是3秒中現在,但是這個時間是可以通過咱們后端的代碼來調整的,自己網站根據自己網站用戶的行為來分析統計出一個最優的等待時間。

 

HTTP請求方法

HTTP/1.1協議中共定義了八種方法(也叫“動作”)來以不同方式操作指定的資源:

GET

向指定的資源發出“顯示”請求。使用GET方法應該只用在讀取數據,而不應當被用於產生“副作用”的操作中,例如在Web Application中。其中一個原因是GET可能會被網絡蜘蛛等隨意訪問。

HEAD

與GET方法一樣,都是向服務器發出指定資源的請求。只不過服務器將不傳回資源的本文部分。它的好處在於,使用這個方法可以在不必傳輸全部內容的情況下,就可以獲取其中“關於該資源的信息”(元信息或稱元數據)。

POST

向指定資源提交數據,請求服務器進行處理(例如提交表單或者上傳文件)。數據被包含在請求本文中。這個請求可能會創建新的資源或修改現有資源,或二者皆有。

PUT

向指定資源位置上傳其最新內容。

DELETE

請求服務器刪除Request-URI所標識的資源。

TRACE

回顯服務器收到的請求,主要用於測試或診斷。

OPTIONS

這個方法可使服務器傳回該資源所支持的所有HTTP請求方法。用'*'來代替資源名稱,向Web服務器發送OPTIONS請求,可以測試服務器功能是否正常運作。

CONNECT

HTTP/1.1協議中預留給能夠將連接改為管道方式的代理服務器。通常用於SSL加密服務器的鏈接(經由非加密的HTTP代理服務器)。

注意事項:

  1. 方法名稱是區分大小寫的。當某個請求所針對的資源不支持對應的請求方法的時候,服務器應當返回狀態碼405(Method Not Allowed),當服務器不認識或者不支持對應的請求方法的時候,應當返回狀態碼501(Not Implemented)。
  2. HTTP服務器至少應該實現GET和HEAD方法,其他方法都是可選的。當然,所有的方法支持的實現都應當匹配下述的方法各自的語義定義。此外,除了上述方法,特定的HTTP服務器還能夠擴展自定義的方法。例如PATCH(由 RFC 5789 指定的方法)用於將局部修改應用到資源

 

請求方式: get與post請求(通過form表單我們自己寫寫看)

  • GET提交的數據會放在URL之后,也就是請求行里面,以?分割URL和傳輸數據,參數之間以&相連,如EditBook?name=test1&id=123456.(請求頭里面那個content-type做的這種參數形式,后面講) POST方法是把提交的數據放在HTTP包的請求體中.
  • GET提交的數據大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.
  • GET與POST請求在服務端獲取請求數據方式不同,就是我們自己在服務端取請求數據的時候的方式不同了,這句廢話昂。
     

 

HTTP狀態碼

所有HTTP響應的第一行都是狀態行,依次是當前HTTP版本號,3位數字組成的狀態代碼,以及描述狀態的短語,彼此由空格分隔。

狀態代碼的第一個數字代表當前響應的類型:

  • 1xx消息——請求已被服務器接收,繼續處理
  • 2xx成功——請求已成功被服務器接收、理解、並接受
  • 3xx重定向——需要后續操作才能完成這一請求
  • 4xx請求錯誤——請求含有詞法錯誤或者無法被執行
  • 5xx服務器錯誤——服務器在處理某個正確請求時發生錯誤

雖然 RFC 2616 中已經推薦了描述狀態的短語,例如"200 OK","404 Not Found",但是WEB開發者仍然能夠自行決定采用何種短語,用以顯示本地化的狀態描述或者自定義信息。

  

URL

超文本傳輸協議(HTTP)的統一資源定位符將從因特網獲取信息的五個基本元素包括在一個簡單的地址中:

  • 傳送協議。
  • 層級URL標記符號(為[//],固定不變)
  • 訪問資源需要的憑證信息(可省略)
  • 服務器。(通常為域名,有時為IP地址)
  • 端口號。(以數字方式表示,若為HTTP的默認值“:80”可省略)
  • 路徑。(以“/”字符區別路徑中的每一個目錄名稱)
  • 查詢。(GET模式的窗體參數,以“?”字符為起點,每個參數以“&”隔開,再以“=”分開參數名稱與數據,通常以UTF8的URL編碼,避開字符沖突的問題)
  • 片段。以“#”字符為起點

以http://www.luffycity.com:80/news/index.html?id=250&page=1 為例, 其中:

http,是協議;
www.luffycity.com,是服務器;
80,是服務器上的默認網絡端口號,默認不顯示;
/news/index.html,是路徑(URI:直接定位到對應的資源);
?id=250&page=1,是查詢。
大多數網頁瀏覽器不要求用戶輸入網頁中“http://”的部分,因為絕大多數網頁內容是超文本傳輸協議文件。同樣,“80”是超文本傳輸協議文件的常用端口號,因此一般也不必寫明。一般來說用戶只要鍵入統一資源定位符的一部分(www.luffycity.com:80/news/index.html?id=250&page=1)就可以了。

由於超文本傳輸協議允許服務器將瀏覽器重定向到另一個網頁地址,因此許多服務器允許用戶省略網頁地址中的部分,比如 www。從技術上來說這樣省略后的網頁地址實際上是一個不同的網頁地址,瀏覽器本身無法決定這個新地址是否通,服務器必須完成重定向的任務。

HTTP請求格式(請求協議)

    

     URL包含:/index/index2?a=1&b=2;路徑和參數都在這里。

    

      請求頭里面的內容舉個例子:這個length表示請求體里面的數據長度,其他的請求頭里面的這些鍵值對,陸續我們會講的,大概知道一下就可以了,其中有一個user-agent,算是需要你記住的吧,就是告訴你的服務端,我是用什么給你發送的請求。

      

      

      以京東為例,看一下user-agent

      

 

     

       看一個爬蟲的例子,爬京東的時候沒問題,但是爬抽屜的時候必須帶着user-agent,因為抽屜對user-agent做了判斷,來判斷你是不是一個正常的請求,算是反扒機制的一種。

      

      打開我們保存的demo.html文件,然后通過瀏覽器打開看看就能看到頁面效果。

       寫上面這些內容的意思是讓你知道有這么個請求頭的存在,有些是有意義的,請求頭我們還可以自己定義,就在requests模塊里面那個headers={},這個字典里面加就行。

      

  

HTTP響應格式(響應協議)

  

   

 

 

HTTPS

明文: 明文指的是未被加密過的原始數據。
密文:明文被某種加密算法加密之后,會變成密文,從而確保原始數據的安全。密文也可以被解密,得到原始的明文。
密鑰:密鑰是一種參數,它是在明文轉換為密文或將密文轉換為明文的算法中輸入的參數。密鑰分為對稱密鑰與非對稱密鑰,分別應用在對稱加密和非對稱加密上。

對稱加密:對稱加密又叫做私鑰加密,即信息的發送方和接收方使用同一個密鑰去加密和解密數據。對稱加密的特點是算法公開、加密和解密速度快,適合於對大數據量進行加密,常見的對稱加密算法有DES、3DES、TDEA、Blowfish、RC5和IDEA。
其加密過程如下:明文 + 加密算法 + 私鑰 => 密文
解密過程如下: 密文 + 解密算法 + 私鑰 => 明文

對稱加密中用到的密鑰叫做私鑰,私鑰表示個人私有的密鑰,即該密鑰不能被泄露。
其加密過程中的私鑰與解密過程中用到的私鑰是同一個密鑰,這也是稱加密之所以稱之為“對稱”的原因。由於對稱加密的算法是公開的,所以一旦私鑰被泄露,那么密文就很容易被破解,所以對稱加密的缺點是密鑰安全管理困難。

非對稱加密:非對稱加密也叫做公鑰加密。非對稱加密與對稱加密相比,其安全性更好。對稱加密的通信雙方使用相同的密鑰,如果一方的密鑰遭泄露,那么整個通信就會被破解。而非對稱加密使用一對密鑰,即公鑰和私鑰,且二者成對出現。私鑰被自己保存,不能對外泄露。公鑰指的是公共的密鑰,任何人都可以獲得該密鑰。用公鑰或私鑰中的任何一個進行加密,用另一個進行解密。
被公鑰加密過的密文只能被私鑰解密,過程如下:
明文 + 加密算法 + 公鑰 => 密文, 密文 + 解密算法 + 私鑰 => 明文
被私鑰加密過的密文只能被公鑰解密,過程如下:
明文 + 加密算法 + 私鑰 => 密文, 密文 + 解密算法 + 公鑰 => 明文

由於加密和解密使用了兩個不同的密鑰,這就是非對稱加密“非對稱”的原因。
非對稱加密的缺點是加密和解密花費時間長、速度慢,只適合對少量數據進行加密。
在非對稱加密中使用的主要算法有:RSA、Elgamal、Rabin、D-H、ECC(橢圓曲線加密算法)等。

HTTPS通信過程

HTTPS協議 = HTTP協議 + SSL/TLS協議,在HTTPS數據傳輸的過程中,需要用SSL/TLS對數據進行加密和解密,需要用HTTP對加密后的數據進行傳輸,由此可以看出HTTPS是由HTTP和SSL/TLS一起合作完成的。

SSL的全稱是Secure Sockets Layer,即安全套接層協議,是為網絡通信提供安全及數據完整性的一種安全協議。SSL協議在1994年被Netscape發明,后來各個瀏覽器均支持SSL,其最新的版本是3.0

TLS的全稱是Transport Layer Security,即安全傳輸層協議,最新版本的TLS(Transport Layer Security,傳輸層安全協議)是IETF(Internet Engineering Task Force,Internet工程任務組)制定的一種新的協議,它建立在SSL 3.0協議規范之上,是SSL 3.0的后續版本。在TLS與SSL3.0之間存在着顯著的差別,主要是它們所支持的加密算法不同,所以TLS與SSL3.0不能互操作。雖然TLS與SSL3.0在加密算法上不同,但是在我們理解HTTPS的過程中,我們可以把SSL和TLS看做是同一個協議。

HTTPS為了兼顧安全與效率,同時使用了對稱加密和非對稱加密。數據是被對稱加密傳輸的,對稱加密過程需要客戶端的一個密鑰,為了確保能把該密鑰安全傳輸到服務器端,采用非對稱加密對該密鑰進行加密傳輸,總的來說,對數據進行對稱加密,對稱加密所要使用的密鑰通過非對稱加密傳輸。

 

HTTPS的圖解

 

 

 
總結:

服務器端的公鑰和私鑰,用來進行非對稱加密

客戶端生成的隨機密鑰,用來進行對稱加密

一個HTTPS請求實際上包含了兩次HTTP傳輸,可以細分為8步。
1.客戶端向服務器發起HTTPS請求,連接到服務器的443端口

2.服務器端有一個密鑰對,即公鑰和私鑰,是用來進行非對稱加密使用的,服務器端保存着私鑰,不能將其泄露,公鑰可以發送給任何人。

3.服務器將自己的公鑰發送給客戶端。

4.客戶端收到服務器端的證書之后,會對證書進行檢查,驗證其合法性,如果發現發現證書有問題,那么HTTPS傳輸就無法繼續。嚴格的說,這里應該是驗證服務器發送的數字證書的合法性,關於客戶端如何驗證數字證書的合法性,下文會進行說明。如果公鑰合格,那么客戶端會生成一個隨機值,這個隨機值就是用於進行對稱加密的密鑰,我們將該密鑰稱之為client key,即客戶端密鑰,這樣在概念上和服務器端的密鑰容易進行區分。然后用服務器的公鑰對客戶端密鑰進行非對稱加密,這樣客戶端密鑰就變成密文了,至此,HTTPS中的第一次HTTP請求結束。

5.客戶端會發起HTTPS中的第二個HTTP請求,將加密之后的客戶端密鑰發送給服務器。

6.服務器接收到客戶端發來的密文之后,會用自己的私鑰對其進行非對稱解密,解密之后的明文就是客戶端密鑰,然后用客戶端密鑰對數據進行對稱加密,這樣數據就變成了密文。

7.然后服務器將加密后的密文發送給客戶端。

8.客戶端收到服務器發送來的密文,用客戶端密鑰對其進行對稱解密,得到服務器發送的數據。這樣HTTPS中的第二個HTTP請求結束,整個HTTPS傳輸完成。


免責聲明!

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



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