目錄
一、認(rèn)識(shí)HTTP協(xié)議
理解 應(yīng)用層協(xié)議
二、fiddler的安裝以及介紹
1、fiddler的安裝
2、fiddler的介紹
http請(qǐng)求
三、HTTP 報(bào)文格式
1、http的請(qǐng)求
2、http的響應(yīng)
五、認(rèn)識(shí)URL
(1)協(xié)議方案名
(2)登錄信息(認(rèn)證)
(3)服務(wù)器地址
(4)服務(wù)器的端口號(hào)
(5)帶層次的文件路徑
(6)查詢字符串(query string)
六、關(guān)于URL encode
都看到這了,點(diǎn)個(gè)贊再走吧,謝謝謝謝謝
一、認(rèn)識(shí)HTTP協(xié)議
? ? ? ? HTTP 全稱為:“超文本傳輸協(xié)議”,是一種應(yīng)用非常廣泛的 應(yīng)用層協(xié)議。如圖:
? ? ? ? 什么是超文本呢?文本就是字符串,能在 utf8 / gbk 等碼表上找到的合法字符;而超文本比文本更nb,不僅僅可以是字符串,也可以攜帶一些圖片,特殊格式啥的(鏈接、HTML(超文本標(biāo)記語(yǔ)言)、表格、標(biāo)題等等)。
? ? ? ? HTTP誕生于1991年,是目前最主流的應(yīng)用層協(xié)議,如圖是發(fā)展史:
? ? ? ? HTTP3.0之前,在傳輸層是基于TCP,HTTP3.0開始就是基于UDP;不是說(shuō)UDP不可靠嗎,為什么還用它呢?因?yàn)閁DP傳輸?shù)暮芸?,是TCP比不了的,雖然它不可靠,但我們可以給它添加一些機(jī)制(一系列更復(fù)雜的機(jī)制),也可以提供可靠性。
理解 應(yīng)用層協(xié)議
? ? ? ? 我們之前學(xué)習(xí)了TCP / IP 協(xié)議,知道網(wǎng)絡(luò)傳輸數(shù)據(jù),可以通過(guò) IP地址和進(jìn)程端口定位服務(wù)器 /客戶端,知道網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)钠瘘c(diǎn)和終點(diǎn),但是當(dāng)網(wǎng)絡(luò)數(shù)據(jù)傳輸完,就結(jié)束了嗎?NO?。?strong>當(dāng)數(shù)據(jù)傳輸給對(duì)端,對(duì)端還要對(duì)數(shù)據(jù)進(jìn)行加工處理,所以應(yīng)用層還需要一層協(xié)議,它不關(guān)心通信的過(guò)程、細(xì)節(jié),只關(guān)心應(yīng)用細(xì)節(jié),這層協(xié)議就是應(yīng)用層協(xié)議。
? ? ? ? HTTP最主要的應(yīng)用場(chǎng)景:網(wǎng)站;瀏覽器和服務(wù)器之間的數(shù)據(jù)傳輸,使用的協(xié)議就是HTTP;客戶端(手機(jī) / PC),和服務(wù)器之間的傳輸?shù)膮f(xié)議,也很可能是HTTP。如圖是瀏覽器和服務(wù)器之間的一次交互。
? ? ? ? 網(wǎng)頁(yè)是通過(guò)HTML構(gòu)建的,HTML也是一門編程語(yǔ)言,不過(guò)和Java / C / C++ / Python不同,這些表達(dá)的是 邏輯,你要做什么;而HTML表達(dá)的是 內(nèi)容,你有什么。
? ? ? ? 一個(gè)成熟的網(wǎng)頁(yè),光有HTML是不夠的,還需要CSS、JavaScript的配合,這三個(gè)語(yǔ)言稱為“前端開發(fā)三劍客”,學(xué)習(xí)前端開發(fā),這三個(gè)語(yǔ)言都要會(huì)。
? ? ? ? HTTP的交互過(guò)程,是非常經(jīng)典的 “一問(wèn)一答” 模型,對(duì)于 TCP / UDP,它們的交互模型更為多樣,具體是啥情況,取決于你的代碼。但即使只有 一問(wèn)一答 的模型,對(duì)于網(wǎng)站開發(fā),也夠用了,如圖是以前網(wǎng)站上的廣告,如果你搜索 “不孕不育、整容” 等詞,就會(huì)出現(xiàn)一堆廣告,你點(diǎn)進(jìn)去就會(huì)出現(xiàn)聊天對(duì)話框(類似QQ這種),如圖:
? ? ? ? 在網(wǎng)頁(yè)上,你發(fā)一條消息,對(duì)面就能收到給你回復(fù),你也能繼續(xù)給對(duì)面發(fā)消息,類似一問(wèn)一答的,這就是一問(wèn)一答的實(shí)現(xiàn)場(chǎng)景。
二、fiddler的安裝以及介紹
? ? ? ? fiddler 是抓包工具,抓包工具本質(zhì)上就是 “代理程序”,能夠獲取網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù),并且顯示出來(lái),給程序員提供一些參考。
? ? ? ? 其中有一種叫 高大全 的抓包工具:wireshark,可以抓各種協(xié)議的數(shù)據(jù)包(TCP、UDP、IP、以太網(wǎng)等等),因?yàn)楹w的范圍比較廣,所以使用起來(lái)會(huì)更復(fù)雜,但fiddler是一種專注于HTTP的抓包,相對(duì)于wireshark的使用更簡(jiǎn)單,而我們目前也是在學(xué)習(xí)HTTP。以下介紹fiddler的下載安裝:
1、fiddler的安裝
? ? ? ? fiddler下載地址:Web Debugging Proxy and Troubleshooting Tools|Fiddler (telerik.com)
? ? ? ? 選擇經(jīng)典版本(最新版要收費(fèi)),點(diǎn)擊 try for free,然后填寫相關(guān)信息:
? ? ? ? 接下來(lái)一路默認(rèn)next即可:
? ? ? ? 安裝完成
安裝完后,進(jìn)行一些簡(jiǎn)單的設(shè)置
????????fiddler的界面:
? ? ? ? 接下來(lái)要抓包,就需要進(jìn)行一個(gè)簡(jiǎn)單的設(shè)置,如下:
? ? ? ? 中間會(huì)提示是否要安裝證書,這里一路確定就好了。
? ? ? ? 把這些都勾上(當(dāng)前網(wǎng)絡(luò)上大部分請(qǐng)求都是基于 HTTPS(相當(dāng)于在HTTP的基礎(chǔ)上進(jìn)行了加密,并且要安裝證書),才能進(jìn)行正確的解密)。
? ? ? ? 除了上述操作之外,另外還需要關(guān)閉電腦上本身的代理程序,例如VPN,有些可以fq的程序(單獨(dú)的程序 / 瀏覽器插件),這個(gè)也是代理程序,要確保電腦上其他的代理程序都是關(guān)閉狀態(tài),不然可能會(huì)導(dǎo)致fiddler和其他代理程序發(fā)生沖突。
2、fiddler的介紹
? ? ? ? fiddler是一個(gè)代理程序,什么是代理程序呢,代理也分正向代理和反向代理,下面介紹正向代理,如圖就是fiddler是客戶端的代理:
? ? ? ? 上圖是正向代理,可以這么理解,正向代理:客戶端的代言人;反向代理:服務(wù)器的代言人
? ? ? ? 抓包工具就可以獲取到HTTP協(xié)議的數(shù)據(jù)包,顯示出請(qǐng)求和響應(yīng)的具體細(xì)節(jié)。
? ? ? ? 這里解釋一下如何實(shí)現(xiàn)fq的效果:用來(lái)fq的代理,本質(zhì)就是通過(guò)可以被訪問(wèn)到境外的服務(wù)器,部署一個(gè)代理服務(wù)器,這樣我們就可以繞過(guò)國(guó)家的防火墻,訪問(wèn)海外的服務(wù)器;我們直接訪問(wèn)谷歌服務(wù)器訪問(wèn)不了,但是通過(guò)這個(gè)代理服務(wù)器,就能訪問(wèn)到,如圖:
? ? ? ? 在fiddler中我們可以看到,即使我們什么也不做,也能抓到很多包,即使你什么也不干,電腦也會(huì)在你感知不到的地方,偷偷的做很多事情,和人家的服務(wù)器進(jìn)行交互,這里介紹一個(gè)快捷鍵:全選,Ctrl + a,再按delete鍵就可以把當(dāng)前所有顯示的包清除。
? ? ? ? 打開一個(gè)網(wǎng)站,其實(shí)瀏覽器和服務(wù)器之間進(jìn)行的 HTTP 交互不只有一次,而是會(huì)有很多次,第一次交互拿到的是這個(gè)頁(yè)面的html,但html還會(huì)依賴css、js等,html被加載出來(lái)后,還會(huì)觸發(fā)一些其他的http請(qǐng)求,獲取到css、js,而獲取到j(luò)s后,執(zhí)行js還會(huì)觸發(fā)很多http請(qǐng)求,css同理;從而獲取到一些數(shù)據(jù)。瀏覽器和服務(wù)器之間往往會(huì)經(jīng)歷反復(fù)多次的拉扯。
? ? ? ? 我們打開一個(gè)bilbli網(wǎng)站,fiddler里面會(huì)抓取到很多包,而會(huì)有藍(lán)色的顯示,它表示返回的是一個(gè)html,往往是訪問(wèn)一個(gè)網(wǎng)站的入口請(qǐng)求,雙擊它就能看到明細(xì),如圖:
? ? ? ? RAW選項(xiàng)是原始數(shù)據(jù)(http的原始數(shù)據(jù)),如圖:
? ? ? ? 上面一部分是請(qǐng)求的明細(xì),下面這部分是響應(yīng)的明細(xì)。
? ? ? ? 我們可以用記事本的方式看看請(qǐng)求和響應(yīng)的內(nèi)容(這里有個(gè)選項(xiàng),點(diǎn)中就可以以記事本的方式查看),如圖:
請(qǐng)求的內(nèi)容:
? ? ? ? 可以看到,http協(xié)議確實(shí)是文本的格式。
響應(yīng)的內(nèi)容:
? ? ? ? 但是這里查看的響應(yīng),為什么有亂碼,亂碼也就意味著不是文本的格式。原因很簡(jiǎn)單:當(dāng)前的響應(yīng)數(shù)據(jù)被壓縮了,我們知道,網(wǎng)絡(luò)傳輸中,網(wǎng)絡(luò)帶寬是很珍貴的資源,比CPU還貴,為了節(jié)省帶寬,就可以把它進(jìn)行壓縮(一般壓縮響應(yīng),請(qǐng)求不太需要),而壓縮和解壓縮都是要消耗CPU資源的,雖然CPU資源貴,但是網(wǎng)絡(luò)帶寬更貴,我們用CPU資源換網(wǎng)絡(luò)帶寬資源,是不虧的。
? ? ? ? 那我們想看返回響應(yīng)的數(shù)據(jù)咋辦,這時(shí)候可以點(diǎn)這個(gè),叫解壓縮
? ? ? ? 再用記事本的方式打開,就可以看到不是亂碼的了,如圖:
? ? ? ? 而這里響應(yīng)的數(shù)據(jù),其實(shí)就是網(wǎng)站的網(wǎng)頁(yè) html。
http請(qǐng)求
三、HTTP 報(bào)文格式
? ? ? ? http是一個(gè)文本格式的協(xié)議,可以通過(guò)fiddler抓包工具,獲得http的請(qǐng)求 / 響應(yīng)的細(xì)節(jié),以下是http抓包的請(qǐng)求和響應(yīng)的細(xì)節(jié)。
1、http的請(qǐng)求
? ? ? ? http的請(qǐng)求包含4個(gè)部分:1、首行;2、請(qǐng)求頭(header);3、空行(請(qǐng)求頭最下面會(huì)有一個(gè)空行,這個(gè)空行可以表示結(jié)束標(biāo)記);4、正文(body),http的載荷部分。
? ? ? ? 如圖:
? ? ? ? 其中,首行還包含三個(gè)部分,如圖:
? ? ? ? 第一部分是方法,第二部分是url,第三部分是版本號(hào)。
2、http的響應(yīng)
? ? ? ? http的響應(yīng)也是分為四部分的,如圖:
? ? ? ? 其中,響應(yīng)的正文也有三部分,如圖:
? ? ? ? 第一部分是版本號(hào);第二部分是狀態(tài)碼;第三部分是狀態(tài)碼描述。
五、認(rèn)識(shí)URL
? ? ? ? URL不僅僅在http中使用,在學(xué)JDBC的時(shí)候,也用過(guò)URL,如圖:
? ? ? ? URL描述的是一個(gè)網(wǎng)絡(luò)上的資源位置,是唯一資源定位符;還有一個(gè)和URL的概念很接近:URI,但它是唯一資源標(biāo)識(shí)符。它們兩都是描述一個(gè)網(wǎng)絡(luò)上的資源位置,有啥不同呢?舉個(gè)例子:我們標(biāo)識(shí)變量的身份,怎么知道這個(gè)變量是什么呢?在C語(yǔ)言是用變量的地址,而在Java中是使用變量的hashCode。它們的就類似這種情況。
? ? ? ? 以下就是一個(gè)最簡(jiǎn)單的URL,這是搜狗搜索的網(wǎng)站,如圖:
? ? ? ? 而一個(gè)完整的URL,還有很多其他的結(jié)構(gòu),如圖:
(1)協(xié)議方案名
????????就是協(xié)議名,http協(xié)議
(2)登錄信息(認(rèn)證)
????????也就是你登錄的密碼,寫在這里不太好,因?yàn)榭梢詮膗rl,就可以看到你密碼了,很容易被黑客入侵拿到登錄網(wǎng)站的密碼,甚至你旁邊有人,也能看到密碼,現(xiàn)在都是 “單獨(dú)的登錄頁(yè)面” 來(lái)完成身份驗(yàn)證的。
(3)服務(wù)器地址
????????就是域名,可以通過(guò)域名拿到服務(wù)器的IP地址
(4)服務(wù)器的端口號(hào)
????????通過(guò)端口號(hào)才能知道你要訪問(wèn)服務(wù)器的哪個(gè)端口。如果url不帶端口,則會(huì)給一個(gè)默認(rèn)訪問(wèn)的端口(服務(wù)器的端口,不是系統(tǒng)隨機(jī)分配的),此處用啥端口作為默認(rèn)值取決于協(xié)議,http的默認(rèn)端口是80,https的默認(rèn)端口的443。
(5)帶層次的文件路徑
????????我們知道,網(wǎng)絡(luò)上的資源位置,可以通過(guò)IP地址知道它在哪,通過(guò)端口知道它是哪個(gè)程序,但還不夠,還要通過(guò)文件路徑,知道要訪問(wèn)哪個(gè)資源。這里可能對(duì)應(yīng)一個(gè)真實(shí)的硬盤文件,也可能是對(duì)應(yīng)虛擬的文件。
(6)查詢字符串(query string)
????????是客戶端給服務(wù)器傳遞信息的重要途徑,這里的組織方式是按照鍵值對(duì)的方式來(lái)組織的。這里的鍵值對(duì)內(nèi)容是程序員自定義的。結(jié)合上面的IP地址、端口號(hào)、路徑、查詢字符串,就可以描述出一個(gè)網(wǎng)絡(luò)資源了,類似下圖:
? ? ? ? 片段標(biāo)識(shí)符:用來(lái)標(biāo)識(shí)當(dāng)前頁(yè)面的某個(gè)部分。用不同的片段標(biāo)識(shí)表示可以完成頁(yè)面內(nèi)跳轉(zhuǎn)。
六、關(guān)于URL encode
? ? ? ? query string 里定義的鍵值對(duì),在 URL 中,有些特殊符號(hào)本身就具有特定的含義,如:/? ?? @ 等等,那如果query string 里面本身就包含特殊的符號(hào),咋辦?這時(shí)候就需要用到轉(zhuǎn)義,對(duì)這些特殊符號(hào)進(jìn)行轉(zhuǎn)義,如C++,在必應(yīng)上搜索C++,如圖:
? ? ? ? 而 “+” 的ASCII值就是2B,如圖:
? ? ? ? 那如果是中文呢,也要進(jìn)行轉(zhuǎn)義,因?yàn)樵谥形牡膗tf8或者gbk等編碼中,就可能某個(gè)字節(jié)恰好有和ASCII碼的符號(hào)一樣的;在必應(yīng)上搜索蛋糕,如圖:
? ? ? ? 可以看到,這里并沒(méi)有轉(zhuǎn)義啊,那我們選中url,復(fù)制進(jìn)畫圖板中,如圖:
? ? ? ? 變成了:%E8%9B%8B%E7%B3%95,這個(gè)也是和上面的 + 一樣,基于漢字的編碼,把每個(gè)字節(jié)都轉(zhuǎn)成16進(jìn)制來(lái)表示,并且加上%,我們?nèi)tf8碼表里面查一下,如圖:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-853060.html
? ? ? ? 這里的URL encode 編碼非常重要,在實(shí)際開發(fā)中,要構(gòu)造一個(gè)URL,尤其是query string里包含中文的,一定要進(jìn)行轉(zhuǎn)義、編碼,不然很可能會(huì)導(dǎo)致,因?yàn)橛兄形?,某些網(wǎng)頁(yè)跳轉(zhuǎn)不了,進(jìn)不去你要進(jìn)的網(wǎng)頁(yè)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-853060.html
都看到這了,點(diǎn)個(gè)贊再走吧,謝謝謝謝謝
到了這里,關(guān)于網(wǎng)絡(luò)原理 - HTTP / HTTPS(1)——http請(qǐng)求的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!