一:概述
本文為自己看阮一峰文章后的筆記.加入了一些自己類比的比喻.
原地址: 互聯網協議入門
二.實體層(電腦)
全世界各個電腦想相互通信.首先要把各個電腦連接起來.
可以通過光纜.電纜.電磁波等連接起來.
這就叫做實體層.他主要規定了網絡的一些電氣特性.負責傳送0/1電信號.
類比: 電腦 ==>> 人 && 0/1信號 ==>> 聲音
每臺電腦就像我們每個人.我們發出的聲音就是0/1電信號
三.鏈路層(以太網)
單純的0/1沒有任何意義.鏈路層就是制定一套規則.讓0/1變得有意義.
類比: 以太網協議 ==>> 語言協議
就像人發出聲音.沒有任何意義.
但是通過語言這個規則.讓聲音可以表達信息.
3.1.以太網協議
舉例如語言規定 矮老虎油
這句話發音表達的意思是我愛你.
以太網也規定一組0/1電信號構成一個數據包.叫做幀
. 每一幀分成兩個部分: 表頭(Head)和數據(Data)
表頭: 包含 發送者.接收者.數據類型 ==>> 對應語言就是主語(我). 謂語(你). 語言類型(中文)
數據: 具體內容 ==>> 對應語言就是我愛你中的愛
.
3.2.MAC地址
上面提到.以太網數據包中標頭
包含了發送者.接收者.那么如何標識發送者和接收者呢?
MAC地址.png
以太網規定.連入網絡的所有設備.都必須具有網卡
接口(理論上是唯一的也是必須有的).
數據包必須從一塊網卡傳送到另一塊網卡.網卡的地址就是發送地址和接收地址.也叫做MAC地址.
每塊網卡出廠的時候.都伴有獨一無二的MAC地址.長度48個二進制單位.通常用12個十六進制數表示.
前6個十六進制數是廠商編號.后6個是該廠商的網卡流水號.
類比: MAC地址 ==>> 傳聲筒的杯子(如下圖)
每個杯子上都有一個名字.標識這是你的杯子.
3.3.廣播
3.3.1問題一:
但是一塊網卡怎么知道另一塊網卡的MAC地址呢.就像傳聲筒的一端杯子怎么知道另一端的杯子是誰的呢.
這個時候就有ARP協議可以解決這個問題.后面介紹.
3.3.2問題二:
就算我知道了對方的MAC地址.但我怎么準確的將幀發送給他呢.
以太網采用了一種很原始的方式.他不是吧數據包準確送到接收方.而是想本子網絡內所有計算機發送.讓每臺計算機自己判斷是否為接收方.
如: 電腦A像電腦B發送一個數據包.
那么電腦A會給子網絡里所有電腦B.C.D.E.F都發送數據包.
然后電腦B.C.D.E.F電腦接收到數據包后拿到接收地址跟自己的MAC地址比較.如果相同就接收.不相同就丟棄.
類比: 廣播 ==>> 村喇叭
現在傳聲筒升級了.每個人手里的傳聲筒都連接村里的大喇叭
這是小明說了一句話.小明愛小紅
.發送給村喇叭.這句話包含了發送地址(小明).接收地址(小紅).
然后村喇叭再向全村人廣播這句話.
這時全村人都聽到了這句話
小紅一聽.接受者是自己.那他就知道了小明對他說的內容了.
村里其他人聽到后手里碗一摔.md.又撒狗糧.然后就無視這段話了.
四.網絡層(IP)
以太網協議依靠MAC地址發送數據.理論上單單依靠MAC地址.上海的網卡就可以找到洛杉磯網卡了.
村喇叭在一個村傳播還好.那要是全世界都用這一個喇叭.
那么30億人每人用傳聲筒說一句話.那每個人都要聽到30億句話.那不炸了嗎.
因此必須找到一個方法.能夠區分哪些MAC地址屬于同一個子網絡.哪些不是.
如果是同一子網絡.就采用廣播方式發送.
如果不是就采用路由
方式發送.
類比: 路由 ==>>省喇叭
就像一個人說一句話.要區分這句話的接收者是不是該村的.
如果是就用本村的村喇叭喊話.
如果不是就讓村喇叭把話發給省喇叭(如果湖北省總喇叭).
遺憾的是MAC地址本身無法做到區分.他只與廠商有關.與所處網絡無關.
這就導致了網絡層
的誕生.網絡層作用就是引進一套新的地址>>IP地址
4.1IP協議
IP協議規定每臺電腦分配一個IP地址.他由32個二進制數組成.
習慣上我們會分成4段十進制數表示.從0.0.0.0一直到255.255.255.255
IP地址分成兩部分.前一部分代表子網絡
(村喇叭).后一部分代表主機
(每個人).
比如IP地址172.16.254.1.
那么172.16.254就標識子網絡
最后的1標識主機
這個時候就可以知道與他同一子網的IP地址為172.16.254.xxx
4.2子網掩碼
但是我們怎么知道前多少位標識子網絡呢.
這個時候就引入了子網掩碼
.
子網掩碼的 網絡部分全部為1. 主機部分全部為0
如: 11111111.11111111.11111111.00000000
十進制:255.255.255.0
知道子網掩碼
我們就能判斷任意兩個IP地址是否是處于同一子網絡.
4.3子網掩碼使用方法
比如IP地址A: 172.16.254.1和IP地址B:172.16.254.233的子網掩碼都是255.255.255.0
拿IP地址A和IP地址B分別與子網掩碼進行AND運算(即與
運算.兩個數都為1則為1.否則為0)
IP地址A:
10101100.00010000.11111110.00000001
11111111.11111111.11111111.00000000 AND運算
=======================================
10101100.00010000.11111110.00000000 >> 172.16.254.0
IP地址B:
10101100.00010000.11111110.11101001
11111111.11111111.11111111.00000000 AND運算
=======================================
10101100.00010000.11111110.00000000 >> 172.16.254.0
可以發現IP地址A和B的運算結果都是172.16.254.0.因此他們在同一個網絡
假如一個姓氏一個村.比如小崗村的人都姓孫.
類比: AND運算 ==>> AND運算后發現兩個人都姓孫
那么這個姓氏就是小明的子掩碼.其他人拿自己的姓名與這個子掩碼.就能得到是否是一個村的.
4.4IP數據包(幀)
根據IP協議發送的數據.就叫IP數據包.其中必須包括IP地址(姓氏).
但是前面提過以太網數據包
只包含MAC地址(名字).
并沒有IP地址的爛尾.那么是否需要修改數據定義呢?
不需要.我們可以把IP數據包
直接放進以太網數據包
的Data
部分.
完全不用修改以太網的規格.
這就是互聯網分層結構的好處.
如下.藍色為以太網數據包
的Head.紅色為以太網數據包
的Data
我們將IP數據包
直接放在以太網數據包
的Data里
類比: 增加IP地址信息 ==>> 相當于增加了姓氏
4.5分段
IP數據包:
Head長度為20-60字節.
Data部分.最長為65515字節.
整個數據包的總長度最大為65535字節.
而以太網數據包
的Data部分最長只有1500字節.
因此如果IP數據包
超過了1500字節.他就需要分割成幾個以太網數據包
分開發送了.
類比: 數據分段 ==>> 一句話分段
此時小明向小紅說一段話就相當于分了幾次說.
先說: 我
再說: 愛
再說: 你
4.6ARP協議
即獲取同一子網絡的主機MAC地址的協議方法.
有兩種情況:
4.6.1)情況一
如果兩臺主機不在同一子網絡.那么事實上就沒辦法得到對方的MAC地址.只能把數據包傳送到兩個子網絡連接處的網關(geteway)
處理.
4.6.2)情況二
如果兩臺主機在同一個子網絡.那么我們可以使用ARP協議.得到對方的MAC地址.
ARP協議也是發出一個數據包(包含在以太網數據包中).其中包含他所要查詢的IP地址.
在對方的MAC地址這一欄.填的是FF:FF:FF:FF:FF:FF.表示這是一個廣播地址
.
他所在子網絡的每一臺主機.都會收到這個數據包.
從中取出IP地址.與自身的IP地址進行比較.如果相同.則回復.向對方報告自己的MAC地址.
五.傳輸層(端口)
5.1由來
有了MAC地址和IP地址.我們已經可以在全世界任意兩臺主機上建立通信.
接下來的問題是.同一臺主機上有許多APP都需要用到網絡.比如.你一邊瀏覽網頁.一邊與朋友在線聊天.
當一個數據包從網上發來的時候.你怎么知道.他是表示網頁的內容還是表示在線聊天的內容.
也就是說.我們還需要一個參數.表示這個數據包到底供哪個APP(進程)使用.
這個參數就叫做端口(Port)
.他其實就是每個APP的編號.
每個數據包都發到主機的特定端口.所以不同的程序能取到自己所需要的數據.
5.2端口
端口是0到65535之間的一個整數.正好16個二進制位.
0-1023的端口被系統占用.
APP只能選用大于1023的端口.
不管是瀏覽網頁還是在線聊天.APP會隨機選用一個端口.然后與服務器的相應端口聯系.
現在傳聲筒又升級啦.每個傳聲筒的兩端都有多個杯子.
類比: 端口 ==>> 傳聲筒一端的不同杯子
相當于你對著不同的杯口說話.對方就能分辨出來你說的是哪件事.(這比喻有點牽強.尷尬??)
5.3套接字(socket)
傳輸層
的功能就是建立端口與端口的通信.
相比之下.網絡層的功能是建立主機到主機的通信.
只要確定主機和端口.我們就能實現程序之間的交流.
因此Unix系統就把主機+端口 叫做 套接字.
有了它.就可以進行網絡APP開發了.
5.4UDP/TCP協議
現在.我們必須在數據包中加入端口信息.這就需要新的協議.最簡單的實現叫做UDP協議.
其實就是添加一個端口信息的協議方法.
如下.藍色為以太網數據包
的Head.
紅色和藍色為以太網數據包
的Data
我們將UDP數據包
直接放在以太網數據包
的Data里.
即將端口信息放在紅色Head里
除了UDP協議.還有另一個協議叫TCP協議.他們功能是一樣的.
5.5UDP/TCP區別
UDP:
協議簡單.容易實現.可靠性差.一旦數據包發出.無法知道對方是否收到.
TCP:
3次握手.4次揮手確保了可靠性.但是過程復雜.實現困難.消耗較多資源.
5.6UDP/TCP應用
對實時性要請高的場景:如實時會議.實時視頻.多點通訊
這些場景如果用TCP.當網絡不好會發生重傳.畫面會有延遲.甚至越堆越多.選擇UDP就會好很多.
除了這些場景.其他都用TCP準備錯.
六:應用層
應用程序收到傳輸層
的數據.接下來就要進行解讀了.
由于互聯網的開放架構.數據來源五花八門.
必須實現規定好格式.否則根本無法解讀.
應用層的作用就是規定應用程序的數據格式.
比如.TCP協議可以為各種各樣的APP傳遞數據.
如Email.WWW.FTP.HTTP等等.這些應用程序協議就構成了應用層.
這是最高的一層.直接面對用戶.他的數據就放在TCP數據包的Data部分.
像平常我們都是使用HTTP協議獲取傳輸數據.
其實也可以直接繞過應用層(HTTP協議)
直接使用傳輸層的TCP協議來獲取傳輸數據.
類比: 應用層協議 ==>> 英語/日語/法語
? 應用層的各種協議就相當于各個國家制定的語言協議一樣.