一文洞悉 OSI和TCP/IP模型,理通所有協議,再也不用似懂非懂了

目錄

 

爲什麼網絡要分層?

這其實很好理解,隋朝開始就有吏部、戶部、禮部、兵部、刑部、工部了,一個龐大的組織要管理好必須要拆分出來,各有各的職責出了事情直接定位,每一層可以制定自己的標準來解決好自己層面上的事情。

再比如一個項目分dao數據庫層,緩存層,service層,controller接入層一樣,每一層專注自己的部分,關於優勢,把高內聚,低耦合,可維護性強這些詞甩在網絡分層上面也是用得的,出了事情直接找負責那部分的那一層。

從專業角度來說,程序設計要求,複雜的程序都需要分層。

OSI模型 比對 TCP/IP模型

比對圖 OSI模型(Open System Interconnection Reference Model開放系統互連參考模型),他只是一種參考概念模型,並沒有提供一個可以實現的方法,現在的因特網採用的是 TCP/IP 模型(五層),TCP/IP 網絡通信協議(四層)。

瞭解網絡發展史會發現OSI模型出現的時間比 TCP/IP 晚,是在 TCP/IP 模型基礎上面提出的,那時候 TCP/IP 協議應用已經成型了,各大運營商們不想再換,再加上OSI模型有些設計冗餘,因此因特網最終選擇了草根選手 TCP/IP。但是OSI在理論研究上面具有很大參考價值,所以各大教材都會提到OSI模型.

TCP/IP 模型

有這五層模型進行分工合作,就可以用tcp/ip協議將計算機連起來通信啦。

物理層

聲音傳信靠聲波,鴿子傳信靠電磁波,電流傳信靠電波。物理層需要解決利用傳輸介質傳輸比特流的問題

以打魂鬥羅爲例(這個遊戲有點暴露年齡),首先可以使用一個鍵盤,兩個人一起打,這樣沒問題但是也太影響體驗了。

兩個人兩臺電腦聯機打,兩臺電腦最簡單的通信方式是一根雙絞線,兩個水晶頭,交叉接法,連接兩個電腦的網卡,分別配置‘ip地址’,‘子網掩碼’,‘默認網關’使之成爲一個網絡,這兩臺電腦就組成了一個最簡單的局域網,可以聯機打魂鬥羅啦!

如果第三個人想加進來,就可以買一個有多個口的集線器(hub)設備,將三個人的電腦都連起來。集線器是純物理工作,將自己收到的字節全部複製到其他的端口,其他機器看着收進來,這樣就實現了三個人一起 happy 了。

一個網吧人都想加入進來,可以加上交換機,交換機互聯,形成網絡拓撲。一個網吧人辣麼多,必須要暢快啊,因此交換機是具有 MAC 地址學習功能的,有利於更快找到目標機器。不過交換機是工作在數據鏈路層的。

一個城市的人都想加進來,就需要移動聯通電信這樣的運營商到處鋪電纜光纖,建立基站了,才能像我們如今這樣無論身處何處,都能”每晚八點,王者峽谷見“了。

數據鏈路層

數據鏈路層也叫做MAC層,Medium Access Control即媒體訪問控制,專業詞叫做“多路訪問控制”。

  1. 以太網協議

物理層裏面,已經幫你把電信號轉化成數字信號 010101001 形式,但是兩臺機器要交流總不可能一個 bit 一個 bit 的 0101 交流,如果別人和你說話總是故意一個字一個字的蹦估計你早就火了。

數據鏈路層就是要負責把這些無窮盡的 010011001 封裝成一個個幀來進行傳輸,這時以太網協議就誕生了,幀也叫做以太網幀,以太網協議規定成幀的各項規則,例如多少位成一個幀等。以太網協議如下:

以太網幀

以太網幀

三個人一起互聯打格鬥遊戲,遊戲是有嚴格的角色和順序的,隨便一個人發出信號,這一層主要就是解決這三個問題:

  • 發給誰,誰接收?

  • 先接收哪個信號,順序怎麼辦?

  • 發錯了怎麼辦?

爲什麼叫”媒體訪問控制“,控制的就是這些。

  1. MAC地址

