網絡協議:透徹解析HTTP協議

本篇內容包括:HTTP 協議定義及其特點概述、關于 URL 定義及分類概述、Request 請求、Response 響應 以及 瀏覽器訪問一個網站的全過程 等內容…

一、HTTP 協議概述

HTTP(HyperText Transfer Protocol) 即 超文本傳輸協議,它是一種用于分布式、協作式和超媒體信息系統的應用層協議。HTTP 是萬維網(www)的數據通信的基礎。

HTTP 作為一個應用層協議,它由請求和響應兩部分構成,是一個標準的個客戶端和服務器模型,它的主要特點:支持客戶端/服務器模型、簡單快速、靈活、無連接、無狀態

1、簡單快速

客戶端向服務器發送服務請求時,只需傳路徑和請求方法。請求方法包括有 GET、POST、HEAD 等。每種方法規定了客戶端與服務器聯系的不同類型。由于 HTTP 協議簡單,使得 HTTP 服務器的程序規模小,因而通信速度很快

2、靈活

HTTP 允許傳輸任意類型的數據對象,正在傳輸的類型由 Content-Type 加以標記,最常見的 4 種 Content-Type 的取值如下:

  • application/x-www-form-urlencoded(常見的 form 提交):最常見 POST 提交數據的方式。瀏覽器的原生 form 表單,如果不設置 enctype 屬性,那么最終就會以此鐘方式提交數據
  • multipart/form-data(文件提交):另一種非常常見的 POST 數據提交的方式。我們在使用表單上傳文件時,必須讓 form 的 enctyped 等于這個值
  • application/json(提交 json 格式的數據):現在越來越多的人把它作為請求頭,用來告訴服務端消息主體是序列化后的 JSON 字符串。由于 JSON 規范的流行,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify,服務端語言也都有處理 JSON 的函數,使用 JSON 不會遇上什么麻煩
  • text/xml(提交 xml 格式的數據) :XML-RPC(XML Remote Procedure Call)。它是一種使用 HTTP 作為傳輸協議,XML 作為編碼方式的遠程調用規范

3、無連接

無連接的含義是限制每次連接只處理一個請求,服務器處理完客戶端的請求,然后響應,并收到應答之后,就斷開連接,這種方式可以節省傳輸時間。

4、無狀態

HTTP 協議是無狀態協議,無狀態是指協議對于事務處理沒有記憶能力,這種方式的一個壞處就是,如果后續的處理需要用到之前的信息,則必須要重傳,這樣就導致了每次連接傳輸的數據量增大。好處就是,如果后續的連接不需要之前提供的信息,響應就會比較快。而為了解決 HTTP 的無狀態特性,出現了 CookieSession 技術.


二、關于 URL

1、URL 概述

URL(Uniform Resource Locator),即 統一資源定位器,是因特網的萬維網服務程序上用于指定信息位置的表示方法。在萬維網(www)上,每一信息資源都有統一的且在網上唯一的地址,該地址就叫 URL,它是 www 的統一資源定位標志,就是指網絡地址(就是我們俗稱的網址)。

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

2、URL 結構組成

URL由三部分組成:資源類型、存放資源的主機域名、資源文件名。也可認為由4部分組成:協議、主機、端口、路徑。

http://host[:port]/[a_path]
http://IP(主機名/域名):端口/訪問的資源路徑
  • http 表示要通過 HTTP 協議來定位網絡資源;
  • host 表示合法的 Internet 主機域名或者IP地址;
  • port 指定一個端口號,端口號為空則使用缺省端口 80;
  • a_path 指定請求資源的 URl;如果 URL 中沒有給出 a_path,那么當它作為請求 URl 時,必須以 “/” 的形式給出,通常這個工作瀏覽器自動幫我們完成。

三、Request 請求

Request 請求:

  • 作用:獲取瀏覽器發送過來的數據,
  • 組成部分:請求行 請求頭 請求體
  • 請求格式:請求方式 請求資源 協議/版本
  • 請求例子:GET /test/row?username=root&password=1234 HTTP/1.1

1、報文頭的屬性

下面是一個請求的報文:

image-20221108132247655

其中:

  • ① 是請求方法,GET 和 POST 是最常見的 HTTP 方法,除此以外還包括 DELETE、HEAD、OPTIONS、PUT、TRACE。不過,當前的大多數瀏覽器只支持 GET 和 POST
  • ② 為請求對應的 URL 地址,它和報文頭的Host屬性組成完整的請求URL,
  • ③ 是協議名稱及版本號。
  • ④ 是 HTTP 的報文頭,報文頭包含若干個屬性,格式為“屬性名:屬性值”,服務端據此獲取客戶端的信息。
  • ⑤ 是報文體,它將一個頁面表單中的組件值通過 param1=value1&param2=value2 的鍵值對形式編碼成一個格式化串,它承載多個請求參數的數據。不但報文體可以傳遞請求參數,請求 URL也可以通過類似于 /chapter15/user.html? param1=value1&param2=value2 的方式傳遞請求參數。

