- http報文結構
- 報文首部
- 起始行
- 請求報文的起始行:
- 方法(method)
- request-URL
- version(http協議版本)
- 回應報文的起始行
- HTTP回應碼
- 請求報文的起始行:
- 請求頭
- 通用首部
- 請求首部
- 回應首部
- 內容首部
- 拓展首部
- 起始行
- 空行
- 報文主體(body)
- 報文首部
- http請求程序
- 1.建立TCP連接
- 2.瀏覽器向服務器發送請求命令
- 3.web服務器應答
- 4.Web服務器關閉TCP連接
記錄的比較散亂,這篇文章的思路寫的很清晰,可以看這篇:
http報文詳解------klguang
http報文結構
http報文主要包含三大部分
| 報文首部 |
|---|
| 空行 |
| 主體(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)
常見的幾種:
- POST (向服務器發送需要處理的資料)【發送資料】增/查,
- GET(從服務器獲取請求URL所指定的資源)【獲取資源】查
- PUT(將請求的主體部分存盤在服務器上)【存盤資料】 改
- DELETE (從服務器上洗掉請求URL所指定的資源)【洗掉資料】刪
request-URL
上面的 /index.html
version(http協議版本)
- 1
- 1.1
- 2
回應報文的起始行
<version> <status> <reason-phrase>
HTTP 版本、數字狀態碼,以及描述操作狀態的文本形式的原因短語,
例如:
HTTP/1.1 200 OK
HTTP回應碼
HTTP回應碼回應碼由三位十進制數字組成,它們出現在由HTTP服務器發送的回應的第一行,
回應碼分五種型別,由它們的第一位數字表示:
- 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連接
- 通過dns找到ip
- 與主機進行三次握手建立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連接在發送后將仍然保持打開狀態,于是,瀏覽器可以繼續通過相同的連接發送請求,保持連接節省了為每個請求建立新連接所需的時間,還節約了網路帶寬,
連接釋放:四次揮手
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/85106.html
標籤:其他
上一篇:VoIP綜合應用技術概述下載
