前言
關(guān)于網(wǎng)絡(luò)知識(shí),一直以來(lái)都是一知半解,悔于大學(xué)期間沒有好好學(xué)習(xí)。
因此這次抽出一段時(shí)間,徹底的搞清楚網(wǎng)絡(luò)知識(shí),從ISO七層模型(實(shí)際上是TCP/IP五層模型)一層層往上,通過假設(shè)一個(gè)無(wú)網(wǎng)絡(luò)的虛擬世界,一步一步模擬搭建網(wǎng)絡(luò),從而從根上弄清楚網(wǎng)絡(luò)知識(shí)。
物理層
假設(shè)現(xiàn)在有個(gè)虛擬世界,剛剛發(fā)明出了計(jì)算機(jī),但還沒有網(wǎng)絡(luò),于是人們開始想如何能讓兩個(gè)計(jì)算機(jī)可以彼此發(fā)送數(shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)的遠(yuǎn)程傳遞。
于是人們發(fā)明了網(wǎng)線,網(wǎng)線可以把0和1轉(zhuǎn)換為電信號(hào)(高電壓代表1,低電壓代表0),于是只要把數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制的0和1,再將兩個(gè)計(jì)算機(jī)用網(wǎng)線連接起來(lái),那這兩個(gè)計(jì)算機(jī)就可以互相發(fā)送數(shù)據(jù)了。

到此物理層的網(wǎng)路通訊就已經(jīng)實(shí)現(xiàn)了,通過網(wǎng)線或光線,就可以實(shí)現(xiàn)數(shù)據(jù)的遠(yuǎn)程傳輸。
c
解決了物理層的通訊問題,人們又犯難了,比如現(xiàn)在一個(gè)村子里面好多人都有電腦,如果每?jī)蓚€(gè)電腦之間都用網(wǎng)線連接,那這線盤綜復(fù)雜簡(jiǎn)直就是災(zāi)難。
所以有人提議,不如弄個(gè)中心設(shè)備,所有電腦都和這個(gè)中心設(shè)備連接,而不是彼此連接,這樣一個(gè)電腦只用一根網(wǎng)線就夠了,然后某電腦想向另一個(gè)電腦傳輸數(shù)據(jù),就通過中心設(shè)備將數(shù)據(jù)轉(zhuǎn)發(fā)給目標(biāo)電腦,這個(gè)承擔(dān)中轉(zhuǎn)的中心設(shè)備就是交換機(jī)。
那么問題又來(lái)了,交換機(jī)怎么知道某個(gè)電腦要把數(shù)據(jù)發(fā)給哪個(gè)電腦呢?
這時(shí)每個(gè)電腦就需要有個(gè)“身份證號(hào)”,作為這個(gè)電腦的唯一標(biāo)識(shí),剛好每個(gè)電腦生產(chǎn)出來(lái)就會(huì)有個(gè)唯一編號(hào),這個(gè)編號(hào)就是MAC地址。
mac地址的組成是廠商的編碼+編號(hào),每個(gè)生產(chǎn)電腦的廠商都有自己的編號(hào),比如Intel的編號(hào)是0x00,AMD的編號(hào)是0x01,這是由一個(gè)公認(rèn)的組織機(jī)構(gòu)EUI48所規(guī)定,大家都遵守,所以每個(gè)電腦的MAC地址都是唯一的。
有了mac地址,電腦發(fā)送數(shù)據(jù)的時(shí)候,就會(huì)把數(shù)據(jù)加上mac地址,然后通過交換機(jī)轉(zhuǎn)發(fā)給目標(biāo)電腦。

交換機(jī)怎么知道某個(gè)mac地址對(duì)應(yīng)的哪個(gè)端口呢?交換機(jī)如果不知道m(xù)ac地址對(duì)應(yīng)的端口,就會(huì)通過廣播的方式告訴所有端口,誰(shuí)認(rèn)領(lǐng)就發(fā)給誰(shuí),然后會(huì)通過這種“偷聽”方式記錄下來(lái)哪個(gè)端口對(duì)應(yīng)的哪個(gè)mac地址。
網(wǎng)絡(luò)層
互聯(lián)網(wǎng)
目前解決了多天電腦彼此互相通訊的事,但是問題又來(lái)了,人們想把世界上所有的電腦都連接起來(lái),這樣就可以實(shí)現(xiàn)互聯(lián)網(wǎng)了
于是有人提議搞一個(gè)超級(jí)大的交換機(jī),把世界上所有的電腦都連接起來(lái),然后超級(jí)交換機(jī)就可以實(shí)現(xiàn)互聯(lián)網(wǎng)了。
但是這樣就會(huì)出現(xiàn)一個(gè)問題,世界上的電腦那么多,即使某個(gè)電腦知道目標(biāo)電腦的mac地址,但發(fā)送給交換機(jī),交換機(jī)要通過廣播來(lái)確認(rèn)哪個(gè)端口對(duì)應(yīng)這個(gè)mac地址,但世界上的設(shè)備太多了,廣播給所有設(shè)備簡(jiǎn)直是災(zāi)難。
想想現(xiàn)實(shí)世界是如何送快遞的,如果只有身份證號(hào)或手機(jī)號(hào)(相當(dāng)于這里的mac地址),那快遞公司要問所有世界上的人誰(shuí)是這個(gè)身份證號(hào)/手機(jī)號(hào),然后有人認(rèn)領(lǐng),才給他送過去,這豈不是弱智行為。
實(shí)際上送快遞一定要留的就是地址,比如:中國(guó).遼寧省.大連市.XX小區(qū),國(guó)際快遞公司一看中國(guó),發(fā)給中國(guó)中轉(zhuǎn)站,一看是遼寧,發(fā)給遼寧中轉(zhuǎn)站,依此類推,最后給收件人發(fā),整個(gè)過程沒有一條路是白走的。

