HTTP
HTTP
1 什么是HTTP

HTTP 超文本傳輸協議 (HTTP-Hyper Text transfer protocol),是一個屬于應用層的面向對象的協議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統。它于1990年提出,經過十幾年的使用與發展,得到不斷地完善和擴展。它是一種詳細規定了瀏覽器和萬維網服務器之間互相通信的規則,通過因特網傳送萬維網文檔的數據傳送協議。客戶端與服務端通信時傳輸的內容我們稱之為報文。HTTP協議就是規定報文的格式。HTTP就是一個通信規則,這個規則規定了客戶端發送給服務器的報文格式,也規定了服務器發送給客戶端的報文格式。實際我們要學習的就是這兩種報文。客戶端發送給服務器的稱為"請求報文",服務器發送給客戶端的稱為"響應報文"。
1 發展歷程
HTTP/0.9
- 蒂姆伯納斯李是一位英國計算機科學家,也是萬維網的發明者。他在 1989 年創建了單行 HTTP 協議。它只是返回一個網頁。這個協議在 1991 年被命名為 HTTP/0.9。
HTTP/1.0
- 1996 年,HTTP/1.0 發布。該規范是顯著擴大,并且支持三種請求方法:GET,Head,和POST。
- HTTP/1.0 相對于 HTTP/0.9 的改進如下:
- 每個請求都附加了 HTTP 版本。
- 在響應開始時發送狀態代碼。
- 請求和響應都包含 HTTP 報文頭。
- 內容類型能夠傳輸 HTML 文件以外的文檔。
HTTP/1.1
-
HTTP 的第一個標準化版本 HTTP/1.1 ( RFC 2068 ) 于 1997 年初發布,支持七種請求方法:OPTIONS,GET,HEAD,POST,PUT,DELETE,和TRACE
-
HTTP/1.1 是 HTTP 1.0 的增強:
-
虛擬主機允許從單個 IP 地址提供多個域。
-
持久連接和流水線連接允許 Web 瀏覽器通過單個持久連接發送多個請求。
-
緩存支持節省了帶寬并使響應速度更快。
-
-
HTTP/1.1 在接下來的 15 年左右將非常穩定。
-
在此期間,出現了 HTTPS(安全超文本傳輸協議)。它是使用 SSL/TLS 進行安全加密通信的 HTTP 的安全版本。
HTTP/2
- 由IETF在2015年發布。HTTP/2旨在提高Web性能,減少延遲,增加安全性,使Web應用更加快速、高效和可靠。
- 多路復用:HTTP/2 允許同時發送多個請求和響應,而不是像 HTTP/1.1 一樣只能一個一個地處理。這樣可以減少延遲,提高效率,提高網絡吞吐量。
HTTP/3
-
于 2021 年 5 月 27 日發布 , HTTP/3 是一種新的、快速、可靠且安全的協議,適用于所有形式的設備。 HTTP/3 沒有使用 TCP,而是使用谷歌在 2012 年開發的新協議 QUIC
-
HTTP/3 是繼 HTTP/1.1 和 HTTP/2之后的第三次重大修訂。
-
HTTP/3 帶來了革命性的變化,以提高 Web 性能和安全性。設置 HTTP/3 網站需要服務器和瀏覽器支持。
-
目前,谷歌云、Cloudflare和Fastly支持 HTTP/3。Chrome、Firefox、Edge、Opera 和一些移動瀏覽器支持 HTTP/3。
2 HTTP協議的會話方式
瀏覽器與服務器之間的通信過程要經歷四個步驟

- 瀏覽器與WEB服務器的連接過程是短暫的,每次連接只處理一個請求和響應。對每一個頁面的訪問,瀏覽器與WEB服務器都要建立一次單獨的連接。
- 瀏覽器到WEB服務器之間的所有通訊都是完全獨立分開的請求和響應對。
3 在瀏覽器中通過F12工具抓取請求響應報文包
幾乎所有的PC端瀏覽器都支持了F12開發者工具,只不過不同的瀏覽器工具顯示的窗口有差異

2 請求和響應報文
1 報文的格式
主體上分為報文首部和報文主體,中間空行隔開

報文部首可以繼續細分為 "行" 和 "頭"

2 請求報文
客戶端發給服務端的報文
- 請求報文格式
- 請求首行(請求行); GET/POST 資源路徑?參數 HTTP/1.1
- 請求頭信息(請求頭);
- 空行;
- 請求體;POST請求才有請求體
瀏覽器 f12 網絡下查看請求數據包

