記錄的比較散亂,這篇文章的思路寫的很清晰,能夠看這篇:html
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
常見的幾種:cookie
上面的 /index.html網絡
<version> <status> <reason-phrase>
HTTP 版本、數字狀態碼,以及描述操做狀態的文本形式的緣由短語。
例如:app
HTTP/1.1 200 OK
HTTP響應碼響應碼由三位十進制數字組成,它們出如今由HTTP服務器發送的響應的第一行。
響應碼分五種類型,由它們的第一位數字表示:jsp
從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 程序也要接受它們並對其進行轉發。
空行用於分隔首部和報文主體
要傳輸的數據
例子:(下面的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>
與主機進行三次握手創建tcp連接
這裏複習一下計算機網絡的知識
一旦創建了 TCP 鏈接,Web 瀏覽器就會向 Web 服務器發送請求命令。例如:GET/hello/index.jsp HTTP/1.1。瀏覽器發送其請求命令以後,還要以頭信息的形式向Web服務器發送一些別的信息(例:Accept ,User-Agent 等 ),以後瀏覽器發送了一空白行來通知服務器,它已經結束了該頭信息的發送。
客戶機向服務器發出請求後,服務器會客戶機進行應答,應答內容包括:協議的版本號和應答狀態碼 :HTTP/1.1 200 OK,響應頭信息來記錄服務器本身的數據,被請求的文檔內容。最後發送一個空白行來表示頭信息的發送到此爲結束,接着以Content-Type響應頭信息所描述的格式發送用戶所請求的實際數據。
通常狀況下,一旦 Web 服務器向瀏覽器發送了請求的數據,它就要關閉 TCP 鏈接,可是若是瀏覽器或者服務器在其頭信息加入了這行代碼:Connection:keep-alive(想起來vue有個keep-alive組件)
TCP鏈接在發送後將仍然保持打開狀態,因而,瀏覽器能夠繼續經過相同的鏈接發送請求。保持鏈接節省了爲每一個請求創建新鏈接所需的時間,還節約了網絡帶寬。
鏈接釋放:四次揮手