[轉載]全面理解 HTTP

HTTP 對於開發人員來說是必備的知識,今天給大家轉載一篇有關 HTTP 的文章。

引言:作為一名軟體工程Web專業學生,對於HTTP的熟悉掌握是必不可少的,特此做記錄,打造自己的HTTP棧。

URL與URI

我們經常接觸到的就是URL了,它就是我們訪問web的一個字元串地址,那麼URI是什麼呢?他們是什麼關係呢?

URL:uniform resource location 統一資源定位符

URI:uniform resource identifier 統一資源標識符

這也就是說,URI是一種資源的標識;而URL也是一種URI,也是一種資源的標識,但它也指明了如何定位Locate到這個資源。

URI是一種抽象的資源標識,既可以是絕對的,也可以是相對的。但是URL是一種URI,它指明了定位的信息,必須是絕對的。

報文-通信的橋樑

客戶端和伺服器端通過相互發送報文進行通信,要深刻理解HTTP協議,就需要理解報文的格式和內容。

報文的組成

無論是請求報文還是響應報文都需要有報文首部,當然報文主體並不是必需的。

一般來說,請求報文的格式如下:

看一下百度網站的請求報文:

簡單的報文形式:

GET / HTTP/1.1 //請求行,包含用於請求的方法,請求的URI,HTTP版本n//以下為各種首部欄位nHost: www.baidu.comnConnection: keep-alivenUpgrade-Insecure-Requests: 1nUser-Agent: Mozilla/5.0...nAccept-Encoding: gzip, deflate, sdchnAccept-Language: zh-CN,zh;q=0.8n

響應報文的格式如下:

看一下百度網站的響應報文:

HTTP/1.1 200 OK //狀態行,包含表明響應結果的狀態碼,原因短語和HTTP版本n//以下為各種首部欄位nServer: bfe/1.0.8.5nDate: Tue, 06 Oct 2015 14:48:28 GMTnContent-Type: text/html;charset=utf-8nTransfer-Encoding: chunkednConnection: keep-alivenCache-Control: privaten

告知伺服器意圖的HTTP方法

發送HTTP的方法有許多種,最常用的便是GET和POST,下面就這兩種進行詳細地說明。

  1. GET

    GET方法用來請求訪問URI所指定的資源,(我想訪問你的某個資源)並不對伺服器上的內容產生任何作用結果;每次GET的內容都是相同的。GET方式把請求所需要的參數放到URL中,直接就可以在URL中看見,有大小限制。

  2. POST

    POST方法用來傳輸實體主體,目的並不是獲取響應的主體內容,(我要把這條信息告訴你),POST方式則是把內容放在報文內容中,因此只要報文的內容沒有限制,它的大小就沒有限制。

  3. 總結

    GET用於獲取某個內容,POST用於提交某種數據請求。

    按照使用場景來說,一般用戶註冊的內容屬於私密的,這應該使用POST方式;而針對某一內容的查詢,為了快速的響應,可以使用GET方式。

無狀態協議與Cookie

HTTP是一種無狀態協議,也就是每一次發送都是一次新的開始,伺服器並不知道也沒有必要知道當前連接的客戶端是否之前有過交集,那麼當需要進行保存用戶登錄狀態時,則出現了麻煩,這個時候使用Cookie來保存狀態。

Cookie會根據伺服器端發送的響應報文內的一個叫做Set-Cookie的首部欄位,通知客戶端保存Cookie(保存在自己的電腦里),當下次客戶端發送請求時,Cookie值會被添加到請求報文中發送出去。

持久連接

使用瀏覽器瀏覽一個包含多張圖片的HTML頁面時,瀏覽器會發起多次請求,如圖所示:

顯而易見每次請求會造成無謂的TCP連接建立和斷開,增加通信量的開銷。

引入持久連接

持久連接的特點是,只要任意一端沒有明確提出斷開連接,則保持TCP連接狀態。目前HTTP/1.1中默認為持久連接。

Connection:keep-aliven

管線化

管線化可以同時並行發送多個請求,不需要一個一個等待響應了。

常見的狀態碼

確保安全的HTTPS

HTTP+加密+認證+完整性保護 = HTTPS

一些登陸界面和購物結算界面使用HTTPS通信,也就是改用https://,HTTPS說簡單點就是它的通信介面部分被SSL和TLS協議代替而已。

身份認證

有一些網址或者服務需要用戶的身份信息,因此需要隨時知道這些消息,但是肯定不能每次都讓用戶輸入用戶密碼,因此關於認證就有下面幾種方式:

在這裡主要說一下FormBase認證,也就是表單認證

使用Cookie來管理Session

  1. 客戶端把用戶IE和密碼等登錄信息放入報文的實體部分,以POST方式發送給伺服器。

  2. 伺服器進行身份認證,產生SessionID,加入到Set-Cookie內,返回給客戶端。

  3. 客戶端接收到SessionID後,將其加入Cookie,下次請求時,瀏覽器會自動發送Cookie。

在傳輸過程中,一種安全地保存密碼方式是,先利用給密碼加鹽的方式增加額外信息,再使用散列hash函數計算出散列值後保存。

書籍推薦:《圖解HTTP》,輕鬆理解更全面的HTTP知識。

文/LuckyJing(簡書作者)

原文鏈接:jianshu.com/p/81632fea3

本文同步發佈於同名微信公眾號:WeCode365,有興趣的同學可以關注一下。

推薦閱讀:

HTTP的post和get
HTTP/2 對現在的網頁訪問,有什麼大的優化呢?體現在什麼地方?
雲計算的1024種玩法之零基礎入門
ApiTestEngine 演化之路(1)搭建基礎框架

TAG:HTTP | 前端入门 | 自学编程 |