常見的報文頭的屬性:

字段說明示例
Accept可接收的響應內容類型Accept:text/plain (文本類型)
Accept-Charset可接收的字符集Accept-Charset: utf-8
Accept-Encoding可接受的響應內容的編碼方式Accept-Encoding: gzip, deflate
Accept-Language可接受的響應內容語言列表Accept-Language: en-US
Accept-Datetime可接受的按照時間來表示的響應內容版本Accept-Datetime: Oct, 26 Oct 2022 13:31:00 GMT
AuthorizationHTTP協議中需要認證資源的認證信息Authorization: Basic OSdjJGRpbjpvcGVuIANlc2SdDE==
Cache-Control請求/回復中的,是否使用緩存機制Cache-Control: no-cache
Connection客戶端想要優先使用的連接類型Connection: keep-alive Connection: Upgrade
Content-Length以8進制表示的請求體的長度Content-Length: 348
Content-Type請求體的MIME類型Content-Type: application/x-www-form-urlencoded
Date發送該消息的日期和時間Date: Oct, 26 Oct 2022 13:31:00 GMT
Expect表示客戶端要求服務器做出特定的行為Expect: 100-continue
From發起此請求的用戶的郵件地址From: user@qq.com
Host服務器域名和端口號,默認端口可省略Host: www.baidu.com:80 or www.baidu.com
If-Match主要用于PUT,實體匹配才可以操作If-Match: “9jd00cdj34pss9ejqiw39d82f20d0ikd”
If-Modified-Since資源未被修改的情況下返回304未修改If-Modified-Since: Dec, 26 Dec 2015 17:30:00 GMT
User-Agent瀏覽器的身份標識字符串User-Agent: Mozilla/

2、報文的方法

# GET

GET 請求是最常見的一種請求方式,當客戶端要從服務器中讀取文檔時,當點擊網頁上的鏈接或者通過在瀏覽器的地址欄輸入網址來瀏覽網頁的,使用的都是GET方式。

GET方法要求服務器將URL定位的資源放在響應報文的數據部分,回送給客戶端。GET方法請求參數和對應的值附加在URL后面,利用一個?代表URL的結尾以及附帶參數的開始,參數用key=value鍵值對的方式書寫,參數和參數之間用&符號隔開.一般GET請求的參數的大小受限,最大不超過1024.由于參數明文的顯示在了URL上面,因此不太適合傳遞私密的數據.

# POST

對于上面提到的不適合使用 GET 方式的情況,可以考慮使用 POST 方式,因為使用 POST 方法可以允許客戶端給服務器提供信息較多

POST 方法將請求參數封裝在 HTT P請求數據中,以名稱/值的形式出現,可以傳輸大量數據,這樣 POST 方式對傳送的數據大小沒有限制,而且也不會顯示在 URL 中

# GET和POST的區別

  • 在參數傳遞上,GET 請求的參數是直接拼接在地址欄URL的后面,而 POST 請求的參數是放到請求體里面的
  • 在長度限制上,GET 請求有具體的長度限制,即一般不超過1024KB,而 POST 理論上沒有,界限取決于瀏覽器限制
  • 在安全角度上。GET 請求因為數據都是明文顯示在 URL 上面的,所以 GET 安全和私密性不如 POST
  • 總的來說,GET 和 POST 都是 TCP 連接,并無實質的區別,但是由于 HTTP 瀏覽器的限定,導致它們在應用過程中體現出了一些不同,GET 產生一個數據包,POST 產生兩個數據包
    • 對于 GET 請求,瀏覽器會把 header 和 data 一并發出去,服務器響應 200(返回數據).
    • 對于 POST 請求,瀏覽器先發送 header,服務器響應 100 continue,瀏覽器再發送 data,服務器響應 200 ok

# HEAD

HEAD 就像 GET,只不過服務端接受到 HEAD 請求后只返回響應頭,而不會發送響應內容。當我們需要查看某個頁面的狀態的時候,使用 HEAD 是非常高效的,因為在傳輸的過程中省去了響應內容部分。

Ps1:HTTP是無狀態的面向連接的協議,無狀態不代表HTTP不能保持TCP連接,HTTP使用的不是UDP協議(無連接)

Ps2:從HTTP/1.1起,默認都開啟了Keep-Alive,保持連接特性,簡單地說,當一個網頁打開完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接

