轉(zhuǎn):https://www.cnblogs.com/carlos-mm/p/6297197.html#undefined
OSI七層模式簡單通俗理解
這個模型學(xué)了好多次罐农,總是記不住莫秆。今天又看了一遍间雀,發(fā)現(xiàn)用歷史推演的角度去看問題會更有邏輯,更好記镊屎。本文不一定嚴(yán)謹(jǐn)惹挟,可能有錯漏,主要是拋磚引玉缝驳,幫助記性不好的人连锯。總體來說用狱,OSI模型是從底層往上層發(fā)展出來的运怖。
這個模型推出的最開始,是是因為美國人有兩臺機器之間進行通信的需求齿拂。
需求1:
科學(xué)家要解決的第一個問題是驳规,兩個硬件之間怎么通信。具體就是一臺發(fā)些比特流署海,然后另一臺能收到吗购。
于是医男,科學(xué)家發(fā)明了物理層:
主要定義物理設(shè)備標(biāo)準(zhǔn),如網(wǎng)線的接口類型捻勉、光纖的接口類型镀梭、各種傳輸介質(zhì)的傳輸速率等。它的主要作用是傳輸比特流(就是由1踱启、0轉(zhuǎn)化為電流強弱來進行傳輸报账,到達目的地后在轉(zhuǎn)化為1、0埠偿,也就是我們常說的數(shù)模轉(zhuǎn)換與模數(shù)轉(zhuǎn)換)透罢。這一層的數(shù)據(jù)叫做比特。
需求2:
現(xiàn)在通過電線我能發(fā)數(shù)據(jù)流了冠蒋,但是羽圃,我還希望通過無線電波,通過其它介質(zhì)來傳輸抖剿。然后我還要保證傳輸過去的比特流是正確的朽寞,要有糾錯功能。
于是斩郎,發(fā)明了數(shù)據(jù)鏈路層:
定義了如何讓格式化數(shù)據(jù)以進行傳輸脑融,以及如何讓控制對物理介質(zhì)的訪問。這一層通常還提供錯誤檢測和糾正缩宜,以確保數(shù)據(jù)的可靠傳輸肘迎。
需求3:
現(xiàn)在我能發(fā)正確的發(fā)比特流數(shù)據(jù)到另一臺計算機了,但是當(dāng)我發(fā)大量數(shù)據(jù)時候脓恕,可能需要好長時間膜宋,例如一個視頻格式的,網(wǎng)絡(luò)會中斷好多次(事實上炼幔,即使有了物理層和數(shù)據(jù)鏈路層秋茫,網(wǎng)絡(luò)還是經(jīng)常中斷,只是中斷的時間是毫秒級別的)乃秀。
那么肛著,我還須要保證傳輸大量文件時的準(zhǔn)確性。于是跺讯,我要對發(fā)出去的數(shù)據(jù)進行封裝枢贿。就像發(fā)快遞一樣,一個個地發(fā)刀脏。
于是局荚,先發(fā)明了傳輸層(傳輸層在OSI模型中,是在網(wǎng)絡(luò)層上面)
例如TCP,是用于發(fā)大量數(shù)據(jù)的耀态,我發(fā)了1萬個包出去轮傍,另一臺電腦就要告訴我是否接受到了1萬個包,如果缺了3個包首装,就告訴我是第1001创夜,234,8888個包丟了仙逻,那我再發(fā)一次驰吓。這樣,就能保證對方把這個視頻完整接收了系奉。
例如UDP檬贰,是用于發(fā)送少量數(shù)據(jù)的。我發(fā)20個包出去喜最,一般不會丟包偎蘸,所以庄蹋,我不管你收到多少個瞬内。在多人互動游戲,也經(jīng)常用UDP協(xié)議限书,因為一般都是簡單的信息虫蝶,而且有廣播的需求。如果用TCP倦西,效率就很低能真,因為它會不停地告訴主機我收到了20個包,或者我收到了18個包扰柠,再發(fā)我兩個粉铐!如果同時有1萬臺計算機都這樣做,那么用TCP反而會降低效率卤档,還不如用UDP蝙泼,主機發(fā)出去就算了,丟幾個包你就卡一下劝枣,算了汤踏,下次再發(fā)包你再更新。
TCP協(xié)議是會綁定IP和端口的協(xié)議舔腾,下面會介紹IP協(xié)議溪胶。
需求4:
傳輸層只是解決了打包的問題。但是如果我有多臺計算機稳诚,怎么找到我要發(fā)的那臺哗脖?或者,A要給F發(fā)信息,中間要經(jīng)過B才避,C丘损,D,E,但是中間還有好多節(jié)點如K.J.Z.Y工扎。我怎么選擇最佳路徑徘钥?這就是路由要做的事。
于是肢娘,發(fā)明了網(wǎng)絡(luò)層呈础。即路由器,交換價那些具有尋址功能的設(shè)備所實現(xiàn)的功能橱健。這一層定義的是IP地址而钞,通過IP地址尋址。所以產(chǎn)生了IP協(xié)議拘荡。
需求5:
現(xiàn)在我們已經(jīng)保證給正確的計算機臼节,發(fā)送正確的封裝過后的信息了。但是用戶級別的體驗好不好珊皿?難道我每次都要調(diào)用TCP去打包网缝,然后調(diào)用IP協(xié)議去找路由,自己去發(fā)蟋定?當(dāng)然不行粉臊,所以我們要建立一個自動收發(fā)包,自動尋址的功能驶兜。
于是扼仲,發(fā)明了會話層。會話層的作用就是建立和管理應(yīng)用程序之間的通信抄淑。
需求6:
現(xiàn)在我能保證應(yīng)用程序自動收發(fā)包和尋址了屠凶。但是我要用Linux給window發(fā)包,兩個系統(tǒng)語法不一致肆资,就像安裝包一樣矗愧,exe是不能在linux下用的,shell在window下也是不能直接運行的迅耘。于是需要表示層(presentation)贱枣,幫我們解決不同系統(tǒng)之間的通信語法問題。
需求7:
OK颤专,現(xiàn)在所有必要條件都準(zhǔn)備好了纽哥,我們可以寫個android程序,web程序去實現(xiàn)需求把栖秕。
補充:
Socket:
這不是一個協(xié)議春塌,而是一個通信模型。其實它最初是伯克利加州分校軟件研究所,簡稱BSD發(fā)明的只壳,主要用來一臺電腦的兩個進程間通信俏拱,然后把它用到了兩臺電腦的進程間通信。所以吼句,可以把它簡單理解為進程間通信锅必,不是什么高級的東西。主要做的事情不就是:
A發(fā)包:發(fā)請求包給某個已經(jīng)綁定的端口(所以我們經(jīng)常會訪問這樣的地址182.13.15.16:1235惕艳,1235就是端口)搞隐;收到B的允許;然后正式發(fā)送远搪;發(fā)送完了劣纲,告訴B要斷開鏈接;收到斷開允許谁鳍,馬上斷開癞季,然后發(fā)送已經(jīng)斷開信息給B。
B收包:綁定端口和IP倘潜;然后在這個端口監(jiān)聽绷柒;接收到A的請求,發(fā)允許給A窍荧,并做好接收準(zhǔn)備辉巡,主要就是清理緩存等待接收新數(shù)據(jù);然后正式接收蕊退;接受到斷開請求,允許斷開憔恳;確認斷開后瓤荔,繼續(xù)監(jiān)聽其它請求。
可見钥组,Socket其實就是I/O操作输硝。Socket并不僅限于網(wǎng)絡(luò)通信。在網(wǎng)絡(luò)通信中程梦,它涵蓋了網(wǎng)絡(luò)層点把、傳輸層、會話層屿附、表示層郎逃、應(yīng)用層——其實這都不需要記,因為Socket通信時候用到了IP和端口挺份,僅這兩個就表明了它用到了網(wǎng)絡(luò)層和傳輸層褒翰;而且它無視多臺電腦通信的系統(tǒng)差別,所以它涉及了表示層;一般Socket都是基于一個應(yīng)用程序的优训,所以會涉及到會話層和應(yīng)用層朵你。