從今天的文章開始,咱們將正式開始介紹 HTTP 協議。文本主要介紹 HTTP 協議的整體結構以及相關概念,讓你們對 HTTP 協議有一個總體的瞭解。html
HTTP 協議是一個無狀態的請求/響應協議,經過創建一個可靠的會話層或者傳輸層鏈接來交換消息。HTTP 客戶端是一個爲了發送一個或多個 HTTP 請求而和服務器創建鏈接的程序。而一個 HTTP 服務器是爲了發送 HTTP 響應而接收鏈接的程序。git
有時,咱們會把客戶端理解爲瀏覽器,但這是片面的。通常而言,咱們使用用戶代理(user agent)表示任何發起請求的客戶端程序。這裏的用戶代理包括但不限於:瀏覽器、網絡爬蟲、命令行工具、定製應用、移動應用等。github
因此,在一般狀況下,咱們將請求訪問文本或圖像等資源的一端稱爲客戶端,而提供資源的一端稱爲服務器。瀏覽器
進行 HTTP 通訊時,在一條通訊線路上一定有一端是客戶端,而另外一端是服務器。但須要注意的是,客戶端和服務器的角色有可能會相互交換。在一次鏈接中,某個程序可能扮演客戶端的角色;而在另外一次鏈接中,這個程序又可能會扮演服務器的角色。安全
下面咱們來看一個應用了 GET 請求的 HTTP 協議, 其中請求報文與響應報文的內容以下:bash
請求報文服務器
GET / HTTP/1.1
Host: 127.0.0.1:9090
Connection: keep-alive
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
複製代碼
響應報文網絡
HTTP/1.1 200 ok
Connection: keep-alive
Content-Length: 164
Content-Type: text/html
Date: Sat, 06 Jun 2020 01:53:57 GMT
<html>
...
複製代碼
關於請求報文與響應報文的具體細節,我會在下一篇文章中具體介紹。負載均衡
HTTP(HyperText Transfer Protocol) 協議翻譯成中文就是超文本傳輸協議。傳輸意味着數據要在客戶端和服務器之間進行傳遞,可是 HTTP 協議並無規定數據只能從客戶端直接傳遞給服務器,或者只能從服務器直接傳遞給客戶端。相反,在傳遞的過程當中能夠有不少「中間人」。工具
在 HTTP 協議中,常見的「中間人」形式有三種:代理、網關(反向代理)和隧道。在某些狀況下,一個獨立的「中間人」可能根據每次請求的性質分別扮演一個源服務器、代理、網關和隧道。
而關於源服務器、代理、網關和隧道的知識,我也會在後面的文章中詳細介紹。
上一篇文章中已經介紹過 HTTP 協議無狀態的特色,這裏再簡單回顧一下。HTTP 協議無狀態的特色是指它不會對發生過的請求和響應的狀態作持久化存儲。也就是說,HTTP 協議沒法根據上一次請求的狀態來處理本次請求。
在早期,無狀態的特色是 HTTP 協議的一大優點,因爲不用存儲狀態,能夠極大地提升服務器的運行效率。可是隨着時代的發展,在愈來愈多的場景下,咱們須要進行狀態的保存以方便處理相應的業務,因而引入了 Cookie 技術。
一般,爲了保存狀態,服務器發送的響應報文中會有一個叫作 Set-Cookie 的首部字段,客戶端獲取到該報文後,就能夠保存 Cookie。下一次請求時,客戶端會將保存的 Cookie 攜帶在請求報文中發送給服務器,服務器拿到 Cookie 後進行比對,就能夠知道是從哪一個客戶端發來的請求了。
本文介紹了 HTTP 協議的基本結構:
1.HTTP 協議是一個傳輸協議,因此它必須至少有兩方參與,分別是客戶端和服務器。
2.HTTP 協議的核心是它傳輸的報文。客戶端發送請求報文,服務器發送響應報文。
3.HTTP 協議由客戶端發起請求開始,服務端發送響應結束。但 HTTP 協議沒有規定中間不容許有其它的參與者。事實上,在傳輸過程當中,有很是多的「中間人」參與傳輸過程。
4.HTTP 協議具備無狀態的特色,爲了知足現代業務的須要,出現了 Cookie 技術,能夠在客戶端保存狀態。
在後面的文章中,我會基本圍繞今天的這些要點依次展開。下一篇文章將介紹 HTTP 協議中的報文,敬請期待。
你的點贊會給我一天好心情,若是能順手 來個 star,再順便關注下公衆號(零幺小館)就更完美了。
1.RFC 7230 文檔
2.《圖解 HTTP》
3.極客時間 《透視 HTTP 協議》