Ps3:Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務器軟件(如Apache)中設定這個時間


四、Response 響應

HTTP 協議定義了 web 客戶端如何從 web 服務器請求頁面,以及服務器如何把頁面傳送給客戶端。

HTTP協議采用了 請求/響應 模型,即客戶端向服務器發送一個請求報文(請求報文包括請求的方法、url、協議版本,請求頭部和請求數據),服務器以一個響應狀態行作為響應(響應的內容包括協議的版本、成功或者錯誤代碼、服務器信息、響應頭部和響應數據)

  • 作用:接收到請求之后,服務器向瀏覽器寫回數據
  • 組成部分:響應行 響應頭 空行 響應體
  • 響應行:協議/版本 狀態碼 狀態碼說明

1、HTTP 響應構成

HTTP 響應是由四部分構成: 響應行 響應頭 空行 響應體

  1. 響應行(狀態行):由 HTTP/1.1(協議版本) 200(狀態碼) OK(狀態碼的描述) 構成
  2. 響應頭:由一些鍵值對構成,用來說明客戶端要使用的一些附加信息
  3. 空行:響應頭后面的空行時必須的
  4. 響應體(響應正文):服務器返回給客戶端的文本信息

2、常見響應狀態碼

  • 1xx:已發送請求
  • 2xx:已完成響應:200:正常響應;
  • 3xx:還需瀏覽器進一步操作:302:重定向 配合響應頭:location;304:讀緩存
  • 4xx:用戶操作錯誤:404:用戶操作錯誤;405:訪問的方法不存在
  • 5xx:服務器錯誤:500:內部異常

五、瀏覽器訪問一個網站的全過程

當我們使用瀏覽器訪問一個網站時,其實是基于 HTTP 協議,瀏覽器作為客戶端向服務器端發送一次請求,而服務器端在接收到這次請求后,給瀏覽器反饋一個響應。下面是具體的過程:

  1. 當用戶訪問一個網站時,首先輸入訪問的 URL,先通過 DNS 進行域名解析,將域名解析成對應的 IP 地址
  2. 經過解析之后,瀏覽器會發起一個 TCP 的連接請求
  3. 服務器接受請求后,通過三次握手建立連接
  4. 客戶端在確認建立連接成功后,向服務端發送 HTTP 請求格式的數據包
  5. 服務器端解析 HTTP 數據包,執行用戶的這次請求并生成一個 HTTP 響應格式的數據包,發送給客戶端
  6. 瀏覽器在收到服務器端的數據包之后再進行解析,再通過 HTML 格式呈現給用戶
  7. 客戶端再通過四次握手釋放連接

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535476.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535476.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535476.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle參數文件和口令文件

外部 審核 口令:記錄超級用戶的用戶名和口令,做sys用戶的安全審核 oracle9以后全部使用sys登錄,但需要使用as sysdba ,之前版本需要使用internal o7字典打開 只要用戶和密碼存在于口令文件,就可以以sysdba登錄&#…

innobackup備份恢復實操步驟--gtid復制(1)(1)

首先在主庫進行備份: 備份命令: Innobackupex --defaults-file/app/dbcluster/sgrdb/mysql/my19103.cnf --no-timestamp --userdbscale --passwordS6000dbscale --host10.157.43.224 --port19103 /data/backup 如果使用setsid: setsid …

Redis系列:Redis的概述與安裝

