基本名詞概念
首先介紹一下一些基礎的名稱
計算機網絡:計算機網絡由節點(node)和鏈接的鏈路(link)組成。
節點:可以是計算機、集線器、交換機或路由器。
鏈路:網線、光纖、Wi-Fi等。
報文:datagram,指一個完整的消息數據。很廣泛,在網絡層,IP數據報是一種報文;在傳輸層,UDP的數據單位也是一種報文。
網絡
網絡的誕生
兩臺電腦想要互相連接,只要拿一根網線把兩臺電腦連在一起
有三臺電腦要互相連接,那就是每臺伸出去兩根網線.....以此類推,有n臺電腦,就需要每臺電腦伸出去n-1條網線分別連接除自己之外的每一臺電腦
那每個電腦都需要開出去好多個網口。因此,我們需要找一個方法。
集線器與交換機
我們可以這樣,使用一個集線器。它只是簡單的分線器的作用,把一個接口分成好多個分別連到其他的各個電腦上(直接電氣複製,類似直接電線一分二這樣,但是一般還會有放大電路來防止信號太弱)。這樣就會把內容複製好幾份發給其他的每臺電腦。
這就叫廣播。
![]()
但是這樣會導致每個數據包都會被髮送給所有的電腦,導致每臺電腦都收到大量的不是給自己的無用數據包。如何實現類似分好多個網口的那樣可以單對單傳輸呢?
這裏就涉及到網絡中計算機的識別了。
我們可以給每個設備一個硬件地址,也就是mac地址,用來唯一標識一臺電腦。
然後在發送的信息前面加上一個信息頭,標識源mac和目標mac。這個就叫做mac頭。這個就是五層結構中第二層,也是第一個軟件層——數據鏈路層。
![]()
這樣,雖然還是每一臺電腦都收到發給所有人的數據包,但是電腦看到目標計算機不是自己的數據包就會丟棄。
但是這樣依然不是特別好,因爲這樣依然是會每個電腦都會收到所有數據包,也就是信息轟炸,大量的流量對這臺電腦其實是無用的。
這就需要用到交換機。
交換機是帶有一點點智能的集線器,剛開機的時候和普通的集線器一樣也是全部發送,但是會通過“偷聽”數據交流學習,
比如像圖中這個交換機它有6個端口,分別連接了不同的電腦。
比如說A給B發數據包,就會從1號端口給交換機一個標明是從aa-aa-aa-aa-aa-aa到bb-bb-bb-bb-bb-bb的數據包,交換機就知道aa-aa-aa-aa-aa-aa是在1號端口了,記錄到一張表裏面;
然後等一下B又發數據包給A,那就是從5號端口給交換機一個從bb-bb-bb-bb-bb-bb到aa-aa-aa-aa-aa-aa的數據包。這個時候路由器查表發現剛剛已經記錄了A(aa-aa-aa-aa-aa-aa)在1號端口,那麼這個時候就發給1號端口就行了,並且也會知道B是在5號端口,又把這個記錄到表裏面。
![]()
然後就這樣維護這張表,並且進行有選擇性的轉發,就可以避免。
當然,也可能會有查詢不到的情況,這個時候交換機就只能給除了發來的這個端口之外的所有端口都發送一個這個數據包,這就叫做泛洪,這樣兩種情況來確保如果目標mac計算機在這個網絡中,那麼它一定能夠收到這個信息。
同時,爲了避免我們把網線拔了換到別的接口上去了,但是還是發往舊的端口的問題,路由表的記錄有一個老化時間,一般是5~10分鐘,超過這個時間就會被丟棄。
但是後面,要連接的電腦越來越多。這個時候可以直接使用一根線把兩臺交換機的兩個端口連起來。
![]()
這個很好理解,這個時候在路由器中這個藍色的線的端口在表中對應的就不是一條記錄了,另外一臺交換機上的所有設備都會對應到這個端口。
![]()
交換機只關心mac地址,不關心更高層級的東西比如IP地址等,所以在網絡中它叫做二層設備。(屬於數據鏈路層,也可以說是四層模型裏的網絡鏈路層)
IP的誕生與網絡層、路由器
但是,隨着主機的數量越來越多,網絡設備就越來越多了,單獨靠MAC地址就會比較喫力了。
一來,MAC地址是扁平的,並沒有從屬關係、記錄網絡結構等,這也是因爲整個二層網絡都是一個整體大網絡,沒有子網什麼的,這意味着每個交換機得記錄一遍全世界所有網絡設備的MAC地址對應的端口號、它在哪裏等,這個表將會大到不可能存放。
二來,MAC地址是標識設備的,也會帶來壞處,意味着如果設備一旦發生移動,換到別的網絡去,或者更換了網絡運營商,上面說的全世界的路由表都要跟着去改變。
因此,必須要引入一種帶有層次的、靈活的網絡協議,其包含一個不與硬件綁定的地址。這就是第三層網絡層以及IP地址。IP網絡高效地把網絡設備高效且有層次地組織起來。靈活主要體現在它的數據頭有可變長度的可選部分,具體看後面講網絡協議結構的地方。
IP這個詞通常不是特指IP協議本身,而是泛指一切與之關聯的內容。
IP有兩個作用,一是在網絡層爲設備提供了一個邏輯地址,二是負責數據包的尋址和轉發。
IP頭會有一個SIP(Souce IP)和一個DIP(Destinate IP),分別是源IP和目標IP,這是每個數據包的一個內容。
IP地址與子網、子網掩碼
IP地址
IP地址和子網掩碼一般都寫成類似123.123.123.123這樣的形式。
這個是爲了方便看的十進制形式,實際上是一個32位(4字節)的數(IPv4),
子網掩碼
子網掩碼(Mask)就是標識它的IP地址哪些內容是變化的,哪些是不變的。通常常用的就是255.255.255.0,展開來就是11111111111111111111111100000000,前24位都是1,那麼一定是前面24位(3字節,也就是前面三個數)不變,後面一個變爲0.
比如說我們是192.168.2.5,要知道自己所屬的網段,那麼就192.168.2.5 & 255.255.255.0,得到的是192.168.2.0,這個就是我們所屬的網段。用0稱呼一個網段,不會分配給某一臺設備。
然後如果我們需要發送東西給別人,就會分別和子網掩碼按位與,如果它們相同就會視作是在同一個子網,不同則稱爲不在同一個子網。
然後還可以用1的數量來表示子網掩碼,比如24來表示255.255.255.0。然後可以用192.168.1.0/24表示擁有192.168.1.1~192.168.1.255這255個IP地址的這個網段。
如果想要增加子網中IP地址的數量,只需要把子網掩碼小;如果想要減少子網中IP地址的數量,只需要把子網掩碼調大。
一個IP地址有網絡位和主機位。
網絡位就是一個網段,就是比如說192.168.1.0~192.168.1.255,前面3段是不變的,它就可以包括一個範圍。這也就是一個子網。
主機位就是變的那個部分,列出來用來給各個主機編號。
網絡號就是指這個網段的名稱,比如說我們說192.168.1.0/24這個網段,它的網絡位就是前面的這24位,網絡號就是這24位的內容即192.168.1.x。
需要注意,IP地址是IP地址,但是任何設備在使用IP的時候必須有一個子網掩碼,用來實現前面說的判斷目標IP是否在同一子網來判斷交給誰發送。192.168.1.2/24這樣的寫法通常是用來配置比較方便,比如說
ip addr add 192.168.1.2/24 dev eth0
網關
子網的概念很重要。TCP/IP協議規定,不同子網之間是不可以直接通信的,需要通過網關來轉發。
網關會有兩個接口,分別有一個屬於兩個子網的IP地址,比如它同時接入10.0.1.0/24和10.0.2.0/24這兩個網絡(這兩個IP表示一個網絡),它的兩個網口的IP地址分別是10.0.1.1/24和10.0.2.1/24,這樣就可以在兩個網絡之間轉發數據包。
網關的作用就好像是小區門口,它連接了多個小區(網絡),我們要去到別的小區裏,首先要去到自己所在小區的門口比如去到10.0.1.1這裏,然後走出去,再走到另外一個小區的門口,走進去。
這就叫做跨越三層網絡(網絡層)去尋址的。
因此發送數據的時候,計算機會先根據目標IP地址判斷是否和自己是同一個子網,如果是那就直接從網卡發出,否則就會發送給網關,修改了目標mac爲網關的mac地址,但是保留目標IP。這樣做是爲了讓這個數據包物理上到達網關。
網關再通過路由表查詢到這一包數據屬於子網2,然後再把目標mac改爲目標計算機的mac地址、源mac改爲網關自己的mac,然後從連接到子網2的接口發出。
這種通過IP來判斷如何發送的行爲,稱爲路由。
以上是IPv4的寫法,如果是IPv6的話,
單播、廣播、主播
除此之外還有兩種分類:
網絡地址:網絡位不變,主機位爲全0,表示一個網絡,比如192.168.1.23/24所在的網絡需要使用192.168.1.0/24來表示,它是稱呼一個網絡,代表192.168.1.0~192.168.1.255這一個範圍。
廣播地址:網絡位不變,主機位全爲1,表示廣播給網絡內的所有設備。
剩下的普通的地址稱爲可分配地址,可以被分配給各個設備。
“播”(cast)是數據鏈路層的概念。
單播是發送給一個特定主機,目標地址是一個特定的MAC或IP
廣播則是發送給網絡中的所有主機,目標地址是主機位爲全1也就是255這個特殊的IP地址,來表示發給全部設備。比如說192.168.1.255/24表示發給192.168.1.0這整個網絡中的所有主機。
組播則是介於單播和廣播之間的一種一對多的發送,但是不是對全部所有的設備。
(在IPv6則分爲單播、組播、任播)
IP地址的有類編址
![]()
通常來講,我們用得比較多的就是前面這三類可以分配給我們用的。
A類:
(計算範圍很簡單,最小值就是可以變的都爲0嘛,最大就是可以變的都爲1嘛。然後最大的那個,我們知道它最大是第一個是01111111,第8位位權是7,27 = 128,所以最大值255-128=127,就可以一下子算出7個1是多少)
![]()
觀察這個就可以發現,A類它一個網段主機數量是最多的,不是說因爲它的IP地址範圍最大。而是說,它的子網掩碼只有8位,它後面三段都是分配給主機的主機位,不作爲區分網絡的,所以1.0.1.234和1.22.32.66也在同一個網段裏面。
也可以反過來說,在ABC三個類中A也是網段數量最少的,因爲它只有8位的網絡位,而且首位固定爲0,實際只有7位的網段
B類則是有16位主機位,也就是有216個值,減去2個特殊地址,即65534個主機。
C類是ABC中主機數量最少的,因爲它只有8位的主機位,256個值,還得減去主機位全0和主機位全1這兩個特殊地址(網絡地址和廣播地址),一個網段一共254個主機。
列:172.16.10.1/16這個B類地址的網絡地址、廣播地址以及可用地址數分別是?
那麼很明顯,就是先給他主機位分別置爲全0和全1,得到網絡地址172.16.0.0、廣播地址172.16.255.255.
然後具體網絡的劃分的話,是美國分走一個範圍、中國分走一個範圍,等等。一開始是這樣隨便分的。
後面的話發現似乎要不夠用了之後,就分了私有地址,比如常見的192.168.x.x網段和10.x.x.x網段。有很多是這樣保留用途的,這樣可以不用給每一個都分配一個公網IP
另外,有幾個特殊的IP地址
![]()
有限廣播地址:這個網絡位、主機位都是全1,也可以表示廣播地址。
環回地址需要注意,上面圖中寫的是127.0.0.0/8,主機位全爲0,代表是一個網絡範圍,我們一般用裏面第一個地址127.0.0.1。
本地鏈路地址是DHCP自動獲取地址失敗之後的臨時地址,比如說發現給我們分配了一個169.254.0.1爲什麼還是上不了網,就是這個原因。
子網
爲什麼要劃分子網?就比如說通信公司給用戶網絡(這裏還是最早的情況,每臺電腦都能分到一個公網IP)
然後一個大公司有2000人,而好多個小公司每個有20多人。
那麼我們知道如果給小公司A類地址或者B類地址,那麼可以有幾萬個主機,顯然是太浪費了,我們就給它分一個主機數量最少的C類地址比如說221.5.12.0/24網絡,裏面有254個可用地址。
而2000人的大公司,C類地址就不夠用了,那麼我們就給它分一個B類公網地址,比如159.2.0.0/16這個網絡,裏面有65534個可用地址。
但是我們可以發現,兩種情況都會有很多浪費,我們給一個20人的公司分了一整個網段254個地址,給2000人的公司分了一整個網段65534個地址。
這就是依靠有類編址機制來分配的缺點:在實際應用中很難準確匹配可用地址數量, 造成IP地址浪費。
前面提到過,一個有類編址中的可用地址數量是2n-2個,n爲主機位數。
也就是說,我們可以把主機位中的一部分借到網絡位中,把網絡號擴大,
比如說一個B類網絡159.2.x.x/16,我們可以多分一點,變成159.2.1.x/24、159.2.2.x/24、159.2.3.x/24等256個子網
比如說一個C類網絡221.5.12.x/24網絡,我們可以多分3個bit給網絡位,變成221.5.12.x/27,也就是說最後這一段這8位有3位是分給了網絡位,主機位只有5位了。然後就可以變成221.5.12.000xxxxx/27、221.5.12.001xxxxx/27、221.5.12.010xxxxx/27、221.5.12.011xxxxx/27等23共8個子網了。
![]()
圖中這樣的話,借1位,那麼就會分成兩半,到主機位128開始就是第二個子網了。
借出去n位,那麼:
子網數:2n
子網中的主機數:2k-2,其中k爲當前的主機位數。
這樣劃分子網之後的好處是顯著的,不僅可以帶來這些好處,而且可以隨意調整廣播域大小,切分出很多個小的網絡號,把不同用途的設備放到不同的主機去,防止廣播域過大造成的廣播風暴。關鍵在於,廣播域大的話,設備多,誰廣播一下喊一嗓子影響到的設備也多,而且設備多的話網絡內有設備需要廣播的情況也更頻繁,兩個方面導致加劇了內網中無用廣播流量,增加網絡負擔。
例題:192.168.100.0/24,現在主機位借位兩位,請寫出劃分後子網個數、以及前兩個子網的網絡地址和廣播地址,以及每個子網的可用地址數。
借用了2位,也就是可能性多了22也就是4種。
前兩個網段分別是00 000000、01 000000,也就是192.168.100.0/26、192.168.100.64/26.計算過程位
廣播地址分別是00 111111、01 111111,也就是192.168.100.63/26、192.168.100.127/26。(計算過程是反過來,減去前面開頭的兩個爲0的位,255-27- 26 = 255-128-64 = 63;255-27 = 255-128=127。或者直接是根據前面網絡地址可以看出一個網段64個主機也行。)
那麼可用地址數就是6位主機位減去兩個特殊地址,也就是26 -2= 64-2 =62
例題:192.168.100.3/26和192.168.100.67/26是在同一個網段裏嗎?
不是。一定要注意它的這個掩碼,它的網絡號是從後8位借了兩位的。
例題:在現有一個C類網絡地址段192.168.1.0/24,請使用可變長子網掩碼給三個子網分別分配IP地址。
![]()
這個就不是直接像前面這樣是直接使用借位的方式來劃分來,因爲借位只能劃分2n個子網,它說是分3個。
我們最簡單的方法是就借2位來00、01、10、11分4個嘛,然後捨棄掉一個即可分3個子網。
然後最多也就是10臺,肯定是夠用的。
例題:在現有一個C類網絡地址段192.168.1.0/24,要分給3個部門,其中A部門人數最多有100人,請你確定如何劃分子網。
這個的結構就得看人數來了,因爲人數超了直接分4個子網的
交換機與路由器的區別
交換機的作用是把數據準確地送到目標設備上,而不是像集線器那樣讓局域網裏的所有設備都收到。
而路由器主要的作用是連接兩個網絡,在不同網絡之間作爲通道,比如說讓家裏的網和外面的網連在一起,也就是作爲網關,起到這個網絡的出入口的作用。但是注意,路由器不負責同一局域網內數據包的轉發!
而爲什麼我們平時家用的“路由器”就可以轉發數據組建局域網呢?因爲實際上,我們平時的家用路由器,所謂“路由器”,其實它不單是路由器,也已經包含了交換機的功能,以及無線AP的功能。 它的LAN口之間其實就相當於交換機。 包括一些企業級產品也是這樣的。 路由器常常也會承擔DHCP服務器的作用,但這不是必須的。
因此,爲什麼要有MAC也很明顯了,因爲承擔局域網內數據轉發的是交換機,而交換機是二層設備,它是基於MAC地址來進行操作的。
更重要的是,MAC地址只在局域網內有效,在傳到外網的時候,就需要去路由,這就是依靠IP地址的路由器了,所以IP地址也是必要的。
所以,IP地址和MAC地址缺一不可。
舉個簡單的例子,我們在局域網內互相發送東西,當然是帶IP頭的,但是使用的是二層的MAC直接交換機傳送,壓根就沒有解封裝到網絡層(IP地址)這一層,IP地址在這個過程中壓根沒用。結合前面IP的誕生部分的描述,應該很容易就理解了。
關鍵在於IP和MAC分別代表了不和設備綁定、和設備綁定兩個角度,分別起到層次與歸屬尋址、在快要送到時在一個小範圍內唯一定位目標
也就是,跨網段傳輸的時候使用IP地址來路由,但是到了末端的局域網內,則需要MAC地址來完成最後的轉發。
路由器的工作包括維護IP路由表、ARP表,如果是前面說的包含交換機功能的路由器還維護MAC表,這幾個叫做控制平面,包括這些表的維護:
路由器會接入兩個甚至更多個網絡,哪個網絡對應自己的哪個端口,這就是IP路由表;
任何一個網絡設備給別人發東西,一開始只知道IP地址,得通過ARP知道對方的MAC地址然後填到目標MAC上面去。ARP獲得的信息也會一條條緩存起來免得每次都要重新請求,這就是ARP表。路由器也是發給別人,也不例外,也得維護這個表。
MAC表就是之前說到的交換機維護的實現一收一發的那個,純路由器當然不維護這個,但是包含交換機功能的路由器裏也需要維護這個表。
轉發平面
然後把數據高效地轉發出去,這叫轉發平面。
路由器把數據轉發給下一個網絡,這叫做“一跳”(one hop)。在一個局域網內的主機之間不是一跳,因爲交換機不算hop。
參考文獻:
[1] 飛天閃客 - 你管這破玩意兒叫網絡 https://www.bilibili.com/video/BV17x6hYZEzJ
在此特別感謝飛天閃客老師的視頻,以通俗易懂的動畫演示了完整的工作流程
更多遊戲資訊請關註:電玩幫遊戲資訊專區
電玩幫圖文攻略 www.vgover.com