所以問題的解決方案就清晰了,要有個(gè)類似“中國(guó).遼寧省.大連市.XX小區(qū)”這樣的地址,這個(gè)地址就是IP地址。還要有一個(gè)可以類似中轉(zhuǎn)功能的承上啟下的設(shè)備,這個(gè)設(shè)備就是路由器。
比如現(xiàn)在就劃分1.x.x.x給中國(guó)用,2.x.x.x給韓國(guó)用,而中國(guó)又細(xì)分1.2.x.x給山東,1.3.x.x給遼寧,遼寧再按不同的市再依次細(xì)分,依次類推。實(shí)際上ip地址是分為4段,每段是8位二進(jìn)制,對(duì)應(yīng)范圍是0-255,而本文只簡(jiǎn)化考慮下
而路由器就相當(dāng)于網(wǎng)絡(luò)世界的中轉(zhuǎn)站,他負(fù)責(zé)根據(jù)ip地址判斷路線該如何走,于是上面送快遞的圖就變成下面這個(gè)網(wǎng)絡(luò)圖了:

圖中如1.3.1.1這個(gè)路由器,它和它的下級(jí)組成了1.3.x.x這個(gè)網(wǎng)段,所以在他的管轄范圍內(nèi),前兩位是網(wǎng)段,后兩位是設(shè)備地址,為了表示前兩位是網(wǎng)段地址,所以引入了子網(wǎng)掩碼,這個(gè)網(wǎng)段的子網(wǎng)掩碼按二進(jìn)制就是前16位,也可以表示為255.255.0.0(通過二與ip地址與計(jì)算就可算出1.3.x.x)
為了避免不同國(guó)家彼此沖突,搶占網(wǎng)段,世界上成立了一個(gè)IANA組織負(fù)責(zé)分配網(wǎng)段。
局域網(wǎng)
雖然可分配的ip地址非常多,但是如果所有可上網(wǎng)設(shè)備都分配一個(gè)唯一ip也不可能夠用,而且也沒有必要,比如家里的上網(wǎng)設(shè)備有電腦、電視、手機(jī)等等,完全沒有必要每個(gè)設(shè)備都分配一個(gè)公網(wǎng)ip地址,只要自己家里搭建一個(gè)局域網(wǎng),大家共享一個(gè)公網(wǎng)ip出口,就可以實(shí)現(xiàn)所有設(shè)備同時(shí)上網(wǎng)
所以IANA特意預(yù)留了一些ip地址作為局域網(wǎng)的網(wǎng)段,供大家搭建局域網(wǎng)使用,這些網(wǎng)段不會(huì)被公網(wǎng)ip占用
- 10.0.0.0 ~ 10.255.255.255 超大公司、園區(qū)、大型企業(yè)
- 172.16.0.0 ~ 172.31.255.255 中型公司、酒店、商場(chǎng)
- 192.168.0.0 ~ 192.168.255.255 家庭、小公司、小網(wǎng)吧
ARP
雖然有了ip地址,但網(wǎng)絡(luò)層是基于數(shù)據(jù)鏈路層實(shí)現(xiàn),因?yàn)榫W(wǎng)線、網(wǎng)卡、交換機(jī)只認(rèn)mac地址,所以一個(gè)路由器要通過ARP(Address Resolution Protocol)協(xié)議將ip地址轉(zhuǎn)換成mac地址,最終實(shí)際發(fā)送數(shù)據(jù)包。
傳輸層
有了網(wǎng)絡(luò)層,世界上的所有計(jì)算機(jī)之間就可以互相通信了,再此之上實(shí)際使用還是要做到程序與程序(即端口和端口)之間的通訊,比如微信和微信通訊,再就是數(shù)據(jù)傳輸怎么校驗(yàn)數(shù)據(jù)有沒有丟失,有沒有亂序,如果發(fā)送失敗如何處理,這就是傳輸層要解決的問題。
傳輸層的實(shí)現(xiàn)重點(diǎn)是計(jì)算機(jī)(操作系統(tǒng))彼此之間遵循一致的協(xié)議,比如A計(jì)算機(jī)說(shuō)要發(fā)送到B計(jì)算機(jī)的80端口(數(shù)據(jù)包一定包含該信息),B計(jì)算機(jī)可以通過接受的數(shù)據(jù)包識(shí)別出來(lái)這個(gè)數(shù)據(jù)是要發(fā)送到80端口的

