Http協議通俗詳解版

一、何爲HTTP協議

http協議: 超文本傳輸協議,是一個簡單的請求-響應協議,它通常運行在TCP之上。

我們說, 應用層協議是我們程序猿自己定的.但實際上, 已經有大佬們定義了一些現成的, 又非常好用的應用層協議, 供我們直接參考使用. HTTP(超文本傳輸協議)就是其中之一(也就是你自己可以寫別的協議,只要你願意)。

原來我們講過了TCP傳輸的過程,就是兩臺主機之間的通訊。那我們僅僅只是發送一串數據過去嗎?我們想想協議是什麼?協議就是約定,約定雙方怎麼處理數據。

舉個例子:
有一天,A要給B郵寄一個密碼本,所以A找來了郵遞員C【TCP/IP協議】,把B的信息告訴了郵遞員C,郵遞員C把密碼本打包【封裝】,C騎着電驢先找了一下本地的城市【局域網】,結果沒找到。郵遞員C想,這肯定是在別的城市了,騎着電驢肯定不靠譜。郵遞員去了郵局【路由器】,把電驢換成了汽車,選擇了城市的一條高速路口出去了【NAT+NAPT協議】,然後開始一個城市一個城市找【RIP協議】,最終在一個城市找到了【B的地址必須爲公網,有疑問看上一篇文章】,把密碼本給了B。B拿到密碼本,怎麼獲取裏面的內容呢?原來A和B提前就約定好了【http協議】,然後B根據這個約定,讀取了數據,原來A是找B要個照片【request請求】。B根據約定,把這個圖片發給了B【response響應】。

現在A就是瀏覽器,B就是服務器,http協議就是他倆直接約定的方式。http協議已經處於應用層了。

二、HTTP的請求方法

http請求方法有很多,但我們要講的就兩種:POST和GET

A把密碼本寄給B的話,如果用GET方法,那麼就會在地址欄【url】顯示這裏面是什麼。如果選擇POST方法的話,那麼【url】就不會顯示這裏面是什麼(但可以帶一些別的參數)
在這裏插入圖片描述

三、認識URL

我們不是說A不是要把B的信息告訴C嗎?那麼B的地址信息就是URL(俗稱網址)。

(1)瀏覽器輸入url:具體訪問url網站的協議,需要查看(網站是http還是https協議的服務,可以不輸入,客戶端瀏覽器+系統和服務端服務器自動也會設置)

在這裏插入圖片描述(3)url編碼(urlencode)和url解碼(urldecode),就是把你發送的字符進行編碼處理(即使url顯示的是漢字)。

四、HTTP版本

主要是1.0和1.1的差別
1、HTTP 1.1支持長連接(PersistentConnection)和請求的流水線(Pipelining)處理
HTTP 1.0規定瀏覽器與服務器只保持短暫的連接,瀏覽器的每次請求都需要與服務器建立一個TCP連接,服務器完成請求處理後立即斷開TCP連接,服務器不跟蹤每個客戶也不記錄過去的請求。

HTTP 1.1則支持持久連接Persistent Connection, 並且默認使用persistent connection. 在同一個tcp的連接中可以傳送多個HTTP請求和響應. 多個請求和響應可以重疊,多個請求和響應可以同時進行. 更加多的請求頭和響應頭(比如HTTP1.0沒有host的字段).

2.HTTP 1.1增加host字段
在HTTP1.0中認爲每臺服務器都綁定一個唯一的IP地址,因此,請求消息中的URL並沒有傳遞主機名(hostname)。但隨着虛擬主機技術的發展,在一臺物理服務器上可以存在多個虛擬主機(Multi-homed Web Servers),並且它們共享一個IP地址。

HTTP1.1的請求消息和響應消息都應支持Host頭域,且請求消息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)。此外,服務器應該接受以絕對路徑標記的資源請求。

3.帶寬優化及網絡連接的使用
HTTP1.0中, 存在-些浪費帶寬的現象,例如客戶端只是需要某個對象的一部分,而服務器卻將整個對象送過來了,並且不支持斷點續傳功能
HTTP1. 1則在請求頭引入了range頭域,它允許只請求資源的某個部分,即返回碼是206 (Partial Content),這樣就方便了開發者自由的選擇以便於充分利用帶寬和連接。

4.錯誤通知的管理
在HTTP1.1中新增 了24個錯誤狀態響應碼,如409 (Conflict) 表示請求的資源與資源的當前狀態發生衝突; 410 (Gone) 表示服務器上的某個資源被永久性的刪除。

五、HTTP常見狀態碼

在這裏插入圖片描述
在這裏插入圖片描述

六、HTTP協議格式

在這裏插入圖片描述抓個HTTP的包看看
在這裏插入圖片描述

HTTP請求:

  • 首行: [方法] + [url] + [版本]
  • Header: 請求的屬性, 冒號分割的鍵值對;每組屬性之間使用\n分隔;遇到空行表示Header部分結束
  • Body: 空行後面的內容都是Body. Body允許爲空字符串. 如果Body存在, 則在Header中會有一個ContentLength屬性來標識Body的長度;

在這裏插入圖片描述HTTP響應:

  • 首行: [版本號] + [狀態碼] + [狀態碼解釋]
  • Header: 請求的屬性, 冒號分割的鍵值對;每組屬性之間使用\n分隔;遇到空行表示Header部分結束
  • Body: 空行後面的內容都是Body. Body允許爲空字符串. 如果Body存在, 則在Header中會有一個ContentLength屬性來標識Body的長度; 如果服務器返回了一個html頁面, 那麼html頁面內容就是在body中

HTTP常見Header

  • Content-Type: 數據類型(text/html等)
  • Content-Length: Body的長度
  • Host:客戶端告知服務器, 所請求的資源是在哪個主機的哪個端口上;
  • User-Agent: 聲明用戶的操作系統和瀏覽器版本信息;
  • referer:當前頁面是從哪個頁面跳轉過來的;
  • location: 搭配3xx狀態碼使用, 告訴客戶端接下來要去哪裏訪問;
  • Cookie: 用於在客戶端存儲少量信息. 通常用於實現會話(session)的功能

七、Cookie和Session

我們還記得訪問郵箱什麼的,有個兩週免登陸的功能嗎?
在這裏插入圖片描述
我們連接服務器的時候,服務器怎麼知道我們原來登錄過呢?要知道我們的IP地址是動態的,開關機一次就更換一次,那服務器怎麼還能認識到我們登陸過呢?這就要靠我們的Cookie了,當我們登錄完成後,服務器就會在本地生成一個Cookie文件,用於保存我們的登錄信息,當我們訪問網站的時候,網站會先看看我們的cookie,看是否存在信息。當然cookie不僅僅只用於登錄,也可以記錄偏好什麼的。【也就是說,cookie存在我們本地,瀏覽器關閉了,還能保存】

當我們登錄完成後,像淘寶那樣,右上角顯示我們的用戶名,在我們訪問商品跳轉到別的頁面爲什麼登錄信息還在呢?這就是靠Session了,服務器會爲每個用戶創建一個session來保存登陸的信息,【這個是存在於服務器的,它存在的時間是取決於服務器的,一般30分鐘】

發佈了42 篇原創文章 · 獲贊 12 · 訪問量 3349
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章