每一個技術人都必須掌握的HTTP過程詳解

爬蟲又稱網絡爬蟲,因此在講解爬蟲以前,咱們有必要了解一下什麼是網絡?網絡是由若干節點和鏈接這些節點的鏈路構成,而後網絡與網絡之間所串連成的龐大網絡叫作互聯網,而咱們今天要講的HTTP(HyperText Transfer Protocol 超文本傳輸協議)是互聯網上應用最爲普遍的一種網絡協議,它是由萬維網協會(World Wide Web Consortium)制定發佈。css

文章主要以一次HTTP請求的整個過程來說解(DNS解析不講):HTTP起源、TCP/IP協議、創建TCP鏈接、客戶端請求、服務端響應、斷開TCP鏈接,文章最後還捎帶講了與HTTP相關知識。文章較長,建議收藏或轉發後閱讀! html

在這裏插入圖片描述

1、簡介

1.起源

今天咱們可以在網絡中暢遊,都得益於一位計算機科學家蒂姆·伯納斯·李的構想。1991年8月6日,蒂姆·伯納斯·李在位於歐洲粒子物理研究所(CERN)的NeXT計算機上,正式公開運行世界上第一個Web網站(info.cern.ch ),創建起基本的互聯網基礎概念和技術體系,由此開啓了網絡信息時代的序幕。 面試

在這裏插入圖片描述
伯納斯·李的提案包含了網絡的基本概念並逐步創建了全部必要的工具:

  1. 提出HTTP (Hypertext Transfer Protocol) 超文本傳輸協議,容許用戶經過單擊超連接訪問資源;
  2. 提出使用HTML超文本標記語言(Hypertext Markup Language)做爲建立網頁的標準;
  3. 建立了統一資源定位器URL (Uniform Resource Locator)做爲網站地址系統,就是沿用至今的http://www URL格式;
  4. 建立第一個Web瀏覽器,稱爲萬維網瀏覽器,這也是一個Web編輯器;
  5. 建立第一個Web服務器info.cern.ch)以及描述項目自己的第一個Web頁面。

2.特色

HTTP 協議一共有五大特色:瀏覽器

  1. 支持客戶/服務器模式。
  2. 簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。
  3. 靈活:HTTP容許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type(Content-Type是HTTP包中用來表示內容類型的標識)加以標記。
  4. 無鏈接:無鏈接的含義是限制每次鏈接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開鏈接。採用這種方式能夠節省傳輸時間。
  5. 無狀態:無狀態是指協議對於事務處理沒有記憶能力,服務器不知道客戶端是什麼狀態。即咱們給服務器發送 HTTP 請求以後,服務器根據請求,會給咱們發送數據過來,可是,發送完,不會記錄任何信息(Cookie和Session孕育而生,後期再講)。

2、TCP/IP協議

咱們常常聽到一句話就是:HTTP是一個基於TCP/IP協議簇來傳遞數據安全

如何理解上面那句話?咱們來看看TCP/IP四層模型就明白了。 服務器

在這裏插入圖片描述
從上圖咱們能夠清晰的看到HTTP使用的傳輸層協議爲 TCP協議,而網絡層使用的是 IP協議(固然還使用了不少其餘協議),因此說 HTTP是一個基於TCP/IP協議簇來傳遞數據

一樣咱們能夠看到ping走的ICMP協議,這也就是爲何有時候咱們開vps能夠上網,可是ping google卻ping不通的緣由,由於走的是不一樣的協議。網絡

那TCP/IP協議簇大體是如何工做的,咱們再來看看下圖: tcp

在這裏插入圖片描述
咱們能夠看到在數據發送端是一層一層封裝數據,數據接收端一層一層拆封,最後應用層得到數據。

3、創建TCP鏈接

咱們知道了TCP/IP協議簇大體的工做原理以後,咱們來看看HTTP是如何創建鏈接的。編輯器

1.TCP包頭信息

前面我們講過HTTP是一個基於TCP/IP協議簇來傳遞數據,因此這HTTP創建鏈接也就是創建TCP鏈接,TCP如何創建鏈接,一塊兒來看看TCP包信息結構吧。 ide

在這裏插入圖片描述
TCP報文包=TCP頭信息+TCP數據體,而在TCP頭信息中包含了6種控制位(上圖紅色框中),這六種標誌位就表明着TCP鏈接的狀態:

  1. URG:緊急數據(urgent data)---這是一條緊急信息
  2. ACK:確認已收到
  3. PSH:提示接收端應用程序應該當即從tcp接受緩衝區中讀走數據
  4. RST:表示要求對方從新創建鏈接
  5. SYN:表示請求創建一個鏈接
  6. FIN:表示通知對方本端要關閉鏈接了

2.創建鏈接過程

瞭解了TCP包頭信息以後,咱們就能夠正式看看TCP創建鏈接的三次握手了。

在這裏插入圖片描述
三次握手講解:

  1. 客戶端發送位碼爲syn=1,隨機產生seq number=1234567的數據包到服務器,服務器由SYN=1知道客戶端要求創建聯機(客戶端:我要鏈接你)
  2. 服務器收到請求後要確認聯機信息,向A發送ack number=(客戶端的seq+1),syn=1,ack=1,隨機產生seq=7654321的包(服務器:好的,你來連吧)
  3. 客戶端收到後檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否爲1,若正確,客戶端會再發送ack number=(服務器的seq+1),ack=1,服務器收到後確認seq值與ack=1則鏈接創建成功。(客戶端:好的,我來了)

