本文來(lái)自作者 宋璐 在 GitChat 上分享「如何快速入門(mén)網(wǎng)絡(luò)基礎(chǔ)知識(shí)(TCP/IP 和 HTTP)」,「閱讀原文」查看交流實(shí)錄 「文末高能」 編輯 | 洛肯 前言在寫(xiě)之前,先給這篇文章做一個(gè)明確定位,讀完這篇文章后,希望你能夠:
課前準(zhǔn)備為了能夠更好地理解這篇文章的內(nèi)容,建議閱讀之前做以下幾個(gè)準(zhǔn)備:
網(wǎng)絡(luò)模型在學(xué)習(xí)具體知識(shí)前,搞清楚它所在的知識(shí)體系和模型是非常重要的,對(duì)于網(wǎng)絡(luò)知識(shí)亦是如此,目前公認(rèn)的網(wǎng)絡(luò)模型有兩種,一種是OSI七層模型,另一種則是TCP/IP五層模型,請(qǐng)看下圖: 可以看到,OSI七層模型和TCP/IP五層模型存在一個(gè)對(duì)應(yīng)關(guān)系,并且傳輸層以下的完全一致(TCP模型中的網(wǎng)絡(luò)接口層就是數(shù)據(jù)鏈路層和物理層的集合),因此可以說(shuō)將OSI模型中的會(huì)話層、表示層與應(yīng)用層合并為T(mén)CP/IP模型中的應(yīng)用層后,二者基本一致。 上述兩個(gè)網(wǎng)絡(luò)模型都屬于通用網(wǎng)絡(luò)模型,相對(duì)來(lái)說(shuō),TCP/IP模型更為普遍一些,所以我們也主要以TCP/IP模型為網(wǎng)絡(luò)模型開(kāi)展論述,這也是為什么這節(jié)課的名字TCP/IP的由來(lái)。 那么每一層都對(duì)應(yīng)哪些協(xié)議呢?請(qǐng)看下圖: 可以看到,我們熟知的一些協(xié)議,IP協(xié)議位于網(wǎng)絡(luò)層,TCP協(xié)議位于傳輸層,而HTTP協(xié)議則位于應(yīng)用層,其余還有比較熟悉的DNS協(xié)議,F(xiàn)TP協(xié)議等等,都有其所屬的層級(jí)。 我們可以通過(guò)Wireshark抓包驗(yàn)證這一點(diǎn),隨便抓取一個(gè)HTTP報(bào)文: 從上往下依次是Frame幀頭、以太幀頭、IP協(xié)議頭、TCP協(xié)議頭和HTTP協(xié)議頭,最后的一行則是本次請(qǐng)求的數(shù)據(jù),其格式為JSON 三握四揮所謂三握四揮是指三次握手和四次揮手,也就是TCP協(xié)議建立連接和斷開(kāi)連接的過(guò)程,之所以叫做三次握手,是因?yàn)榻⑦B接的雙方需要經(jīng)過(guò)三次數(shù)據(jù)交互以后才能完成連接的建立,同樣的,四次揮手是指在斷開(kāi)連接時(shí)需要四次數(shù)據(jù)交互,其交互過(guò)程圖如下: 舉個(gè)簡(jiǎn)單的例子,兩個(gè)人小S和小C打電話,他們的三次握手建立連接過(guò)程就是:
而四次揮手的過(guò)程則是:
然后小S和小C就掛了電話,我們注意到,在四次揮手的過(guò)程中,小S先提出了斷開(kāi)連接,但實(shí)際上他們的對(duì)話并沒(méi)有結(jié)束,后面小C確認(rèn)這個(gè)消息后,并沒(méi)有立馬斷開(kāi)連接,而是繼續(xù)對(duì)話,這是因?yàn)門(mén)CP協(xié)議具備全雙工特性,簡(jiǎn)單點(diǎn)說(shuō)就是一個(gè)連接,存在小C——小S和小S到小C兩條線路,而小S提出并由小C確認(rèn)關(guān)閉的只是小S——小C這條線路,因此小C還可以繼續(xù)向小S發(fā)消息,直到小C也覺(jué)得要關(guān)閉連接并由小S確認(rèn)后,兩人的所有連接才徹底關(guān)閉。 那么你肯定會(huì)問(wèn)啦,為什么TCP要這么設(shè)計(jì)呢,這是因?yàn)門(mén)CP是一個(gè)全雙工的協(xié)議,全雙工(Full Duplex)是通訊傳輸?shù)囊粋€(gè)術(shù)語(yǔ)。通信允許數(shù)據(jù)在兩個(gè)方向上同時(shí)傳輸,我們?cè)谏厦娴睦右蔡岬搅嗽谝淮蜹CP交互中,需要維持兩條線路,因此無(wú)論是在建立和斷開(kāi)的時(shí)候,都要確保兩條線路的狀態(tài)正確。 上面的闡述還是建立在理論階段,為了能更好地鞏固知識(shí),我們利用Wireshark在實(shí)際生產(chǎn)環(huán)境下抓包看下:
客戶端和服務(wù)端建立連接時(shí)的抓包情況: 可以看到由客戶端首先發(fā)SYN報(bào)文,服務(wù)端收到并回應(yīng)SYN ACK報(bào)文,客戶端最后再回一個(gè)ACK報(bào)文,連接就算建立完畢了。 再來(lái)看看斷開(kāi)連接時(shí)的情況: 和建立連接時(shí)不同,斷開(kāi)連接的發(fā)起者是服務(wù)端,可以看到服務(wù)端發(fā)送FIN報(bào)文,然后客戶端再發(fā)ACK報(bào)文,此時(shí)服務(wù)端便不再向客戶端傳輸數(shù)據(jù),而客戶端在完成數(shù)據(jù)傳輸后,也發(fā)送FIN報(bào)文到服務(wù)端,在收到服務(wù)端的Last ACK報(bào)文后正式斷開(kāi)連接。 關(guān)于TCP連接建立和斷開(kāi)時(shí)的三握四揮就先講到這里,再附上一張TCP的狀態(tài)遷移圖,對(duì)了解整個(gè)TCP協(xié)議有很大的幫助: DNS解析
這是來(lái)源于百度百科的一段描述,簡(jiǎn)單點(diǎn)說(shuō)DNS解析做的工作就是,讓我們把能記住的,比較好記的域名轉(zhuǎn)換為IP地址的一個(gè)系統(tǒng),下面我們就借助Wireshark來(lái)看看它到底是怎么工作的。 我們?cè)跒g覽器中輸入www.baidu.com時(shí),會(huì)向服務(wù)器發(fā)送DNS請(qǐng)求報(bào)文,當(dāng)服務(wù)器端處理完這個(gè)請(qǐng)求以后,就會(huì)發(fā)送DNS響應(yīng)報(bào)文,其中就包含我們關(guān)心的IP地址,可以看到我們抓到兩個(gè)報(bào)文,前者我們稱之為DNS請(qǐng)求報(bào)文,后者稱之為DNS響應(yīng)報(bào)文,注意我們的篩選條件,通過(guò)UDP端口來(lái)過(guò)濾更加方便: 先來(lái)看DNS請(qǐng)求報(bào)文: 可以看到DNS的傳輸層協(xié)議是UDP,而不是TCP,并且其端口號(hào)為53。緊接著的是Transaction ID(2字節(jié)),這個(gè)ID可以作為DNS請(qǐng)求的一個(gè)唯一ID來(lái)使用,也就是說(shuō)對(duì)于一個(gè)請(qǐng)求和應(yīng)答報(bào)文,這個(gè)ID是相同的,因此也可以借助這個(gè)ID來(lái)查找請(qǐng)求報(bào)文相對(duì)應(yīng)的應(yīng)答報(bào)文。 Flags字段長(zhǎng)度也是2字節(jié),可以看到,16bit被分成了以下幾部分,依次為:
緊接著Flags下面的幾個(gè)字段分別是:queries、answers、auth_r、add_rr,其相應(yīng)的中文含義為問(wèn)題數(shù)、資源記錄數(shù)、授權(quán)資源記錄數(shù)和額外資源記錄數(shù),它們的長(zhǎng)度都是2字節(jié),一般來(lái)說(shuō)queries為1,其余的字段值為0。 接下來(lái)就是報(bào)文的正文部分,這里包括要查詢的域名,查詢類型和相應(yīng)的查詢類,這里的域名的格式比較特別,在這里的域名是www.baidu.com,而標(biāo)記為藍(lán)色的部分則是報(bào)文中的表示,可以看到,03是代表3個(gè)字節(jié),而緊跟著3個(gè)77,如果轉(zhuǎn)換為ASIC碼的話,就是0x77,因此對(duì)于www.baidu.com,首先是以“.”為分隔符,分成3個(gè)部分后,用相應(yīng)的段長(zhǎng)度再加上域名段的ASIC組成一個(gè)段,這樣就構(gòu)成了一個(gè)完整的域名。 后續(xù)的兩個(gè)字段分別是Type和Class,在這里兩個(gè)字段都為1,其中Type為A則代表此次請(qǐng)求類型是通過(guò)域名獲取IP地址,也是最為常見(jiàn)的一種DNS請(qǐng)求形式。而Class字段為1,則代表這里查詢的數(shù)據(jù)是internet數(shù)據(jù),也是最為常見(jiàn)的一種形式。 介紹完了請(qǐng)求報(bào)文,接下來(lái)再看一下響應(yīng)報(bào)文: 響應(yīng)報(bào)文和應(yīng)答報(bào)文相同的部分就不再贅述了,可以看到Flags中的Response值為1,就說(shuō)明這是一個(gè)響應(yīng)報(bào)文,同時(shí)Transaction ID也和請(qǐng)求報(bào)文中的ID一致,說(shuō)明這就是上面那個(gè)請(qǐng)求報(bào)文所對(duì)應(yīng)的響應(yīng)報(bào)文。 請(qǐng)求報(bào)文正文中最主要的部分就是Answers字段,這里面包括了我們想要的IP地址,但是我們也注意到,對(duì)于www.baidu.com這一個(gè)域名,響應(yīng)字段居然有3條,那么究竟以哪一條為準(zhǔn)呢?我們一條條來(lái)看。 首先是第1條Answer,這里的Type類型為CNAME,這里的CNAME表示這個(gè)回應(yīng)是請(qǐng)求報(bào)文中查詢的域名的一個(gè)別名,也就是此處返回的將是www.baidu.com的一個(gè)別名,也就是www.a.shifen.com,緊接著后面兩個(gè)Answer,Type類型為A,代表返回值將是一個(gè)IPV4地址,其他的比較常見(jiàn)的Type類型還有AAAA——IPV6地址,PTR——IP地址轉(zhuǎn)換為域名,NS——名字服務(wù)器。 可以看到,對(duì)于同一個(gè)域名,可以返回多個(gè)IP地址,在上面的響應(yīng)報(bào)文中,返回了2個(gè)IP地址,分別是61.135.169.125和61.135.169.121,這就是我們最終想要的結(jié)果,為了防止其中某個(gè)IP地址出現(xiàn)異常,因此通常對(duì)于一個(gè)域名,都會(huì)有兩個(gè)甚至以上的IP地址與其對(duì)應(yīng),這樣便可以起到一個(gè)主備容災(zāi)效果,當(dāng)其中一個(gè)IP地址無(wú)法連接時(shí),還可以切換到另一個(gè)IP進(jìn)行訪問(wèn)。在瀏覽器中輸入 或61.135.169.121,也可以正常訪問(wèn)頁(yè)面: 對(duì)于使用chrome瀏覽器的同學(xué),可以輸入chrome://net-internals/#dns 來(lái)查看瀏覽器DNS解析列表: 在這里可以看到你訪問(wèn)過(guò)的網(wǎng)站,以及相應(yīng)的解析記錄,這里還有一欄TTL,代表域名解析結(jié)果的生存時(shí)間,簡(jiǎn)單點(diǎn)說(shuō)就是當(dāng)我們解析完畢一個(gè)域名以后,會(huì)將其記錄緩存起來(lái),在TTL時(shí)間之內(nèi)的訪問(wèn),我們都直接從緩存中獲取,而不再去進(jìn)行DNS解析,這樣帶來(lái)的好處就是減少DNS解析時(shí)間,加快網(wǎng)頁(yè)訪問(wèn)速度,但同時(shí)帶來(lái)的影響就是如果TTL值過(guò)大,那么如果服務(wù)器的域名解析發(fā)生變化,也需要很長(zhǎng)時(shí)間才能在客戶端生效,所以TTL要根據(jù)實(shí)際生產(chǎn)環(huán)境需求來(lái)調(diào)整 關(guān)于DNS的解析暫時(shí)將到這里,建議大家參照上面的抓包過(guò)程去實(shí)踐一把,相信可以對(duì)整個(gè)過(guò)程有更深入的理解! 應(yīng)用層協(xié)議介紹完TCP協(xié)議和DNS協(xié)議之后,我們就要開(kāi)始介紹處于TCP/IP模型中最上層的應(yīng)用層協(xié)議了。應(yīng)用層協(xié)議也是和用戶交互最密切的,因此對(duì)用戶感知影響也是最直接的,下面就以此介紹幾種比較常見(jiàn)的應(yīng)用層協(xié)議。 HTTP
上面是關(guān)于HTTP的權(quán)威描述,HTTP可以說(shuō)是整個(gè)互聯(lián)網(wǎng)當(dāng)中最普遍也是最重要的一個(gè)協(xié)議了,包括你現(xiàn)在能看到我寫(xiě)的這篇文章,也是利用HTTP進(jìn)行數(shù)據(jù)傳輸?shù)?,那么糾結(jié)是如何進(jìn)行工作的呢?這次我們借助另外一款抓包神器——Charles來(lái)進(jìn)行抓包分析。 當(dāng)我們利用瀏覽器訪問(wèn)http://www.csdn.net/時(shí),瀏覽器會(huì)在我們輸入地址并敲下回車后在頁(yè)面顯示: 這是一個(gè)在平常不過(guò)的操作了,此時(shí)我們用Charles進(jìn)行抓包,得到下面的結(jié)果: 上面是整個(gè)完整的交互,實(shí)際上包含了兩部分,首先是HTTP request請(qǐng)求,也就是上面中上半部分,可以看到,在request請(qǐng)求中幾個(gè)關(guān)鍵點(diǎn)是GET、HTTP/1.1、Host、User-Agent、Accept以及Cookie,這些關(guān)鍵字構(gòu)成了一個(gè)request請(qǐng)求的報(bào)文頭,代表客戶端想通過(guò)本次請(qǐng)求得到服務(wù)端的哪些數(shù)據(jù),服務(wù)端在收到request后,作出的回應(yīng)便是HTTP response報(bào)文,也就是上圖中下半部分,因?yàn)槲覀冊(cè)L問(wèn)的是csdn的主頁(yè),并且在Accept里也指定了html是一種請(qǐng)求數(shù)據(jù),所以response報(bào)文返回的數(shù)據(jù)里便包含了HTML數(shù)據(jù),當(dāng)然,response報(bào)文也有其它組成部分,如下圖所示: 這里面就包括了服務(wù)端對(duì)于本次請(qǐng)求的回應(yīng)數(shù)據(jù),其中最關(guān)鍵的便是200 OK這個(gè)字段,這是響應(yīng)狀態(tài)碼,最常見(jiàn)的就是200,也就是表明請(qǐng)求OK,還有比較常見(jiàn)的就是404和502,前者代表客戶端非法請(qǐng)求,后者代表服務(wù)端響應(yīng)失敗,比如說(shuō)我們輸入http://www.csdn.net/test123時(shí),頁(yè)面就會(huì)提示: HTTPS
從上面的闡述中我們可以得到HTTPS = HTTP + TLS這樣一個(gè)簡(jiǎn)單的結(jié)論,也就試試哦HTTPS是比HTTP更加安全的協(xié)議,并且目前已經(jīng)有不少網(wǎng)站開(kāi)始支持HTTPS了。比如說(shuō)百度: 可以看到,使用的是HTTPS協(xié)議,同時(shí)瀏覽器會(huì)提示安全,我們?cè)倏戳硗鈳讉€(gè)例子: 上圖是工行的登陸界面,可以看到也使用了HTTPS協(xié)議,如果使用的仍然是HTTP協(xié)議,瀏覽器便不會(huì)有安全字樣的提示: 哈,建行主頁(yè)竟然還沒(méi)有使用HTTPS協(xié)議,那是不是就說(shuō)明建行不安全了呢? 其實(shí)不然,我們點(diǎn)擊登陸按鈕: 可以看到使用的協(xié)議還是HTTPS協(xié)議,這說(shuō)明我們的登陸操作依然是有安全保障的,大大降低了賬號(hào)信息被盜用的可能 HTTP2
HTTP/2標(biāo)準(zhǔn)于2015年5月以RFC 7540正式發(fā)表。[5]HTTP/2的標(biāo)準(zhǔn)化工作由Chrome、Opera、Firefox[6]、Internet Explorer 11、Safari、Amazon Silk及Edge等瀏覽器提供支持。[7] 多數(shù)主流瀏覽器已經(jīng)在2015年底支持了該協(xié)議。[8]此外,根據(jù)W3Techs的數(shù)據(jù),在2017年5月,在排名前一千萬(wàn)的網(wǎng)站中,有13.7%支持了HTTP/2。 可以看到HTTP2協(xié)議已經(jīng)在互聯(lián)網(wǎng)占有一席之地,那么它究竟比HTTP強(qiáng)在哪里呢?總結(jié)了一下,大致有以下幾點(diǎn)。相比 HTTP/1.x,HTTP/2 在底層傳輸做了很大的改動(dòng)和優(yōu)化:
QUIC
QUIC相比于上述介紹的HTTP、HTTPS和HTTP2協(xié)議最大的不同就在于,其傳輸層采用的是UDP協(xié)議而不是TCP協(xié)議,因此其具備的特性有以下幾點(diǎn):
那在實(shí)際環(huán)境中,如何知道哪些訪問(wèn)使用了HTTP2、哪些訪問(wèn)使用了QUIC協(xié)議呢? 這里就要提到chrome的一個(gè)插件——HTTP/2 and SPDY indicator,當(dāng)下載該插件并成功訪問(wèn)后,我們就可以看到瀏覽器地址欄右側(cè)會(huì)多一個(gè)??標(biāo)志: 訪問(wèn)百度時(shí),這個(gè)??標(biāo)志是白色的,當(dāng)我們?cè)L問(wèn)YouTube時(shí): 會(huì)發(fā)現(xiàn)標(biāo)志變?yōu)樗{(lán)色,鼠標(biāo)移到該標(biāo)志時(shí),提示HTTP2已經(jīng)使能,這說(shuō)明在YouTube上面已經(jīng)開(kāi)始使用HTTP2協(xié)議了,在chrome瀏覽器中輸入chrome://net-internals/#http2就可以看到具體哪些網(wǎng)站使用了HTTP2和QUIC: 總結(jié)本期的內(nèi)容到這里也就告一段落了,希望讀完本篇文章后,可以讓你對(duì)網(wǎng)絡(luò)有更深入的了解,并且能夠在實(shí)際生活中,去留意這些知識(shí),尤其是抓包分析網(wǎng)絡(luò)問(wèn)題,可以說(shuō)是學(xué)習(xí)網(wǎng)絡(luò)知識(shí)和分析網(wǎng)絡(luò)問(wèn)題的最大利器。 后續(xù)我會(huì)在這一期的基礎(chǔ)上,再推出一期網(wǎng)絡(luò)知識(shí)進(jìn)階篇,敬請(qǐng)期待! 近期熱文 《Python 的 C 擴(kuò)展開(kāi)發(fā)慣例》 《輕松入門(mén) | 用 WordPress 和主題模板做網(wǎng)站》 福利
|
|
來(lái)自: imnobody2001 > 《IT技術(shù)》