了解HTTP協議
開始複習網絡基礎了,這個是真學了又忘,忘了又學
1. 簡單的HTTP協議
超文本傳輸協議,規範了瀏覽器和服務器的數據交互,其是基於TCP協議進行連接的,而傳輸的內容就是HTTP
瀏覽器即客戶端發送的HTTP我們稱之為請求報文,反之叫響應報文
1.1 報文的組成
報文首部 + 空行 + 報文主體

請求報文的組成:報文首部(請求方法、請求URI、協議版本、首部字段)、空行、報文主體

響應報文的組成:報文首部(協議版本、狀態碼、原因短語、首部字段)、空行、內容實體

1.2 持久連接
- keep-alive:保持TCP連接,建立一個TCP連接可進行多次請求和相應
- 管線化:不用等待響應可直接發送下一個請求
2. 常見的請求方法
請求方法用於告知服務器的意圖
- GET:獲取資源
- POST:傳輸實體主體
- PUT:傳輸文件(一般不使用,沒有驗證)
- HEAD:獲得報文首部(確認URI有效性、資源更新時間)
- DELETE:刪除文件(一般不使用,沒有驗證,但和RESTful意義不同了)
- OPTIONS:預查詢資源支持的方法
- TRACE:追蹤路徑
- CONNECT:要求用歲寶協議連接代理(主要SSL/TLS用到)
GET與POST的區別
GET:
獲取資源
請求參數附加在url後面,且有長度限制
POST:
傳輸實體主體
請求信息放入請求體裏面,沒有長度限制
有兩個TCP包,先發送請求頭,待響應100 continue後才發送請數據
3. URI、URL
URI統一資源標識符、URL統一資源定位符,URI包含URL。URL是我們常用的Web的網頁地址,而RUI是任何不止於Web的唯一標識,比如身份證、UUID等
URI格式:
//root:[email protected]:80/dir/index.html?search=test#ch1
協議 :// 認證信息 @ 服務器地址 : 端口號 / 文件路徑 ? 查詢參數 # 位置標識符
4 協議版本
常見的HTTP協議版本有 1.0 / 1.1 / 2.0 其區別如下:
- 1.0-1.1
- 支持長連接:keep-alive
- Host頭處理:虛擬主機的出現
- 支持範圍請求:增加range字段,可斷點請求
- 增多了錯誤狀態碼
- 增多了緩存處理:增多了緩存控制
- 1.1-1.2
- 採用二進制格式:1.1是文本格式,二進制解析高效
- 報頭壓縮:以前版本大量字段且重複發送
- 主動推送
- 完全多路復用:連接共享,每個請求對應一個Id,那麼一個TCP連接上可以有多個請求,可隨機混雜到服務器再歸併
5 狀態碼
負責表示客戶端HTTP請求的返回結果,以三位數字和原因短語組成,類別如下:
| 類別 | 原因短語 | |
|---|---|---|
| 1XX | 信息性 | 請求正在處理 |
| 2XX | 成功 | 請求正常處理完畢 |
| 3XX | 重定向 | 需要附加操作以完成請求 |
| 4XX | 客戶端錯誤 | 服務器無法處理請求 |
| 5XX | 服務器錯誤 | 服務器處理請求錯誤 |
常見的狀態碼:
-
101:切換協議
-
200:請求成功且返回
-
204:請求成功無返回
-
206:範圍請求
-
301:永久重定向
-
302:臨時重定向(常用)
-
303:存在另外URI,希望用GET方法
-
400:請求語法錯誤
-
401:未認證
-
403:無權限
-
404:無此資源
-
405:不支持該請求方法
-
500:服務器內部錯誤
-
503:服務器繁忙
6 首部字段
給瀏覽器或服務器提供報文主體大小、使用語言、認證信息等。其分類如下:
6.1 通用首部字段
- Connection:控制不再轉發的字段、管理持久連接
Connection:update 、 Connection:keep-alive
- Date:創建報文的日期時間
- Trailer:事先聲明報文主體記錄的首部字段,分塊傳輸會用到
- Transfer-Encoding:規定傳輸報文主體採用的編碼
- Update:檢測能否使用高級協議(只能用於鄰接的服務器,要配合Connection)
6.2 請求首部字段
- Host:必須包含在內的主機名
- Accept:用戶代理能處理的媒體類型eg:text/html
- Accept-Charset:用戶代理支持的字符集
- Accept-Encoding:用戶代理支持的內容編碼eg:gzip、identity、compress
- Accept-Language:用戶代理支持的語言集eg:zh-cn、en-us
- Authorization:告知服務器用戶代理信息
- Range:範圍請求eg:Range:bytes=1000-2000
- Referer:請求的原始URI
- User-Agent:客戶端程序信息
6.3 響應首部字段
- Accept-Ranges:是否支持範圍請求eg:none、bytes
- Age:創建響應過去多長時間,單位秒
- Localtion:重定向地址,配置302狀態碼
- Retry-After:告知客戶端多久後再請求
- Server:告知HTTP的服務器應用程序
6.4 實體首部字段
- Content-Encoding:實體內容的編碼
- Content-Length:實體主體大小單位位元組
- Content-Range:範圍請求資源
- Content-type:實體內容的媒體類型
- Expires:資源過期時間
6.5 為Cookie服務的字段
- Set-cookie:響應字段
- cookie:發給服務器的字段
7. HTTP協議的瓶頸
- 一條連接上只可發送一個請求(1.1版本長連接可多個)
- 請求只能從客戶端開始,不可接收響應外的指令
- 首部字段未壓縮發送,信息越多越延遲
- 發送冗長的首部,每次互相發送相同的首部浪費
- 可任意選擇數據壓縮格式,未強制要求壓縮
應對方法:
7.1 Ajax
利用JavaScript和DOM操作,局部Web頁面更新,響應中減少了傳輸的數據,但並未突破瓶頸
7.2 Comet
通過延遲應答(掛起響應)模擬服務器向客戶端推送消息,需要連接時長變長,但並未突破瓶頸
7.3 SPDY
沒完全改寫HTTP協議,而是在應用層和傳輸層之間通過新的會話層形式運行。可多路復用、請求優先級、壓縮首部、推送、服務器提示功能
突破了瓶頸,但SPDY只是單個域名的多路復用(只對當前網站適用),若請求其他網站則不適用,沒有盛行
7.4 WebSocket
使用HTTP協議就無法完全消除瓶頸,那麼只能使用另外的協議了—-WebSokcet使用全雙工通信,突破瓶頸
一旦建立WebSocket通信,後面都使用這個專用的協議,但由於其使用HTTP來升級協議,那麼發起連接的還是客戶端,升級協議後就沒有區分了
WebSocket特點:推送功能、減少通信量
過程:建立HTTP連接後(TCP三次握手),需要再進行一次升級協議(HTTP字段),成功後使用WebSocket的獨立數據幀(所以WebSocket使用到了TCP、HTTP的功能)
- 第一步:客戶端發送Update:WebSocket字段、Connection:Update、Sec-WebSocket-Key:XXX
- 第二步:響應101狀態碼,字段:Sec-WebSocket-Accept:XXX(二者通過算法加密一樣才可連接)
參考
《圖解HTTP》