面試官:爲何http創建鏈接須要三次握手,不是兩次或四次 答:三次是最少的安全次數,兩次不安全,四次浪費資源

4、客戶端請求

客戶端與服務器鏈接上了以後,客戶端就能夠開始向服務器請求資源,就能夠開始發送HTTP請求了。

1.HTTP請求報文結構

咱們以前說過TCP報文包=TCP頭信息+TCP數據體,TCP頭信息咱們已經講了,如今來說TCP數據體,也就是咱們的HTTP請求報文

在這裏插入圖片描述

2.HTTP請求實例

來看看實際的HTTP請求例子:

在這裏插入圖片描述

  1. ①是請求方法,HTTP/1.1 定義的請求方法有8種:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的兩種GET和POST,若是是RESTful接口的話通常會用到GET、POST、DELETE、PUT
  2. ②爲請求對應的URL地址,它和報文頭的Host屬性組成完整的請求URL
  3. ③是協議名稱及版本號
  4. ④是HTTP的報文頭,報文頭包含若干個屬性,格式爲「屬性名:屬性值」,服務端據此獲取客戶端的信息
  5. ⑤是報文體,它將一個頁面表單中的組件值經過param1=value1&param2=value2的鍵值對形式編碼成一個格式化串,它承載多個請求參數的數據。不但報文體能夠傳遞請求參數,請求URL也能夠經過相似於「/chapter15/user.html? param1=value1&param2=value2」的方式傳遞請求參數。

請求頭參數很是多,豬哥就不一一說明,只說明兩個低級的反扒參數:

  1. User-Agent:客戶端使用的操做系統和瀏覽器的名稱和版本,有些網站會限制請求瀏覽器
  2. Referer:先前網頁的地址,表示此請求來自哪裏,有些網站會限制請求來源

5、服務端響應

服務器在收到客戶端請求處理完須要響應並返回給客戶端,而HTTP響應報文結構與請求結構體一致。

1.HTTP響應報文結構

在這裏插入圖片描述

2.HTTP響應實例

在這裏插入圖片描述

3.響應狀態碼

響應報文中咱們重點關注下:服務器的響應狀態碼,面試也很容易問到,下面豬哥只列出分類,詳細狀態碼自行上網查找了解。

在這裏插入圖片描述

6、斷開鏈接

在服務器響應完畢後,一次會話就結束了,請問這時候鏈接會斷開嗎?

1.長短鏈接

是否斷開咱們須要區分HTTP版本:

  • 在HTTP/1.0版本的時候,客戶端與服務器完成一個請求/響應以後,會將以前創建的TCP鏈接斷開,下次請求的時候又要從新創建TCP鏈接,這也被稱爲短鏈接
  • 在HTTP1.0發佈僅半年後(1997年1月) ,HTTP/1.1版本發佈並帶來一個新的功能:在客戶端與服務器完成一次請求/響應以後,容許不斷開TCP鏈接,這意味着下次請求就直接使用這個TCP鏈接而再也不須要從新握手創建新鏈接,這也被稱爲長鏈接

注意:長鏈接是指一次TCP鏈接容許屢次HTTP會話,HTTP永遠都是一次請求/響應,會話結束,HTTP自己不存在長鏈接之說。

早在1999年HTTP1.1就推廣普及,因此如今瀏覽器在請求時請求頭中都會攜帶一個參數:Connection:keep-alive,這表示瀏覽器要求與服務器創建長鏈接,而服務器也能夠設置是否願意創建長鏈接。

2.長鏈接優缺點

對於服務器來講創建長鏈接有優勢也有缺點:

  • 優勢:當網站中有大量靜態資源(圖片、css、js等)就能夠開啓長鏈接,這也幾張圖片就能夠經過一次TCP鏈接發送。
  • 缺點:當客戶端請求一次時候不在請求,而服務器卻開着長鏈接資源被佔用着,這是嚴重浪費資源。

因此是否開啓長鏈接,長鏈接時間都須要根據網站自身來合理設置。

ps:你們不要小看這一個TCP鏈接,在一次客戶端HTTP完整的請求中(DNS尋址、創建TCP鏈接、請求、等待、解析網頁、斷開TCP鏈接)創建TCP鏈接佔用的時間比仍是很大的。

3.斷開鏈接過程

在創建TCP鏈接時是三次握手,而斷開TCP鏈接是四次揮手!

在這裏插入圖片描述
在前面講TCP/IP協議時咱們說過標誌位: FIN表示通知對方本端要關閉鏈接了,**那斷開鏈接爲什麼須要四次揮手呢?**這裏給你們的課後做業,能夠在留言中給出你的理解,看看是否正確。

7、題外話

1.面試必考題:http三次握手、四次揮手

面試官:爲什麼創建鏈接須要三次握手而關閉鏈接卻須要四次揮手。給你們的課後做業,在留言中給出你的看法!

2.http2.0

在這裏插入圖片描述
HTTP/1.1已經爲咱們服務了20年,而HTTP/2.0其實在2015就發佈了,可是尚未推廣開來,關於HTTP/2.0新特性你們也能夠去網上查閱相關資料

3.http&rpc

由於http響應慢請求頭體積大等缺點,因此在微服務時代,你們都使用rpc來調用服務,rpc相關概念感興趣同窗自行網上學習。

4.http&https

http還有兩個很大的缺點就是明文不能保證完整性,因此目前會漸漸被HTTPS代替,HTTPS知識豬哥下期將會爲你們講解。

在這裏插入圖片描述
相關文章
相關標籤/搜索