文章目錄
1.概念
1.1 Web Service
Web Service(Web服務)是我們日常使用最多的服務,所有網站都是以Web服務形式爲我們呈現。
- Web服務分爲服務端和客戶端。
- 常見的客戶端就是我們使用的各種瀏覽器(IE、Chorm、Safari、Firefox、Opera或命令行瀏覽器)都是Web客戶端。
- 而Web服務端就是我們所訪問網站的Web服務。常見的Web服務器有:IIS、Apache、Nginx、Lighttpd等。不同Web服務器對不同的系統平臺,有各自的優缺點。
1.2 HTTP協議
超文本傳輸協議(HTTP)是一種通信協議。它允許將超文本標記語言(HTML)文檔從web服務器傳送到客戶端。
我們平時瀏覽網頁,只要在瀏覽器端輸入網址,電腦就能顯現出我們想要的東西。可是你有沒有想過,輸入網址之後到底發生了什麼呢?
簡單來說,就是我們向服務器說:“嘿,哥們,我想要xxx”,服務器再把我們想要的東西發到我們電腦上顯現出來。我們向服務器申請資源的時候、服務器發給我們東西這個過程,是要遵從一定的協定的(沒有規矩,不成方圓),這個協定就是HTTP協議。
也就是說,Wbe服務器和客戶端通過HTTP協議進行交互。
- HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端服務端模型(CS模型)。HTTP是一個無狀態的協議(下一章會講到)。
- 在Internet中所有的傳輸都是通過TCP/IP進行的。HTTP協議作爲TCP/IP模型中應用層的協議也不例外。HTTP協議通常承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了我們常說的HTTPS(HTTPS後面我會講到)。
- 瀏覽網頁是HTTP的主要應用,但是這並不代表HTTP就只能應用於網頁的瀏覽。HTTP是一種協議,只要通信的雙方都遵守這個協議,HTTP就能有用武之地。比如咱們常用的QQ,迅雷這些軟件,都會使用HTTP協議(還包括其他的協議)。
2. 傳輸的過程
HTTP協議(應用層)是承載於TCP協議(傳輸層)之上的。而TCP是一個端到端的面向連接的協議。所謂的端到端可以理解爲進程到進程之間的通信。所以HTTP在開始傳輸之前,首先需要建立TCP連接,而TCP連接的過程需要所謂的“三次握手”。下圖所示TCP連接的三次握手。
2.1 TCP三次握手(建立連接)
 PS:下面是一張非常棒的圖,對於TCP協議的理解很有幫助。雖然我們主要講的是三次握手,但是理解了三次握手,四次揮手也就很簡單了。
