Http協議詳解



Http協議詳解

思考:

用戶打開一個瀏覽器,輸入網址,向服務端發送數據,那么這個數據該如何發送呢?

若每個網站都有自己的規則,整個互聯網就亂套了,而且用戶訪問也不是很方便,每個網站都要開發屬於自己的客戶端軟件,致使運營成本變大。

所以,必須有一個統一的規則,讓大家發送數據或接受數據有一個依據,於是,HTTP協議由此而來。

一、HTTP協議介紹

1.HTTP協議簡介

HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於萬維網(WWW:World Wide Web )服務器與本地瀏覽器之間傳輸超文本的傳送協議。

HTTP是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分布式超媒體信息系統。它於1990年提出,經過幾年的使用與發展,得到不斷地完善和擴展。HTTP協議工作於客戶端-服務端架構為上。瀏覽器作為HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求。Web服務器根據接收到的請求后,向客戶端發送響應信息。

image-20200924172049937

使用HTTP協議,每當有新的請求發送時,就會有對應的新響應產 生。協議本身並不保留之前一切的請求或響應報文的信息。這是為了更快地處理大量事務,確保協議的可伸縮性,而特意把HTTP協議設計成 如此簡單的。可是,隨着Web的不斷發展,因無狀態而導致業務處理變得棘手 的情況增多了。比如,用戶登錄到一家購物網站,即使他跳轉到該站的 其他頁面后,也需要能繼續保持登錄狀態。針對這個實例,網站為了能 夠掌握是誰送出的請求,需要保存用戶的狀態。HTTP/1.1雖然是無狀態協議,但為了實現期望的保持狀態功能, 於是引入了Cookie技術。有了Cookie再用HTTP協議通信,就可以管 理狀態了。有關cookie的詳細內容我們后面講解。

2.什么是HTTP協議

  • 超文本傳輸協議, 規定了瀏覽器與服務端之間數據交互的格式
  • 將瀏覽器作為HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求。
  • 如果服務端不遵循該協議,那就要自己開發一個客戶端,讓用戶下載的的web應用,通過web應用訪問,否則,用戶通過瀏覽器是無法你的web應用的。

二、HTTP協議四大特性

1.基於TCP/IP協議之上的應用層協議

2.基於請求-響應模式

HTTP協議規定:請求從客戶端發出,最后服務端響應客戶端請求並返回

也是就說,用戶訪問數據先從客戶端開始建立通信的,服務端在沒收到請求之前不會發送數據並響應客戶端。

image-20200924172118199

3.無狀態保存:不保存用戶信息狀態

HTTP是一種不保存狀態,即無狀態(stateless)協議。HTTP協議 自身不對請求和響應之間的通信狀態進行保存。也就是說在HTTP這個級別,協議對於發送過的請求或響應都不做持久化處理

總結:見你千百遍,我始終待你如初戀。

image-20200924172149501

使用HTTP協議,每當有新的請求發送時,就會有對應的新響應產 生。協議本身並不保留之前一切的請求或響應報文的信息。

作用:

  • 為了更快地處理大量事務,確保協議的可伸縮性,而特意把HTTP協議設計成 如此簡單的。

問題:

  • 隨着Web的不斷發展,因無狀態而導致業務處理變得棘手 的情況增多了
  • 比如,用戶登錄到一家購物網站,即使他跳轉到該站的 其他頁面后,也需要能繼續保持登錄狀態。針對這個實例,網站為了能 夠掌握是誰送出的請求,需要保存用戶的狀態。那怎樣實現

解決:

  • HTTP/1.1雖然是無狀態協議,但為了實現期望的保持狀態功能, 於是引入了Cookie技術
  • 有了Cookie再用HTTP協議通信,就可以管 理狀態了。

4.無(短)連接

無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答后,即斷開連接。即:客戶端請求一次服務端就響應一次, 之后就沒有任何關系。

作用:采用這種方式可以節省傳輸時間。

解決方案:

  • 后面可以用websocket可以實現長連接,可以讓雙方建立連接后默認不斷開連接(QQ、微信聊天采用的就是這種)

三、HTTP請求協議與響應協議

HTTP協議既然規定了客戶端與服務端之間的通信格式,http協議包含由瀏覽器發送數據到服務器需要遵循的請求協議與服務器發送數據到瀏覽器需要遵循的請求協議。

那HTTP協議是怎么規定消息格式的呢?

首先我們來手擼一個socket服務端

簡單socket服務端:

import socket

server = socket.socket()  # 默認就是基於網絡的TCP協議
server.bind(("127.0.0.1", 8888))
server.listen(5)
while True:
    conn, addr = server.accept()
    data = conn.recv(1024)
    print(data)  # 將請求數據的打印出來
    conn.send(b"ok")
    conn.close()

然后將socket服務端運行起來看看,在瀏覽器URL輸入:127.0.0.1:8888,socket服務端會受到如下數據:

