HTTP詳解

爬蟲又稱網(wǎng)絡(luò)爬蟲,所以在講解爬蟲之前,我們有必要了解一下什么是網(wǎng)絡(luò)?網(wǎng)絡(luò)是由若干節(jié)點和連接這些節(jié)點的鏈路構(gòu)成,然后網(wǎng)絡(luò)與網(wǎng)絡(luò)之間所串連成的龐大網(wǎng)絡(luò)叫做互聯(lián)網(wǎng),而我們今天要講的HTTP(HyperText Transfer Protocol 超文本傳輸協(xié)議)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,它是由萬維網(wǎng)協(xié)會(World Wide Web Consortium)制定發(fā)布。

文章主要以一次HTTP請求的整個過程來講解(DNS解析不講):HTTP起源、TCP/IP協(xié)議、建立TCP連接、客戶端請求、服務(wù)端響應(yīng)、斷開TCP連接,文章最后還捎帶講了與HTTP相關(guān)知識。文章較長,建議收藏或轉(zhuǎn)發(fā)后閱讀!


http大概流程圖.png

一、簡介

1.起源

今天我們能夠在網(wǎng)絡(luò)中暢游,都得益于一位計算機科學家蒂姆·伯納斯·李的構(gòu)想。1991年8月6日,蒂姆·伯納斯·李在位于歐洲粒子物理研究所(CERN)的NeXT計算機上,正式公開運行世界上第一個Web網(wǎng)站(http://info.cern.ch ),建立起基本的互聯(lián)網(wǎng)基礎(chǔ)概念和技術(shù)體系,由此開啟了網(wǎng)絡(luò)信息時代的序幕。
[圖片上傳失敗...(image-83515c-1560387117466)]
伯納斯·李的提案包含了網(wǎng)絡(luò)的基本概念并逐步建立了所有必要的工具:

  1. 提出HTTP (Hypertext Transfer Protocol) 超文本傳輸協(xié)議,允許用戶通過單擊超鏈接訪問資源;
  2. 提出使用HTML超文本標記語言(Hypertext Markup Language)作為創(chuàng)建網(wǎng)頁的標準;
  3. 創(chuàng)建了統(tǒng)一資源定位器URL (Uniform Resource Locator)作為網(wǎng)站地址系統(tǒng),就是沿用至今的http://www URL格式;
  4. 創(chuàng)建第一個Web瀏覽器,稱為萬維網(wǎng)瀏覽器,這也是一個Web編輯器;
  5. 創(chuàng)建第一個Web服務(wù)器http://info.cern.ch)以及描述項目本身的第一個Web頁面。

2.特點

HTTP 協(xié)議一共有五大特點:

  1. 支持客戶/服務(wù)器模式。
  2. 簡單快速:客戶向服務(wù)器請求服務(wù)時,只需傳送請求方法和路徑。
  3. 靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀蒀ontent-Type(Content-Type是HTTP包中用來表示內(nèi)容類型的標識)加以標記。
  4. 無連接:無連接的含義是限制每次連接只處理一個請求。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時間。
  5. 無狀態(tài):無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力,服務(wù)器不知道客戶端是什么狀態(tài)。即我們給服務(wù)器發(fā)送 HTTP 請求之后,服務(wù)器根據(jù)請求,會給我們發(fā)送數(shù)據(jù)過來,但是,發(fā)送完,不會記錄任何信息(Cookie和Session孕育而生,后期再講)。

二、TCP/IP協(xié)議

我們經(jīng)常聽到一句話就是:HTTP是一個基于TCP/IP協(xié)議簇來傳遞數(shù)據(jù)

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

tcp_ip四層協(xié)議.png

從上圖我們可以清晰的看到HTTP使用的傳輸層協(xié)議為TCP協(xié)議,而網(wǎng)絡(luò)層使用的是IP協(xié)議(當然還使用了很多其他協(xié)議),所以說HTTP是一個基于TCP/IP協(xié)議簇來傳遞數(shù)據(jù)

同樣我們可以看到ping走的ICMP協(xié)議,這也就是為什么有時候我們開vps可以上網(wǎng),但是ping google卻ping不通的原因,因為走的是不同的協(xié)議。

那TCP/IP協(xié)議簇大致是如何工作的,我們再來看看下圖:
[圖片上傳失敗...(image-d6665f-1560387117466)]
我們可以看到在數(shù)據(jù)發(fā)送端是一層一層封裝數(shù)據(jù),數(shù)據(jù)接收端一層一層拆封,最后應(yīng)用層獲得數(shù)據(jù)。

三、建立TCP連接

我們知道了TCP/IP協(xié)議簇大致的工作原理之后,我們來看看HTTP是如何建立連接的。

1.TCP包頭信息

前面咱們講過HTTP是一個基于TCP/IP協(xié)議簇來傳遞數(shù)據(jù),所以這HTTP建立連接也就是建立TCP連接,TCP如何建立連接,一起來看看TCP包信息結(jié)構(gòu)吧。

tcp:ip工作原理.png

TCP報文包=TCP頭信息+TCP數(shù)據(jù)體,而在TCP頭信息中包含了6種控制位(上圖紅色框中),這六種標志位就代表著TCP連接的狀態(tài):

  1. URG:緊急數(shù)據(jù)(urgent data)---這是一條緊急信息
  2. ACK:確認已收到
  3. PSH:提示接收端應(yīng)用程序應(yīng)該立即從tcp接受緩沖區(qū)中讀走數(shù)據(jù)
  4. RST:表示要求對方重新建立連接
  5. SYN:表示請求建立一個連接
  6. FIN:表示通知對方本端要關(guān)閉連接了

2.建立連接過程

了解了TCP包頭信息之后,我們就可以正式看看TCP建立連接的三次握手了。


tcp頭信息.png

三次握手講解:

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

面試官:為什么http建立連接需要三次握手,不是兩次或四次
答:三次是最少的安全次數(shù),兩次不安全,四次浪費資源

四、客戶端請求

客戶端與服務(wù)器連接上了之后,客戶端就可以開始向服務(wù)器請求資源,就可以開始發(fā)送HTTP請求了。

1.HTTP請求報文結(jié)構(gòu)

我們之前說過TCP報文包=TCP頭信息+TCP數(shù)據(jù)體,TCP頭信息我們已經(jīng)講了,現(xiàn)在來講TCP數(shù)據(jù)體,也就是我們的HTTP請求報文。

http請求報文結(jié)構(gòu).png

2.HTTP請求實例

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


http 請求報文實例.png
  1. ①是請求方法,HTTP/1.1 定義的請求方法有8種:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的兩種GET和POST,如果是RESTful接口的話一般會用到GET、POST、DELETE、PUT
  2. ②為請求對應(yīng)的URL地址,它和報文頭的Host屬性組成完整的請求URL
  3. ③是協(xié)議名稱及版本號
  4. ④是HTTP的報文頭,報文頭包含若干個屬性,格式為“屬性名:屬性值”,服務(wù)端據(jù)此獲取客戶端的信息
  5. ⑤是報文體,它將一個頁面表單中的組件值通過param1=value1&param2=value2的鍵值對形式編碼成一個格式化串,它承載多個請求參數(shù)的數(shù)據(jù)。不但報文體可以傳遞請求參數(shù),請求URL也可以通過類似于“/chapter15/user.html? param1=value1&param2=value2”的方式傳遞請求參數(shù)。

請求頭參數(shù)非常多,豬哥就不一一說明,只說明兩個低級的反扒參數(shù):

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

五、服務(wù)端響應(yīng)

服務(wù)器在收到客戶端請求處理完需要響應(yīng)并返回給客戶端,而HTTP響應(yīng)報文結(jié)構(gòu)與請求結(jié)構(gòu)體一致。

1.HTTP響應(yīng)報文結(jié)構(gòu)

http響應(yīng)體結(jié)構(gòu).png

2.HTTP響應(yīng)實例

http 響應(yīng)報文實例.png

3.響應(yīng)狀態(tài)碼

響應(yīng)報文中我們重點關(guān)注下:服務(wù)器的響應(yīng)狀態(tài)碼,面試也很容易問到,下面豬哥只列出分類,詳細狀態(tài)碼自行上網(wǎng)查找了解。


http 狀態(tài)碼分類.jpg

六、斷開連接

在服務(wù)器響應(yīng)完畢后,一次會話就結(jié)束了,請問這時候連接會斷開嗎?

1.長短連接

是否斷開我們需要區(qū)分HTTP版本:

  • 在HTTP/1.0版本的時候,客戶端與服務(wù)器完成一個請求/響應(yīng)之后,會將之前建立的TCP連接斷開,下次請求的時候又要重新建立TCP連接,這也被稱為短連接
  • 在HTTP1.0發(fā)布僅半年后(1997年1月) ,HTTP/1.1版本發(fā)布并帶來一個新的功能:在客戶端與服務(wù)器完成一次請求/響應(yīng)之后,允許不斷開TCP連接,這意味著下次請求就直接使用這個TCP連接而不再需要重新握手建立新連接,這也被稱為長連接

注意:長連接是指一次TCP連接允許多次HTTP會話,HTTP永遠都是一次請求/響應(yīng),會話結(jié)束,HTTP本身不存在長連接之說。

早在1999年HTTP1.1就推廣普及,所以現(xiàn)在瀏覽器在請求時請求頭中都會攜帶一個參數(shù):Connection:keep-alive,這表示瀏覽器要求與服務(wù)器建立長連接,而服務(wù)器也可以設(shè)置是否愿意建立長連接。

2.長連接優(yōu)缺點

對于服務(wù)器來說建立長連接有優(yōu)點也有缺點:

  • 優(yōu)點:當網(wǎng)站中有大量靜態(tài)資源(圖片、css、js等)就可以開啟長連接,這也幾張圖片就可以通過一次TCP連接發(fā)送。
  • 缺點:當客戶端請求一次時候不在請求,而服務(wù)器卻開著長連接資源被占用著,這是嚴重浪費資源。

所以是否開啟長連接,長連接時間都需要根據(jù)網(wǎng)站自身來合理設(shè)置。

ps:大家不要小看這一個TCP連接,在一次客戶端HTTP完整的請求中(DNS尋址、建立TCP連接、請求、等待、解析網(wǎng)頁、斷開TCP連接)建立TCP連接占用的時間比還是很大的。

3.斷開連接過程

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

http斷開連接四次揮手.jpeg

在前面講TCP/IP協(xié)議時我們說過標志位:FIN表示通知對方本端要關(guān)閉連接了,那斷開連接為何需要四次揮手呢?這里給大家的課后作業(yè),可以在留言中給出你的理解,看看是否正確。

七、題外話

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

面試官:為何建立連接需要三次握手而關(guān)閉連接卻需要四次揮手。給大家的課后作業(yè),在留言中給出你的見解!

2.http2.0

在這里插入圖片描述

HTTP/1.1已經(jīng)為我們服務(wù)了20年,而HTTP/2.0其實在2015就發(fā)布了,但是還沒有推廣開來,關(guān)于HTTP/2.0新特性大家也可以去網(wǎng)上查閱相關(guān)資料

3.http&rpc

因為http響應(yīng)慢、請求頭體積大等缺點,所以在微服務(wù)時代,大家都使用rpc來調(diào)用服務(wù),rpc相關(guān)概念感興趣同學自行網(wǎng)上學習。

4.http&https

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 作者:滌生_Woo鏈接:http://www.itdecent.cn/p/6e9e4156ece3 本篇文章篇幅...
    Fi的學習筆記閱讀 1,831評論 0 4
  • socket(套接字)是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元,包含進行網(wǎng)絡(luò)通信必須的五種信息...
    丟了發(fā)型的男人閱讀 8,870評論 0 1
  • 看過很多次http相關(guān)知識了,但沒做過什么總結(jié),這里就仔細總結(jié)下吧。 tip下,我是根據(jù)《圖解http》總結(jié)的,這...
    pengweinan閱讀 415評論 0 0
  • IPV4和IPV6的區(qū)別 - 小螞蟻zoe - 博客園 1.IPv6 把 IP 地址由 32 位增加到 128 位...
    一代驕馬閱讀 493評論 0 1
  • 日精進打卡 姓名 朱均 企業(yè)名稱 寧波大發(fā)化纖公司 組別 上海盛和塾276期反省一組 【日精進打卡第57天】 【知...
    朱均f7c8閱讀 149評論 0 0

友情鏈接更多精彩內(nèi)容