前言:
介于自己的網(wǎng)絡(luò)方面知識(shí)爛的一塌糊涂,所以準(zhǔn)備寫相關(guān)網(wǎng)絡(luò)的文章裤翩,但是考慮全部寫在一篇太長(zhǎng)了,所以分開寫调榄,希望大家能仔細(xì)看踊赠,最好可以指出我的錯(cuò)誤,讓我也能糾正每庆。
1.講解相關(guān)的整個(gè)網(wǎng)絡(luò)體系結(jié)構(gòu):
Android技能樹 — 網(wǎng)絡(luò)小結(jié)(1)之網(wǎng)絡(luò)體系結(jié)構(gòu)
2.講解相關(guān)網(wǎng)絡(luò)的重要知識(shí)點(diǎn)筐带,比如很多人都聽過相關(guān)網(wǎng)絡(luò)方面的名詞,但是僅限于聽過而已缤灵,什么tcp ,udp ,socket ,websocket, http ,https ,然后webservice是啥伦籍,跟websocket很像,socket和websocket啥關(guān)系長(zhǎng)的也很像腮出,session,token,cookie又是啥鸽斟。
Android技能樹 — 網(wǎng)絡(luò)小結(jié)(2)之TCP/UDP
Android技能樹 — 網(wǎng)絡(luò)小結(jié)(3)之HTTP/HTTPS
Android技能樹 — 網(wǎng)絡(luò)小結(jié)(4)之socket/websocket/webservice
相關(guān)網(wǎng)絡(luò)知識(shí)點(diǎn)小結(jié)- cookie/session/token(待寫)
3.相關(guān)的第三方框架的源碼解析,畢竟現(xiàn)在面試個(gè)大點(diǎn)的公司利诺,okhttp和retrofit源碼是必問的。
Android技能樹 — 網(wǎng)絡(luò)小結(jié)(6)之 OkHttp超超超超超超超詳細(xì)解析
Android技能樹 — 網(wǎng)絡(luò)小結(jié)(7)之 Retrofit源碼詳細(xì)解析
網(wǎng)絡(luò)這塊知識(shí)其實(shí)很多開發(fā)估計(jì)都很薄弱剩燥,很多開發(fā)一直都是使用一些框架慢逾,然后和后臺(tái)約定好返回的數(shù)據(jù)結(jié)構(gòu),然后就可以干活了灭红。比如我們知道了retrofit調(diào)用的api后侣滩,填入相關(guān)的http url及要傳給服務(wù)器的指定參數(shù),我們就可以拿到相關(guān)的返回JSON:
{
"success":true,
"msg":"xxxx",
"data":{
"key1":value1,
"key2":value2
}
}
(當(dāng)然其中的``success``一般的也是會(huì)用``code``值來返回变擒,
然后移動(dòng)端來判斷是否是200即可君珠。)
然后通過類似FastJson或者Gson等轉(zhuǎn)換成對(duì)象,然后用在我們的app中即可娇斑。
所以在很多時(shí)候策添,我們發(fā)現(xiàn)我們對(duì)于網(wǎng)絡(luò)的東西一竅不通,照樣能做出一個(gè)app來毫缆。而且說起來也是頭頭是道,但是一旦去面試大點(diǎn)的公司唯竹,問的稍微詳細(xì)點(diǎn),就直接啞口無言苦丁,然后基本就面試GG了浸颓。
而介于我的網(wǎng)絡(luò)基礎(chǔ)也是超級(jí)爛,所以這次是參考別人的文章,自己理解产上,并且做了總結(jié)棵磷,文章最后會(huì)附上相關(guān)鏈接,并且一些圖也是直接參考這些大佬們的文章里面的配圖晋涣。(所以不要噴我直接盜圖)仪媒。
1.網(wǎng)絡(luò)體系結(jié)構(gòu)
不知道大家小時(shí)候有沒有寫過信,通過郵局寄出去姻僧,但是那時(shí)候我們要手動(dòng)的把真正寫的內(nèi)容寫在紙上规丽,然后塞入信封中,然后在信封上寫上相關(guān)發(fā)件人信息撇贺,收件人信息赌莺,郵編等,然后才能順利的寄到目的地松嘶。而收件人最關(guān)心的肯定是里面的真正內(nèi)容的紙張艘狭,甚至可以不看信封的信息。
那我們?cè)谄綍r(shí)發(fā)送相關(guān)的信息的時(shí)候其實(shí)也跟寄信有點(diǎn)像翠订,我們也只是寫了相關(guān)的主要信息巢音,但是最后卻能發(fā)送到指定的地點(diǎn),因?yàn)閹臀覀円粚訉臃庋b了數(shù)據(jù)(有點(diǎn)像幫忙寫了信封上的信息)尽超。然后對(duì)方收到信息的時(shí)候官撼,也只看到了我們發(fā)給他的主要信息(有點(diǎn)像幫忙打開了信封,拿出來里面的主要內(nèi)容)似谁。
看這個(gè)圖是不是感覺很像剛才寄信傲绣,我們主要的DATA內(nèi)容被一層層封裝,然后到了接收方后巩踏,一層層解封裝秃诵。
有些人可能會(huì)問,那這一層層的塞琼,到底具體做了什么呢菠净,其實(shí)讓你現(xiàn)在想象你也大概知道一些,比如對(duì)方的地址和你的地址彪杉;各種約定好的協(xié)議(比如我們信封上面的郵編號(hào)也算是規(guī)定的協(xié)議)毅往;比如你用的是英文寫的,或者用的中文寫的派近,對(duì)方也要會(huì)看懂煞抬,大家最好也是要相互約定,這樣寄信過去后才能更方面讓對(duì)方讀懂等等构哺。
我們一步步具體來看:
1.1 OSI體系結(jié)構(gòu)
其實(shí)上面那個(gè)圖用的是OSI體系結(jié)構(gòu)革答,所有我們可以看到有七層战坤。
其實(shí)看上面的圖已經(jīng)大概有點(diǎn)了解了:
-
物理層:
主要定義物理設(shè)備標(biāo)準(zhǔn),如網(wǎng)線的接口類型残拐、光纖的接口類型途茫、各種傳輸介質(zhì)的傳輸速率等。主要作用是將數(shù)據(jù)最終編碼為用0溪食、1標(biāo)識(shí)的比特流囊卜,通過物理介質(zhì)傳輸,這一層的數(shù)據(jù)叫做比特错沃。 - 數(shù)據(jù)鏈路層:主要將接收到的數(shù)據(jù)進(jìn)行MAC地址(網(wǎng)卡地址)的封裝與解封裝栅组。常把這一層的數(shù)據(jù)叫做幀。這一層常工作的設(shè)備是交換機(jī)枢析。
- 網(wǎng)絡(luò)層:主要將接收到的數(shù)據(jù)進(jìn)行 IP 地址的封裝與解封裝玉掸。常把這一層的數(shù)據(jù)叫做數(shù)據(jù)包。這一層設(shè)備是路由器醒叁。
- 傳輸層:定義了一些數(shù)據(jù)傳輸?shù)膮f(xié)議和端口號(hào)司浪。主要將接收的數(shù)據(jù)進(jìn)行分段和傳輸,到達(dá)目的地址后在進(jìn)行重組把沼。常把這一層的數(shù)據(jù)叫做段啊易。
- 會(huì)話層:通過傳輸層建立數(shù)據(jù)傳輸?shù)耐贰V饕谙到y(tǒng)之間發(fā)起會(huì)話或者接收會(huì)話請(qǐng)求饮睬。
-
表示層:主要進(jìn)行對(duì)接收數(shù)據(jù)的解釋租谈、加密與解密、壓縮與解壓縮捆愁。
確保一個(gè)系統(tǒng)的應(yīng)用層發(fā)送的數(shù)據(jù)能被另一個(gè)系統(tǒng)的應(yīng)用層識(shí)別垦垂。 - 應(yīng)用層:主要是為一些終端應(yīng)用程序提供服務(wù)。直接面對(duì)著用戶的牙瓢。
來個(gè)更具體的圖片:
然后很多人說七層太多了看不懂,然后表示直接放棄间校,(PS:我自己也表示放棄) 雖然知道封裝了很多東西矾克,但是層數(shù)太多,真心不想看下去憔足。所以后來看到還有其他的比較少的層數(shù)結(jié)構(gòu)
1.2 TCP / IP的體系結(jié)構(gòu)
TCP / IP的體系結(jié)構(gòu)簡(jiǎn)化了計(jì)算機(jī)網(wǎng)絡(luò)的結(jié)構(gòu)胁附,由原來的七層編導(dǎo)現(xiàn)在的四層,但是其功能并沒有減少滓彰。
是不是一下子少了很多控妻,我們知道一個(gè)數(shù)據(jù)從這邊發(fā)送到另外一個(gè)地方,很像寄信一樣揭绑,我們就以寄信來說明弓候,更加通俗易懂郎哭。寄信無非就是要有這幾個(gè)條件:
- 你寄信要先有個(gè)郵筒(郵局)吧,然后你把信投進(jìn)去他們才開始受理菇存。
- 要知道對(duì)方在哪個(gè)城市(也就是你填的郵編號(hào)碼)夸研,不然你都不知道這封信發(fā)送到哪個(gè)城市,甚至有可能要中轉(zhuǎn)好幾次(你寄個(gè)信到某個(gè)城市依鸥,有時(shí)候一些近的城市可以直達(dá)亥至,有時(shí)候一些很遠(yuǎn)的城市是不是要中轉(zhuǎn)很多個(gè)城市,最后才到了目的地)
- 信送到了這個(gè)城市的郵局贱迟,但是伴隨著的是很多其他都到這個(gè)城市的信姐扮,這時(shí)候具體要送到這個(gè)城市的具體的某個(gè)街道,某個(gè)小區(qū)等衣吠。這時(shí)候就會(huì)根據(jù)自己信封上面的具體收件人信息來確定這封信到底是屬于具體的某個(gè)人的茶敏。
- 信到了收件人手里,里面的信封我們可能是用英文寫的或者中文寫的蒸播,又或者是通過某種格式來組成的加密信件(中國(guó)特務(wù)電視劇看過不)睡榆,所以收件人在要讀懂這封信,就要請(qǐng)相關(guān)的人來幫忙翻譯解釋袍榆。(反正寄過來英文信件胀屿,我肯定是找個(gè)英文厲害的人幫我翻譯翻譯)
所以上面的例子看懂了我們?cè)賮砜碩CP/IP的四層協(xié)議(當(dāng)然我只是講了一個(gè)大概,沒有講解詳細(xì)包雀,甚至如果講錯(cuò)了宿崭,望指正
):
- 網(wǎng)絡(luò)接口層:就像郵筒一樣,我們肯定需要有相應(yīng)的物理層(比如網(wǎng)絡(luò)相關(guān)硬件)才写,同時(shí)還會(huì)放入一些核心信息葡兑,比如ip等 (這樣郵局才能知道在把你這封信放在哪個(gè)城市運(yùn)輸車?yán)锩妫?/strong>
-
網(wǎng)絡(luò)層:我們知道了ip,要把數(shù)據(jù)從一個(gè)主機(jī)傳到另外一個(gè)地方的主機(jī)赞草,同時(shí)中間可能有中轉(zhuǎn) (類似寄信從一個(gè)城市到另外一個(gè)城市) 讹堤。
詳細(xì)的可以看:網(wǎng)絡(luò)層的作用
-
運(yùn)輸層:一個(gè)電腦可能有多個(gè)進(jìn)程同時(shí)在使用網(wǎng)絡(luò)連接,那么網(wǎng)絡(luò)包達(dá)到主機(jī)之后厨疙,怎么區(qū)分自己屬于那個(gè)進(jìn)程洲守?(相當(dāng)于很多信一起運(yùn)到了這個(gè)城市,但是你的信具體屬于哪個(gè)人的呢沾凄?) 所以傳輸層從網(wǎng)絡(luò)層接收數(shù)據(jù)后梗醇,必須將數(shù)據(jù)正確遞交給某個(gè)應(yīng)用程序,也就是傳輸層曾能夠區(qū)分不同進(jìn)程的數(shù)據(jù)并且加以區(qū)分處理撒蟀。(同時(shí)反過來叙谨,當(dāng)處于發(fā)送方的那邊,傳輸層從應(yīng)用程序接收?qǐng)?bào)文后要封裝在傳輸層的段中再交給網(wǎng)絡(luò)層發(fā)送)保屯。具體詳細(xì)可以參考:傳輸層作用概述
-
應(yīng)用層:該層包括所有和應(yīng)用程序協(xié)同工作手负,利用基礎(chǔ)網(wǎng)絡(luò)交換應(yīng)用程序?qū)S玫臄?shù)據(jù)的協(xié)議涤垫。應(yīng)用層是大多數(shù)普通與網(wǎng)絡(luò)相關(guān)的程序?yàn)榱送ㄟ^網(wǎng)絡(luò)與其他程序通信所使用的層。這個(gè)層的處理過程是應(yīng)用特有的虫溜;數(shù)據(jù)從網(wǎng)絡(luò)相關(guān)的程序以這種應(yīng)用內(nèi)部使用的格式進(jìn)行傳送雹姊,然后被編碼成標(biāo)準(zhǔn)協(xié)議的格式。常用的程序比如電子郵件接收(POP3),遠(yuǎn)程登錄(TELNET),文件傳輸訪問(FTP),域名解析服務(wù)(DNS),控制信件的發(fā)送和中轉(zhuǎn)(SMTP)等
(是不是相當(dāng)于我們收到一個(gè)英文信件請(qǐng)英文好的人翻譯衡楞,收到加密信件吱雏,請(qǐng)破解大師來幫忙翻譯)
1.3 TCP/IP五層體系結(jié)構(gòu)
其實(shí)和上面的四層類似,只是最下面的網(wǎng)絡(luò)接口層拆分成了OSI的最底下的二個(gè)層:物理層和數(shù)據(jù)鏈路層瘾境。其他都是一樣的歧杏。
1.4 各自的體系對(duì)應(yīng)關(guān)系
看了圖片是不是一下子就明白了三者的關(guān)系了,類似于TCP/IP的結(jié)構(gòu)更多的是把OSI的七層標(biāo)準(zhǔn)迷守,把某幾層合并簡(jiǎn)略成了一層犬绒。從而更好的理解。
結(jié)語
emmmm.........希望大家輕噴兑凿。
參考文章:
網(wǎng)絡(luò)基礎(chǔ)之一:網(wǎng)絡(luò)體系結(jié)構(gòu)詳解
網(wǎng)絡(luò)模型(7層網(wǎng)絡(luò)模型)
淺談Android網(wǎng)絡(luò)通信的前世今生--網(wǎng)絡(luò)基礎(chǔ)
這是一份詳細(xì) & 清晰的計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ) 學(xué)習(xí)指南