HTTP是什么呢?它是超文本傳輸協(xié)議,HTTP是縮寫,它的全英文名是HyperText Transfer Protocol。
那么什么是超文本呢?
超文本指的是HTML,css,JavaScript和圖片等,HTTP的出現(xiàn)是為了接收和發(fā)布HTML頁面,經過不斷的發(fā)展也可以用于接收一些音頻,視頻,文件等內容。
HTTP協(xié)議是用于客戶端和服務器端之間的通信,用于客戶端和服務器端之間的通信有HTTP協(xié)議和TCP/IP協(xié)議族在內的其他眾多的協(xié)議。
請求訪問文本或圖片等資源的一方,我們叫做客戶端;負責接收,提供響應的一方稱為服務器端。
Client客戶端請求Server服務端,Server服務端響應給Client客戶端。HTTP是基于客戶端/服務端的架構模型,瀏覽器或其他任何客戶端都可以用HTTP協(xié)議的,通過URL地址向HTTP的服務器即Web服務器發(fā)送所有請求,Web服務器端在接收到請求后會做出反應,響應給對方,就是向客戶端回傳響應的信息。
《圖解HTTP》
注意:在使用HTTP協(xié)議的時候,我們一端必定是客戶端,另一端必定是服務器端。
有時候服務端和客戶端是可以互換的,如果要決定誰是服務器端和誰是客戶端,單就一條通信路線來講,是可以確定的,因為由HTTP協(xié)議就可以區(qū)分誰是客戶端,和誰是服務器端了。
通過發(fā)送信息(請求)和回應信息(響應)
通過發(fā)送信息(請求)和回應信息(響應)達成交易(通信)
通過請求和響應的交互達成通信,客戶端發(fā)送請求給服務器,服務器響應回復給客戶端。客戶端是發(fā)出請求的,服務器端是回復響應的。
先是從客戶端開始建立通信的,因為在服務器在沒有接受到請求前是不會發(fā)送響應的。
HTTP的特點:
支持客戶端、服務器端模式,簡單快速,客戶端向服務器端請求服務時,只需傳送請求方法和路徑,靈活,HTTP允許傳輸任意類型的數(shù)據(jù)對象,無連接,限制每次連接只處理一個請求,無狀態(tài),HTTP協(xié)議是無狀態(tài)協(xié)議,指明協(xié)議對于事務處理沒有記憶能力。
HTTP都是由客戶端發(fā)起請求的,并且由服務器端回應響應消息的。
靈活,我們知道允許可以任何類型的數(shù)據(jù)對象,包括音頻,視頻,圖片,文件等等。
無狀態(tài),HTTP就是說,每次HTTP請求都是獨立的,任何兩個請求之間沒有必然的聯(lián)系。
無連接的,每次服務器在處理完客戶端的請求后,并收到客戶的應答后,就斷開了通信,當客戶端再次發(fā)送請求時就是一個新的連接,采用這種方式可以節(jié)省傳輸時間。
這是HTTP/1.0版的主要缺點,每個TCP連接只能發(fā)送一個請求,發(fā)送數(shù)據(jù)完畢后,連接就關閉了,如果還要請求就必須要新建一個請求連接。
HTTP是一種不保存狀態(tài),無狀態(tài)協(xié)議,協(xié)議對于發(fā)送過來的請求或是響應都不做持久化處理。
HTTP1.1雖然是無狀態(tài)協(xié)議,但是為了實現(xiàn)期望的保持狀態(tài)功能,于是引入了Cookie技術,有了Cookie,和HTTP協(xié)議通信,就可以管理狀態(tài)了。
TCP連接的新建成本很高,因為需要客戶端和服務器端三次握手。
交流的簡單流程:客戶端發(fā)起連接,客戶端發(fā)起請求,服務器端響應請求,服務器端關閉連接。
HTTP、1.1版本是最流行的版本,可以持久連接,TCP連接默認不關閉,可以被多個請求復用,只有在一段時間內,沒有請求,就可以自動關閉。
// 不用聲明:
HTTP的消息結構
我們可以把HTTP協(xié)議當做是一種客戶端和服務器端相互溝通交流的語言,一個HTTP客戶端在向服務器發(fā)送請求時會攜帶請求的消息,服務器端會根據(jù)客戶端發(fā)送過來的請求消息了解客戶端的需求,從而服務器端做出響應,發(fā)送響應消息給客戶端。
請求消息的結構:
一個請求消息是由請求行,請求頭字段,一個空行和消息主體構成。
消息主體是響應消息的承載數(shù)據(jù)。
客戶端:****發(fā)送請求
客戶端發(fā)送給某個HTTP服務器端的請求報文中的內容
GET/HTTP/1.1
服務器:****發(fā)送響應
HTTP/1.1 200 OK
GET,Request Method,請求方法,Request URL,為請求的url的地址,Status Code為狀態(tài)碼,Remote Address為地址。
HTTP是基于TCP/IP協(xié)議的應用層協(xié)議,不涉及數(shù)據(jù)包傳輸,規(guī)定了客戶端和服務器端之間的通信方式,默認使用80端口,就如同他倆交流的語言。
HTTP1.0的發(fā)布,任何格式的內容都可以發(fā)送了,不僅可以發(fā)送文件,圖片,視頻,二進制文件等。
HTTP發(fā)送請求的例子:
服務器回應消息格式:
響應頭:
Server為服務器的名稱,Location為通知客戶端新的資源位置,Content-Type響應數(shù)據(jù)的類型,Content-Encoding為響應數(shù)據(jù)的編碼格式。
頭部信息回應的是ASCII碼,后面的數(shù)據(jù)可以是任何形式,服務器返回信息的時候,告訴客戶端數(shù)據(jù)是什么格式的,由Content-Type字段體現(xiàn)。
Content-Type的字段值:
text/plain
分析一下就是,協(xié)議版本,狀態(tài)碼,狀態(tài)描述。
在尾部使用分號,添加參數(shù),類型表示,發(fā)送的是網頁,編碼為utf-8
Content-Type: text/html; charset=utf-8
Accept字段聲明自己可以接受哪些數(shù)據(jù)格式:
Accept: */*
請求消息:
GET /index.htm HTTP/1.1
Accept為客戶端接受哪些Mine類型,Accept-Encoding支持的編碼類型,Accept-Language為可接受的語言,User-Agent為一個標識客戶端的字符串。
字符串index.htm指明了請求訪問的資源對象,也叫做請求URL,后面的是HTTP/1.1,為HTTP版本號,表示客戶端使用的HTTP版本協(xié)議。
URL為請求的URL地址,協(xié)議版本為代表在向服務器發(fā)送請求時,使用的協(xié)議以及其版本,請求頭部為HTTP請求頭部包含若干個屬性,格式:
“屬性名”:“屬性值”,服務器端可以據(jù)此獲取客戶端請求的相關信息。
客戶端請求用Accept-Encoding字段說明自己可以接受哪些壓縮方式
Accept-Encoding: gzip, deflate
請求行為請求消息的第一行,它說明了請求方法,資源標示****符,HTTP版本,如下:
請求URI定位資源:HTTP協(xié)議使用URI定位互聯(lián)網上的資源。
《圖解HTTP》
URI,URL,URN是用來識別,定位和命名互聯(lián)網上的資源。
URI:
由HTTP版本,狀態(tài)碼,狀態(tài)描述文字構成:
HTTP/1.1 200 OK
GET /hello.htm HTTP/1.1
請求報文是由請求方法,請求URL,協(xié)議版本,可選的請求首部字段和內容實體構成的。
請求報文的解構
消息報頭
響應報文由協(xié)議版本,狀態(tài)碼,響應的首部字段,以及實體主體構成。
讓我們了解在HTTP/1.1有多少中請求方法:
HTTP的請求方法有很多,但是最常見的兩種請求方法是GET和POST
提交HTML表單或上傳文件
《圖解HTTP》
《圖解HTTP》
POST:傳輸實體主體
POST 方法用來傳輸實體的主體。
《圖解HTTP》
PUT:傳輸文件
PUT 方法用來傳輸文件。
《圖解HTTP》
HEAD:獲得報文首部
DELETE 方法用來刪除文件,是與 PUT 相反的方法。
OPTIONS:詢問支持的方法
OPTIONS 方法用來查詢針對請求 URI 指定的資源支持的方法。
1.GET為獲取資源數(shù)據(jù)
HTTP超文本傳輸協(xié)議是一個基于請求與響應模式的,無狀態(tài)的,應用層的協(xié)議,?;赥CP的連接方式。HTTP表示通過HTTP協(xié)議定位網絡資源,host表示合法的Internet主機域名或者ip地址,port指定為端口號。
第一行:方法,URL,協(xié)議版本
第二行:請求首部字段
第三行:內容實體
客戶端的請求消息:
請求方法,URL,協(xié)議版本為請求行,請求頭部,頭部字段名,值,請求數(shù)據(jù),一個HTTP請求的請求消息包括請求行,請求頭部,空行和請求數(shù)據(jù)。
服務器端響應消息:
狀態(tài)行,消息報頭,空行,響應正文,這是一個HTTP響應的響應消息。
狀態(tài)行,HTTP/1.1為表示使用的協(xié)議是HTTP的版本,我們可以看到狀態(tài)碼常見返回“200 0k”代表是服務器成功響應了此次請求,消息報頭,與HTTP請求頭部一樣,格式為“屬性名:屬性值",客戶端可以根據(jù)此獲取服務器端響應的信息,響應正文是服務器返回響應的東西給到客戶端,也是客戶端想要的東西。
超文本傳輸協(xié)議(英文:HyperText Transfer Protocol,縮寫:HTTP)是互聯(lián)網上應用最為廣泛的一種網絡協(xié) 議。設計HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法。通過HTTP或者HTTPS協(xié)議請求的資源由 統(tǒng)一資源標識符(Uniform Resource Identifiers,URI)來標識。 來自維基百科
HTTP狀態(tài)碼(英語:HTTP Status Code)是用以表示網頁服務器HTTP響應狀態(tài)的3位數(shù)字代碼。它由RFC 2616規(guī)范定義的,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等規(guī)范擴展。來自維基百科
HTTP狀態(tài)碼
HTTP狀態(tài)碼是用來干什么的呢?它的重要作用是Web服務器用來告訴客戶端,當前的網頁請求發(fā)生什么事情了,或者是當前web服務器端的響應狀態(tài),HTTP狀態(tài)碼是服務器端返回給客戶端的。
你比較常見的狀態(tài)碼有哪些呢?
有200,301,302,304,404,500,403。
我們最常見的狀態(tài)碼為200,狀態(tài)碼200表示服務器響應成功,服務器找到了客戶端請求的內容,并將內容發(fā)送給了客戶端。
我們程序員有時候也常見的500,狀態(tài)碼500表示程序錯誤,就是說請求的網頁程序本身就報錯了。
現(xiàn)在的瀏覽器會對狀態(tài)碼500做出一定的處理,所以在一般情況下會返回一個定制的錯誤頁面。
狀態(tài)碼404表示服務器上沒有該資源,或者說是服務器上沒有找到客戶端請求的資源,是最常見的請求錯誤碼。
狀態(tài)碼301和狀態(tài)碼302
狀態(tài)碼302表示臨時跳轉。
url地址a可以向url地址b上跳轉,但這并不意味著是永久性的,有可能過短時間就從url地址a跳轉到地址c。
而狀態(tài)碼301代表的是永久性的重定向。
2xx:
200為請求已經成功,202為服務器已經接受請求,但尚未處理,204為服務器成功處理了請求,但不需要返回如何實體內容。
304狀態(tài)碼,被請求的資源內容沒有發(fā)生更改。
400為包含語法錯誤,無法被服務器解析,403為服務器已經接收請求,但是被拒絕執(zhí)行,404請求失敗。
500為服務器內部錯誤,無法處理請求,502為作為網關或者代理工作的服務器嘗試執(zhí)行請求時,從上游服務器接收到無效響應,504為作為網關或者代理工作的服務器嘗試執(zhí)行請求時,未能及時從上游服務器(URI標識出的服務器,例如HTTP、FTP、LDAP)或者輔助服務器(例如DNS)收到響應
200 OK
請求被正確處理
302 Found
所請求的資源已暫時更改.通常會重定向到另一個 URL
404 Not Found
所請求的資源無法找到
500 Internal Server Error
服務器出現(xiàn)一般性錯誤
HTTP通信過程
本地服務器編寫一個demo.html文檔:
<!DOCTYPE html>
消息頭是在客戶端發(fā)送請求時,向服務器傳輸?shù)男畔ⅰ?/strong>
Accept為告訴服務器接收哪些格式的文件,Accept-Encoding為接收的編碼方式,Accept-Language為接收的語言,Cache-Control為是否使用緩存,Connection為連接方式,Cookie為向服務器發(fā)送的Cookie信息,Host為服務器域名。
Content-Length為服務器返回給客戶端的內容的長度,Content-Type為服務器返回給客戶端的內容的類型,Keep-Alive為緩存的時間,Server為服務器的相關信息。
HTTP過程中包含3個重要部分,消息頭,響應頭和狀態(tài)碼。
消息頭中存放的信息是客戶端告訴服務器能回傳什么,就是客戶端能接收的信息是什么類型的,如果客戶端需要傳值,則傳值信息也會放在消息頭中。
響應頭中存放的信息是服務器告訴客戶端返回的內容相關信息,包括回傳內容的長度,內容和緩存的時間等。
狀態(tài)碼為服務器告訴客戶端它的響應結果是什么。
其他
打開Chrome,在菜單中選擇“視圖”,“開發(fā)者”,“開發(fā)者工具”:
Elements顯示網頁的結構,Network顯示瀏覽器和服務器的通信。Content-Type指示響應的內容,這里是text/html表示HTML網頁。
HTTP的消息分為兩種,請求和響應。
// 一個 簡單的HTTP請求:
HTTP/1.1 200 OK
HTTP消息由三部分組成,首行,消息頭和消息體。消息頭和消息體均可以為空。
請求行
請求行由三部分組成,分別是方法(GET),URI(/)和http版本(HTTP/1.1)
GET / HTTP/1.1
消息頭
消息頭host用于指定所請求的域名。
請求消息包括以下格式:
更多狀態(tài)碼:
https://www.runoob.com/http/http-status-codes.html
HTTP工作原理
參考資料