傳輸層除了要解決端口問題,再次之上還要根據(jù)不同場(chǎng)景解決額外問題:
- 要不要校驗(yàn)數(shù)據(jù)完整性?
- 要不要保證送達(dá)?
- 要不要保證順序?
- 要不要控制流量?
于是就分化出兩種路線:
- TCP協(xié)議:把可靠、順序、連接、重傳全都做了(速度相對(duì)慢)
- UDP協(xié)議:只做端口和數(shù)據(jù)完整校驗(yàn),其他都不管(速度相對(duì)快)
UDP協(xié)議
先說(shuō)最簡(jiǎn)單的UDP協(xié)議,它很簡(jiǎn)單,就是把數(shù)據(jù)包發(fā)送給目標(biāo)主機(jī)的目標(biāo)端口,至于數(shù)據(jù)是否送達(dá)它不管。
它的消息頭也非常簡(jiǎn)單,只包含源端口,目標(biāo)端口,數(shù)據(jù)長(zhǎng)度,校驗(yàn)和。
UDP協(xié)議最大的特點(diǎn)是,它不保證數(shù)據(jù)包送達(dá),也不保證數(shù)據(jù)包順序,總之就是為了簡(jiǎn)單快速,適合于數(shù)據(jù)準(zhǔn)確性不重要,但速度要求高的場(chǎng)景。
TCP協(xié)議
TCP協(xié)議,它的消息頭比UDP協(xié)議要復(fù)雜一些,它除了包含源端口,目標(biāo)端口,數(shù)據(jù)長(zhǎng)度,校驗(yàn)和外,還包含一個(gè)序列號(hào),一個(gè)確認(rèn)號(hào),一個(gè)窗口大小,一個(gè)緊急標(biāo)志等等。
TCP協(xié)議的出發(fā)點(diǎn)就是保障數(shù)據(jù)的送達(dá),并且能保證數(shù)據(jù)包的順序。它是一個(gè)可靠的傳輸協(xié)議,為了保證這些,TCP協(xié)議會(huì)制定復(fù)雜的規(guī)則進(jìn)行確認(rèn),比如三次握手,四次揮手等等,導(dǎo)致傳輸效率一定會(huì)損失。
TCP是面向連接的,也就是它要求彼此先建立連接,然后再進(jìn)行數(shù)據(jù)傳輸,最后關(guān)閉連接,就好像打電話,先接通,再通話溝通,最后掛斷。而UDP是無(wú)連接的,它就像發(fā)短信,發(fā)過去了就可以,也不管對(duì)方收沒收到。
所謂的連接是虛擬的,并不是有一條專線,而不過是通信雙方各自在自己內(nèi)存里,保存了一套關(guān)于這次對(duì)話的信息
建立連接需要三次握手,目的是保證彼此發(fā)出的數(shù)據(jù)對(duì)方都能收到

斷開連接需要四次揮手,目的是斷開連接同時(shí)保證數(shù)據(jù)收發(fā)完畢

應(yīng)用層
操作系統(tǒng)層面解決了傳輸層的問題,實(shí)現(xiàn)了轉(zhuǎn)發(fā)端口,和選擇可靠、不可靠傳輸方式。然后就是程序自身的協(xié)議了,這就來(lái)到了應(yīng)用層。
程序自己的協(xié)議也是在TCP/UDP的基礎(chǔ)上,規(guī)定了數(shù)據(jù)包的字段,格式等。
比如最出名的HTTP協(xié)議,基于TCP實(shí)現(xiàn),最早是為了瀏覽器訪問網(wǎng)頁(yè)而創(chuàng)建的協(xié)議,它對(duì)頂了報(bào)文的格式,定義了報(bào)文頭和報(bào)文體,以及報(bào)文頭中包含的HTTP版本、狀態(tài)碼、請(qǐng)求方法、URL、請(qǐng)求頭、響應(yīng)頭等等等等。
所以從應(yīng)用層開始,所謂的協(xié)議不過就是根絕具體的場(chǎng)景定義了一個(gè)數(shù)據(jù)格式,通訊雙方都遵守就可以互相理解,比如HTTP規(guī)定第X位為狀態(tài)碼,那瀏覽器就可以讀取對(duì)應(yīng)的位置獲取狀態(tài)碼

我們可以繼續(xù)在HTTP協(xié)議的基礎(chǔ)之上再定義一個(gè)協(xié)議,比如我們開發(fā)后端接口返回的數(shù)據(jù)包含兩個(gè)字段:一個(gè)是code、一個(gè)是data, 前端通過code來(lái)判斷接口是否成功,通過data獲取返回?cái)?shù)據(jù),這本身也是一種基于HTTP協(xié)議之上的自定義協(xié)議。
最后
最后補(bǔ)充一張完整層級(jí)圖