form表單發送GET請求特點
1、由于請求參數在請求首行中已經攜帶了,所以沒有請求體,也沒有請求空行
2、請求參數拼接在url地址中,地址欄可見[url?name1=value1&name2=value2],不安全
3、由于參數在地址欄中攜帶,所以由大小限制[地址欄數據大小一般限制為4k],只能攜帶純文本
4、get請求參數只能上傳文本數據
5、沒有請求體。所以封裝和解析都快,效率高, 瀏覽器默認提交的請求都是get請求比如:地址欄輸入回車,超鏈接,表單默認的提交方式
查看GET請求行,請求頭,請求體
- 請求行組成部分
- 請求方式 GET
- 訪問服務器的資源路徑?參數1=值1&參數2=值2 ... ...
- 協議及版本 HTTP/1.1
GET /05_web_tomcat/login_success.html?username=admin&password=123213 HTTP/1.1
- 請求頭
-主機虛擬地址
Host: localhost:8080
-長連接
Connection: keep-alive
-請求協議的自動升級[http的請求,服務器卻是https的,瀏覽器自動會將請求協議升級為https的]
Upgrade-Insecure-Requests: 1
- 用戶系統信息
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36
- 瀏覽器支持的文件類型
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
- 當前頁面的上一個頁面的路徑[當前頁面通過哪個頁面跳轉過來的]: 可以通過此路徑跳轉回上一個頁面, 廣告計費,防止盜鏈
Referer: http://localhost:8080/05_web_tomcat/login.html
- 瀏覽器支持的壓縮格式
Accept-Encoding: gzip, deflate, br
- 瀏覽器支持的語言
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
-
請求空行
-
請求體
- GET請求數據不放在請求體
form表單發送post請求特點
1、POST請求有請求體,而GET請求沒有請求體。
2、post請求數據在請求體中攜帶,請求體數據大小沒有限制,可以用來上傳所有內容[文件、文本]
3、只能使用post請求上傳文件
4、post請求報文多了和請求體相關的配置[請求頭]
5、地址欄參數不可見,相對安全
6、post效率比get低
- POST請求要求將form標簽的method的屬性設置為post
查看post的請求行 請求頭 請求體
- 請求行組成部分
- 請求方式 POST
- 訪問服務器的資源路徑?參數1=值1&參數2=值2 ... ...
- 協議及版本 HTTP/1.1
POST /05_web_tomcat/login_success.html HTTP/1.1
- 請求頭
Host: localhost:8080
Connection: keep-alive
Content-Length: 31 -請求體內容的長度
Cache-Control: max-age=0 -無緩存
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1 -協議的自動升級
Content-Type: application/x-www-form-urlencoded -請求體內容類型[服務器根據類型解析請求體參數]
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://localhost:8080/05_web_tomcat/login.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
Cookie:JSESSIONID-
-
請求空行
-
請求體:瀏覽器提交給服務器的數據
username=admin&password=1232131
3.2.3 響應報文
響應報文格式
- 響應首行(響應行); 協議/版本 狀態碼 狀態碼描述
- 響應頭信息(響應頭);
- 空行;
- 響應體;


