爬蟲又稱網絡爬蟲 ,因此在講解爬蟲以前,咱們有必要了解一下什麼是網絡 ?網絡是由若干節點和鏈接這些節點的鏈路構成,而後網絡與網絡之間所串連成的龐大網絡叫作互聯網 ,而咱們今天要講的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 ),創建起基本的互聯網基礎概念和技術體系,由此開啓了網絡信息時代的序幕。 面試
伯納斯·李的提案包含了網絡的基本概念並逐步創建了全部必要的工具:
提出HTTP (Hypertext Transfer Protocol) 超文本傳輸協議,容許用戶經過單擊超連接訪問資源;
提出使用HTML 超文本標記語言(Hypertext Markup Language)做爲建立網頁的標準;
建立了統一資源定位器URL (Uniform Resource Locator)做爲網站地址系統,就是沿用至今的http://www URL格式;
建立第一個Web瀏覽器 ,稱爲萬維網瀏覽器,這也是一個Web編輯器;
建立第一個Web服務器 (info.cern.ch )以及描述項目自己的第一個Web頁面。
2.特色
HTTP 協議一共有五大特色:瀏覽器
支持客戶/服務器模式。
簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。
靈活:HTTP容許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type(Content-Type是HTTP包中用來表示內容類型的標識)加以標記。
無鏈接:無鏈接的含義是限制每次鏈接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開鏈接。採用這種方式能夠節省傳輸時間。
無狀態:無狀態是指協議對於事務處理沒有記憶能力,服務器不知道客戶端是什麼狀態。即咱們給服務器發送 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鏈接的狀態:
URG:緊急數據(urgent data)---這是一條緊急信息
ACK:確認已收到
PSH:提示接收端應用程序應該當即從tcp接受緩衝區中讀走數據
RST:表示要求對方從新創建鏈接
SYN:表示請求創建一個鏈接
FIN:表示通知對方本端要關閉鏈接了
2.創建鏈接過程
瞭解了TCP包頭信息以後,咱們就能夠正式看看TCP創建鏈接的三次握手了。
三次握手講解:
客戶端發送位碼爲syn=1,隨機產生seq number=1234567的數據包到服務器,服務器由SYN=1知道客戶端要求創建聯機(客戶端:我要鏈接你)
服務器收到請求後要確認聯機信息,向A發送ack number=(客戶端的seq+1),syn=1,ack=1,隨機產生seq=7654321的包(服務器:好的,你來連吧)
客戶端收到後檢查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請求例子:
①是請求方法,HTTP/1.1 定義的請求方法有8種:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的兩種GET和POST,若是是RESTful接口的話通常會用到GET、POST、DELETE、PUT
②爲請求對應的URL地址,它和報文頭的Host屬性組成完整的請求URL
③是協議名稱及版本號
④是HTTP的報文頭,報文頭包含若干個屬性,格式爲「屬性名:屬性值」,服務端據此獲取客戶端的信息
⑤是報文體,它將一個頁面表單中的組件值經過param1=value1¶m2=value2的鍵值對形式編碼成一個格式化串,它承載多個請求參數的數據。不但報文體能夠傳遞請求參數,請求URL也能夠經過相似於「/chapter15/user.html? param1=value1¶m2=value2」的方式傳遞請求參數。
請求頭參數很是多,豬哥就不一一說明,只說明兩個低級的反扒參數:
User-Agent:客戶端使用的操做系統和瀏覽器的名稱和版本,有些網站會限制請求瀏覽器
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知識豬哥下期將會爲你們講解。