快速了解必要的网络知识
這是一篇非常簡(jiǎn)單的文章,幫助程序員快速地、大致地了解下網(wǎng)絡(luò)相關(guān)的基礎(chǔ)知識(shí)。寫這篇文章的目的當(dāng)然是想幫助許多對(duì)網(wǎng)絡(luò)知識(shí)不了解的朋友用盡量少的時(shí)間了解必要的知識(shí),學(xué)習(xí)網(wǎng)絡(luò)相關(guān)知識(shí)當(dāng)然少不了去看書,如被奉為經(jīng)典的《TCP/IP詳解》,但對(duì)大多數(shù)程序員來(lái)說(shuō),沒(méi)那么多時(shí)間看完這么枯燥的書,也沒(méi)必要(嗯,我承認(rèn)我這里有點(diǎn)政治不正確了),而當(dāng)我們想快速補(bǔ)習(xí)下這方面的知識(shí)而去搜索技術(shù)博客或者知乎的時(shí)候,得到的回答總是去看XXX書吧……So,我打算提供一些便利,只管有用,不管政治正不正確,呵呵。
1,七層還是四層?
說(shuō)起網(wǎng)絡(luò),99%的書總是一開(kāi)始就七層架構(gòu),考試的時(shí)候也是樂(lè)意考這么個(gè)填空題,而我們經(jīng)常能看到的名詞還有“四層架構(gòu)”,那到底七層還是四層?簡(jiǎn)單地說(shuō):“七層”是ISO標(biāo)準(zhǔn),“四層”是TCP/IP。ISO是個(gè)標(biāo)準(zhǔn)組織,它定義的網(wǎng)絡(luò)七層架構(gòu)叫OSI標(biāo)準(zhǔn),而我們現(xiàn)在廣泛使用的TCP/IP網(wǎng)絡(luò)則實(shí)現(xiàn)了其中四層。我們?nèi)缃裾f(shuō)的網(wǎng)絡(luò)一般來(lái)說(shuō)指的就是TCP/IP網(wǎng)絡(luò),所以對(duì)我們而言,四層更有現(xiàn)實(shí)意義。哪四層?
2,四層架構(gòu)有哪些相關(guān)名詞?
應(yīng)用層 —— HTTP
傳輸層 —— 端口,TCP
網(wǎng)絡(luò)層 —— IP,IP地址,路由
鏈路層 —— MAC地址
我不打算列更多的名詞了,有這些夠了,也許跟你在別處看到的不同,比如我這里的鏈路層別處可能叫“網(wǎng)絡(luò)接口層”,不要在意這些細(xì)節(jié)……
3,對(duì)鏈路層要了解哪些東西?
我們電腦連接的有線網(wǎng)絡(luò)99.9%是以太網(wǎng)(還有0.1%我沒(méi)見(jiàn)過(guò),哈哈),以太網(wǎng)的重要外觀就是用雙絞線連接電腦網(wǎng)口和交換機(jī)網(wǎng)口,這個(gè)你肯定懂。
以太網(wǎng)是什么?——就是這玩意兒(簡(jiǎn)單粗暴^_^)
以太網(wǎng)有以太網(wǎng)的通訊標(biāo)準(zhǔn),標(biāo)準(zhǔn)由IEEE制定,IEEE和ISO一樣是個(gè)標(biāo)準(zhǔn)組織,如今的鏈路層均遵循其標(biāo)準(zhǔn),這是一系列的標(biāo)準(zhǔn),相當(dāng)龐大而復(fù)雜(如果細(xì)分的話,以太網(wǎng)本身就有多種標(biāo)準(zhǔn))這個(gè)系列標(biāo)準(zhǔn)叫“IEEE 802系列”,IEEE 802系列標(biāo)準(zhǔn)之龐大,包括了幾乎所有我們能見(jiàn)到的網(wǎng)絡(luò)——以太網(wǎng)、2G、3G、4G、WIFI、近場(chǎng)通訊……等等,而每個(gè)我們熟悉的名詞拆分開(kāi)又有不同的標(biāo)準(zhǔn)定義,真是煩!——所幸的是我們不需要管那么多,我們只需要知道,在鏈路層上傳輸?shù)膯卧小皫?#xff0c;而幀中包含了“MAC地址”,俗稱“物理地址”,鏈路層不提供路由功能,若無(wú)上層協(xié)議的支持,鏈路層只能實(shí)現(xiàn)直接連接的節(jié)點(diǎn)之間通訊,比如你的電腦的網(wǎng)口連著公司的交換機(jī),只依賴鏈路層的話,你的電腦就只能跟公司的交換機(jī)聊聊天。關(guān)心鏈路層的人更多的是電子工程師或網(wǎng)管,我等碼農(nóng)大致看看就好。
4,如何路由?
網(wǎng)絡(luò)層是對(duì)鏈路層的封裝,最重要的東西應(yīng)數(shù)IP地址,有了IP地址,就有了路由的能力,使得通訊可以跨越多個(gè)節(jié)點(diǎn),實(shí)現(xiàn)網(wǎng)間通訊了,這相當(dāng)好理解,交換機(jī)理解IP地址和網(wǎng)口的對(duì)應(yīng)關(guān)系,它知道這個(gè)網(wǎng)絡(luò)包(前面叫“幀”,這里叫“包”了,哈哈,真會(huì)整人)應(yīng)該往哪個(gè)網(wǎng)口丟,如果實(shí)在不知道,那么就往“網(wǎng)關(guān)”丟,網(wǎng)關(guān)再往別處丟,如果IP地址正確,網(wǎng)絡(luò)也沒(méi)什么問(wèn)題,那總歸能抵達(dá)目的地的,這就是IP協(xié)議最重要的任務(wù)——路由。
也許你想問(wèn):有沒(méi)有不用IP協(xié)議的網(wǎng)絡(luò)?有啊,藍(lán)牙設(shè)備通常就不用(藍(lán)牙的規(guī)范且不在IEEE802系列中),其實(shí)是沒(méi)必要,因?yàn)樗ǔV蛔鳛閱吸c(diǎn)連接,不需要實(shí)現(xiàn)網(wǎng)間通訊,反過(guò)來(lái)說(shuō),如果要實(shí)現(xiàn)網(wǎng)間通訊,應(yīng)該沒(méi)什么比IP協(xié)議更合適的了。
5,為啥要弄個(gè)端口出來(lái)?
光有IP地址,恐怕還不夠,想想我們電腦上N多程序都需要使用網(wǎng)絡(luò),那么如何區(qū)分程序各自的網(wǎng)絡(luò)訪問(wèn)包呢?如果分不開(kāi),那豈不是亂了套,所以要用傳輸層包裝,傳輸層包裝里多了一個(gè)“端口”的東西。例如:我們?cè)陔娔X上啟動(dòng)Web服務(wù)器,默認(rèn)打開(kāi)了80端口監(jiān)聽(tīng),一個(gè)端口只能由一個(gè)程序打開(kāi),這樣就不會(huì)亂套了。端口是對(duì)網(wǎng)絡(luò)層的進(jìn)一步擴(kuò)展,對(duì)上層提供了更友好的使用界面。
6,TCP如何做到有連接?
有了TCP協(xié)議,從此有了“連接”的概念,否則你想連接從何而來(lái)?從網(wǎng)絡(luò)層上看,反正都是一個(gè)個(gè)網(wǎng)絡(luò)包,前一個(gè)包傳了過(guò)去,后一個(gè)包被交換機(jī)卡住了,沒(méi)看出來(lái)“連接”在哪里啊,其實(shí)“有連接”只是個(gè)概念,它的原理是通過(guò)那些“握手”、“揮手”、“心跳”、“應(yīng)答”和“超時(shí)檢查”在傳輸?shù)碾p方保持了一些“狀態(tài)”,所以,準(zhǔn)確說(shuō)是“看起來(lái)有連接”而已。
7,對(duì)開(kāi)發(fā)者而言網(wǎng)絡(luò)到底是怎樣的存在?
那傳輸層體現(xiàn)在應(yīng)用程序上又是個(gè)怎么樣的東西?——是Socket。網(wǎng)絡(luò)編程是件挺頭疼的事情,從一開(kāi)始就是,所以弄了個(gè)Socket的概念出來(lái)方便我們程序員訪問(wèn)網(wǎng)絡(luò),這最早是出現(xiàn)在Unix系統(tǒng)上的,后來(lái)Windows也借鑒了這套方法,搞了套自己的Socket API,用起來(lái)大家都很像??傮w的編程思想大概就是(以TCP客戶端為例):指定目標(biāo)服務(wù)器IP地址和端口,連接,獲取到了Socket(通常用一個(gè)整型數(shù)來(lái)表示),以后就往這個(gè)Socket上讀寫東西(跟讀寫本地文件有些類似)來(lái)實(shí)現(xiàn)收發(fā),中間還可以用一些函數(shù)查詢這個(gè)Socket的狀態(tài),不用了之后就close掉這個(gè)Socket以斷開(kāi)TCP連接。這是比較簡(jiǎn)單的情形,事實(shí)上,為了更好地挖掘系統(tǒng)的潛能,提高系統(tǒng)的網(wǎng)絡(luò)吞吐量,不同的系統(tǒng)還祭出了自己的一些所謂高級(jí)網(wǎng)絡(luò)編程模型,如Windows的完成端口,Linux的epoll等,但對(duì)程序而言,網(wǎng)絡(luò)訪問(wèn)依舊是對(duì)Socket進(jìn)行操作。實(shí)際上,程序員們?nèi)匀徽J(rèn)為Socket是比較底層的東西,需要進(jìn)一步抽象,于是誕生了如HttpContext之類東西,大伙們不再需要直接操作Socket了,甚至都可以不知道Socket的存在。
8,TCP提供了哪些可靠性?
主要兩方面:成功保障和次序保障。對(duì)于成功保障,很好理解,如果網(wǎng)絡(luò)包發(fā)送成功,對(duì)方應(yīng)答一下,發(fā)送方便知道了,認(rèn)為接收方一定成功接收;而次序保障,則是通過(guò)在傳輸包中加入一個(gè)次序標(biāo)識(shí)來(lái)實(shí)現(xiàn)的,當(dāng)傳輸包抵達(dá)對(duì)方節(jié)點(diǎn)時(shí),TCP根據(jù)次序標(biāo)識(shí)對(duì)收到的內(nèi)容重新“組包”。那么,現(xiàn)在考慮一下這種可能性:發(fā)送方的包確實(shí)已經(jīng)發(fā)送至接收方了,但接收方的應(yīng)答卻沒(méi)有成功發(fā)往發(fā)送方,這時(shí)候是不是會(huì)錯(cuò)誤判斷為發(fā)送失敗?——答案是肯定的,所以TCP有個(gè)重發(fā)機(jī)制,當(dāng)遲遲沒(méi)收到應(yīng)答的時(shí)候,會(huì)嘗試重發(fā)數(shù)次,如果依舊出現(xiàn)沒(méi)有應(yīng)答,那就真的判定為失敗了,所以TCP能知道“一定成功”,但卻無(wú)法知道“一定失敗”。
9,真的可靠嗎?
TCP連接為我們的程序通信創(chuàng)造了一條“通道”,我們程序間發(fā)送數(shù)據(jù)就變得有保障起來(lái),那根據(jù)上面提供的這些信息,你認(rèn)為這條通道有多牢靠?——事實(shí)上是這樣的:如果網(wǎng)絡(luò)系統(tǒng)確確實(shí)實(shí)按照了既定的規(guī)則去工作的話,可靠性是顯而易見(jiàn)的,但,誰(shuí)說(shuō)網(wǎng)絡(luò)上途徑的這么多節(jié)點(diǎn)每個(gè)都會(huì)老老實(shí)實(shí)工作?有沒(méi)有可能在傳輸過(guò)程中將我們的包截獲并篡改?或者干脆就直接造一個(gè)假的包冒充發(fā)送?——我說(shuō),這種事情不光可能,而且一直在發(fā)生!不需要我證明給你看,你自己想想,有沒(méi)有自己建了一個(gè)好端端的網(wǎng)站,別人打開(kāi)的時(shí)候卻無(wú)緣無(wú)故彈出廣告之類的事情發(fā)生?而你確信自己的網(wǎng)站沒(méi)問(wèn)題,沒(méi)中病毒之類的……恭喜你啊,你的網(wǎng)站被電信劫持了,你的頁(yè)面在傳輸中被篡改了,HTTP協(xié)議是基于TCP的,所以你說(shuō)從這個(gè)角度看可不可靠?
一個(gè)典型的http劫持的例子,看看右下角這個(gè)連滾動(dòng)條都擋住了的廣告
10,如何做到真的可靠?
當(dāng)然是使用SSL,SSL現(xiàn)在又叫TLS,但舊名字叫慣了就沿用下來(lái),它是在傳輸層上包了一層加密,這層加密實(shí)現(xiàn)了這些功能:
- 密鑰不直接在網(wǎng)絡(luò)上傳輸(通過(guò)一個(gè)非對(duì)稱加密實(shí)現(xiàn))
- 所有數(shù)據(jù)皆經(jīng)過(guò)加密,即便截獲也沒(méi)用
- 如果試圖偽造或篡改數(shù)據(jù)包,那接收方一定知道數(shù)據(jù)不合法并丟棄
另外SSL還可以通過(guò)層級(jí)證書手段,對(duì)傳輸方的身份進(jìn)行認(rèn)證。某大牛說(shuō)過(guò):“沒(méi)有SSL的安全都是在假裝安全。”用了SSL之后,傳輸安全了,網(wǎng)站圖標(biāo)綠了,框也不彈了。另外注意:SSL是用來(lái)防范“中間人攻擊”的手段,至于主機(jī)上中了木馬之類的,它卻無(wú)能為力。
11,關(guān)于TCP還有哪些東西沒(méi)談?
太多了,比如流量控制,但我不打算說(shuō),否則此文就沒(méi)什么意義了。一般來(lái)說(shuō),需要的時(shí)候才去學(xué)比較好,雖然技不壓身,這個(gè)誰(shuí)都清楚,可學(xué)習(xí)技術(shù)要花不少時(shí)間,而且最關(guān)鍵的是:人是會(huì)遺忘的,尤其是學(xué)而不用的話。
12,不是還有個(gè)叫UDP的東西嗎?
傳輸層有兩套協(xié)議,一是前面提到的TCP,另一是UDP,TCP如今大行其道,而UDP則用得很少,UDP是無(wú)連接協(xié)議,比TCP簡(jiǎn)單得多,最形象的比喻就是以前的“寫信”,我寫好信了之后(發(fā)送的數(shù)據(jù)),把信裝進(jìn)信封(UDP包),寫上地址和收件人(IP地址端口),扔進(jìn)郵箱(send)即可,既不等待應(yīng)答,也不保證次序,也沒(méi)有連接通道的概念。由于UDP形式如此簡(jiǎn)單,所以在以前某些特定的環(huán)境里,它傳輸效率高于TCP,所以被用于一些對(duì)傳輸性能要求比較苛刻的場(chǎng)景,如網(wǎng)游,但現(xiàn)在世道變了,網(wǎng)絡(luò)資源不再像當(dāng)年那么緊張,TCP顯然是更好的選擇。當(dāng)然了,還有些特殊場(chǎng)合是非用UDP不可的,如實(shí)現(xiàn)局域網(wǎng)廣播,這個(gè)TCP做不到。
13,為什么IP地址仍然不枯竭?
我們常說(shuō)的IP地址指的是IPv4地址,例如“10.186.3.21”,其實(shí)它是個(gè)32位整型,表面上看最高可支持2的32次方個(gè)節(jié)點(diǎn),即42億多,事實(shí)上遠(yuǎn)遠(yuǎn)沒(méi)那么多,首先其中有很多屬于“保留地址”,做特殊用途使用的,其次,大量?jī)?yōu)質(zhì)地址段被一些寡頭占據(jù)了(主要是美國(guó)政府及美國(guó)一些科技公司),所以剩下的可用地址可謂寶貴,國(guó)人早意識(shí)到了這點(diǎn),所以很早就發(fā)力研究IPv6,我在N年前就看到過(guò)國(guó)內(nèi)XX大學(xué)的教授在帶學(xué)生研究IPv6的一些報(bào)道,號(hào)稱我們走在了世界領(lǐng)先,報(bào)道還做了一些技術(shù)細(xì)節(jié)介紹,如IPv4是“xxx.xxx.xxx.xxx”這樣(四段),而IPv6則變成了“xxx.xxx.xxx.xxx.xxx.xxx”(六段),所以地址多了很多……我暈!我雖然讀書少,但也少拿這個(gè)來(lái)糊弄我了,事實(shí)上的IPv6地址高達(dá)128位,與之最接近的是什么?——作為程序員,馬上回答!UUID啊!UUID不也128位么?——有點(diǎn)跑題了,回到正題,為啥現(xiàn)在IP地址仍然不枯竭?——那是因?yàn)槲覀兘^大多數(shù)人都沒(méi)有公網(wǎng)地址。這個(gè)你可以馬上自己試試,比如你的手機(jī),連著3G,貌似接入了公網(wǎng)了,你還可以在設(shè)置中看到自己的IP地址,這是運(yùn)營(yíng)商分配的,但我向你保證,這個(gè)地址其實(shí)是運(yùn)營(yíng)商的局域網(wǎng)地址,要證明很簡(jiǎn)單,你用手機(jī)瀏覽器打開(kāi)http://www.ip138.com/看看自己的“公網(wǎng)IP”,是不是不一樣?也就是說(shuō),你想用手機(jī)當(dāng)服務(wù)器讓Internet上的用戶來(lái)連是不行的。雖然沒(méi)有公網(wǎng),但通過(guò)NAT,我們照樣訪問(wèn)Internet沒(méi)啥問(wèn)題。至于推IPv6的事情,我覺(jué)得還是讓教授們?nèi)ジ砂伞?/p>
14,為什么到處都是HTTP?
我想那是因?yàn)椤?jiǎn)單!HTTP是一個(gè)基于TCP的請(qǐng)求/應(yīng)答模型的協(xié)議,客戶端一問(wèn),服務(wù)器一答,就這么簡(jiǎn)單,跟程序里的函數(shù)調(diào)用似的,所以很多RPC在底下也使用了HTTP協(xié)議,HTTP協(xié)議還使用了非常易讀的文本格式,一出就被廣泛追捧。如今廣泛使用的HTTP 1.1協(xié)議最后的一次修訂是在1999年,距今17年了,看吧,越是簡(jiǎn)單基礎(chǔ)的東西越不容易變化。
15,如何抓包分析?
如果僅僅是想抓取HTTP包的話,IE的HttpWatch Pro是不錯(cuò)的東西,Firefox下有個(gè)跟它類似的叫“httpfox”,我不知道現(xiàn)在還在不在,chrome的話本身也提供了一些簡(jiǎn)單的查看http包的功能。想專業(yè)一點(diǎn)的話可以考慮用Fiddler,Windows環(huán)境下的抓包利器,Mac下則用Charles。當(dāng)然了,最強(qiáng)大(但也很復(fù)雜)的抓包神器當(dāng)然是Wireshark,這玩意兒甚至能看鏈路層的幀。
16,最后講點(diǎn)有趣的?
很多年前我的公司由于網(wǎng)口少,我跟一個(gè)同事共用一個(gè)網(wǎng)口(通過(guò)一個(gè)集線器),集線器這玩意兒跟交換機(jī)不同,它不會(huì)“路由”,收到任何包都是直接廣播到所有網(wǎng)口,于是我用抓包工具抓了一些網(wǎng)絡(luò)包,這位同事用MSN的聊天信息我全部都能看到,由于這樣,我后來(lái)一直不敢用MSN在公司里亂說(shuō)話,你想MSN這么爛的東西為啥公司喜歡讓我們用呢?不過(guò)幾年后MSN用戶就幾乎絕跡了。
轉(zhuǎn)載于:https://www.cnblogs.com/guogangj/p/5421990.html
總結(jié)
以上是生活随笔為你收集整理的快速了解必要的网络知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 加速计简单使用---迷宫游戏
- 下一篇: SolarWinds供应链攻击事件带来的