網(wǎng)站首頁 編程語言 正文
HTTP協(xié)議簡介
超文本傳輸協(xié)議(英文:HyperText Transfer Protocol,縮寫:HTTP)是一種用于分布式、協(xié)作式和超媒體信息系統(tǒng)的應(yīng)用層協(xié)議。HTTP是萬維網(wǎng)的數(shù)據(jù)通信的基礎(chǔ)。
HTTP的發(fā)展是由蒂姆·伯納斯-李于1989年在歐洲核子研究組織(CERN)所發(fā)起。HTTP的標(biāo)準(zhǔn)制定由萬維網(wǎng)協(xié)會(World Wide Web Consortium,W3C)和互聯(lián)網(wǎng)工程任務(wù)組(Internet Engineering Task Force,IETF)進(jìn)行協(xié)調(diào),最終發(fā)布了一系列的RFC,其中最著名的是1999年6月公布的 RFC 2616,定義了HTTP協(xié)議中現(xiàn)今廣泛使用的一個版本——HTTP 1.1。
2014年12月,互聯(lián)網(wǎng)工程任務(wù)組(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小組將HTTP/2標(biāo)準(zhǔn)提議遞交至IESG進(jìn)行討論,于2015年2月17日被批準(zhǔn)。 HTTP/2標(biāo)準(zhǔn)于2015年5月以RFC 7540正式發(fā)表,取代HTTP 1.1成為HTTP的實(shí)現(xiàn)標(biāo)準(zhǔn)。
HTTP協(xié)議概述
HTTP是一個客戶端終端(用戶)和服務(wù)器端(網(wǎng)站)請求和應(yīng)答的標(biāo)準(zhǔn)(TCP)。通過使用網(wǎng)頁瀏覽器、網(wǎng)絡(luò)爬蟲或者其它的工具,客戶端發(fā)起一個HTTP請求到服務(wù)器上指定端口(默認(rèn)端口為80)。我們稱這個客戶端為用戶代理程序(user agent)。應(yīng)答的服務(wù)器上存儲著一些資源,比如HTML文件和圖像。我們稱這個應(yīng)答服務(wù)器為源服務(wù)器(origin server)。在用戶代理和源服務(wù)器中間可能存在多個“中間層”,比如代理服務(wù)器、網(wǎng)關(guān)或者隧道(tunnel)。
盡管TCP/IP協(xié)議是互聯(lián)網(wǎng)上最流行的應(yīng)用,HTTP協(xié)議中,并沒有規(guī)定必須使用它或它支持的層。事實(shí)上,HTTP可以在任何互聯(lián)網(wǎng)協(xié)議上,或其他網(wǎng)絡(luò)上實(shí)現(xiàn)。HTTP假定其下層協(xié)議提供可靠的傳輸。因此,任何能夠提供這種保證的協(xié)議都可以被其使用。因此也就是其在TCP/IP協(xié)議族使用TCP作為其傳輸層。
通常,由HTTP客戶端發(fā)起一個請求,創(chuàng)建一個到服務(wù)器指定端口(默認(rèn)是80端口)的TCP連接。HTTP服務(wù)器則在那個端口監(jiān)聽客戶端的請求。一旦收到請求,服務(wù)器會向客戶端返回一個狀態(tài),比如"HTTP/1.1 200 OK",以及返回的內(nèi)容,如請求的文件、錯誤消息、或者其它信息。
HTTP工作原理
HTTP協(xié)議定義Web客戶端如何從Web服務(wù)器請求Web頁面,以及服務(wù)器如何把Web頁面?zhèn)魉徒o客戶端。HTTP協(xié)議采用了請求/響應(yīng)模型。客戶端向服務(wù)器發(fā)送一個請求報(bào)文,請求報(bào)文包含請求的方法、URL、協(xié)議版本、請求頭部和請求數(shù)據(jù)。服務(wù)器以一個狀態(tài)行作為響應(yīng),響應(yīng)的內(nèi)容包括協(xié)議的版本、成功或者錯誤代碼、服務(wù)器信息、響應(yīng)頭部和響應(yīng)數(shù)據(jù)。
以下是 HTTP 請求/響應(yīng)的步驟:
- 1. 客戶端連接到Web服務(wù)器
一個HTTP客戶端,通常是瀏覽器,與Web服務(wù)器的HTTP端口(默認(rèn)為80)建立一個TCP套接字連接。例如,http://www.baidu.com/。 - 2. 發(fā)送HTTP請求
通過TCP套接字,客戶端向Web服務(wù)器發(fā)送一個文本的請求報(bào)文,一個請求報(bào)文由請求行、請求頭部、空行和請求數(shù)據(jù)4部分組成。 - 3. 服務(wù)器接受請求并返回HTTP響應(yīng)
Web服務(wù)器解析請求,定位請求資源。服務(wù)器將資源復(fù)本寫到TCP套接字,由客戶端讀取。一個響應(yīng)由狀態(tài)行、響應(yīng)頭部、空行和響應(yīng)數(shù)據(jù)4部分組成。 - 4. 釋放連接TCP連接
若connection 模式為close,則服務(wù)器主動關(guān)閉TCP連接,客戶端被動關(guān)閉連接,釋放TCP連接;若connection 模式為keepalive,則該連接會保持一段時間,在該時間內(nèi)可以繼續(xù)接收請求; - 5. 客戶端瀏覽器解析HTML內(nèi)容
客戶端瀏覽器首先解析狀態(tài)行,查看表明請求是否成功的狀態(tài)代碼。然后解析每一個響應(yīng)頭,響應(yīng)頭告知以下為若干字節(jié)的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應(yīng)數(shù)據(jù)HTML,根據(jù)HTML的語法對其進(jìn)行格式化,并在瀏覽器窗口中顯示。
例如:在瀏覽器地址欄鍵入U(xiǎn)RL,按下回車之后會經(jīng)歷以下流程:
- 瀏覽器向 DNS 服務(wù)器請求解析該 URL 中的域名所對應(yīng)的 IP 地址;
- 解析出 IP 地址后,根據(jù)該 IP 地址和默認(rèn)端口 80,和服務(wù)器建立TCP連接;
- 瀏覽器發(fā)出讀取文件(URL 中域名后面部分對應(yīng)的文件)的HTTP 請求,該請求報(bào)文作為 TCP 三次握手的第三個報(bào)文的數(shù)據(jù)發(fā)送給服務(wù)器;
- 服務(wù)器對瀏覽器請求作出響應(yīng),并把對應(yīng)的 html 文本發(fā)送給瀏覽器;
- 釋放 TCP連接;
- 瀏覽器將該 html 文本并顯示內(nèi)容;?
http協(xié)議是基于TCP/IP協(xié)議之上的應(yīng)用層協(xié)議。
基于 請求-響應(yīng) 的模式
HTTP協(xié)議規(guī)定,請求從客戶端發(fā)出,最后服務(wù)器端響應(yīng)該請求并 返回。換句話說,肯定是先從客戶端開始建立通信的,服務(wù)器端在沒有接收到請求之前不會發(fā)送響應(yīng)
無狀態(tài)保存
HTTP是一種不保存狀態(tài),即無狀態(tài)(stateless)協(xié)議。HTTP協(xié)議自身不對請求和響應(yīng)之間的通信狀態(tài)進(jìn)行保存。也就是說在HTTP這個級別,協(xié)議對于發(fā)送過的請求或響應(yīng)都不做持久化處理。
使用HTTP協(xié)議,每當(dāng)有新的請求發(fā)送時,就會有對應(yīng)的新響應(yīng)產(chǎn)生。協(xié)議本身并不保留之前一切的請求或響應(yīng)報(bào)文的信息。這是為了更快地處理大量事務(wù),確保協(xié)議的可伸縮性,而特意把HTTP協(xié)議設(shè)計(jì)成 如此簡單的。可是,隨著Web的不斷發(fā)展,因無狀態(tài)而導(dǎo)致業(yè)務(wù)處理變得棘手 的情況增多了。比如,用戶登錄到一家購物網(wǎng)站,即使他跳轉(zhuǎn)到該站的 其他頁面后,也需要能繼續(xù)保持登錄狀態(tài)。針對這個實(shí)例,網(wǎng)站為了能 夠掌握是誰送出的請求,需要保存用戶的狀態(tài)。HTTP/1.1雖然是無狀態(tài)協(xié)議,但為了實(shí)現(xiàn)期望的保持狀態(tài)功能, 于是引入了Cookie技術(shù)。有了Cookie再用HTTP協(xié)議通信,就可以管 理狀態(tài)了。有關(guān)Cookie的詳細(xì)內(nèi)容稍后講解。
無連接
無連接的含義是限制每次連接只處理一個請求。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時間,并且可以提高并發(fā)性能,不能和每個用戶建立長久的連接,請求一次相應(yīng)一次,服務(wù)端和客戶端就中斷了。但是無連接有兩種方式,早期的http協(xié)議是一個請求一個響應(yīng)之后,直接就斷開了,但是現(xiàn)在的http協(xié)議1.1版本不是直接就斷開了,而是等幾秒鐘,這幾秒鐘是等什么呢,等著用戶有后續(xù)的操作,如果用戶在這幾秒鐘之內(nèi)有新的請求,那么還是通過之前的連接通道來收發(fā)消息,如果過了這幾秒鐘用戶沒有發(fā)送新的請求,那么就會斷開連接,這樣可以提高效率,減少短時間內(nèi)建立連接的次數(shù),因?yàn)榻⑦B接也是耗時的,默認(rèn)的好像是3秒中現(xiàn)在,但是這個時間是可以通過咱們后端的代碼來調(diào)整的,自己網(wǎng)站根據(jù)自己網(wǎng)站用戶的行為來分析統(tǒng)計(jì)出一個最優(yōu)的等待時間。
HTTP請求方法
HTTP/1.1協(xié)議中共定義了八種方法(也叫“動作”)來以不同方式操作指定的資源:
GET
向指定的資源發(fā)出“顯示”請求。使用GET方法應(yīng)該只用在讀取數(shù)據(jù),而不應(yīng)當(dāng)被用于產(chǎn)生“副作用”的操作中,例如在Web Application中。其中一個原因是GET可能會被網(wǎng)絡(luò)蜘蛛等隨意訪問。
HEAD
與GET方法一樣,都是向服務(wù)器發(fā)出指定資源的請求。只不過服務(wù)器將不傳回資源的本文部分。它的好處在于,使用這個方法可以在不必傳輸全部內(nèi)容的情況下,就可以獲取其中“關(guān)于該資源的信息”(元信息或稱元數(shù)據(jù))。
POST
向指定資源提交數(shù)據(jù),請求服務(wù)器進(jìn)行處理(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請求本文中。這個請求可能會創(chuàng)建新的資源或修改現(xiàn)有資源,或二者皆有。
PUT
向指定資源位置上傳其最新內(nèi)容。
DELETE
請求服務(wù)器刪除Request-URI所標(biāo)識的資源。
TRACE
回顯服務(wù)器收到的請求,主要用于測試或診斷。
OPTIONS
這個方法可使服務(wù)器傳回該資源所支持的所有HTTP請求方法。用'*'來代替資源名稱,向Web服務(wù)器發(fā)送OPTIONS請求,可以測試服務(wù)器功能是否正常運(yùn)作。
CONNECT
HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。通常用于SSL加密服務(wù)器的鏈接(經(jīng)由非加密的HTTP代理服務(wù)器)。
注意事項(xiàng):
- 方法名稱是區(qū)分大小寫的。當(dāng)某個請求所針對的資源不支持對應(yīng)的請求方法的時候,服務(wù)器應(yīng)當(dāng)返回狀態(tài)碼405(Method Not Allowed),當(dāng)服務(wù)器不認(rèn)識或者不支持對應(yīng)的請求方法的時候,應(yīng)當(dāng)返回狀態(tài)碼501(Not Implemented)。
- HTTP服務(wù)器至少應(yīng)該實(shí)現(xiàn)GET和HEAD方法,其他方法都是可選的。當(dāng)然,所有的方法支持的實(shí)現(xiàn)都應(yīng)當(dāng)匹配下述的方法各自的語義定義。此外,除了上述方法,特定的HTTP服務(wù)器還能夠擴(kuò)展自定義的方法。例如PATCH(由 RFC 5789 指定的方法)用于將局部修改應(yīng)用到資源。
請求方式: get與post請求(通過form表單我們自己寫寫看)
- GET提交的數(shù)據(jù)會放在URL之后,也就是請求行里面,以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連,如EditBook?name=test1&id=123456.(請求頭里面那個content-type做的這種參數(shù)形式,后面講) POST方法是把提交的數(shù)據(jù)放在HTTP包的請求體中.
- GET提交的數(shù)據(jù)大小有限制(因?yàn)闉g覽器對URL的長度有限制),而POST方法提交的數(shù)據(jù)沒有限制.
- GET與POST請求在服務(wù)端獲取請求數(shù)據(jù)方式不同,就是我們自己在服務(wù)端取請求數(shù)據(jù)的時候的方式不同了,這句廢話昂。
HTTP狀態(tài)碼
所有HTTP響應(yīng)的第一行都是狀態(tài)行,依次是當(dāng)前HTTP版本號,3位數(shù)字組成的狀態(tài)代碼,以及描述狀態(tài)的短語,彼此由空格分隔。
狀態(tài)代碼的第一個數(shù)字代表當(dāng)前響應(yīng)的類型:
- 1xx消息——請求已被服務(wù)器接收,繼續(xù)處理
- 2xx成功——請求已成功被服務(wù)器接收、理解、并接受
- 3xx重定向——需要后續(xù)操作才能完成這一請求
- 4xx請求錯誤——請求含有詞法錯誤或者無法被執(zhí)行
- 5xx服務(wù)器錯誤——服務(wù)器在處理某個正確請求時發(fā)生錯誤
雖然 RFC 2616 中已經(jīng)推薦了描述狀態(tài)的短語,例如"200 OK","404 Not Found",但是WEB開發(fā)者仍然能夠自行決定采用何種短語,用以顯示本地化的狀態(tài)描述或者自定義信息。
URL
超文本傳輸協(xié)議(HTTP)的統(tǒng)一資源定位符將從因特網(wǎng)獲取信息的五個基本元素包括在一個簡單的地址中:
- 傳送協(xié)議。
- 層級URL標(biāo)記符號(為[//],固定不變)
- 訪問資源需要的憑證信息(可省略)
- 服務(wù)器。(通常為域名,有時為IP地址)
- 端口號。(以數(shù)字方式表示,若為HTTP的默認(rèn)值“:80”可省略)
- 路徑。(以“/”字符區(qū)別路徑中的每一個目錄名稱)
- 查詢。(GET模式的窗體參數(shù),以“?”字符為起點(diǎn),每個參數(shù)以“&”隔開,再以“=”分開參數(shù)名稱與數(shù)據(jù),通常以UTF8的URL編碼,避開字符沖突的問題)
- 片段。以“#”字符為起點(diǎn)
以http://www.luffycity.com:80/news/index.html?id=250&page=1 為例, 其中:
http,是協(xié)議;
www.luffycity.com,是服務(wù)器;
80,是服務(wù)器上的默認(rèn)網(wǎng)絡(luò)端口號,默認(rèn)不顯示;
/news/index.html,是路徑(URI:直接定位到對應(yīng)的資源);
?id=250&page=1,是查詢。
大多數(shù)網(wǎng)頁瀏覽器不要求用戶輸入網(wǎng)頁中“http://”的部分,因?yàn)榻^大多數(shù)網(wǎng)頁內(nèi)容是超文本傳輸協(xié)議文件。同樣,“80”是超文本傳輸協(xié)議文件的常用端口號,因此一般也不必寫明。一般來說用戶只要鍵入統(tǒng)一資源定位符的一部分(www.luffycity.com:80/news/index.html?id=250&page=1)就可以了。
由于超文本傳輸協(xié)議允許服務(wù)器將瀏覽器重定向到另一個網(wǎng)頁地址,因此許多服務(wù)器允許用戶省略網(wǎng)頁地址中的部分,比如 www。從技術(shù)上來說這樣省略后的網(wǎng)頁地址實(shí)際上是一個不同的網(wǎng)頁地址,瀏覽器本身無法決定這個新地址是否通,服務(wù)器必須完成重定向的任務(wù)。
HTTP請求格式(請求協(xié)議)
URL包含:/index/index2?a=1&b=2;路徑和參數(shù)都在這里。
請求頭里面的內(nèi)容舉個例子:這個length表示請求體里面的數(shù)據(jù)長度,其他的請求頭里面的這些鍵值對,陸續(xù)我們會講的,大概知道一下就可以了,其中有一個user-agent,算是需要你記住的吧,就是告訴你的服務(wù)端,我是用什么給你發(fā)送的請求。
以京東為例,看一下user-agent
看一個爬蟲的例子,爬京東的時候沒問題,但是爬抽屜的時候必須帶著user-agent,因?yàn)槌閷蠈ser-agent做了判斷,來判斷你是不是一個正常的請求,算是反扒機(jī)制的一種。
打開我們保存的demo.html文件,然后通過瀏覽器打開看看就能看到頁面效果。
寫上面這些內(nèi)容的意思是讓你知道有這么個請求頭的存在,有些是有意義的,請求頭我們還可以自己定義,就在requests模塊里面那個headers={},這個字典里面加就行。
HTTP響應(yīng)格式(響應(yīng)協(xié)議)
原文鏈接:https://www.cnblogs.com/an-wen/p/11180076.html
相關(guān)推薦
- 2022-01-10 npm一個錯誤 npm ERR code ENOENT npm ERR syscall open
- 2022-11-03 通過VS下載的NuGet包修改其下載存放路徑的操作方法_python
- 2023-06-19 C++開放封閉原則示例解析_C 語言
- 2022-02-13 如何寫一個自己的strcpy函數(shù)
- 2022-07-13 JMeter主要元件_線程組的使用方法
- 2022-06-02 Go語言中定時任務(wù)庫Cron使用方法介紹_Golang
- 2022-10-18 Qt實(shí)現(xiàn)TCP客戶端和服務(wù)器通訊程序_C 語言
- 2023-03-21 Mongodb?用戶權(quán)限管理及配置詳解_MongoDB
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支