最近在補一些網絡協議的知識,自認沒下面這位博主講得好,所以借用借用下這位博主總結的內容,確實通俗易懂
轉自:https://www.cnblogs.com/carlos-mm/p/6297197.html
OSI七層協議如下:

博主是用歷史推演的角度去理解的。總體來說,OSI模型是從底層往上層發展出來的。
這個模型推出的最開始,是是因為美國人有兩台機器之間進行通信的需求。
第1個需求:
科學家要解決的第一個問題是,兩個硬件之間怎么通信。具體就是一台發些比特流,然后另一台能收到,於是發明了
物理層:
主要定義物理設備標准,如網線的接口類型、光纖的接口類型、各種傳輸介質的傳輸速率等
它的主要作用是傳輸比特流(就是由1、0轉化為電流強弱來進行傳輸,到達目的地后在轉化為1、0,也就是我們常說的數模轉換與模數轉換)
這一層的數據叫做比特。
需求2:
現在通過電線我能發數據流了,但是,我還希望通過無線電波,通過其它介質來傳輸。然后我還要保證傳輸過去的比特流是正確的,要有糾錯功能。
於是,發明了
數據鏈路層:
定義了如何讓格式化數據以進行傳輸,以及如何讓控制對物理介質的訪問。這一層通常還提供錯誤檢測和糾正,以確保數據的可靠傳輸。
需求3:
現在能發正確的發比特流數據到另一台計算機了,但是當發大量數據時候,可能需要好長時間,例如一個視頻格式的,網絡會中斷好多次
事實上,即使有了物理層和數據鏈路層,網絡還是經常中斷,只是中斷的時間是毫秒級別的。那么,我還需要保證傳輸大量文件時的准確性。於是,我要
對發出去的數據進行封裝。就像發快遞一樣,一個個地發。
於是,先發明了
傳輸層(傳輸層在OSI模型中,是在網絡層上面)
例如TCP,是用於發大量數據的,我發了1萬個包出去,另一台電腦就要告訴我是否接受到了1萬個包,如果缺了3個包,就告訴我是第1001,234,8888個
包丟了,那我再發一次。這樣,就能保證對方把這個視頻完整接收了。
例如UDP,是用於發送少量數據的。我發20個包出去,一般不會丟包,所以,我不管你收到多少個。在多人互動游戲,也經常用UDP協議,因為一般都是
簡單的信息,而且有廣播的需求。如果用TCP,效率就很低,因為它會不停地告訴主機我收到了20個包,或者我收到了18個包,再發我兩個!如果同時有
1萬台計算機都這樣做,那么用TCP反而會降低效率,還不如用UDP,主機發出去就算了,丟幾個包你就卡一下,算了,下次再發包你再更新。
TCP協議是會綁定IP和端口的協議,下面會介紹IP協議。
需求4:
傳輸層只是解決了打包的問題。但是如果我有多台計算機,怎么找到我要發的那台?或者,A要給F發信息,中間要經過B,C,D,E,但是中間還有好
多節點如K.J.Z.Y。我怎么選擇最佳路徑?這就是路由要做的事。
於是,發明了
網絡層。即路由器,交換價那些具有尋址功能的設備所實現的功能。這一層定義的是IP地址,通過IP地址尋址。所以產生了IP協議。
需求5:
現在我們已經保證給正確的計算機,發送正確的封裝過后的信息了。但是用戶級別的體驗好不好?難道我每次都要調用TCP去打包,然后調用IP協議
去找路由,自己去發?當然不行,所以我們要建立一個自動收發包,自動尋址的功能。
於是,發明了
會話層。會話層的作用就是建立和管理應用程序之間的通信。
需求6:
現在我能保證應用程序自動收發包和尋址了。但是我要用Linux給window發包,兩個系統語法不一致,就像安裝包一樣,exe是不能在linux下用的,
shell在window下也是不能直接運行的。於是需要
表示層(presentation),幫我們解決不同系統之間的通信語法問題。
需求7:
現在所有必要條件都准備好了,可以盡情寫
應用層了
最后補充一個
Socket:
這不是一個協議,而是一個通信模型。其實它最初是伯克利加州分校軟件研究所,簡稱BSD發明的,主要用來一台電腦的兩個進程間通信,然后把
它用到了兩台電腦的進程間通信。所以,可以把它簡單理解為進程間通信,不是什么高級的東西。主要做的事情是:
A發包:發請求包給某個已經綁定的端口(所以我們經常會訪問這樣的地址182.13.15.16:1235,1235就是端口);收到B的允許;然后正式發送;
發送完了,告訴B要斷開鏈接;收到斷開允許,馬上斷開,然后發送已經斷開信息給B。
B收包:綁定端口和IP;然后在這個端口監聽;接收到A的請求,發允許給A,並做好接收准備,主要就是清理緩存等待接收新數據;然后正式接收;
接受到斷開請求,允許斷開;確認斷開后,繼續監聽其它請求。
可見,Socket其實就是I/O操作。Socket並不僅限於網絡通信。在網絡通信中,它涵蓋了網絡層、傳輸層、會話層、表示層、應用層——因為Socket通
信時候用到了IP和端口,僅這兩個就表明了它用到了網絡層和傳輸層;而且它無視多台電腦通信的系統差別,所以它涉及了表示層;一般Socket都是
基於一個應用程序的,所以會涉及到會話層和應用層。