數據發給誰接收,最早是隻有集線器沒有交換機的,三臺電腦每臺電腦發送信號都是通過廣播的方式,廣播出去哪一臺電腦需要處理呢,每臺電腦都需要一個標識能夠在數據鏈路層表示自己,MAC地址由此誕生,對應的物理設備是網卡接口,每塊網卡的mac地址都是全球唯一的,生產時就固定了。但是網絡通信中,卻不用mac地址進行通信,而是ip地址,讀者可以思考一下原因留言答出。

有了身份了,以太網幀裏面源MAC 和目標 MAC都有了,就能找到相應目標機器,數據包在鏈路上廣播,目標MAC的網卡就能判定這個是給自己的,將其收進來打開。IP數據包收進來之後,拿掉MAC頭,打開IP包發現IP包的地址也是自己的,再拿掉 ip 頭,根據 tcp 頭裏面對應端口xxx了,這個端口正好是我的打開的 QQ 監聽的端口,就找到了微信這個進程扔給 QQ 處理了。返回也是一樣的,源MAC就變成了目標MAC。

  1. ARP協議

有個問題就是,一個數據包過來,怎麼找到對應的主機呢?網路里面最開始肯定是誰也不認識誰,當機器不多的時候,可以把目標機器的 MAC 地址直接放進數據包裏,但是如果有 n 臺機器呢?一個網吧的人一起玩格鬥,總不可能一個個去問哎,兄弟你的 MAC 地址是啥?,這種操作太騷了,於是就有了 ARP 協議。

在局域網裏面,如果知道了 IP 地址不清楚MAC地址,那麼就廣播吧,發送一個廣播包,誰是這個 IP 誰來回答,回答的包裏面會帶上自己的 MAC 信息。爲了防止每次都 ARP 廣播,機器本地會進行 ARP 廣播結果緩存,交換機就是具有 MAC 地址學習能力的設備,學習完之後就能精準找到主機,不需要廣播,這裏再次提到了交換機爲什麼工作在數據鏈路層了。

網絡層

上面其實已經提到過一些 IP 地址,計算機網絡世界裏面,都是通過 IP 地址來進行定位的,怎麼配置自己的ip地址呢?

  • 其實可以使用 ifconfig(window系統是ipconfig)

  • 也可以if addr,將網卡up一下就可以

  • 電腦小白可以打開自己的電腦網絡配置中心更改IP地址就行。

現實中我們的網絡是由一個個局域網組成的複雜網絡拓撲,每個局域網處於同一個網段,MAC地址相當於這個人的 DNA,能精準到一個人,但是卻是沒有定位尋址功能的,MAC 地址沒有爲尋址功能設計編號,出廠後網卡在哪裏被使用不知道,中國可以用進口的美國產的網卡,但是 ip地址是有設計尋址功能的,每個地區的 ip,就像物流地址一樣能一層層定位到一個人的具體位置,黑客找人很多就是根據ip地址的。

DHCP(Dynamic Host Configuration Protocol)動態主機配置協議

如果局域網內只有幾臺主機,自己配置一下 ip 地址玩玩也是可以的,但是如果一個學校的電腦都需要網管來一個一個配置的話,那就不好玩了,所以我們需要一個可以自動配置ip的協議,即 DHCP。

每臺主機要加入一個網絡的時候,肯定是初來乍到什麼情況也懂,只知道自己的 MAC地址,因此這個時候還是靠廣播,使用 ip 地址 0.0.0.0 發送一個廣播包,發給目的地址 255.255.255.255 ,封裝在 UDP 協議裏面,UDP 封裝在 BOOTP 裏面(DHCP的前身),DHCP SERVER收到帶有 MAC 地址的包,在沒有 ip 地址的情況下就知道是誰在索要 ip 了,因此就給他子網掩碼,網關和 ip 信息,然後這臺新來的機器就可以歡快的加入局域網大家庭了。

網關(gateway)

說了這麼多還都是在局域網內小打小鬧,外面的網絡那麼精彩,如果想要出國玩玩第一件事就是解決護照,才能通過海關,前面不止一次說到網卡配置的時候需要配置網關。假如你配置的ip是192.168.1.100,旁邊兄弟的是192.168.10.100,然後我要訪問他,來看看電腦是怎麼理解的,以下是linux的處理方式:

太晚了就這個圖吧!

太晚了就這個圖吧!

網關大家可以理解成工作在網絡層的路由器,它有多個網卡分別連着不同的局域網,每個網卡的 ip 地址都和對應局域網在同一個網段,工作時就像機場,你拿着哪一國護照就往哪一國送,會將 MAC 頭和 IP 頭都取下來,然後判斷內容看將包往哪裏轉發。路由裏面又分爲靜態路由動態路由,路由算法等複雜的邏輯。