Redis(Remote Dictionary Server) 是一個使用 C 語言編寫的,開源的(BSD許可)高性能非關系型(NoSQL)的鍵值對數據庫。 本篇內容包括:Redis 簡介(為什么快?為什么單線程?優…

安裝LibreOffice和字體

#/bin/bash # Check if user is root if [ $(id -u) ! "0" ]; thenecho "Error: You must be root to run this script, please use root"exit 1 fi echo 安裝LibreOffice cd /home/ tar -zxvf LibreOffice_6.3.3_Linux_x86-64_rpm.tar.gz cd /home/LibreO…

xtrabackup備份腳本

#!/bin/sh #備份主機 remote_ip100.0.132.160 Master_ip100.20.132.158 VIP100.20.132.166 #備份用戶 userroot #密碼 password00000 # 返回年月日 backup_datedate %F # 返回時分秒 backup_timedate %H-%M-%S # 返回今天是這周的第幾天 backup_week_daydate %u backup_ok0 #備…

Redis系列:使用Redis實現分布式鎖及相關問題

分布式鎖其實就是,控制分布式系統不同進程共同訪問共享資源的一種鎖的實現。如果不同的系統或同一個系統的不同主機之間共享了某個臨界資源,往往需要互斥來防止彼此干擾,以保證一致性。 本篇內容包括:關于 Redis 與 分布式鎖&…

Redis系列:Redis持久化機制與Redis事務

Redis 是個基于內存的數據庫。那服務一旦宕機,內存中數據必將全部丟失。所以丟失數據的恢復對于 Redis 是十分重要的,我們首先想到是可以從數據庫中恢復,但是在由 Redis 宕機時(說明相關工作正在運行)且數據量很大情況…

Java基礎:Java程序設計環境

按應用范圍,Java 可分為 3 個體系,即 Java SE、Java EE 和 Java ME。Java 語言的開發運行,也離不開 Java 語言的運行環境 JRE。沒有 JRE 的支持,Java 語言便無法運行。當然,如果還想編譯 Java 程序,搞搞小開…

負載均衡策略

輪循均衡(Round Robin):每一次來自網絡的請求輪流分配給內部中的服務器,從1至N然后重新開始。此種均衡算法適合于服務器組中的所有服務器都有相同的軟硬件配置并且平均服務請求相對均衡的情況。 我們的業務web服務器都是同樣配置…

Java基礎:Java數據類型

Java 是一種強類型語言,這就意味著必須為每一個變量聲明一種類型。在 Java 中基本數據類型共有 8 種,包括 4 種整型、2 種浮點型、1 種用于表現 Unicode 編碼的字符單元的字符類型 char 和一種用于表示真值的 boolean 類型 ~ 本篇主要記錄內容包括&#…

TCP連接的建立與終止

TCP連接的建立與終止 1.三次握手 TCP是面向連接的,無論哪一方向另一方發送數據之前,都必須先在雙方之間建立一條連接。在TCP/IP協議中,TCP協議提供可靠的連接服務,連接是通過三次握手進行初始化的。三次握手的目的是同步連接雙方…

日常問題:MySQL排序字段數據相同不能分頁問題

【問題日期】 2022-11-14 22:45:12 【問題描述】 MySQL 排序字段數據相同不能分頁問題:在分頁查詢數據時,按創建時間排序,由于數據是批量創建的,導致部分數據創建時間一樣,而此時分頁查詢數據,翻頁后出現…

數據缺失值處理

數據缺失值處理 In [1]: import pandas as pd import numpy as np from sklearn.ensemble import RandomForestRegressor,RandomForestClassifier from sklearn.preprocessing import StandardScaler from sklearn.impute import SimpleImputer In [2]: df pd.DataFrame() df[…

Java基礎:Java數字類型

Java 中包含多種運算符:算數運算符、關系運算符、邏輯運算符、位運算符。在 Math 類中,包含了各種各樣的數學函數。在編寫不同類別的程序時,可能需要的函數也不同。要生成一個隨機數,可以使用 Random 對象。 ~ 本篇主要…

Java基礎:Java流程控制

塊(即復合語句)是指由一對大括號括起來的若干條簡單的 Java 語句。塊確定了變量的作用域。一個塊可以嵌套在另一個塊中。但是,不能在嵌套的兩個塊中聲明同名的變量。使用塊(有時稱為復合語句)可以在Java程序結構中原本…

Java基礎:Java類與對象

面向對象程序設計(簡稱OOP)是當今主流的程序設計范型,它已經取代了20世紀70年代的“結構化”過程化程序設計開發技術。Java是完全面向對象的,必須熟悉OOP才能夠編寫Java程序。面向對象的程序是由對象組成的,每個對象包…

SVN備份腳本

#!/bin/bash #svn全量備份腳本 wwytcode_path/home/wwytcode/project backup_path/home/bak Datedate %Y%m%d cd $backup_path echo date >> $back_path/svn_backup.log svnversionsvnlook youngest $wwytcode_path svnadmin dump --revision 0:$svnversion $wwytcode_pa…

Java基礎:Java面向對象

面向過程的優點是性能比面向對象高,不需要面向對象的實例化;缺點是不容易維護、復用和擴展。面向對象的優點是具有封裝、繼承、多態的特性,因而容易維護、復用和擴展,可以設計出低耦合的系統;缺點是由于需要實例化對象…

薪資生成

import openpyxl from openpyxl.styles import Font,Alignment,Side,Border#設置字體樣式 fontFont(name宋體,size20,boldTrue) font2Font(name宋體,size12,boldTrue) alignmentAlignment(horizontalcenter,verticalcenter,wrap_textTrue) sideSide(stylethin ,color000000) …

Java基礎:Java抽象接口

在Java中,一個沒有方法體的方法應該定義為抽象方法,而如果一個類中含有抽象方法,則該類必須定義為一個抽象類。接口是功能的集合,同樣可看做是一種特殊的數據類型,是比抽象類更為抽象的類,接口只描述所應該…