網(wǎng)絡(luò)基礎(chǔ)之協(xié)議棧
在計(jì)算機(jī)網(wǎng)絡(luò)里传透,數(shù)據(jù)傳輸?shù)牧鞒檀笾驴煞譃橐韵聨撞剑?/p>
1、應(yīng)用程序原始數(shù)據(jù)被拆解并編碼韧衣,轉(zhuǎn)化成電信號或光信號盅藻;
2、電信號或光信號通過物理介質(zhì)傳輸汹族;
3萧求、傳輸完成后電信號或光信號還原成應(yīng)用程序數(shù)據(jù)被接收;
整個流程顶瞒,都是通過計(jì)算機(jī)網(wǎng)絡(luò)協(xié)議棧完成的夸政。
而現(xiàn)在的互聯(lián)網(wǎng)采用就是基于OSI七層模型的TCP/IP協(xié)議棧,主要包括五層榴徐,即應(yīng)用層守问、傳輸層、網(wǎng)絡(luò)層坑资、數(shù)據(jù)鏈路層和物理層耗帕,如下圖所示;其中數(shù)據(jù)鏈路層又可以分為兩個子層袱贮,即LLC(邏輯鏈路控制層)和MAC(介質(zhì)訪問控制層)仿便。
應(yīng)用層:為應(yīng)用程序提供數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)接口,常見的是HTTP、Telnet嗽仪、FTP等協(xié)議都工作在這一層荒勇;
傳輸層:傳輸層提供端到端的連接,例如讓A主機(jī)上的程序小紅找到B主機(jī)上的應(yīng)用程序小明闻坚。TCP和UDP都工作在這一層沽翔,端口號的定義也在這一層;
網(wǎng)絡(luò)層:用于尋址窿凤,它能讓互聯(lián)網(wǎng)的兩臺主機(jī)在互聯(lián)網(wǎng)的茫媒鲑耍”機(jī)海“中找到彼此雳殊;
數(shù)據(jù)鏈路層:網(wǎng)卡就工作這一層橘沥,負(fù)責(zé)將數(shù)據(jù)信號轉(zhuǎn)化成光信號或者電信號,供物理層傳輸夯秃;
物理層:物理層是信號傳輸?shù)奈锢硗ǖ劳眨W(wǎng)線和配套的接口都屬于物理層。
應(yīng)用程序數(shù)據(jù)寝并,經(jīng)過這五層協(xié)議自上往下逐層分解,最終變成可供物理介質(zhì)可傳輸?shù)男盘柛贡福?dāng)達(dá)到目的地主機(jī)后衬潦,再自下而上還原成應(yīng)用程序數(shù)據(jù)。
那么植酥,為什么不能把應(yīng)用程序數(shù)據(jù)直接轉(zhuǎn)化成物理信號镀岛,其實(shí)是因?yàn)榫W(wǎng)絡(luò)棧分層后使得一些特殊功能的網(wǎng)絡(luò)設(shè)備可以只實(shí)現(xiàn)協(xié)議棧的子集,我想言下之意應(yīng)該是說友驮,讓所有的設(shè)備功能都可以解耦單獨(dú)完成自己的工作就可以了漂羊。如路由器,只要實(shí)現(xiàn)網(wǎng)絡(luò)層卸留、數(shù)據(jù)鏈路層和物理層的功能就可以了走越。這樣就保證了每一層都可以單獨(dú)設(shè)計(jì),只要保證上下兩層的接口保持一致就可以了耻瑟。
互聯(lián)網(wǎng)是如何提供服務(wù)的
互聯(lián)網(wǎng)上的主流應(yīng)用旨指,如瀏覽器、在線視頻喳整、社交游戲等類型很多谆构,但其本質(zhì)都是下載。作者舉例說框都,我們想象用戶將一根水管插到水桶里搬素,水經(jīng)過水管流出,我們可以用來做飯(聽歌)、洗手(看視頻)熬尺、洗菜(瀏覽網(wǎng)頁)摸屠,這些水(資源)被下載到本地后,應(yīng)用程序就會按照開發(fā)者的設(shè)計(jì)猪杭,將數(shù)據(jù)進(jìn)行存儲餐塘,和使用。所以皂吮,在C++戒傻、Java等大量編程語言中,流叫做stream蜂筹,被用來形容一個地方從另外一個地方不間斷地獲取數(shù)據(jù)需纳。
用戶打開網(wǎng)站時,瀏覽器會根據(jù)網(wǎng)址與服務(wù)器建立連接艺挪,從而建立流不翩。網(wǎng)頁的數(shù)據(jù)通過這個管道不斷地流向用戶的瀏覽器,瀏覽器得到這些數(shù)據(jù)后麻裳,立即進(jìn)行解析口蝠、排版、繪制津坑,經(jīng)過整個渲染過程妙蔗,用戶看到了呈現(xiàn)在瀏覽器窗口內(nèi)的網(wǎng)頁。
IP地址
IP地址相當(dāng)于接入互聯(lián)網(wǎng)的所有主機(jī)對應(yīng)的門牌號疆瑰,這個門牌號在互聯(lián)網(wǎng)上是獨(dú)一無二的眉反,否則發(fā)送給指定主機(jī)的數(shù)據(jù)就會走錯門。
我們可以用通過系統(tǒng)屬性或網(wǎng)站提供的服務(wù)頁面查詢本機(jī)的IP地址穆役,嘗試如下圖寸五。
每一臺連接到網(wǎng)絡(luò)的中的網(wǎng)卡,都有一個IP地址耿币,用來在網(wǎng)絡(luò)中收發(fā)信息梳杏。在IP地址庫中,有三類地址被定義為”私有地址“掰读,如下表所示:
私有地址秘狞,就是指這些地址只允許被用在私有網(wǎng)絡(luò)中,不能作為互聯(lián)網(wǎng)接入地址使用蹈集,如果某臺PC接入家庭網(wǎng)絡(luò)或者公司的局域網(wǎng)烁试,他的IP肯定會落到上表中的地址段中。但如果私有網(wǎng)絡(luò)中的設(shè)備拢肆,要訪問互聯(lián)網(wǎng)上的內(nèi)容减响,就需要用到NAT(Network Address Translation靖诗,網(wǎng)絡(luò)地址轉(zhuǎn)換)技術(shù)。
NAT轉(zhuǎn)換技術(shù)支示,主要有三中實(shí)現(xiàn)方式:
1刊橘、靜態(tài)轉(zhuǎn)換(Static NAT)
內(nèi)網(wǎng)地址與外網(wǎng)地址是一一對應(yīng)關(guān)系,如果內(nèi)網(wǎng)中有10臺主機(jī)需要訪問外部網(wǎng)絡(luò)颂鸿,就需要有10個外網(wǎng)IP地址做映射促绵,而且這10個內(nèi)網(wǎng)IP和10個外網(wǎng)IP是固定的映射關(guān)系。如果需要內(nèi)部網(wǎng)絡(luò)的一臺主機(jī)作為外網(wǎng)的服務(wù)器嘴纺,就需要用到靜態(tài)轉(zhuǎn)換败晴。
2、動態(tài)轉(zhuǎn)換(Dynamic NAT)
動態(tài)轉(zhuǎn)換與靜態(tài)轉(zhuǎn)換類似栽渴,但內(nèi)網(wǎng)IP與外網(wǎng)IP不是一一對應(yīng)關(guān)系尖坤,一般ISP會使用這種方式為接入用戶提供訪問外網(wǎng)的能力芍耘。
3蚀腿、端口多路復(fù)用(Overload)
這種方式,就是一個外網(wǎng)的IP可以被內(nèi)網(wǎng)多個IP同步共享盔几,與前兩個方式的區(qū)別在于講端口作為一個映射的維度墅冷,家用路由器一般都是通過端口多路復(fù)用來實(shí)現(xiàn)NAT的纯路。
那么為什么同一臺設(shè)備有兩個不同的IP地址呢,其實(shí)網(wǎng)絡(luò)上查詢的IP是經(jīng)過NAT轉(zhuǎn)化之后的了寞忿,詳細(xì)流程參見下圖:
PING和網(wǎng)關(guān)
PING(Packet Internet Groper)是網(wǎng)絡(luò)診斷工具感昼,意為互聯(lián)網(wǎng)包探測器。PING是TCP/IP協(xié)議簇中的一部分罐脊,其原理是向目標(biāo)IP地址發(fā)送一個數(shù)據(jù)包,如果對方返回一個同樣大小的數(shù)據(jù)包蜕琴,則證明聯(lián)通萍桌,并且整個過程能測試時延。
網(wǎng)關(guān)凌简,就是兩個網(wǎng)絡(luò)之間的門上炎,在物理上網(wǎng)關(guān)是一個網(wǎng)絡(luò)設(shè)備,擁有IP地址雏搂,在家庭網(wǎng)絡(luò)里通常就是路由器的IP地址藕施。網(wǎng)關(guān)具有轉(zhuǎn)接和過濾的功能。
端口
端口是終端留給外部的接口凸郑,是不同設(shè)備之間通信的橋梁裳食,物理設(shè)備是通過物理端口實(shí)現(xiàn)溝通的,比如網(wǎng)口芙沥、USB等都是物理端口或接口诲祸。計(jì)算機(jī)內(nèi)部有很多數(shù)據(jù)服務(wù)都是要通過一個物理端口與其他設(shè)備產(chǎn)生聯(lián)系的浊吏,外部的數(shù)據(jù)包也是需要通過物理端口反饋回來的,但是計(jì)算機(jī)內(nèi)部各種各種的服務(wù)數(shù)以萬計(jì)救氯,每個服務(wù)怎么知道回來的數(shù)據(jù)包是自己需要的找田,這樣便有了”虛擬端口“,一個服務(wù)想和外界聯(lián)系就要綁定一個端口號着憨,同時制定目標(biāo)服務(wù)的端口號墩衙,這個端口便是虛擬端口,這樣便把相應(yīng)的服務(wù)數(shù)據(jù)包放在對應(yīng)服務(wù)生命端口的緩沖區(qū)中甲抖,等待服務(wù)取走自己的數(shù)據(jù)包漆改。
另外,還有一個概念惧眠,就是服務(wù)進(jìn)程拿了一部分?jǐn)?shù)據(jù)后開始處理籽懦,但是還沒有處理完又有新的數(shù)據(jù)來了,當(dāng)緩沖區(qū)數(shù)據(jù)過多氛魁,可能就會造成數(shù)據(jù)溢出丟失暮顺。解決辦法就是在進(jìn)程中設(shè)計(jì)了一個特殊的監(jiān)聽線程負(fù)責(zé)監(jiān)聽綁定的端口,如果有數(shù)據(jù)過來秀存,監(jiān)聽線程就會把這個數(shù)據(jù)從緩沖區(qū)取走捶码,讓其他的線程處理。作者給的例子非常顯淺易懂或链,比如把公司比作是一個進(jìn)程惫恼,前臺比作一個監(jiān)控線程,而其他的人則可比做處理數(shù)據(jù)包的其他線程澳盐,當(dāng)快遞源源不斷的寄到公司的時候祈纯,監(jiān)控線程是可以隨時通知其他線程來拿走數(shù)據(jù)包進(jìn)行處理的,而不用等到一個完成才能叫下一個線程叼耙。
TCP和UDP
TCP(Transmission Control Protocol)即傳輸控制協(xié)議腕窥,IP(Internet Protocol)即因特網(wǎng)互聯(lián)協(xié)議。TCP/IP是一個協(xié)議簇筛婉,也就是許多協(xié)議的集合簇爆,包含了很多不同的協(xié)議,并定義好了整個互聯(lián)網(wǎng)連接和協(xié)商的最基礎(chǔ)原則爽撒。
TCP和UDP處于整個網(wǎng)絡(luò)協(xié)議棧的應(yīng)用層入蛆,是兩個不同的通信協(xié)議,其作用都是傳輸數(shù)據(jù)硕勿,常見的網(wǎng)絡(luò)數(shù)據(jù)都是基于這兩種協(xié)議進(jìn)行傳輸?shù)摹?/p>
TCP是應(yīng)答式通信方式哨毁,UDP是只管發(fā)送而不管是否接收成功的通信方式。TCP的數(shù)據(jù)傳輸需要一個邏輯上的私有通道源武,當(dāng)連接兩端成功后挑庶,所有的數(shù)據(jù)都在這條通道上傳輸言秸,發(fā)送方也會收到數(shù)據(jù)被成功接收的回執(zhí)。另外迎捺,為保證這條通道的正確建立举畸,客戶端和服務(wù)端需要進(jìn)行”三次握手<傳輸兩端需要三次確認(rèn),才能開始通信>“凳枝,保證了數(shù)據(jù)的可靠性抄沮,但是降低的效率。
TCP保證可靠性的手段:順序編號岖瑰、確認(rèn)機(jī)制和超時重傳叛买。
UDP則比較簡單粗暴,不管對方的狀態(tài)蹋订,直接發(fā)送數(shù)據(jù)不需要建立通道率挣,所以保障的數(shù)據(jù)傳輸?shù)男剩莵G失了可靠性露戒。
但是每種場景應(yīng)用哪一種傳輸協(xié)議椒功,應(yīng)結(jié)合實(shí)際情況考慮,不能一概而論智什。
反向代理
一般意義上的代理动漾,都是指客戶端向外界發(fā)送請求時,并不直接與目標(biāo)服務(wù)器連接荠锭,而是將所有的請求交給一個代理服務(wù)器旱眯,他負(fù)責(zé)對外連接外界的目標(biāo)服務(wù)器。同時证九,外界從服務(wù)器返回的數(shù)據(jù)也是先經(jīng)過代理服務(wù)器返回客戶端删豺。在外界看來,所有的客戶端都隱藏在代理服務(wù)器后面愧怜,起到了保護(hù)客戶端的作用吼鳞。
反向代理,則恰好相反叫搁,是針對服務(wù)器的一種代理技術(shù),可以接受客戶端的請求供炎,然后把他們分發(fā)給被代理的后端服務(wù)器上渴逻,等這些服務(wù)器處理完請求后,再將結(jié)果轉(zhuǎn)發(fā)給客戶端音诫,他是將服務(wù)器都隱藏在身后惨奕,對客戶端來說也許只有一臺服務(wù)器,但是反代理服務(wù)器也許服務(wù)了成千上外臺的后端服務(wù)器竭钝。
那么梨撞,反向代理服務(wù)器的意義則是實(shí)現(xiàn)了負(fù)載均衡雹洗,因?yàn)闀泻芏嗯_服務(wù)器提供服務(wù),但是每一臺服務(wù)器的負(fù)荷可能不一樣卧波,如果請求被發(fā)送到負(fù)荷較高的服務(wù)器时肿,他的處理時間可能較長,但是客戶端不知道那臺服務(wù)器比較清閑港粱,而反向代理服務(wù)器知道每臺服務(wù)器的負(fù)載量螃成,會將請求轉(zhuǎn)發(fā)到相對空閑的服務(wù)器。
同時查坪,反向代理服務(wù)器還可以減輕后端服務(wù)器的壓力寸宏,比如一些靜態(tài)資源或者緩存數(shù)據(jù),可以直接放在反向代理服務(wù)器上偿曙,不用將這些請求放到后端服務(wù)器氮凝,這樣就可以直接服務(wù)前臺應(yīng)用了。反向代理服務(wù)器還能為后端服務(wù)器阻擋一些網(wǎng)絡(luò)攻擊望忆,提升后臺服務(wù)器的安全性罩阵,反向代理服務(wù)器對于后端服務(wù)器而言,如同產(chǎn)品經(jīng)理和研發(fā)同學(xué)炭臭,能過濾掉不必要的需求永脓,減輕工程師的對接壓力。