- 響應行組成部分
- 協議及版本 HTTP/1.1
- 響應狀態碼 200
- 狀態描述 OK (缺省)
HTTP/1.1 200 OK
說明:響應協議為HTTP1.1,響應狀態碼為200,表示請求成功;
- 響應頭
Server: Apache-Coyote/1.1 服務器的版本信息
Accept-Ranges: bytes
ETag: W/"157-1534126125811"
Last-Modified: Mon, 13 Aug 2018 02:08:45 GMT
Content-Type: text/html 響應體數據的類型[瀏覽器根據類型解析響應體數據]
Content-Length: 157 響應體內容的字節數
Date: Mon, 13 Aug 2018 02:47:57 GMT 響應的時間,這可能會有8小時的時區差
- 響應體
<!--需要瀏覽器解析使用的內容[如果響應的是html頁面,最終響應體內容會被瀏覽器顯示到頁面中]-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
恭喜你,登錄成功了...
</body>
</html>
響應狀態碼:響應碼對瀏覽器來說很重要,它告訴瀏覽器響應的結果。比較有代表性的響應碼如下:
- 200: 請求成功,瀏覽器會把響應體內容(通常是html)顯示在瀏覽器中;
- 302: 重定向,當響應碼為302時,表示服務器要求瀏覽器重新再發一個請求,服務器會發送一個響應頭Location指定新請求的URL地址;
- 304: 使用了本地緩存
- 404: 請求的資源沒有找到,說明客戶端錯誤的請求了不存在的資源;
- 405: 請求的方式不允許
- 500: 請求資源找到了,但服務器內部出現了錯誤;
更多的響應狀態碼
| 狀態碼 | 狀態碼英文描述 | 中文含義 |
|---|---|---|
| 1** | ||
| 100 | Continue | 繼續。客戶端應繼續其請求 |
| 101 | Switching Protocols | 切換協議。服務器根據客戶端的請求切換協議。只能切換到更高級的協議,例如,切換到HTTP的新版本協議 |
| 2** | ||
| 200 | OK | 請求成功。一般用于GET與POST請求 |
| 201 | Created | 已創建。成功請求并創建了新的資源 |
| 202 | Accepted | 已接受。已經接受請求,但未處理完成 |
| 203 | Non-Authoritative Information | 非授權信息。請求成功。但返回的meta信息不在原始的服務器,而是一個副本 |
| 204 | No Content | 無內容。服務器成功處理,但未返回內容。在未更新網頁的情況下,可確保瀏覽器繼續顯示當前文檔 |
| 205 | Reset Content | 重置內容。服務器處理成功,用戶終端(例如:瀏覽器)應重置文檔視圖。可通過此返回碼清除瀏覽器的表單域 |
| 206 | Partial Content | 部分內容。服務器成功處理了部分GET請求 |
| 3** | ||
| 300 | Multiple Choices | 多種選擇。請求的資源可包括多個位置,相應可返回一個資源特征與地址的列表用于用戶終端(例如:瀏覽器)選擇 |
| 301 | Moved Permanently | 永久移動。請求的資源已被永久的移動到新URI,返回信息會包括新的URI,瀏覽器會自動定向到新URI。今后任何新的請求都應使用新的URI代替 |
| 302 | Found | 臨時移動。與301類似。但資源只是臨時被移動。客戶端應繼續使用原有URI |
| 303 | See Other | 查看其它地址。與301類似。使用GET和POST請求查看 |
| 304 | Not Modified | 未修改。所請求的資源未修改,服務器返回此狀態碼時,不會返回任何資源。客戶端通常會緩存訪問過的資源,通過提供一個頭信息指出客戶端希望只返回在指定日期之后修改的資源 |
| 305 | Use Proxy | 使用代理。所請求的資源必須通過代理訪問 |
| 306 | Unused | 已經被廢棄的HTTP狀態碼 |
| 307 | Temporary Redirect | 臨時重定向。與302類似。使用GET請求重定向 |
| 4** | ||
| 400 | Bad Request | 客戶端請求的語法錯誤,服務器無法理解 |
| 401 | Unauthorized | 請求要求用戶的身份認證 |
| 402 | Payment Required | 保留,將來使用 |
| 403 | Forbidden | 服務器理解請求客戶端的請求,但是拒絕執行此請求 |
| 404 | Not Found | 服務器無法根據客戶端的請求找到資源(網頁)。通過此代碼,網站設計人員可設置"您所請求的資源無法找到"的個性頁面 |
| 405 | Method Not Allowed | 客戶端請求中的方法被禁止 |
| 406 | Not Acceptable | 服務器無法根據客戶端請求的內容特性完成請求 |
| 407 | Proxy Authentication Required | 請求要求代理的身份認證,與401類似,但請求者應當使用代理進行授權 |
| 408 | Request Time-out | 服務器等待客戶端發送的請求時間過長,超時 |
| 409 | Conflict | 服務器完成客戶端的 PUT 請求時可能返回此代碼,服務器處理請求時發生了沖突 |
| 410 | Gone | 客戶端請求的資源已經不存在。410不同于404,如果資源以前有現在被永久刪除了可使用410代碼,網站設計人員可通過301代碼指定資源的新位置 |
| 411 | Length Required | 服務器無法處理客戶端發送的不帶Content-Length的請求信息 |
| 412 | Precondition Failed | 客戶端請求信息的先決條件錯誤 |
| 413 | Request Entity Too Large | 由于請求的實體過大,服務器無法處理,因此拒絕請求。為防止客戶端的連續請求,服務器可能會關閉連接。如果只是服務器暫時無法處理,則會包含一個Retry-After的響應信息 |
| 414 | Request-URI Too Large | 請求的URI過長(URI通常為網址),服務器無法處理 |
| 415 | Unsupported Media Type | 服務器無法處理請求附帶的媒體格式 |
| 416 | Requested range not satisfiable | 客戶端請求的范圍無效 |
| 417 | Expectation Failed | 服務器無法滿足Expect的請求頭信息 |
| 5** | ||
| 500 | Internal Server Error | 服務器內部錯誤,無法完成請求 |
| 501 | Not Implemented | 服務器不支持請求的功能,無法完成請求 |
| 502 | Bad Gateway | 作為網關或者代理工作的服務器嘗試執行請求時,從遠程服務器接收到了一個無效的響應 |
| 503 | Service Unavailable | 由于超載或系統維護,服務器暫時的無法處理客戶端的請求。延時的長度可包含在服務器的Retry-After頭信息中 |
| 504 | Gateway Time-out | 充當網關或代理的服務器,未及時從遠端服務器獲取請求 |
| 505 | HTTP Version not supported | 服務器不支持請求的HTTP協議的版本,無法完成處理 |

浙公網安備 33010602011771號