b'GET / HTTP/1.1\r\n              ## 請求首行
Host: 127.0.0.1:8080\r\n          ## 請求頭 (下面都是,一大堆的K:V鍵值對)
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3823.400 QQBrowser/10.7.4307.400\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
Cookie: csrftoken=WCzjKvmjOSdJbYKs0uIfPtiFfLl04FENb6p9CjypP7ZObcUpydaQPLZN0qPOVqwj\r\n
\r\n'     ## 換行
b''       ## 請求體

  • 用於HTTP協議交互的信被為HTTP報文。請求端(客戶端)的HTTP報文 做請求報文,響應端(服務器端)的 做響應報文。
  • HTTP報文本身是由多行數據構成的字文本。

image-20200924172222493

然后我們再來訪問一下CSDN, 查看瀏覽器收到的相應數據 : 在網頁中鼠標右擊檢查---->Network---->點擊當前網頁的網址---->Headers----->查看 Response Headers

image-20210315192622788

1.請求協議

1.1 請求格式

image-20200924172250257

HTTP GET方法的請求格式
  • 格式說明:
// 請求首行 : 請求方法, 協議版本...
// 請求頭 : 一大堆的 k:v 鍵值對
// 空行 \r\n : 用來標識作用
// 請求體 : 並不是所有的請求方法都有, 只要用來攜帶敏感性數據(get沒有,post有)

img

  • 請求方式:

    1. "get" 請求 : 朝服務端索要數據 (例 : 輸入網址獲取對應的內容)
    2. "post" 請求 : 朝服務端提交數據 (例 : 登入,輸入用戶名密碼,提交到服務端進行校驗)
  • get 與 post 的區別

    1. 都可以攜帶額外的參數 : 
        // GET 提交的數據會放在URL之后,以"?"分割URL和傳輸數據,參數之間以"&"相連
        // POST方法是把提交的數據放在HTTP包的請求體(Body)中.
    2. 提交的數據大小限制 : 
        // 瀏覽器對URL長度有限制, 所以GET提交的數據大小有限制
        // POST方法沒有數據大小限制
    3. 數據的安全性 : 
        // GET方式提交數據, 會帶來安全問題, 比如一個登錄頁面, 通過GET方式提交數據時, 用戶名和密碼將出現在URL上
        // 如果頁面可以被緩存或者其他人可以訪問這台機器, 就可以從歷史記錄獲得該用戶的賬號和密碼
    
    

2.HTTP響應

服務器收到了客戶端發來的HTTP請求后,根據HTTP請求中的動作要求,服務端做出具體的動作,將結果回應給客戶端,稱為HTTP響應。

2.1 請求格式

image-20200924172428894

格式說明
// 響應首行 : 響應狀態碼, 協議版本....
// 響應頭 : 一大堆 k:v 鍵值對
// 空行 \r\n : 用來標識作用
// 響應體 : 響應正文, 展示給用戶的數據

img

  • HTTP響應由三部分組成:狀態行、響應頭、響應正文;
  • 狀態行:包括協議版本Version、狀態碼Status Code、回應短語;
  • 響應頭(server header):包括搭建服務器的軟件,發送響應的時間,回應數據的格式等信息,包含HTTP狀態碼 (HTTP Status Code) ;
  • 響應正文:就是響應的具體數據。
響應狀態碼說明:

HTTP狀態碼由三個十進制數字組成,第一個十進制數字定義了狀態碼的類型,后兩個數字有分類的作用。不同的狀態碼代表不同的含義。

image-20200924172516228

// 用簡單的數字來表示一串中文意思(狀態或者描述性信息)
1XX : 1開頭的,服務端已經接受到你的數據正在處理,你可以繼續提交
2XX : 200 OK>>> : 請求成功
3XX : 重定向(當你在訪問一個需要登陸之后才能看的頁面你會發現會自動跳轉到登陸頁面)
4XX : 403當前請求不符合條件(沒有權限), 404請求資源不存在
5XX : 服務器內部錯誤,無法完成請求

ps : 除了上面提到的響應碼之外, 公司內部還會自定義自己的狀態碼, 一般1000以后

更多參考CSDN博客

四、URL 統一資源定位符

統一資源定位符是對可以從互聯網上得到的資源的位置和訪問方法的一種簡潔的表示,是互聯網上標准資源的地址。互聯網上的每個文件都有一個唯一的URL,它包含的信息指出文件的位置以及瀏覽器應該怎么處理它

格式:

協議://IP:端口(80)/路徑?name=lqz&age=18

?之前的是請求路徑,?之后的是請求數據部分

形式 : scheme:[//[user:password@]host[:port]][/]path[?query-string][#anchor]

提示 : 方框內的是可選部分

  • scheme :協議(例如:http, https, ftp)
  • user : password@用戶的登錄名以及密碼
  • host :服務器的IP地址或者域名
  • port :服務器的端口(如果是走協議默認端口,http 80 or https 443)
  • path :訪問資源的路徑
  • query-string :參數,它通常使用鍵值對來制定發送給http服務器的數據
  • anchor :錨(跳轉到網頁的指定錨點位置)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM