這多是對小白最友好的HTTP協議講解了

HTTP是什麼

打開百度,度娘告訴我javascript

http是一個簡單的請求-響應協議,它一般運行在TCP之上。它指定了客戶端可能發送給服務器什麼樣的消息以及獲得什麼樣的響應。請求和響應消息的頭以ASCII碼形式給出;而消息內容則具備一個相似MIME的格式。這個簡單模型是早期Web成功的有功之臣,由於它使得開發和部署是那麼的直截了當

上面的描述可能過於專業術語了,簡單的說,HTTP是一個約定協議規範,規範約定,客戶端(Firefox、IE、 chrome)經過發起一個請求到服務端,服務端根據客戶端的請求返回對應的響應結果css

在這裏插入圖片描述
打個比方,咱們去零售店買東西,1塊能夠買棒棒糖,2塊能夠買果凍,五塊能夠買冰淇淋,我至關於客戶端,售賣員至關於服務端,我對售賣員說(發起一個請求),給我來一個棒棒糖,順帶遞給了他一塊錢,售賣員根據個人描述和金錢,遞給了我一個棒棒糖(響應),整個過程就是一個請求-相應的過程。html

在這裏插入圖片描述

上面的過程映射到咱們平常用瀏覽器(Chrome)打開一個百度頁面搜索http這個關鍵字,當咱們敲下回車鍵的同時java

chrome會向百度的服務器發起了一個請求,請求的資源路徑爲https://www.baidu.com/s?wd=ht... ,百度服務器根據咱們請求的關鍵字http返回給咱們對應的搜索結果。web

HTTP中的URL

說到HTTP就不得不說HTTP的產物URL,URL(Uniform Resource Locator,統一資源定位符) 其實就是咱們經常說的網址,好比www.baidu.com/s/a/v/s,對於URL的格式,HTTP協議有相對應的規範設計chrome

協議 主機 端口 路徑
  • 協議,表示當前的傳輸協議,咱們經常使用的有http協議,ftp協議,tcp協議,file協議,https協議等等
  • 主機,主機指請求的服務器域名或IP地址,若是是域名,則須要先請求DNS服務器解析域名對應的ip,再對域名發起請求
  • 端口,請求服務器的對應端口,能夠省略,省略時默認80端口
  • 路徑,表示請求的資源路徑

HTTP工做原理

上面簡單的介紹了HTTP協議是什麼,那麼HTTP協議是如何工做的呢。首先你們須要知道的是,每個網址好比www.baidu.com 都是對外提供了一個端口來進行響應HTTP請求的,若是在請求的時候不聲明端口,默認就是80端口,也就是說咱們常常請求的www.baidu.com其實默認請求的是百度服務器的80端口,你也能夠這樣訪問www.baidu.com:80效果都是同樣的。下面是具體的請求和響應的步驟json

  • 服務端開啓一個端口監聽的程序,好比80端口,當80端口有請求進來後,請求就被服務端捕獲了
  • 咱們在客戶端(瀏覽器)輸入域名URL,回車請求數組

    • 瀏覽器會向DNS服務器請求解析咱們輸入的域名對應的IP地址
    • 瀏覽器獲取到ip後,和服務端的80端口創建TCP鏈接
    • 瀏覽器發送請求報文
    • 服務端根據請求報文,返回對應的響應報文
    • 釋放TCP鏈接
    • 客戶端(瀏覽器)根據返回的結果渲染頁面

HTTP報文格式

報文格式涉及到了兩方面,請求報文格式和響應報文格式瀏覽器

請求報文格式

請求報文也就是發起請求時的數據格式,當咱們用瀏覽器請求頁面時,這個請求報文是由客戶端幫咱們默認實現的tomcat

在這裏插入圖片描述

總體請求報文格式分爲三大塊,請求行,請求頭部,請求數據

  • 請求行

    • 請求方法, 目前請求方法支持GET HEAD POST PUT DELETE CONNECT OPTIONS TRACE PATCH
    • URL ,咱們請求的地址
    • 協議版本, 當前請求使用的HTTP的協議版本
  • 請求頭部,頭部字段名:值 ,請求攜帶的頭部信息,能夠自定義,通常的頭部信息包括,Host,User-Agent,Cookie,Accept等等

    • Host,當前請求的域名+端口
    • Accept,客戶端可識別的類型,識別到對應的格式後,瀏覽器會對返回的數據作對應的處理,好比html就對數據作渲染,javascript就看成腳本語言來識別

      • text/html ,咱們常見的html頁面
      • application/xml xml數據
      • image/webp 圖片數據,格式爲webp, 固然也有更多的格式,如 image/png爲png格式等等
      • application/javascript ,咱們很熟悉的javascript腳本
      • application/json;charset=utf-8 ,json格式的數據
      • text/css ,css樣式文件
      • **等等
    • User-Agent,當前請求的客戶端版本及操做系統,能夠經過這個頭部來識別是不是移動端
    • Cookie,本質上cookie是多個key-value字符串的組合,cookie是存儲在客戶端本地的字段信息,是服務端用來標識用戶信息的一種方式,後續會專門講下cookie
    • 其餘自定義Cookie,服務端能夠經過設置響應報文格式的響應頭部Set-Cookie來設置Cookie
  • 回車符 換行符,協議規範要求
  • 請求數據,當請求方法爲Post請求時,纔有請求數據
GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi

響應報文格式

響應報文格式就是服務端響應時的數據格式,當咱們在請求咱們的Servlet時,響應報文是由tomcat幫咱們默認實現的

在這裏插入圖片描述

與請求報文相似,響應報文主要包含,狀態行,響應頭部,響應主體內容

  • 狀態行

    • 協議版本 當前響應的協議版本
    • 狀態碼 表示當前請求的整體結果狀態,下面會專門講下狀態碼
  • 響應頭部,響應頭部主要是響應請求的描述信息,好比content_length表示響應內容的長度,content_type響應數據的格式,date響應時間等等

    • Content-Type,contentType是響應頭部很重要的信息,瀏覽器經過contentType來識別當前服務端返滬ide響應內容的格式,

      • text/html,瀏覽器會去渲染響應內容,
      • text/css,瀏覽器會認爲這是一個樣式文件,解析css,而且渲染頁面
      • application/json,瀏覽器會默認轉化爲json對象
      • image/png,瀏覽器會將相應內容看成圖片來進行處理展現
      • 等等..
    • Set-Cookie,服務端在響應頭部寫入Set-Cookie,表示須要將當前Set-Cookie的值寫入cookie,而且在下次請求的時候放入到請求頭部帶回服務端

      • Set-Cookie: userName=zhangsan; expires=Thu, 01-Jan-2020 00:00:01 GMT; path=/my
        上面的頭信息表示,將userName=zhangsan寫入cookie,
        cookie的到期時間爲2020年一月一日
        path=/my,表示只有在請求/my,及/my的子目錄的時帶上這個cookie
    • Server,當前請求服務器的類型,常見有的Tengine,Nginx,Apache,PHP等等
    • Content-Length,當前響應內容的長度
    • 等等..
  • 響應主題,響應的主體內容信息
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122

<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>

狀態碼的分類

在返回頭的狀態行的狀態碼錶示當前請求結果的大體狀態結果,狀態碼由三位數組成,常見的狀態碼有200,404,500,302等等,那麼爲何須要這麼多狀態碼呢,主要是爲了區分各類各樣的狀況,HTTP狀態碼的前第一位數表示表明了響應的五種狀態之一

  • 1 消息 這一類型的狀態碼,表明請求已被接受,須要繼續處理
  • 2 成功 這一類型的狀態碼,表明請求已成功被服務器接收、理解、並接受
  • 3 重定向 這類狀態碼錶明須要客戶端採起進一步的操做才能完成請求。一般,這些狀態碼用來重定向,後續的請求地址
  • 4 請求錯誤 這類的狀態碼錶明瞭客戶端看起來可能發生了錯誤,妨礙了服務器的處理
  • 5 服務器錯誤 這類狀態碼錶明瞭服務器在處理請求的過程當中有錯誤或者異常狀態發生,也有多是服務器意識到以當前的軟硬件資源沒法完成對請求的處理

更多狀態碼的詳細含義,https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660

HTTP各個版本

  • 0.9 僅支持文本,不支持圖片
  • 1.0 豐富了支持協議,可是不支持長鏈接,無狀態,消耗資源和性能
  • 1.1 在1.0的基礎上支持長鏈接指在一個tcp鏈接上發送多個http請求

HTTP與TCP的區別

知乎上有一個回答很形象,https://www.zhihu.com/questio...

HTTP是要基於TCP鏈接基礎上的,簡單的說,TCP就是單純創建鏈接,不涉及任何咱們須要請求的實際數據,簡單的傳輸。HTTP是用來收發數據,即實際應用上來的。

TCP是公路,HTTP是公路上跑的車。

因此,若是要把貨物從a點運到b點,首先要在ab之間修路,這個工做由ip和tcp這倆夥伴完成(其實還有其它夥伴,但這倆出力最大,就由這倆代言了)。

路修好了之後,就能夠「應用」了,公路應用於什麼?固然是應用於車來車往了。跑啥車都行,好比跑http牌子的車,也能夠跑mail牌的車

參考

https://www.runoob.com/http/h...

https://baike.baidu.com/item/...

我曾在銀色平原漫步

也曾在青草之河垂釣

我便是平靜的海面

又是洶涌的風暴

這片土地認識我

相關文章
相關標籤/搜索