http報文解析

記錄的比較散亂,這篇文章的思路寫的很清晰,能夠看這篇:html

http報文詳解------klguangvue

http報文結構

http報文主要包含三大部分web

報文首部
空行
主體(body)

http報文例子:瀏覽器

GET / HTTP/1.1
Host: www.enjoytoday.cn
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://www.enjoytoday.cn/posts/326
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: bdshare_firstime=1466032270994; UM_distinctid=15c4ef2ac4e2e4-0d13269271b947-1b2a120b-1fa400-15c4ef2ac4f7b5; un=aGZjYWk=;
 
username=hfcai&sex=man

報文首部

報文首部根據是請求報文仍是響應報文有所區別,因此這一節會分請求和響應來描述安全

起始行

請求報文的起始行:

<method> <request-URL> <version>

方法 + URL + Http協議版本號,他們之間用空格分隔。
該部分位於數據首行,例如:服務器

GET /index.html HTTP/1.1

方法(method)

常見的幾種:cookie

  • POST (向服務器發送須要處理的數據)【發送數據】增/查,
  • GET(從服務器獲取請求URL所指定的資源)【獲取資源】查
  • PUT(將請求的主體部分存儲在服務器上)【存儲數據】 改
  • DELETE (從服務器上刪除請求URL所指定的資源)【刪除數據】刪
request-URL

上面的 /index.html網絡

version(http協議版本)
  • 1
  • 1.1
  • 2

響應報文的起始行

<version> <status> <reason-phrase>

HTTP 版本、數字狀態碼,以及描述操做狀態的文本形式的緣由短語。
例如:app

HTTP/1.1 200 OK
HTTP響應碼

HTTP響應碼響應碼由三位十進制數字組成,它們出如今由HTTP服務器發送的響應的第一行。
響應碼分五種類型,由它們的第一位數字表示:jsp

  • 1xx:信息,請求收到,繼續處理
  • 2xx:成功,行爲被成功地接受、理解和採納
  • 3xx:重定向,爲了完成請求,必須進一步執行的動做
  • 4xx:客戶端錯誤,請求包含語法錯誤或者請求沒法實現
  • 5xx:服務器錯誤,服務器不能實現一種明顯無效的請求

請求頭

從host 到cookie

GET / HTTP/1.1
Host: www.enjoytoday.cn
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://www.enjoytoday.cn/posts/326
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: bdshare_firstime=1466032270994; UM_distinctid=15c4ef2ac4e2e4-0d13269271b947-1b2a120b-1fa400-15c4ef2ac4f7b5; un=aGZjYWk=;
 
username=hfcai&sex=man

每一個請求頭都有一種簡單的語法:名字後面跟着冒號(:),而後跟上可選的空格,再跟上字段值,最後是一個CRLF。(或者換行符)

通用首部

這些是客戶端和服務器均可以使用的通用首部。能夠在客戶端、服務器和其餘應用程序之間提供一些非有用的通用功能。好比,Date 首部就是一個通用首部,每一端均可以用它來講明構建報文的時間和日期:

Date: Tue, 3 Oct 1974 02:16:00 GMT

請求首部

從名字中就能夠看出,請求首部是請求報文特有的。它們爲服務器提供了一些額外信息,好比客戶端但願接收什麼類型的數據。例如,下面的Accept 首部就用
來告知服務器客戶端會接受與其請求相符的任意媒體類型:
Accept: /

首部 描述
Accept 告訴服務器可以發送哪些媒體類型
Accept-Charset 告訴服務器可以發送哪些字符集
Accept-Encoding 告訴服務器可以發送哪些編碼方式
Authorization 包含了客戶端提供給服務器,以便對其自身進行認證的數據
Cookie 客戶端用它向服務器傳送一個令牌——它並非真正的安全首部,但確實隱含了安全功能14
... ...

響應首部

響應報文有本身的首部集,以便爲客戶端提供信息(好比,客戶端在與哪一種類型的服務器進行交互)。例如,下列Server 首部就用來告知客戶端它在與一個版本1.0 的Tiki-Hut 服務器進行交互:

Server: Tiki-Hut/1.0

內容首部

首部 描述
Content-Encoding 對主體執行的任意編碼方式
Content-Length 主體的長度或尺寸
Content-Type 這個主體的對象類型
... ...

拓展首部

擴展首部是非標準的首部,由應用程序開發者建立,但還未添加到已批准的HTTP 規範中去。即便不知道這些擴展首部的含義,HTTP 程序也要接受它們並對其進行轉發。

空行

空行用於分隔首部和報文主體

報文主體(body)

要傳輸的數據
例子:(下面的html標籤即爲請求體)

HTTP/1.1 200 OK
  Date: Sat, 01 Jul 2017 14:51:26 GMT
  Server: Apache/2.4.7 (Ubuntu)
  Set-Cookie: JSESSIONID=84C993F5E433C4DE9BFBA57150FFC065.ajp13_worker;path=/;HttpOnly
  Content-Language: zh-CN
  Vary: Accept-Encoding
  Content-Encoding: gzip
  Content-Length: 7333
  Keep-Alive: timeout=5, max=100
  Connection: Keep-Alive
  Content-Type: text/html;charset=UTF-8
 
  <html>
  <head>
  <title>title of html.</html>
  </head>
  <body>
  <h1>Hello world!</h1>
  </body>
  </html>

http請求過程

1.創建TCP鏈接

  1. 經過dns找到ip
  2. 與主機進行三次握手創建tcp連接

    這裏複習一下計算機網絡的知識

2.瀏覽器向服務器發送請求命令

一旦創建了 TCP 鏈接,Web 瀏覽器就會向 Web 服務器發送請求命令。例如:GET/hello/index.jsp HTTP/1.1。瀏覽器發送其請求命令以後,還要以頭信息的形式向Web服務器發送一些別的信息(例:Accept ,User-Agent 等 ),以後瀏覽器發送了一空白行來通知服務器,它已經結束了該頭信息的發送。

3.web服務器應答

客戶機向服務器發出請求後,服務器會客戶機進行應答,應答內容包括:協議的版本號和應答狀態碼 :HTTP/1.1 200 OK,響應頭信息來記錄服務器本身的數據,被請求的文檔內容。最後發送一個空白行來表示頭信息的發送到此爲結束,接着以Content-Type響應頭信息所描述的格式發送用戶所請求的實際數據。

4.Web服務器關閉TCP鏈接

通常狀況下,一旦 Web 服務器向瀏覽器發送了請求的數據,它就要關閉 TCP 鏈接,可是若是瀏覽器或者服務器在其頭信息加入了這行代碼:Connection:keep-alive(想起來vue有個keep-alive組件)

TCP鏈接在發送後將仍然保持打開狀態,因而,瀏覽器能夠繼續經過相同的鏈接發送請求。保持鏈接節省了爲每一個請求創建新鏈接所需的時間,還節約了網絡帶寬。

鏈接釋放:四次揮手

相關文章
相關標籤/搜索