網(wǎng)絡(luò)七層協(xié)議的理解
以下內(nèi)容轉(zhuǎn)載自https://www.cnblogs.com/carlos-mm/p/6297197.html诀浪,僅供學(xué)習(xí)使用秀鞭。
OSI七層模式簡單通俗理解
這個(gè)模型學(xué)了好多次噩翠,總是記不住。今天又看了一遍降允,發(fā)現(xiàn)用歷史推演的角度去看問題會(huì)更有邏輯嘹锁,更好記。本文不一定嚴(yán)謹(jǐn)阀湿,可能有錯(cuò)漏,主要是拋磚引玉瑰妄,幫助記性不好的人陷嘴。總體來說间坐,OSI模型是從底層往上層發(fā)展出來的灾挨。
這個(gè)模型推出的最開始,是是因?yàn)槊绹擞袃膳_(tái)機(jī)器之間進(jìn)行通信的需求竹宋。
需求1:
科學(xué)家要解決的第一個(gè)問題是劳澄,兩個(gè)硬件之間怎么通信。具體就是一臺(tái)發(fā)些比特流蜈七,然后另一臺(tái)能收到秒拔。
于是,科學(xué)家發(fā)明了物理層:
主要定義物理設(shè)備標(biāo)準(zhǔn)飒硅,如網(wǎng)線的接口類型砂缩、光纖的接口類型、各種傳輸介質(zhì)的傳輸速率等三娩。它的主要作用是傳輸比特流(就是由1庵芭、0轉(zhuǎn)化為電流強(qiáng)弱來進(jìn)行傳輸,到達(dá)目的地后在轉(zhuǎn)化為1雀监、0双吆,也就是我們常說的數(shù)模轉(zhuǎn)換與模數(shù)轉(zhuǎn)換)。這一層的數(shù)據(jù)叫做比特会前。
需求2:
現(xiàn)在通過電線我能發(fā)數(shù)據(jù)流了好乐,但是,我還希望通過無線電波回官,通過其它介質(zhì)來傳輸曹宴。然后我還要保證傳輸過去的比特流是正確的,要有糾錯(cuò)功能歉提。
于是笛坦,發(fā)明了數(shù)據(jù)鏈路層:
定義了如何讓格式化數(shù)據(jù)以進(jìn)行傳輸区转,以及如何讓控制對物理介質(zhì)的訪問。這一層通常還提供錯(cuò)誤檢測和糾正版扩,以確保數(shù)據(jù)的可靠傳輸废离。
需求3:
現(xiàn)在我能發(fā)正確的發(fā)比特流數(shù)據(jù)到另一臺(tái)計(jì)算機(jī)了,但是當(dāng)我發(fā)大量數(shù)據(jù)時(shí)候礁芦,可能需要好長時(shí)間蜻韭,例如一個(gè)視頻格式的,網(wǎng)絡(luò)會(huì)中斷好多次(事實(shí)上柿扣,即使有了物理層和數(shù)據(jù)鏈路層肖方,網(wǎng)絡(luò)還是經(jīng)常中斷,只是中斷的時(shí)間是毫秒級(jí)別的)未状。
那么俯画,我還須要保證傳輸大量文件時(shí)的準(zhǔn)確性。于是司草,我要對發(fā)出去的數(shù)據(jù)進(jìn)行封裝艰垂。就像發(fā)快遞一樣,一個(gè)個(gè)地發(fā)埋虹。
于是猜憎,先發(fā)明了傳輸層(傳輸層在OSI模型中,是在網(wǎng)絡(luò)層上面)
例如TCP搔课,是用于發(fā)大量數(shù)據(jù)的胰柑,我發(fā)了1萬個(gè)包出去,另一臺(tái)電腦就要告訴我是否接受到了1萬個(gè)包辣辫,如果缺了3個(gè)包旦事,就告訴我是第1001,234急灭,8888個(gè)包丟了姐浮,那我再發(fā)一次。這樣葬馋,就能保證對方把這個(gè)視頻完整接收了卖鲤。
例如UDP,是用于發(fā)送少量數(shù)據(jù)的畴嘶。我發(fā)20個(gè)包出去蛋逾,一般不會(huì)丟包,所以窗悯,我不管你收到多少個(gè)区匣。在多人互動(dòng)游戲,也經(jīng)常用UDP協(xié)議蒋院,因?yàn)橐话愣际呛唵蔚男畔⒖鞴常矣袕V播的需求莲绰。如果用TCP,效率就很低姑丑,因?yàn)樗鼤?huì)不停地告訴主機(jī)我收到了20個(gè)包蛤签,或者我收到了18個(gè)包,再發(fā)我兩個(gè)栅哀!如果同時(shí)有1萬臺(tái)計(jì)算機(jī)都這樣做震肮,那么用TCP反而會(huì)降低效率,還不如用UDP留拾,主機(jī)發(fā)出去就算了戳晌,丟幾個(gè)包你就卡一下,算了痴柔,下次再發(fā)包你再更新躬厌。
TCP協(xié)議是會(huì)綁定IP和端口的協(xié)議,下面會(huì)介紹IP協(xié)議竞帽。
需求4:
傳輸層只是解決了打包的問題。但是如果我有多臺(tái)計(jì)算機(jī)鸿捧,怎么找到我要發(fā)的那臺(tái)屹篓?或者,A要給F發(fā)信息匙奴,中間要經(jīng)過B堆巧,C,D,E泼菌,但是中間還有好多節(jié)點(diǎn)如K.J.Z.Y谍肤。我怎么選擇最佳路徑?這就是路由要做的事哗伯。
于是荒揣,發(fā)明了網(wǎng)絡(luò)層。即路由器焊刹,交換價(jià)那些具有尋址功能的設(shè)備所實(shí)現(xiàn)的功能系任。這一層定義的是IP地址,通過IP地址尋址虐块。所以產(chǎn)生了IP協(xié)議俩滥。
需求5:
現(xiàn)在我們已經(jīng)保證給正確的計(jì)算機(jī),發(fā)送正確的封裝過后的信息了贺奠。但是用戶級(jí)別的體驗(yàn)好不好霜旧?難道我每次都要調(diào)用TCP去打包,然后調(diào)用IP協(xié)議去找路由儡率,自己去發(fā)挂据?當(dāng)然不行以清,所以我們要建立一個(gè)自動(dòng)收發(fā)包,自動(dòng)尋址的功能棱貌。
于是玖媚,發(fā)明了會(huì)話層。會(huì)話層的作用就是建立和管理應(yīng)用程序之間的通信婚脱。
需求6:
現(xiàn)在我能保證應(yīng)用程序自動(dòng)收發(fā)包和尋址了今魔。但是我要用Linux給window發(fā)包,兩個(gè)系統(tǒng)語法不一致障贸,就像安裝包一樣错森,exe是不能在linux下用的,shell在window下也是不能直接運(yùn)行的篮洁。于是需要表示層(presentation)涩维,幫我們解決不同系統(tǒng)之間的通信語法問題。
需求7:
OK袁波,現(xiàn)在所有必要條件都準(zhǔn)備好了瓦阐,我們可以寫個(gè)android程序,web程序去實(shí)現(xiàn)需求把篷牌。
補(bǔ)充:
Socket:
這不是一個(gè)協(xié)議睡蟋,而是一個(gè)通信模型。其實(shí)它最初是伯克利加州分校軟件研究所枷颊,簡稱BSD發(fā)明的戳杀,主要用來一臺(tái)電腦的兩個(gè)進(jìn)程間通信,然后把它用到了兩臺(tái)電腦的進(jìn)程間通信夭苗。所以信卡,可以把它簡單理解為進(jìn)程間通信,不是什么高級(jí)的東西题造。主要做的事情不就是:
A發(fā)包:發(fā)請求包給某個(gè)已經(jīng)綁定的端口(所以我們經(jīng)常會(huì)訪問這樣的地址182.13.15.16:1235傍菇,1235就是端口);收到B的允許界赔;然后正式發(fā)送桥嗤;發(fā)送完了,告訴B要斷開鏈接仔蝌;收到斷開允許泛领,馬上斷開,然后發(fā)送已經(jīng)斷開信息給B敛惊。
B收包:綁定端口和IP渊鞋;然后在這個(gè)端口監(jiān)聽;接收到A的請求,發(fā)允許給A锡宋,并做好接收準(zhǔn)備儡湾,主要就是清理緩存等待接收新數(shù)據(jù);然后正式接收执俩;接受到斷開請求徐钠,允許斷開;確認(rèn)斷開后役首,繼續(xù)監(jiān)聽其它請求尝丐。
可見,Socket其實(shí)就是I/O操作衡奥。Socket并不僅限于網(wǎng)絡(luò)通信爹袁。在網(wǎng)絡(luò)通信中,它涵蓋了網(wǎng)絡(luò)層矮固、傳輸層失息、會(huì)話層、表示層档址、應(yīng)用層——其實(shí)這都不需要記盹兢,因?yàn)镾ocket通信時(shí)候用到了IP和端口,僅這兩個(gè)就表明了它用到了網(wǎng)絡(luò)層和傳輸層守伸;而且它無視多臺(tái)電腦通信的系統(tǒng)差別蛤迎,所以它涉及了表示層;一般Socket都是基于一個(gè)應(yīng)用程序的含友,所以會(huì)涉及到會(huì)話層和應(yīng)用層。
二校辩、
http 和 webservice 都是基于TCP/IP協(xié)議的應(yīng)用層協(xié)議
webservice是基于http的soap協(xié)議傳輸數(shù)據(jù) webservice=soap=http+xml
socket是基于TCP/IP的傳輸協(xié)議窘问,是對TCP/IP協(xié)議的封裝
socket和TCP都是基于TCP/IP傳輸層協(xié)議
Restful是一種接口規(guī)范,而不是接口協(xié)議宜咒。