- 第一次握手:建立連接。客戶端發送連接請求報文段,將SYN位置爲1,Seq爲x;然後客戶端進入SYN_SEND狀態,等待服務器的確認;
- 第二次握手:服務器收到SYN報文段。服務器收到客戶端的SYN報文段,需要對這個SYN報文段進行確認,設置Ack爲x+1(Seq+1);同時,自己自己還要發送SYN請求信息,將SYN位置爲1,Seq爲y;服務器端將上述所有信息放到一個報文段(即SYN+ACK報文段)中,一併發送給客戶端,此時服務器進入SYN_RECV狀態;
- 第三次握手:客戶端收到服務器的SYN+ACK報文段。然後將Ack設置爲y+1,向服務器發送ACK報文段,這個報文段發送完畢以後,客戶端和服務器端都進入ESTABLISHED狀態,完成TCP三次握手。
在TCP三次握手之後,建立了TCP連接,此時HTTP就可以進行傳輸了。
四次揮手也和三次握手原理一樣,由於篇幅有限,在這裏就不再詳解。在計算機網絡專欄中我會詳細講解TCP/IP協議。
2.2 HTTP報文
HTTP報文由請求報文和響應報文組成。HTTP的這兩種報文都由三部分組成:起始行、首部、實體主體。
2.2.1 起始行
請求報文起始行格式:
方法 【空格】 URL 【空格】 HTTP版本
- 方法: 向請求資源指定的資源發送請求報文的方法,其作用是可以指定請求的資源按期望產生某種行爲。
HTTP定義了許多方法,客戶端通過不同的方式於Web服務器進行通信,常見的方法如下:
GET | 從服務器上獲取一個資源(一般是一個網頁) |
---|---|
POST | 向服務器提交數據(可能會創建一個新的資源) |
PUT | 向服務器提交數據 |
DELETE | 刪除指定資源 |
HEAD | 只請求網頁頭部信息 |
- URL : URL鏈接,定位資源位置
- HTTP版本:目前有 HTTP/1.0、HTTP/1.1、HTTP/2.0 版本,其中 HTTP1.0 版本使用較廣泛。
響應報文起始行格式:
HTTP版本 [空格] 狀態碼
- 狀態碼:就是顯示給客戶端,服務端的狀態。例如:我們訪問網頁的時候經常會遇到404錯誤。常見的狀態碼及含義如下:
200 | 正常,請求成功 |
---|---|
301 | 永久移動,一般用於域名重定向 |
304 | 未修改,一般用於緩存 |
401 | 禁止訪問,未授權 |
403 | 進制訪問,通常代表已通過認證,但沒有訪問權限 |
404 | 未找到資源 |
301 | 服務器內部錯誤 |
2.2.2 首部(header)
- 是用來說明瀏覽器、服務器或報文主體的一些信息。
- 可以有好幾行,也可以不使用
- 每個首部行都是由首部字段名、:、 和值組成
- 每個首部在結束地方都有一個空行,標誌首部結束
HTTP 首部字段分爲 4 種: 通用首部字段、請求首部字段、響應首部字段、實體首部字段。
一張圖展示所有字段:這裏不再逐個講解每個字段的意思,有興趣的可以自行上網搜索~~
2.2.3 實體(body)
- 請求報文實體,就是客戶端具體想要的是什麼。
- 響應報文的實體,就是客戶端想要的資源。
2.3 瀏覽器演示
我們使用Chorm瀏覽器,隨便打開一個網頁(例如:www.meizu.com),鼠標右擊,點擊【檢查】,就會出來以下界面,然後按順序點擊:Network—>www.meizu.com—>Headers,(如果沒看到,就對頁面重新加載)
點擊進去,看看這些Headers。有沒有很熟悉?這就是我們剛剛說的HTTP報文。但是和上邊所說的還有點不一樣,別急,點擊 view source,顯示視圖源。(PS:因爲瀏覽器原本顯示的是 view parsed——視圖解析。意思是一樣的,區別在於一個是源,一個是解析過的。提示:有的網頁沒有view source這個選項)
點擊過後就是下面的圖片,就和我們剛剛說的報文一樣了。
而響應報文實體就在後面的Response裏面。這裏只是給大家看一下HTTP報文的大概樣子,就不再具體詳解了。
3.HTTP協議發展歷史
HTTP/0.9:協議很簡單,只有一個命令GET,沒有HEADER等描述信息。服務器發送完畢就關閉TCP連接。
HTTP/1.0:
- 增加了很多命令,例如:POST,HEAD,PUT等。
- 增加了status code和header。
- 多字符集支持、多部分發送、權限、緩存等。
HTTP/1.1:
- 持久連接(HTTP是無連接的,下一篇文章會講到)。
- pipeline(管道化),pipeline機制是在一條connection上多個http request不需要等待response就可以連續發送的技術。但這可能會帶來隊頭阻塞的問題,也正因此,許多瀏覽器默認關閉了這個功能。(HTTP2解決了這個問題)。
- 增加host和其他一些命令。Host是比較重要的東西,他的存在,是爲了實現一臺服務器上可以跑多個Web服務。例如:www.a1.com,www.a2.com,www.a3.com,這三個域名通過DNS翻譯出來的IP都一樣,但可以通過Host,來區分同一臺服務器上的不同的Web服務。
HTTP/2:
- 所有數據以二進制傳輸。
- 同一個連接裏面發送多個請求不再需要按照順序來。
- 頭信息壓縮以及推送等提高效率的功能。
4. HTTP協議一個基本的工作流程
一次HTTP操作稱爲一個事務,其工作過程大致可分爲四步:
- 首先客戶端與服務端需要建立TCP連接。只要單擊某個超級鏈接,HTTP的工作開始
- 建立連接後,客戶端發送一個請求給服務端,請求報文格式上邊已經提過。
- 服務端接到請求後,會發送一個響應給客戶端,響應報文格式上邊已經提過。
- 客戶端接收服務器所返回的信息通過瀏覽器顯示在用戶的顯示屏上,然後客戶機與服務器斷開連接。
如果在以上過程中的某一步出現錯誤,那麼產生錯誤的信息將返回到客戶端,有顯示屏輸出。對於用戶來說,這些過程是由HTTP自己完成的,用戶只要用鼠標點擊,等待信息顯示就可以了。
5.總結
以上就是對HTTP協議的初步講解,講的東西很少,就是希望大家先有個清晰的概念。後續我會接着寫,關於HTTP協議的一些重要特性,以及HTTPS等。
文章如有不當之處,還請多多指教~如有疑問,可以留言區討論鴨!