Githubgit
本系列文章旨在向程序員分享一些網絡基本知識,讓程序員具有基本的網絡常識,以便與網絡工程師溝通。本系列文章不會涉及如何配置交換機、路由器等網絡設備的內容,因此不適合想考CCNA/HCNA證書的人士。程序員
相信全部的程序員都據說過網絡分層模型,那咱們說說最常提到的OSI參考模型與TCP/IP模型。github
不少人常說的7層網絡就是指OSI參考模型,其模型一共分爲7層,自下而上分別是:物理鏈接層、數據鏈路層、網絡層、傳輸層、會話層、表現層、應用層。服務器
而TCP/IP模型能夠被認爲是對OSI參考模型的簡化,其一共有4層,自下而上分別是:網絡接入層、網際互聯層、傳輸層、應用層。網絡
下圖對這兩種模型作了一個比較:學習
下面簡單講一下2-4層PDU所包含的關鍵信息(不是全部信息):spa
用於建網的網絡設備通常有交換機(Switch)和路由器(Router)。其中交換機工做在OSI模型第二層,因此也被稱爲二層設備(L2 Device),路由器工做在OSI模型第三層,因此也稱爲三層設備(L3 Device)。操作系統
回顧上圖,L2有一個用途是MAC Addressing,所謂MAC Addressing即MAC尋地,每一塊網卡(NIC)都有一個MAC地址,好比在Linux運行ifconfig
可以看到NIC的MAC地址,注意看下面的HWaddr:3d
ens33 Link encap:Ethernet HWaddr 00:0b:29:2b:25:10 inet addr:192.168.1.246 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe2b:2510/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:5253258 errors:0 dropped:0 overruns:0 frame:0 TX packets:6680389 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2384306523 (2.3 GB) TX bytes:9150388800 (9.1 GB)
MAC地址是網卡的物理地址,該地址理論上是全世界惟一的,不過現實生活中只須要保證在同一個LAN(局域網,或稱二層網絡)中惟一便可。code
交換機是一個工做在L2的設備,即它是依靠MAC地址來使處於同一個LAN中的兩個NIC相互通訊的。
交換機是一個有不少端口(Port)的設備,每一個NIC經過網線鏈接到其中的一個端口,好比PC-1(假設只有一個網卡)鏈接在Port-一、PC-2(假設只有一個網卡)鏈接在Port-2。交換機內部會維護一張「MAC地址表」,它存儲來MAC地址->Port的對應關係。
交換機在某個端口收到數據後,會查看Frame(上圖中Data Link層的PDU)中的目的地MAC地址,而後根據「MAC地址表」找到對應端口,而後將數據轉發到這個端口。
可是咱們在現實生活中歷來沒有使用MAC地址來通訊對不對?咱們都是使用IP來通訊的,好比:ping 192.168.1.20
。這是由於操做系統會使用ARP協議來獲知192.168.1.20
的MAC地址,而交換機在此過程當中會學習到這個信息,而且記錄到「MAC地址表」中(具體過程本文不作詳述)。
關於ARP協議、以及交換機的其餘功能細節本文不作詳述,讀者朋友只需知道交換機是一個二層設備,它維護了一張「MAC地址表」並運用此表讓處於同一個二層網絡的兩個網卡通訊就能夠了。
交換機只能讓處於同一個二層網絡的兩個網卡進行通訊,如何讓處於不一樣二層網絡的設備是通訊呢?
答案是使用路由器(Router),路由器是一個三層設備(L3 Device),它的做用是將兩個二層網絡鏈接起來,使其可以互相通訊。
下圖是一個將兩個二層網絡鏈接起來的例子:
在這張圖中能夠看到有兩個子網——192.168.1.0/24和192.168.2.0/24(若是你不知道這是什麼,沒關係張,咱們會在子網分割章節詳細講解),它們是兩個獨立的二層網絡。路由器1有兩個端口,一個端口鏈接在交換機1上,IP是192.168.1.1;另外一個端口鏈接在交換機2上,IP是192.168.2.1。
當PC1要和PC3通訊的時候,好比ping 192.168.2.10
,它會發現PC3和本身不在同一個子網中(到底是如何知道的你如今不用關心,咱們會在子網分割章節中詳細講解),那它數據交給路由器1,路由器1它會讀取Packet(Network層的PDU)中的目的地IP地址,發現是192.168.2.10,結合其內部的路由表(關於路由表本文不作講解)決定將其轉發到交換機2,交換機2再轉發到PC3.
咱們再考慮一個更貼近現實的問題,咱們的電腦是如何訪問到baidu.com
的呢?
實際上當訪問baidu.com
的時候你的數據是通過多層路由器,最終到達baidu服務器的,以下圖:
你也許會問,路由器是一個L3設備,它是經過IP來轉發數據的,那它是怎麼知道baidu.com
的IP地址呢?實際上路由器並不知道baidu.com
的IP地址,操做系統在發送請求的時候會將baidu.com
轉化爲IP地址放到Packet中傳遞給路由器。關於這個咱們會在DNS章節中作詳細說明。
實際上這個問題自己存在一個錯誤的假設,咱們已經知道在同一個二層網絡中是直接經過MAC地址來通訊的,在這種狀況下咱們是能夠得到MAC地址的。但這只是極少的一種狀況,由於大部分時候咱們都必須通過路由器才能訪問網絡的。
咱們再來看這張圖:
在列出詳細步驟前先補充一個知識:路由器的每一個端口都是一個獨立的網卡,有獨立的MAC地址。
若是PC1要和PC3通訊,其詳細步驟是這樣的:
PC1發送數據
路由器1轉發數據
因此當PC3收到數據的時候,它收到的Frame已經不是PC1當初發出的Frame了,可是Packet仍是PC1發出的Frame。所以PC3是不可能獲取PC1的MAC地址的,它能收到的只是路由器1右側端口的MAC地址。