網路概論 Lesson 1
- 預期你會學到什麼
你會知道 IP地址、子網路遮罩、默認網關 這三個重要設定是什麼意思。
你會知道 DHCP 是什麼,然後 NAT 的優點以及局限性,以及要在 NAT 後面架設網路服務應該要怎麼做。
- 如何最簡單的讓兩台電腦可以互相通訊?
Ans: 直接給他們插上一條網路線就可以了
我們給兩台電腦接上一條網路線,他們就「有能力」彼此傳遞訊息了。 但目前還不能,因為他們還不知道彼此是誰(像是我有腳會走路,我能走到你家,但我不知道怎麼走),所以你要給彼此一個 IP位置和子網路遮罩。
設置完成之後他們才有能力彼此發送訊息:
對於 PC1,他如果要發送一個封包給 192.168.1.2,他會先看,他發現 192.168.1.2 和他在同一個子網路。
要怎麼看呢? 檢查(目標IP) & (子網路遮罩) 是否等於 (自己IP) & (子網路遮罩)。
目標IP: $$11000000.10101000.00000001.00000010(192.168.1.2)$$ $$\text{AND}$$ $$11111111.11111111.11111111.00000000(255.255.255.0)$$ $$=$$ $$11000000.10101000.00000001.00000000(192.168.1.0)$$
自己IP: $$11000000.10101000.00000001.00000001(192.168.1.1)$$ $$\text{AND}$$ $$11111111.11111111.11111111.00000000(255.255.255.0)$$ $$=$$ $$11000000.10101000.00000001.00000000(192.168.1.0)$$
發現兩個相同,所以知道彼此在同一個子網路,可以「直接通訊」。在同一個子網路內,我要發訊息給對方我會直接「廣播」,就是將資料發給所有我看的到的人。就好像你媽在家裡面要叫你她就會直接大喊你的名字,要叫你哥哥他就會直接大喊你哥的名字,然後你聽到了就會回應,如果你聽到你媽叫你哥,你就當沒聽到。
所以 PC1 發現 PC2 在同一個子網路中,他就會直接廣播封包,然後 PC2 收到之後發現 PC1 在和自己講話,就會回應。
因此,一個最簡單的網路模型就搭建完成了。
- 交換器?
但如果要擴大剛剛的模型,變成三台電腦,甚至三十台電腦要可以彼此通訊的話該怎麼做?而這時候就不太可能會讓電腦直接彼此相連,比較有可能會通過一個交換器(Switch)。
像這個網路拓撲, PC1 要給 PC2 發送訊息時候,Switch 會把封包廣播出去,PC3 發現和自己沒關係,就默默的把封包丟掉。
這邊其實並不是把我們要傳遞的封包直接廣播出去,這邊會先發送一個叫做 ARP 的封包,這個封包的意思是說:「我想要找 IP 為 XXX 的電腦,請你告訴我你的 MAC 地址。」
因為 MAC 地址才是真正的物理地址,在一個子網路中,是直接透過 MAC 地址來傳遞資料的,所以我先透過 ARP 詢問對方的 MAC 地址,得到答案後再把資料傳向到對方的 MAC 地址。
而 Switch 會進行學習,他會去紀錄某個特定的 MAC 地址應該會在自己的哪個介面,他下次就知道如果要給某個特定 MAC 地址,他就會直接從那個介面傳出去,就不需要全部廣播,浪費網路資源。
而這也是用 Switch 的主要功能,就是請他幫助讓一大堆設備串在一起,Switch 往往有非常多個介面。
Cisco 的 2960-24TT Switch 有 24 個介面。
而 Zyxel GS2210-48 有 48 個介面。
- 我要怎麼發給不在我這個子網路的電腦?
如果在同一個子網路,我們就可以直接通訊,但如果不在呢?
剛剛這個設定介面還有一個很重要的東西叫做 Default Gateway(默認網關),他的用武之地就在於,你要發給不在自己子網路的設備,就有點像你要離開你自己的國家,此時你要出關,往更大的世界走。
你要離開你自己的 LAN(內網),然後到更大的 WAN(外網),你需要先找到一個大門,而這個就是默認網關。所以你對外的封包會從 Default Gateway 想辦法轉發出去。
所以我這邊放一個路由器,這個路由器會有 Routing 的功能,當他收到一個來自外面的封包,他會自動的去轉發給應該轉發的地方。
這個路由器(Router)的兩個介面一個接在 192.168.1.X 這字網路,另一個接在 192.168.2.X 這個子網路。
當封包從 PC1 想要發給 PC4 時,他首先會發現 PC4 不在自己所在的子網路中,於是他會發給 Router0(192.168.1.254),然後 Router0 會認得 PC4 的 IP 和自己第二個介面的 IP(192.168.2.254)相同,所以會轉發給第二個介面,所以 PC4 才收得到。
所以我們成功的用一台 Router 把兩個子網路接在了一起,而事實上這可能也是網路世界當中的很小一塊,而這台 Router0 可能還會接出去到更大的網路世界,這樣層層遞進下去。
我們可以看看這台 Router 的 Route table:
192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.1.0/24 is directly connected, GigabitEthernet0/0/0
L 192.168.1.1/32 is directly connected, GigabitEthernet0/0/0
192.168.2.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.2.0/24 is directly connected, GigabitEthernet0/0/1
L 192.168.2.1/32 is directly connected, GigabitEthernet0/0/1
反正大略的意思就是如果是往 192.168.1.0/24,就往 GigabitEthernet0/0/0 這個介面轉發;如果是往 192.168.2.0/24,就往 GigabitEthernet0/0/1 這個介面轉發。
而在剛剛,我手動配置了 4 台 PC 的 IP地址、子網路遮罩、默認網關。而這動作是繁瑣的,而一台 DHCP 伺服器可以幫我們做到這件事。一台電腦連上網路之後,會廣播一個封包詢問是否有 DHCP 伺服器可以告訴他他是誰他在哪,DHCP伺服器就會回應他「你的IP是XXX,你的子網路遮罩是XXX,你的默認網關是XXX」,只要我們預先在一個 LAN 裡面設定好 DHCP,我們之後電腦接上來就會自動拿到這些資料。
以我手上的一台很初階的 AP 而言,他的 DHCP 設定介面在這:
他會回傳的 IP 範圍是從這邊做分配的,然後默認網關會回傳這台 AP 自己的 IP,然後子網路遮罩也會回傳這台 AP 所掌管的這個 LAN 的子網路遮罩。
而我之前也有用 Linux 系統架設過一個 DHCP 伺服器,詳細的設定檔長這樣:
option domain-name-servers 8.8.8.8;
max-lease-time 7200;
default-lease-time 600;
authoritative;
subnet 10.113.40.0 netmask 255.255.255.0 {
option routers 10.113.40.254;
option subnet-mask 255.255.255.0;
option domain-name-servers 8.8.8.8;
range 10.113.40.111 10.113.40.122;
range 10.113.40.124 10.113.40.222;
}
當 10.113.40.X 這個子網路的人發 DHCP 請求的時候,我會回傳 10.113.40.111 ~ 10.113.40.122 或 10.113.40.124 ~ 10.113.40.222 這兩個範圍之中的一個 IP,然後我會告訴他 default-gateway 是 10.113.40.254,子網路遮罩是 255.255.255.0, DNS 伺服器是 8.8.8.8。
- NAT 是什麼?
有時候我們只有一個對外 IP,例如你的手機 4G 網路拿到一個對外 IP,然後你的手機要開熱點給你的平板、筆電。
此時你的手機、平板、筆電就會形成一個子網路,平板要發送封包給外網的時候,會發送給默認網關也就是你的手機,你的手機此時會重寫這個封包。
原本封包是這樣:
(從 平板的內網IP, 到 目標對外IP, 資料)
手機會重寫封包的Header,變成這樣:
(從 手機的對外IP, 到 目標對外IP, 資料)
這樣才能讓封包傳的回來,因為真實網路世界描述位置是按照對外 IP。
而這種操作就叫做 NAT(網路位址轉換),他的方便處就是可以讓多台設備共用同一個對外 IP,可以減緩 IPv4 位置匱乏的問題。但麻煩處就是,如果有多台設備共用同一個對外 IP,我要怎麼訪問其中的特定一台?
在 NAT 之下的設備難以進行被動連線。
- NAT 之後的 Port forwarding
先講一下什麼是 Port:
對於一台電腦而言,他可能有非常多個網路服務,例如你同時在用 Chrome 滑 facebook,又用 Spotify 聽音樂,而電腦要怎麼區分每個網路封包是應該要交給哪一個應用程式來處理?此時就是用 Port 來區分。
例如如果我架設了一個網站,這個網站伺服器會監聽 80 port,所有 http 請求理論上都要交給這個網站伺服器。所以所有 http 請求的封包裡面都會有一個欄位寫著 80,這就代表這個封包要發送的 port。
所以比較放大來講,一個 IP 只知道這台電腦是誰,我還需要知道這台電腦的哪個程式在和我作通訊,而應用程式就是用 port 來做區分的。
我發送一個 80 port 的封包給某個對外 IP,這個對外 IP 如果有用 NAT,他底下有一大堆的設備,他可能會不知道這個封包要發送給誰。所以此時就需要設定 port forwarding,在接受到往特定 port 的封包的時候,應該要轉發給 nat 下哪一個主機的哪個 port?
以這個例子,筆者我有一個對外IP是 140.113.138.226,而內網有很多台設備都共用這個對外 IP,其中一台設備(192.168.1.3)我希望拿來作為網站伺服器。
我就會新增一條 port forwarding 的規則,將所有 incoming 往 (140.113.138.226, 80) 的封包轉成 (192.168.1.3, 80)。
-
DNS?
-
TCP/UDP ?
