概念
簡(jiǎn)介
HTTP是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,目前使用最為廣泛的是HTTP1.1協(xié)議。當(dāng)然,許多網(wǎng)站已經(jīng)開始支持HTTP2.0,HTTP2復(fù)雜度高于HTTP1.1,我們先從HTTP1.1說起。
HTTP于1990 年提出,經(jīng)過幾年的使用與發(fā)展,得到不斷地完善和擴(kuò)展。主要有以下特點(diǎn):
- 支持客戶/服務(wù)器模式
- ASCII碼傳輸,人能直接讀懂
- 參數(shù)靈活
- *無連接/無狀態(tài)(僅針對(duì)HTTP2以前的版本)
兩個(gè)重要的網(wǎng)站
1.https://www./rfc/
主要存儲(chǔ)RFC標(biāo)準(zhǔn)文檔
2.https://zh./zh-cn/超文本傳輸協(xié)議
這個(gè)地址是關(guān)于HTTP的詳細(xì)介紹
關(guān)于RFC
RFC:Request For Comments(RFC),是一系列以編號(hào)排定的文件。文件收集了有關(guān)互聯(lián)網(wǎng)相關(guān)信息,以及UNIX和互聯(lián)網(wǎng)社區(qū)的軟件文件。RFC文件是由Internet Society(ISOC)贊助發(fā)行?;镜幕ヂ?lián)網(wǎng)通信協(xié)議都有在RFC文件內(nèi)詳細(xì)說明。RFC文件還額外加入許多在標(biāo)準(zhǔn)內(nèi)的論題,例如對(duì)于互聯(lián)網(wǎng)新開發(fā)的協(xié)議及發(fā)展中所有的記錄。因此幾乎所有的互聯(lián)網(wǎng)標(biāo)準(zhǔn)都有收錄在RFC文件之中。(來自百度百科)
RFC2026將標(biāo)準(zhǔn)定義位4個(gè)階段:因特網(wǎng)草案、建議標(biāo)準(zhǔn)、草案標(biāo)準(zhǔn)、因特網(wǎng)標(biāo)準(zhǔn)。更多的過程可以看看這些文件:
- RFC 2223 "Instructions to RFC Authors"。
- RFC 2026 "The Internet Standards Process -- Revision 3"。
瀏覽器輸入某個(gè)網(wǎng)站地址并按下回車后發(fā)生了什么
假設(shè)我們?cè)跒g覽器鐘輸入www.,這個(gè)網(wǎng)站的IP地址是11.22.33.44,當(dāng)回車按下后計(jì)算機(jī)將做如下工作:
1.首先檢查本地的各種緩存,比如DNS緩存、網(wǎng)站內(nèi)容緩存等,如果有并且規(guī)則表明不需在服務(wù)器查找則直接展示內(nèi)容出來
2.檢查本地的hosts配置,如果輸入的網(wǎng)站域名在本機(jī)有配置則加載本機(jī)配置的IP地址,比如我們直接配置了一條hosts如下:
11.22.33.44 www.
那么計(jì)算機(jī)將會(huì)直接向11.22.33.44這個(gè)地址發(fā)送數(shù)據(jù),而不會(huì)做DNS查詢。
3.如果本機(jī)什么都沒有則進(jìn)行DNS查詢,DNS和本機(jī)的hosts類似,即傳入www.,然后DNS服務(wù)器返回給機(jī)器11.22.33.44,這個(gè)DNS服務(wù)器即我們?cè)赥CP/IP里面填寫的服務(wù)器地址,它使用的是UDP傳輸。
4.使用IP建立連接,需要記住的是在互聯(lián)網(wǎng)世界里面只有IP地址才是唯一地址,而網(wǎng)站域名只是一種別名,在連接服務(wù)器的過程中也是使用IP地址進(jìn)行連接。
5.發(fā)送客戶端請(qǐng)求的數(shù)據(jù)。
6.接收服務(wù)端響應(yīng)的數(shù)據(jù)。
當(dāng)然,實(shí)際情形下遠(yuǎn)不止以上幾步這么簡(jiǎn)單,以上的每一步也可以拆分位許多小步,甚至形成一篇新的文章,但是基本流程就是這樣。
怎么觀察HTTP協(xié)議內(nèi)容
如上文所說,HTTP協(xié)議是基于應(yīng)用層的協(xié)議,那么計(jì)算機(jī)網(wǎng)絡(luò)抓包過后的應(yīng)用層數(shù)據(jù)即包含HTTP協(xié)議的內(nèi)容,在windows里面我們可以采用大名鼎鼎的wireshark進(jìn)行數(shù)據(jù)報(bào)文的抓取,然后篩選HTTP協(xié)議進(jìn)行觀察,也可以使用smartsniff這樣小而精的軟件專門抓取應(yīng)用層內(nèi)容,在Linux里面直接使用tcpdump進(jìn)行抓取即可,然后將抓取的結(jié)果使用相關(guān)的軟件打開觀察,也可以導(dǎo)入到wireshark進(jìn)行觀察。一個(gè)實(shí)際抓取的較為典型的HTTP內(nèi)容如下:
客戶端請(qǐng)求:
POST /devices HTTP/1.1
Host: www.
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
a=b&c=d
服務(wù)器響應(yīng):
HTTP/1.1 200 OK
Date: Tue, 27 Oct 2020 02:13:39 GMT
Content-Type: application/json
Content-Length: 5
Connection: keep-alive
Server: nginx
Pragma: no-cache
Hello
協(xié)議詳解
HTTP之URL
HTTP URL格式如下:
http://host[":"port][abs_path]
host 表示合法的 Internet 主機(jī)域名或者 IP 地址
port 指定一個(gè)端口號(hào),為空則使用缺省端口 80
abs_path 指定請(qǐng)求資源的 URI
舉幾個(gè)例子:
http://www.
http://www.:8080
http://www./devices
http://www.:8080/devices/data
http://11.22.33.44/devices/data
http://11.22.33.44:8080/devices/data
以上均符合HTTP URL的定義,我們可以簡(jiǎn)單地將其理解位我們?cè)跒g覽器里面輸入的網(wǎng)站域名
HTTP之請(qǐng)求
請(qǐng)求組成部分
http請(qǐng)求由三部分組成,分別是:請(qǐng)求行、消息報(bào)頭、請(qǐng)求正文
關(guān)于請(qǐng)求行
請(qǐng)求行以一個(gè)方法符號(hào)開頭,以空格分開,后面跟著請(qǐng)求的URI和協(xié)議的版本,即
Method Request-URI HTTP-Version CRLF
針對(duì)Method有以下定義,并且必須使用以下定義的內(nèi)容,如果填入其他的數(shù)據(jù)那么就不是標(biāo)準(zhǔn)的HTTP協(xié)議(雖然一部分服務(wù)器能自動(dòng)糾錯(cuò))
- GET 請(qǐng)求獲取 Request-URI 所標(biāo)識(shí)的資源
- POST 在 Request-URI 所標(biāo)識(shí)的資源后附加新的數(shù)據(jù)
- HEAD 請(qǐng)求獲取由 Request-URI 所標(biāo)識(shí)的資源的響應(yīng)消息報(bào)頭
- PUT 請(qǐng)求服務(wù)器存儲(chǔ)一個(gè)資源,并用 Request-URI 作為其標(biāo)識(shí)
- DELETE 請(qǐng)求服務(wù)器刪除 Request-URI 所標(biāo)識(shí)的資源
- TRACE 請(qǐng)求服務(wù)器回送收到的請(qǐng)求信息,主要用于測(cè)試或診斷
- CONNECT 保留將來使用
- OPTIONS 請(qǐng)求查詢服務(wù)器的性能,或者查詢與資源相關(guān)的選項(xiàng)和需求
常用的Method只有GET以及POST,如果有涉及到協(xié)議轉(zhuǎn)換,比如HTTP1轉(zhuǎn)換到HTTP2、HTTP轉(zhuǎn)換到HTTPS或者轉(zhuǎn)換為websocket,可能回使用OPTIONS方法先詢問。至于其他的方法通常不怎么用,值得注意的是標(biāo)準(zhǔn)的restful接口業(yè)務(wù)會(huì)在GET和POST基礎(chǔ)上還有PUT和DELETE方法。
針對(duì)Request-URI則是我們?cè)跒g覽器輸入的域名和端后后面的內(nèi)容,比如/devices,如果是根目錄,比如www.,實(shí)際上Request-URI是“/”,即默認(rèn)都是“/”開始,這樣的目錄結(jié)構(gòu)和Linux的目錄結(jié)構(gòu)類似,而實(shí)際上也是來源于它。
HTTP-Version我們常用的是HTTP/1.1,當(dāng)然,現(xiàn)在也有部分網(wǎng)站使用HTTP/2
第一節(jié)的客戶端請(qǐng)求里面第一行則是請(qǐng)求行的內(nèi)容,具體如下:
POST /devices HTTP/1.1
關(guān)于消息報(bào)頭
在第一節(jié)關(guān)于HTTP抓包的請(qǐng)求實(shí)例中,除了a=b&c=d這一個(gè)內(nèi)容外其余的全是消息報(bào)頭,即
Host: www.
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
這里面也是HTTP核心東西之一,它以key: value的形式成對(duì)出現(xiàn),除了上述內(nèi)容外,我們常說的cookie、session等通常情況下也是放在消息報(bào)頭中進(jìn)行傳輸
我們也常說HTTP Header,直接將消息報(bào)頭理解為HEADER里面的所有東西也是沒什么問題的。
關(guān)于請(qǐng)求正文
上述例子中,“a=b&c=d”即是請(qǐng)求正文,請(qǐng)求正文通常情況下有按照form形式、按照json形式進(jìn)行傳輸,但是也可以自由發(fā)揮填充任意東西,只要服務(wù)端能去解析即可。
關(guān)于form形式除了最簡(jiǎn)單的a=b&c=d外還有mutiform等形式,也是在請(qǐng)求頭中進(jìn)行定義,然后請(qǐng)求正文使用相應(yīng)的格式進(jìn)行數(shù)據(jù)填充。
具體請(qǐng)求例子
具體的例子里面我們將以最小的報(bào)文頭進(jìn)行展示而展示無關(guān)的信息
GET / HTTP/1.1
Host: www.
- 以GET形式傳入username為haha以及password為hehe到www.網(wǎng)站的登錄接口(假設(shè)為/login)
GET /login?username=haha&password=hehe HTTP/1.1
Host: www.
- 以POST標(biāo)準(zhǔn)FORM形式傳入username為haha以及password為hehe到www.網(wǎng)站的登錄接口(假設(shè)為/login)
POST /login HTTP/1.1
Host: www.
username=haha&password=hehe
- 以POST標(biāo)準(zhǔn)json形式傳入username為haha以及password為hehe到www.網(wǎng)站的登錄接口(假設(shè)為/login)
POST /login HTTP/1.1
Host: www.
{"username":"haha","password":"hehe"}
- 查詢www.網(wǎng)站的設(shè)備列表,并帶上cookie為123456(假設(shè)為/devicelist)
GET /devicelist HTTP/1.1
Host: www.
Cookie: 123456
- 查詢www.網(wǎng)站的設(shè)備列表,并帶上cookie為123456,要求服務(wù)端保持連接(假設(shè)為/devicelist)
GET /devicelist HTTP/1.1
Host: www.
Cookie: 123456
Connection: keep-alive
總結(jié)和后續(xù)計(jì)劃
本文主要講解了HTTP一些基本概念以及請(qǐng)求相關(guān)的報(bào)文。
接下來第二篇將講解HTTP響應(yīng)、HTTP2簡(jiǎn)介以及當(dāng)下主流的HTTPS簡(jiǎn)單交互過程,最后將模擬請(qǐng)求一次網(wǎng)站并進(jìn)行抓包演示。
|