DNS(DOMAIN NAME SYSTEM)域名系統

如果你有超強的記憶力的話,當然可以 12.34.45.56 這樣的方式去訪問百度,就跟純敲電話號碼去給一個人打電話一樣,但是大多數人都是直接翻看通訊錄找名稱來打電話吧,網絡世界也是一樣,需要域名來標示一個ip,於是你就可以通過 www.baidu.com 來訪問百度了。域名就是網絡世界裏面的通訊錄。

想象一下,全世界都靠一個通訊錄找人,它一旦掛了那麼地球村就 gg 了,因此 dns 服務器一定得高可用,高併發,分佈式,這麼複雜第一反應肯定是分層設計的嘛,思想都是相通的,於是就有了根DNS服務器,頂級域DNS服務器,權威DNS服務器,如下:

圖畫的有點醜醜的

圖畫的有點醜醜的

樹狀結構,訪問就需要遞歸了,爲了提高ip解析性能,就需要緩存了,很多運營商(移動電信聯通)會就近部署DNS緩存服務器,DNS解析流程如下:

image

image

CDN(content delivery network)緩存

訪問一個地址都要這麼複雜,找這麼多層,現實中多等一秒都難受,那麼就要想辦法儘量走緩存拿數據,全球有那麼多數據中心,我們不遠的地方都有數據中心,何不在這些數據中心裏面部署一些機器來做緩存集羣緩存部分數據呢?於是cdn的角色就出來了,這裏不細講其具體形態,無外乎又是分層,高可用設計。

傳輸層

TCP,UDP

像物流系統一樣,接單之後選好了路徑,就要運貨了,交通情況那麼複雜,運貨過程中肯定會遇到擁堵,丟貨,超時等一系列問題,傳輸層就是爲了解決這些問題而設計的。主要有 UDP 協議和 TCP 協議,他們之間最主要的區別就是UDP不可靠,TCP可靠。

UDP 協議適用於對丟包不敏感的應用,不需要建立連接,速度快,以上說到的 ARP, DHCP 都是基於UDP協議的,還有直播的流媒體協議,早期對實時性要求高的遊戲,物聯網和移動通信領域等等。

TCP要保證可靠傳輸,就要考慮到保證順序,丟包處理,維護連接,流量控制,和擁塞控制等問題,因此就出現了複雜的三次握手,四次揮手,還要維護 TCP 狀態機等。擁塞控制是通過擁塞窗口來解決的,順序,丟包處理,流量控制對應滑動窗口。

端口(port)

試想一下數據跋山涉水的到達了你的電腦,然後呢咋辦,你同時開了微信,QQ,釘釘,別人給你發條消息你總要運送到對應的程序吧,這樣纔算最終到達,這裏不妨把每個應用都理解成一個程序,端口的需要就體現出來了,這個端口在你電腦是不會重複的,要不然數據過來就沒法判斷了,很多人在玩 tomcat 的時候,開兩個8080端口都會遇到報錯吧。

應用層

到了應用層,就會比較具體了,畢竟我們看得見,每個人都有不同的需求,比如 A 需要發郵件,B 需要下訂單,C 需要下載文件,這層需要解決告訴對方,我要幹什麼的問題,根據乾的事情不一樣,又會催化出各種不同的協議來最好解決你的需求。

http,https協議

http是最早的協議,其中分爲了POST,DELETE,PUT,GET等請求,對應向服務器增刪改查數據,然後發展到http2.0通過壓縮,分幀,二進制編碼,多路複用等技術提升性能,最後發展到https,通過改進加密技術來提高安全性。

傳輸層協議和應用層協議之間的關係

應用層協議 = TCP/UDP + PORT端口號

  • HTTP = TCP + 80

  • HTTPS = TCP + 443

  • RDP(遠程桌面協議) = TCP + 3389

  • FTP協議 = TCP + 21

  • TELNET = TCP + 23

  • SMTP = TCP + 25

  • DNS = UDP + 53

  • TFTP = UDP + 69

  • SNMP = UDP + 161

  • RIP = UDP + 520

歡迎關注我的公衆號《阿甘的碼路》看更多精彩內容,一鍵三連是美德。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章