網路基礎真的很重要!但是,資料太多,好雜啊!慢慢看底下的資料,真的是挺重要的!
網路基礎原本就是很難理解的東西!而且資料還異常的多!包括 OSI 七層協定、TCP/IP、IPv4 表頭資料、IPv6 位址理解、 路由概念、TCP 與 UDP 的埠口意義等!光是解釋這些東西,腦袋就炸裂了...不過不要緊,這一小節你隨時都可以回來慢慢參考, 最重要的是 4.5 小節,將網卡卡號、IP位址、埠口號碼、埠口啟動等,連結到地理位置、門牌號碼、服務窗口、服務人員等概念, 並且懂得上網需要 IP/Netmask, Gateway, DNS 等參數,這樣就很棒了!
現在的人們都離不開網路,尤其是智慧型手機熱門應用之後,年輕的世代更是一出生就跟著網路活動了! 但是,我們不要只是『會用』而已啊,資訊人員還是得要了解這些網路底層的物理連接方式,以及網路軟體相關概念, 這樣未來如果網路出問題,或者是想要從事網路資訊行業,才不會因為一些小細節沒注意到,就導致網路連接的崩潰啊! 所以,底下我們先來介紹一下在區域網路裡面常見的連結方式與相關硬體,然後介紹一下網路架構 (OSI 七層堆疊的概念), 以及目前應用的 TCP/IP 協定!了解一下就很棒了!不用深入研究更內部的理論啦!
一般來說,在企業內部或者是學校計中單位的電腦教室內,我們透過一個交換器 (switch) 為中心, 以實體網路線將所有設備接在一起。有時候還會額外提供一台無線存取點 (Access Point, AP), 提供智慧型手機或筆記型電腦連線。然後這個交換器會連結到具有兩個網路界面以上的路由器或 Linux 防火牆, 再透過電信業者 (Internet Service Provider, ISP) 的協助,連接到網際網路上。相關的連線圖示有點像底下這樣:
上述的連接網路,目前主流都是使用乙太網路 (Ehternet) 技術。乙太網路最初是由全錄公司 (Xerox PARC) 所建構出來的,而後透過 DEC, Intel 與 Xerox 合作將乙太網路標準化。再經由 IEEE (Institute of Electrical and Electronic Engineers) 這個國際著名的專業組織利用一個 802 的專案制定出標準,之後有 19 家公司宣佈支援 IEEE 所發布的 802.3 標準,並且到了 1989 年國際標準組織 ISO (International Organization for Standard) 將乙太網路編入 IS88023 標準。 後來大家都可以透過這個標準界面來開發自己的硬體囉!
上圖 4.1.1-1 是一種所謂的『星形連線』拓樸 (topology),因為交換器就像是星星一樣,透過網路線如同光線發散到各個節點上, 所以稱為星形連線。目前網路都是一堆大大小小的星形連線所組合起來的啦!至於星形連線裡面,連結的元件大概是:
在你接觸的無線 AP 當中,你應該經常會看到兩種埠口的名稱 (IP 分享器後面的接孔),一個是 LAN 一個是 WAN,這兩個東西是啥鬼? 基本上,原本的定義是這樣的:
節點之間的傳輸距離較近,例如一棟大樓內,或一個學校的校區內。可以使用較為昂貴的連線材料, 例如光纖或是高品質網路線 (CAT 6) 等。網路速度較快,連線品質較佳且可靠,因此可應用於科學運算的叢集式系統、 分散式系統、雲端負荷分擔系統等。
傳輸距離較遠,例如城市與城市之間的距離,因此使用的連線媒體需要較為便宜的設備,例如經常使用的電話線就是一例。 由於線材品質較差,因此網路速度較慢且可靠性較低一些,網路應用方面大多為類似 email, FTP, WWW 瀏覽等功能。
雖說是如此,但是,目前 (2023) 家庭網路撥接速度已經可以來到 1Gpbs/600Mbps (下載/上傳速度), 所以,定義上面雖然說 WAN 使用的連線媒體較為便宜,不過以目前的現有環境來看,事實上速度與媒體都有一定程度的提昇了! 所以,老實說,現在的定義喔,可以說,內部環境就說是 LAN,連到 internet 的那個連線口就簡稱為 WAN 就好了! 不用太鑽牛角尖啦!
前一小節談到,所有的節點與拓樸中央的交換器,都是透過網路線連接的。網路線總有插頭與插孔, 網路線插頭我們通常稱為水晶頭,因為通常這個插頭是透明塑膠材質,亮晶晶啊~所以稱為水晶頭。 比較專業的說法,則是 RJ-45 (Registered Jack) 接頭或 8P8C 線材 (8 position 8 contact)。 相關的圖示有點像底下這樣:
在線材裡面的 8 芯是有顏色分別的,每個編號都有對應的顏色,根據顏色的定義,主要有兩種線路配置,分別是 568A, 568B。 目前的主流大致上都以 568B 為主,所以,未來你只要知道 568B 就好了!568A 自動略過吧!
接頭名稱\蕊線順序 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
568A | 白綠 | 綠 | 白橙 | 藍 | 白藍 | 橙 | 白棕 | 棕 |
568B | 白橙 | 橙 | 白綠 | 藍 | 白藍 | 綠 | 白棕 | 棕 |
早期的 cat5 網路線,雖然是 8P8C 了,但是因為速度只到 100Mbps,事實上僅有 4P4C,亦即僅有兩對共四條芯在進行接收與傳輸而已。 不過,從 1000Mbps 的速度之後,所有 8 芯都用上了!因此,每一個線路都很重要!如果自己壓製好了水晶頭,一定要用測線器分析過! 避免訊號不良,導致網路降速或者是不穩定喔!
如果距離比較遠,一般建議施做資訊座會比較好!資訊座除了比較好壓製之外,它也比較不容易損壞,而且還能夠搭配桌上盒或牆壁上的插孔, 作為一個固定的插座。一般桌機或筆電,則直接拿市面上壓製好的網路線來連接即可。資訊座相關的圖示以及與網路線的壓製狀況, 有點像底下這樣:
乙太網路的流行主要是它成為國際公認的標準所致。早先 IEEE 所制訂的乙太網路標準為 802.3 的 IEEE 10BASE5,這個標準主要的定義是:『10 代表傳輸速度為 10Mbps,BASE 表示採用基頻信號來進行傳輸,至於 5 則是指每個網路節點之間最長可達 500 公尺。』目前的主流則是 1000BASE-T,高階一點則會使用 10GBASE-T, 使用的就是 8P8C 的線材,速度在 1Gbit/s 以及 10Gbit/s 。不同的線材可到達的標準不同喔!
名稱 | 速度 | 搭配的網路線等級 |
Ethernet | 10Mbps | - |
Fast Ethernet | 100Mbps | Cat 5 |
1G Ethernet | 1Gbps | Cat 5e / Cat 6 |
10G Ethernet | 10Gbps | Cat 6 / Cat 6A / Cat 7 |
一般市面上我們會經常看到 Cat 5e, Cat 6, Cat 6e 不同等級的網路線材,至於 Cat 6A 與 Cat 7 可能較少見,其中 Cat 6A 大概是最少見的!Cat 7 說不定還比較常見。就 wiki 的說明,其實 Cat 6e 是廠商自己亂定義出來的一種非標準的線材,所以 wiki 建議大家,還是購買 cat 6 或者是 cat 7 的線路較佳。其實 Cat 5e 就挺好用的,只要拉線不是太長,速度穩定上都很好了! 但如果資訊座之間的距離較長,建議還是購買 cat6 以上等級的線材喔!
再次重申喔,兩個節點之間的網路傳輸速度,是以通過的所有元件中,最慢的那個網路媒體所限制的! 因此,你買的新的主機,裡面的網卡速度高達 10Gbps 好了,但是家用的 switch port 都是 Gbps 時,那麼所有的速度就會是 Gbps 囉! 除了這個之外,事實上,乙太網路媒體通常還會有這些機制喔:
那麼你的網路媒體怎麼知道最低限制的速度是網路線材?還是網路卡呢?因為目前幾乎所有的乙太網路媒體都具有一個很特別的機制, 稱為自動協商機制 (auto negotiation),這個機制會在兩個 node 之間傳輸時,自動協商最佳可接受的速度來進行傳輸!如果 1Gbps 不能動,那就自動降一級,直到可以接受的那一級速度為止。
另外,網路線 8 芯裡面,如果傳送與接收可以同時進行,那就稱為全雙工 (full-duplex), 如果同一時間只能進行傳輸或只能進行接收,無法同時進行,那就稱為半雙工 (half-duplex)。如果網路頻寬為 1Gbps 而有全雙工的情境下, 那總頻寬 (上傳+下載) 就可以達到 2Gbps 了!但是,單一方向最大就是 1Gbps 喔!這個要注意! 此外,中心連接的媒體要是 switch 才能達到全雙工,共享媒體的 hub 是無法達到全雙工的!
以前的網路媒體當中, switch 與 PC 之間的接法並不相同,因此需要網路線兩頭分別使用 568A 及 568B 進行跳接, 這種接法的網路線被稱為『跳線』。這樣很麻煩啊~因此在 1Gbps 之後的乙太網路媒體,已經加上了 auto MDI 或 MDIX 機制, 這種機制會自動判斷線路形式而進行跳接,所以,目前網路線僅須兩端均為 568B 的平行線即可!
我們可以透過 Linux 提供的 ethtool 這個指令來觀察/設定實體網卡喔!基本上,虛擬機器內的網卡實際限制大概都是跟著實體網卡跑, 而且不太容易修改相關的機制。因此,底下主要是連線到 KVM host 上面去找出實體網卡,然後觀察一下, 到底有沒有出現上面提到的相關協定機制呢?
# 1. 在 KVM host 實體主機上面,先找到實體網卡的名稱 [root@cloud ~]# ip link show .... 2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether fc:34:97:3b:eb:86 brd ff:ff:ff:ff:ff:ff altname enp0s31f6 .... # 我這部主機的實體網路卡名稱為 eno1 喔!透過 ip link show 去找出來的網卡名稱 # 由於網卡名稱與匯流排位址有關,所以每部主機的網卡名稱都不會相同喔!請自己找出來! # 2. 使用 ethtool 觀察目前的連線狀態與機制 [root@cloud ~]# ethtool eno1 Settings for eno1: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supported pause frame use: No Supports auto-negotiation: Yes Supported FEC modes: Not reported Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised pause frame use: No Advertised auto-negotiation: Yes Advertised FEC modes: Not reported Speed: 1000Mb/s Duplex: Full Auto-negotiation: on Port: Twisted Pair PHYAD: 1 Transceiver: internal MDI-X: off (auto) Supports Wake-on: pumbg Wake-on: g Current message level: 0x00000007 (7) drv probe link Link detected: yes
如上所示,我們可以看到支援 (Supported) 的連線模式可以到 1000baseT/Full,所以這張網卡支援到 1Gbps 的速度。 然後往下看,目前速度來到 1000Mb/s,而且是全雙工 (Duplex: Full),也具有自動協商 (Autonegotiation: on), 使用的網路線為雙絞線 (Twisted Pair),這個就是 8P8C 的線材!最後一個 Link detected: yes 就代表目前這個網卡是有連線的。 一項一項來看,其實挺清楚的!
現在,讓我們來看一下,那麼虛擬機器裡面的網卡參數,又會長怎樣呢?
# 1. 確認一下我們啟動的是 test1 虛擬機器,用來作為測試。demo1 非必要,不要再啟用囉! [root@cloud ~]# virsh create /kvm/xml/test1.xml [root@cloud ~]# virsh list Id Name State ----------------------- 1 test1 running [root@cloud ~]# ssh vbird@192.168.10.52 # 請依據您的環境來連線到虛擬機裡面去!後續也是這樣做即可! # 2. 同樣的,在虛擬機器裡面,先找出網卡名稱 [root@localhost ~]# ip link show 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff # 2. 就來測試一下,到底虛擬網卡的機制長怎樣? [root@localhost ~]# ethtool enp1s0 Settings for enp1s0: Supported ports: [ ] Supported link modes: Not reported Supported pause frame use: No Supports auto-negotiation: No Supported FEC modes: Not reported Advertised link modes: Not reported Advertised pause frame use: No Advertised auto-negotiation: No Advertised FEC modes: Not reported Speed: Unknown! Duplex: Unknown! (255) Auto-negotiation: off Port: Other PHYAD: 0 Transceiver: internal Link detected: yes
除了 Link detected 顯示為正常之外,其他的...全部都是怪怪的。如果你想要修改速度與全雙工的型態, 其實也是可以的!有時候,某些第三方軟體在執行時,也是需要網路速度在 1Gbps 以上才會放行!所以啦! 這個時候就得要動手修改才行!用 root 在虛擬機器修改修改!
# 基本語法 [root@localhost ~]# ethtool -s dev [speed NN] [duplex full|half] [mdix auto|on|off] [autoneg on|off] # 注意,是在虛擬機器改喔!將速度改為 1000 且為全雙工 [root@localhost ~]# ethtool -s enp1s0 speed 1000 duplex full [root@localhost ~]# ethtool enp1s0 Settings for enp1s0: .... Speed: 1000Mb/s Duplex: Full ....
這樣就可以騙過檢查囉!效能會不會比較好?這就不清楚了!只是,至少你可以清楚的查詢到速度以及相關的機制就是了! 更多 ethtool 的參數,請自行 man ethtool 囉!
就如同語言一樣,如果沒有一致的標準,那麼大家各講各的,誰也聽不懂誰的語言~那就無法溝通了!網路世界也一樣, 除了上述的硬體標準 (乙太網路) 之外, 還有所謂的網路 OSI 七層協定 (Open System Interconnection, OSI) 的資料, 目的在指導作業系統想要加入網路時,所需要撰寫的網路連線程式模型。這個 OSI 七層協定只是在提出一個加入網路所需要的模型與概念, 只要能夠參考 OSI 七層協定的規範所設計出來的作業系統,理論上就可以加入以 OSI 七層協定為共同標準的網路世界之意。 (有點像目前的強勢語言還是英文,所以出國在外,大家都用英文溝通是一樣的意思。)
網路不就是網路,為什麼要分為 7 層呢?除了每一層的定義清晰,設計比較方便之外,分不同層級來設計時, debug 也比較方便的。 如果你曾經設計過程式,應該就會知道,如果將全部的資料寫在主程式,那未來這個主程式越來越大的時候,將很難維護! 同時,如果有同事想要協助你程式的維護與開發,那將會造成非常大的困擾...每個人寫 code 的習慣不同啊~
所以,將主程式拆開成數個函數,當要使用的時候才去呼叫!每個函數都有特定的輸入/輸出參數, 如此一來,要使用的時候,填入固定的參數,而你也可以預期該函數會輸出什麼資料!這樣就很容易維護! 同事如果想要幫忙某個寫的比較不這麼好的函數,那他只要去讀該函數內容即可,不用完整的看完所有主程式!真是相當愉快! 這就是分層堆疊的好處之一!
如上圖所示,就是 OSI 七層堆疊的示意圖。依據定義來說,越接近硬體的階層為底層 (layer 1),越接近應用程式的則是高層 (layer 7)。不論是接收端還是發送端,每個一階層只認識對方的同一階層資料。而整個傳送的過程就好像人們在玩整人遊戲一般, 我們透過應用程式將資料放入第七層的包裹,再將第七層的包裹放到第六層的包裹內,依序一直放到第一層的最大的包裹內,然後傳送出去給接收端。 接收端的主機就得由第一個包裹開始,依序將每個包裹拆開,然後一個一個交給對應負責的階層來視察!這就是整人遊戲...喔!是 OSI 七層協定在階層定義方面需要注意的特色。
既然說是包裹,那我們都知道,包裹封面都會有個重要的資訊,這些資訊包括有來自哪裡、要去哪裡、接收者是誰等等, 而包裹裡面才是真正的資料。同樣的,在七層協定中,每層都會有自己獨特的表頭資料 (header),告知對方這裡面的資訊是什麼, 而真正的資料就附在後頭囉!我們可以使用如下的圖示來表示這七層每一層的名字,以及資料是如何放置到每一層的包裹內:
OSI 七層協定的七層,從底層往上層的名稱如上圖所示。當應用程式,例如瀏覽器或者是 WWW 伺服器軟體將資料收集完畢之後, 就會將資料塞入應用層,應用層會在表頭記載該資料的特性,然後再往底下塞給表現層,表現層又寫一個自己的表頭資料,再往下塞給會談層, 這樣一層一層的往下塞,直到最底層的實體層,轉成電子訊號之後,就交給作業系統,然後提交給網路卡進行傳送。 那接收端的系統從網卡接收到這些訊號之後,再由實體層、鍊結層一個一個的拆解,最終再由應用層將資料傳輸給應用程式。 至於每一層的名稱與功能,簡述如下,看看就好。
分層 | 負責內容 |
---|---|
Layer 1 實體層 Physical Layer |
由於網路媒體只能傳送 0 與 1 這種位元串,因此實體層必須定義所使用的媒體設備之電壓與訊號等, 同時還必須瞭解資料訊框轉成位元串的編碼方式,最後連接實體媒體並傳送/接收位元串。 |
Layer 2 資料鏈結層 Data-Link Layer |
這一層是比較特殊的一個階層,因為底下是實體的定義,而上層則是軟體封裝的定義。因此第二層又分兩個子層在進行資料的轉換動作。
在偏硬體媒體部分,主要負責的是 MAC (Media Access Control) ,我們稱這個資料包裹為 MAC 訊框 (frame), MAC
是網路媒體所能處理的主要資料包裹,這也是最終被實體層編碼成位元串的資料。MAC 必須要經由通訊協定來取得媒體的使用權,
目前最常使用的則是 IEEE 802.3 的乙太網路協定。詳細的 MAC 與乙太網路請參考下節說明。 至於偏向軟體的部分則是由邏輯連結層 (logical link control, LLC) 所控制,主要在多工處理來自上層的封包資料 (packet) 並轉成 MAC 的格式, 負責的工作包括訊息交換、流量控制、失誤問題的處理等等。 |
Layer 3 網路層 Network Layer |
這一層是我們最感興趣的囉,因為我們提及的 IP (Internet Protocol) 就是在這一層定義的。 同時也定義出電腦之間的連線建立、終止與維持等,資料封包的傳輸路徑選擇等等,因此這個層級當中最重要的除了 IP 位址之外,就是封包能否到達目的地的路由 (route) 概念了! |
Layer 4 傳送層 Transport Layer |
這一個分層定義了發送端與接收端的連線技術(如 TCP, UDP 技術), 同時包括該技術的封包格式,資料封包的傳送、流程的控制、傳輸過程的偵測檢查與復原重新傳送等等, 以確保各個資料封包可以正確無誤的到達目的端。 |
Layer 5 會談層 Session Layer |
在這個層級當中主要定義了兩個位址之間的連線通道之連接與掛斷,此外,亦可建立應用程式之對談、 提供其他加強型服務如網路管理、簽到簽退、對談之控制等等。如果說傳送層是在判斷資料封包是否可以正確的到達目標, 那麼會談層則是在確定網路服務建立連線的確認。 |
Layer 6 表現層 Presentation Layer |
我們在應用程式上面所製作出來的資料格式不一定符合網路傳輸的標準編碼格式的! 所以,在這個層級當中,主要的動作就是:將來自本地端應用程式的資料格式轉換(或者是重新編碼)成為網路的標準格式, 然後再交給底下傳送層等的協定來進行處理。所以,在這個層級上面主要定義的是網路服務(或程式)之間的資料格式的轉換, 包括資料的加解密也是在這個分層上面處理。 |
Layer 7 應用層 Application Layer |
應用層本身並不屬於應用程式所有,而是在定義應用程式如何進入此層的溝通介面,以將資料接收或傳送給應用程式,最終展示給使用者。 |
事實上, OSI 七層協定只是一個參考的模型 (model),目前的網路社會並沒有什麼很知名的作業系統在使用 OSI 七層協定的聯網程式碼。那...講這麼多幹嘛?這是因為 OSI 所定義出來的七層協定在解釋網路傳輸的情況來說, 可以解釋的非常棒,因此大家都拿 OSI 七層協定來做為網路的教學與概念的理解。至於實際的聯網程式碼,那就交給 TCP/IP 這個玩意兒吧!
我們經常講到『網路基礎』或者是『防火牆』或者是『第二層交換器』或『第三層交換器』等網路專業術語中,會用到的層級概念, 都是使用 OSI 七層協定的規範!而所謂的『封包過濾式防火牆』主要就是在控制第 2, 3, 4 層的封包過濾, 而『網路基礎』的概念,則也是著重在 2, 3, 4 層的介紹與使用的!所以,你一定要知道這七層協定以及各協定的表頭資料喔! 當然,只要知道 layer 2, 3, 4 就是了!
那麼 Layer 2, 3, 4 裡面跟防火牆有關的封包與表頭資料,各別有什麼呢?
另外,網路是雙向的, client 會向 server 要求資料,而 server 自然就會回應資料給 client, 所以,防火牆與相關的網路路由規劃,都需要注意到雙向傳輸這件事喔!所以上述的 MAC 位址、IP 位址、port 號碼, 都有 server 端與 client 端的紀錄喔!如下圖所示,下圖為第二、三、四層的表頭資料最重要的兩個數據而已! 並不是所有的表頭資料喔!
所以,所謂的『第二層交換器』,其主要針對的設備為網路卡卡號,比較偏向於硬體方面的設定。而防火牆管理第二層時, 主要也是透過管理主機的網路卡卡號位址!所謂的『第三層交換器』代表該交換器基本上有 IP 位址, 而且比較偏向管理軟體封包,而不只是針對硬體而已,當然價格就更高檔。而防火牆針對第三層網路層, 主要就是針對作業系統的 IP 位址進行限制。第四層傳輸層,用在防火牆的規範中,就是針對軟體連接到某個應用程式來限制, 這時就是針對服務啟動在某個埠口 (port number) 來管理!這樣,對 layer 2, 3, 4 有沒有稍微清楚些?
OSI 七層協定規範的網路層級相當清晰,不過架構太過嚴謹,就是一個網路設計的指引模型。後來美國國防部尖端研究企劃署 (Defense Advanced Research Project Agency, DARPA) 依據 OSI 七層協定開發出一套網路系統,當時稱為 ARPANET 網路。後來 DARPA 在 1980 年代推出 TCP/IP 技術後,將網路分為兩個部份,一個仍給軍方使用,另一個則與柏克萊 (Berkeley) 大學合作開發,並將他們的 TCP/IP 技術整合到著名的 BSD Unix 系統內,因此,在早期, TCP/IP 幾乎就是學術網路,原因就是這樣。
因為 TCP/IP 的架構比較鬆散,將原本的七層規範簡化為四層,只要作業系統的網路功能符合 TCP/IP 的規範,就能夠加入該網路系統中。後來更由於 email 的流行,讓學術網路風行於各大學間~在 80 年代後期,更由於 Web 以及超連結的發展,讓商業公司投入 TCP/IP 的領域中!因此,後來才有網路的大爆發!這個 TCP/IP 的技術,也被稱為 Internet (網際網路) 囉!所以,學名是 TCP/IP,而俗名就稱為網際網路 (Internet), 這兩者其實是同意字喔!
既然 TCP/IP 是由 OSI 七層協定簡化而來,那麼這兩者之間有沒有什麼相關性呢?它們的相關性可以圖示如下, 同時這裡也列出目前在這架構底下常見的通訊協定、封包格式與相關標準:
TCP/IP 將 OSI 最上層的三層結合成為一個應用層,中間的傳輸、網路層則保留,最底層的硬體與鍊結層結合成為鍊結層,所以僅有 4 層而已。 由於應用層偏向於應用程式的呼叫使用,因此基礎網路大概就是底下三層,其實對應起來,也就是 OSI 七層協定的 layer 2, 3, 4 啦!
如同前幾個小節提到的,在 TCP/IP 當中,鍊結層最重要的資料其實是 layer 2 的 MAC 訊框資料,而網路層最重要的其實是 IP 封包 (packet) 與表頭資料,傳輸層有兩種重要的封包,一個是可靠連線的 TCP 封包,一個是非連接導向的 UDP 封包。 至於應用層的相關封包協定,則大多與網路服務有關!那已經是應用程式使用的層級,不算是基礎網路概念。 不過比較重要的網路服務協定你還是得要注意一下!尤其是各個服務預設會啟用在某些特定的埠口號碼!
OSI 七層協定的第二層是所謂的『資料鏈結層』,這一層裡面最重要的是一個名為 Media Access Control, MAC 的包裹, 這個包裹主要跟硬體的資源比較有關系,因此,被稱為訊框 (frame) 而不是軟體包裹而來的封包 (packet)。不過, 其實就是名稱不太一樣就是了,你還是可以將它想成是個包裹啦!
那這個訊框的表頭資料裡面有什麼?還有,我們前面談到的網路卡卡號又該如何查看? 以及資料如何在網路卡之間傳遞?這就是 Layer 2 相關的資料了!
Layer 2 最重要的訊框 (frame) 就是 MAC 訊框,這個訊框上面有兩個很重要的資料,就是目標與來源的網卡卡號, 因此我們又簡稱網卡卡號為 MAC 位址而已。簡單的說,你可以把 MAC 訊框想成是一個在網路線上面傳遞的包裹, 而這個包裹是整個網路硬體上面傳送資料的最小單位了。也就是說,網路線可想成是一條『一次僅可通過一個人』的獨木橋, 而 MAC 訊框就是在這個獨木橋上面動的人啦!接下來,來看一看 MAC 這個訊框的內容吧!
上圖中的目的位址與來源位址指的就是網卡卡號 (hardware address, 硬體位址),每一張網卡都有一個獨一無二的卡號, 那個卡號的目的就在這個訊框的表頭資料使用到啦!硬體位址最小由 00:00:00:00:00:00 到 FF:FF:FF:FF:FF:FF (16 進位法,共 12 個值), 這 6 bytes 當中,前 3bytes 為廠商的代碼,後 3bytes 則是該廠商自行設定的裝置碼了。
早期訊框內的資料內容最大僅能到 1500bytes 而已,近期則可能可以放大到 9000bytes 左右。但是,為何需要規範最小資料量為 46byes 呢? 這是由於 CSMA/CD (稍後說明) 機制所算出來的!在這個機制上面可算出若要偵測碰撞,則訊框總資料量最小得要有 64bytes , 那再扣除目的位址、來源位址、檢查碼 (前導碼不算) 後,就可得到資料量最小得要有 46bytes 了!也就是說,如果妳要傳輸的資料小於 46byes ,那我們的系統會主動的填上一些填充碼,以補齊至少 46bytes 的容量才行!這都是 TCP/IP 網路功能自動處理, 你不用理會的!
通過上面 MAC 封裝的定義,現在我們知道標準乙太網路訊框所能傳送的資料量最大可以到達 1500 bytes ,這個數值就被我們稱為 MTU (Maximum Transmission Unit, 最大傳輸單位)。你得要注意的是,每種網路介面的 MTU 都不相同,因此有的時候在某些網路文章上面你會看到 1492 bytes 的 MTU 等等。不過,在乙太網路上,標準的定義就是 1500 bytes。
在待會兒會介紹到的 IP 封包中,這個 IP 封包最大可以到 65535 bytes,比 MTU 還要大哩!既然禮物 (IP封包) 都比盒子 (MAC訊框) 大, 那怎麼可能放的進去啊?所以囉, IP 封包是可以進行拆解的,然後才能放到 MAC 訊框當中啊!等到資料都傳到目的地, 再由目的地的主機將他組裝回來就是了。所以囉,如果 MTU 能夠大一些的話,那麼 IP 封包的拆解情況就會降低, 封包與封包傳送之間的等待時間 (大約是 96 bit time) 也會減少,就能夠增加網路頻寬的使用囉!
為了這個目的,所以 Gigabit 的乙太網路媒體才有支援 Jumbo frame 的嘛!這個 Jumbo frame 一般都定義到 9000bytes。 那你會說,既然如此,我們的 MTU 能不能改成 9000bytes 呢?這樣一來不就能夠減少資料封包的拆解,以增加網路使用率嗎? 是這樣沒錯,而且,你也確實可以在 Linux 系統上更改 MTU 的!但是,如果考量到整個網路,那麼我們不建議你修改這個數值。為什麼呢?
我們的封包總是需要在 Internet 上面跑吧?你無法確認所有的網路媒體都是支援那麼大的 MTU 對吧!如果你的 9000 bytes 封包通過一個不支援 Jumbo frame 的網路媒體時,好一點的是該網路媒體 (例如 switch/router 等) 會主動的幫你重組而進行傳送,差一點的可能就直接回報這個封包無效而丟棄了~這個時候可就糗大囉~ 所以, MTU 設定為 9000 這種事情,大概僅能在內部網路的環境中作~舉例來說,很多的內部叢集系統 (cluster) 就將他們的內部網路環境 MTU 設定為 9000,但是對外的介面卡可還是原本的標準 1500 喔!
查看網卡卡號也是挺容易的,好幾個指令功能可以處理。我們來看看簡單的 ifconfig 以及 ip link show 吧! 不過,要注意的是,底下的操作,可以的話,請盡量使用類似 remote-viwer 的方式在 VNC 情境下實做,因此, 鳥哥不敢肯定你改了 MTU / MAC address 之後,ssh 的網路連線是否能夠持續...說不定會暫時中斷啦!
# 1.1 先用 ifconfig 查看一下虛擬機器的網卡 [root@localhost ~]# ifconfig enp1s0 enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.10.52 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 fe80::5054:ff:feed:63aa prefixlen 64 scopeid 0x20 ether 52:54:00:ed:63:aa txqueuelen 1000 (Ethernet) RX packets 6860 bytes 430760 (420.6 KiB) .... # 1.2 使用 ip link show 也行: [root@localhost ~]# ip link show enp1s0 2: enp1s0: >BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff # 其實,兩個指令都可以查看 MAC address 以及 MTU 的數值! # 2.1 使用 ip link set 功能,進行 MAC address 偽裝,將原本的位址結果變成 ff 看看 [root@localhost ~]# ip link set enp1s0 address 52:54:00:ed:63:ff [root@localhost ~]# ip link show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:ed:63:ff brd ff:ff:ff:ff:ff:ff permaddr 52:54:00:ed:63:aa # 這個設定值在下次開機會恢復成原本的 MAC 位址。 # 2.2 使用 ifconfig 指令修改 MTU 數值 [root@localhost ~]# ifconfig enp1s0 mtu 9000 [root@localhost ~]# ifconfig enp1s0 enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9000 inet 192.168.10.52 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 fe80::5054:ff:feed:63aa prefixlen 64 scopeid 0x20 ether 52:54:00:ed:63:ff txqueuelen 1000 (Ethernet) .... # 3. 測試完畢後,使用 ip 指令將 MAC address 與 MTU 修改回預設值 [root@localhost ~]# ip link set enp1s0 mtu 1500 address 52:54:00:ed:63:aa [root@localhost ~]# ip link show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff
ip 就是個萬用指令!這個指令後續接的 layer 2 參數,就是『 ip link 』,如果是 layer 3 時,那就用『 ip addr 』參數! 只是,不知道你的網路環境當中是否可接受這些數值前,不要亂改喔!所以,上面我們測試完畢之後, 最後一步有改回來喔!注意注意!如果需要永久生效,那就得要使用 nmcli 這個指令的配合!這邊只是先行測試而已!
了解了 MAC 訊框與其表頭資料之後,接下來讓我們了解一下,那麼這個 MAC 訊框的包裹,是怎麼在主機之間互相傳送的呢? 基本上,乙太網路的 MAC 訊框,主要是透過 CSMA/CD (Carrier Sense Multiple Access with Collision Detection) 的方式進行傳送的! 這個 CSMA/CD 是 IEEE 802.3 的標準,整體流程我們使用底下的圖示來進行說明:
集線器是一種網路共享媒體,什麼是網路共享媒體啊?想像一下上述的環境就像一個十字路口,而集線器就是那個路口! 這個路口一次只允許一輛車通過,如果兩輛車同時使用這個路口,那麼就會發生碰撞的車禍事件啊!那就是所謂的共享媒體。 也就是說,網路共享媒體在單一時間點內, 僅能被一部主機所使用。
理解了共享媒體的意義後,再來,我們就得要討論,那麼乙太網路的網卡之間是如何傳輸的呢?我們以上圖中的 A 網卡要發資料給 D 網卡為例好了,簡單的說,CSMA/CD 搭配上述的環境,它的傳輸情況需要有以下的流程:(A 所發送的訊框,MAC 的表頭資料中, 來源卡號為 A 的卡號,目標卡號為 D 的卡號)
A 主機要發送 MAC 訊框前,需要先對網路媒體進行監聽,確認沒有人在使用後,才能夠發送出訊框
A 主機所送出的 MAC 訊框會被集線器複製一份,然後以廣播的方式傳送給所有連接到此集線器的主機!也就是說,A 所送出的資料, B, C, D 三部電腦都能夠接收的到!但由於目標是 D 主機,因此 B 與 C 會將此訊框資料丟棄,而 D 則會抓下來處理;
該訊框資料附有檢測能力,若其他主機例如 B 電腦也剛好在同時間發送訊框資料時,那麼 A 與 B 送出的資料碰撞在一塊 (出車禍), 此時這些訊框就是損毀,那麼 A 與 B 就會各自隨機等待一個時間, 然後重新透過第一步再傳送一次該訊框資料。
透過上述的 CSMA/CD 方式,我們就可以很輕鬆的將 MAC 訊框這個包裹,在區域網路內,透過共享媒體直接傳輸! 但是,這個情境有點問題呢!有什麼問題呢?我們輕鬆的說一說好了。
透過上述的流程我們會知道,不管哪一部主機發送出訊框,所有的電腦都會接收到!因為集線器會複製一份該資料給所有電腦。 因此,雖然只有一部主機在對外連線,但是在集線器上面的所有電腦燈號就都會閃個不停!大家都瘋狂收到該 MAC 訊框資料喔!
透過上述的流程,我們只要在 C 電腦上面安裝一套監聽軟體,這套軟體將原本要丟棄的訊框資料捉下來分析,並且加以重組, 就能夠知道原本 A 所送出的訊息了。這也是為什麼我們都建議重要資料在網際網路上面得要『加密』後再傳輸!看不懂嘛?沒關係, 我們來想個人間類似的情境好了。假設你在教室上課,老師正在講一些政治八卦,旁邊路過的同學覺得很有趣,但是他不想進入教室, 所以就拿錄音筆在教室外面錄音。此時,教室內的老師、同學都不會知道有人錄音走了這些資料 (沒人被入侵), 但是上課的內容都被錄音竊取了(資料被竊取)!這樣的意思!
這個問題就有趣了,既然共享媒體一次只能被一個主機所使用,那麼萬一我傳輸 100MB 的檔案,集線器就得被我使用 80 秒 (以 10Mbps 傳輸時),在這期間其他人都不可以使用嗎?不是的,由於標準的訊框資料在網路卡與其他乙太網路媒體一次只能傳輸 1500bytes,因此:
所以,這個集線器的使用權是大家搶著用的!即使只有一部主機在使用網路媒體時,那麼這部主機在發送每個封包間, 也都是需要等待一段時間的 (96 bit time)!bit time 的單位很特別,它的定義有點像這樣:
簡單的意思是,傳送 1 bit 所需要花費的時間~所以,如果是 10Mbps 的速度,代表的就是 10*106 bit/s = 107 bit/s, 那麼 1 bit time 就是 1/107 = 10-7 秒!所以,現今的 1Gbps 網卡速度,其 bit time 就會是 10-9 秒的意思!
等等,上面的 CSMA/CD 機制中,開宗明義就說來源 MAC address 是 A 而目標 MAC address 是 D,問題是, A 怎麼知道 D 的網卡卡號?這真是沒道理!如果沒有什麼特別的『詢問機制』,在區域網路內,不應該大家立刻知道彼此誰是誰吧? 所以,A 認識 D 的卡號,是怎麼辦到的呢?這就得要說明一下 ARP 協定了!
其實,網際網路 TCP/IP 只認 IP 位址,所以,網際網路連線的兩部主機之間,使用的是 IP 封包傳遞資料的。 但是,實際上的乙太網路資料傳遞則是透過 MAC 訊框,這兩者之間,一定會有某種關係! 這透過的就是 ARP 協定 (Address Resolution Protocol, 網路位址解析協定),這是從 layer 3 的 IP 位址去找到 layer 2 的 MAC 位址的一個重要協定。
當 A 需要知道『區域網路內』的某部主機的 MAC 位址時,就會發送一個廣播封包,詢問有沒有人知道 D 的 MAC 位址。 跟原本的 CSMA/CD 相同,B 與 C 會主動略過這個詢問,而 D 就會回報他自己的 MAC 位址給 A,這時, D 就將 A 的 MAC 位址紀錄起來,而 A 也會將 D 的位址紀錄下來!就紀錄到 arp table 當中 (記憶體內的資料)。 我們來測試看看這個效果! (跟前面類似的,底下的測試會使用到 KVM host 以及虛擬機器喔!所以要開兩個視窗)
# 1. 先在虛擬機器上面使用 ping 去檢查一部不存在的區網 IP [root@localhost ~]# ping 192.168.10.20 <== 這個是『區網』內的一個沒用到的 IP PING 192.168.10.20 (192.168.10.20) 56(84) bytes of data. From 192.168.10.52 icmp_seq=1 Destination Host Unreachable From 192.168.10.52 icmp_seq=2 Destination Host Unreachable .... # 反覆出現這個錯誤,是正常的!不要緊! # 2. 在 KVM host 上面,使用 tcpdump 監聽 templan 網路界面 [root@cloud ~]# tcpdump -i templan -nn dropped privs to tcpdump tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on templan, link-type EN10MB (Ethernet), snapshot length 262144 bytes 15:23:24.184714 ARP, Request who-has 192.168.10.52 tell 192.168.10.254, length 28 15:23:24.184842 ARP, Reply 192.168.10.52 is-at 52:54:00:ed:63:aa, length 28 15:23:24.210949 ARP, Request who-has 192.168.10.20 tell 192.168.10.52, length 28 .... # 測試完畢之後,兩邊都按下 [ctrl]-c 結束測試
上面有兩個情境,(1)一個是鳥哥的 server (192.168.10.254) 在查詢誰是 192.168.10.52,實際 .52 就是虛擬機器, 有活著喔!所以,虛擬機器就回應它的網卡卡號給 .254 了!(2)另一個就是虛擬機器詢問的,它問說有沒有人知道 .20 是誰? 因為 .20 並不實際存在,所以沒有人會給予回應,於是該條訊息就會一直持續不斷的透過廣播來詢問整個 LAN 喔! 如果這個時候你使用 arp 這個指令來查看一下虛擬機上面的 arp table 資料,就會有點像這樣:
# 顯示出虛擬機器內的 arp table 資料 [root@localhost ~]# arp -n Address HWtype HWaddress Flags Mask Iface 192.168.10.20 (incomplete) enp1s0 192.168.10.254 ether 52:54:00:00:ff:01 C enp1s0
很明白的告訴你, 192.168.10.20 找不到相關的 MAC 位址,而路由器的 192.168.10.254 就有紀錄好該主機的 MAC 位址了! 相當的清楚明白!那如果其實你知道 192.168.10.20 這個主機的 MAC 號碼,所以不想讓你的主機去『學習』, 而是想要主動的『設定 MAC 位址到 arp table 中』呢?例如假設 192.168.10.20 的 MAC 卡號是 52:54:00:00:ff:20 時! 那可以這樣做:
# 在虛擬機上面設定 IP 位址與 MAC 位址的『靜態 ARP』對應 [root@localhost ~]# arp -s 192.168.10.20 52:54:00:00:ff:20 [root@localhost ~]# arp -n Address HWtype HWaddress Flags Mask Iface 192.168.10.20 ether 52:54:00:00:ff:20 CM enp1s0 192.168.10.254 ether 52:54:00:00:ff:01 C enp1s0 [root@localhost ~]# ping 192.168.10.20 # 在 KVM host 上面,繼續偵測 templan 的封包狀態 [root@cloud ~]# tcpdump -i templan -nn 16:04:35.502439 IP 192.168.10.52 > 192.168.10.20: ICMP echo request, id 5, seq 8, length 64 16:04:36.526746 IP 192.168.10.52 > 192.168.10.20: ICMP echo request, id 5, seq 9, length 64
使用 arp -s 可以將 IP 位址與 MAC 位址『靜態』的紀錄到自己主機的 arp table 當中,因為是靜態的, 所以這筆紀錄不會遺失 (重新開機或使用 arp -d 刪除就 OK),而再次使用 ping 與 tcpdump 去查看區域網路內的封包情況,你就可以發現 ARP 要求不見了!因為該發送 ping 的主機『已經知道 MAC 位址』了, 所以當然不用重新找尋 MAC 位址。
剛剛我們上面提到了,當一個很忙碌的網路在運作時,集線器 (hub) 這個網路共享媒體就可能會發生碰撞的情況, 這是因為 CSMA/CD 的緣故。那有沒有辦法避免這種莫名其妙的封包碰撞情況呢?有的,那就使用非共享媒體的交換器即可啊!
交換器 (switch) 等級非常多,我們這裡僅探討支援 OSI 第二層的交換器。交換器與集線器最大的差異, 在於交換器內有一個特別的記憶體,這個記憶體可以記錄每個 switch port 與其連接節點的 MAC 位址,所以,當來自 switch 兩端的節點要互傳資料時,每個訊框將直接透過交換器的記憶體資料而傳送到目標主機上!所以 switch 不是共享媒體,且 switch 的每個埠口 (port) 都具有獨立的頻寬喔!
如下所示,當 A 與 D 之間要互相傳遞資料,而 B 與 C 之間也同時要互相傳遞資料時,兩者透過 switch 的記憶體輔助, 因此可以直接將訊框資料丟到特定的 switch 埠口去,因此就可以略過大部分的封包碰撞,同時也才能夠達到全雙工的功能! 說實在的,目前 (2023) 家庭用 8 port 的 switch 幾乎都可達到 1Gbps 的速度,而且價格大多在 1000 新台幣以內, 千萬不要買錯!買成 500 元以下的 hub,那就傷腦筋了!
另外,在佈線的時候你也需要注意,一般來說,當你的網路線拉的線段太長,然後水晶頭壓製的不夠好,這個時候, 電子訊號由於衰減的關係,可能會造成連線品質不良,因此網路情況就會時通時不通~一般來說,Cat 5e 的速度達到 1Gbps 的情況,可以拉線到 100m 左右,不過實際佈線時,能夠達到 90m 就已經是很棒的情況了。
如果佈線是 10Gbps 的話,那麼肯定需要使用到 Cat 6a 等級的線路較佳,因為線長可以達到 100m 左右之外,未來可以使用到 10Gbps 的速度!要注意,短距離 (可能小於 1.5m) 的情況下,即使是 Cat 5e 的線路,依舊有可能達到 10Gbps 的連線速度 (在實際測試中,確實可以達成此速度),不過,稍微拉長一點之後,可能網路品質就會下降到 1Gbps 了!為了未來著想,要拉長距離的線路, 最好還是使用 Cat 6 以上等級的網路線較佳。
那『為什麼市面上販賣的網路線,通常絕對長於 1.5m 呢?』難道沒有短線的需求?查了查 wiki , 底下這一段文字相當有趣:
靠近水晶頭的地方,網路線的八條芯被從線路中獨立出來,被捋平了。此時這 8 芯將失去了雙絞線的特性。線越短, 未絞線/正常絞線的比例會越來越大,這樣這段線的電氣效能會有降低。此原因導致有線纜最短長度為 1.5m 或 1m 來保證其電氣效能。
雖然自己壓製短線材是沒問題,不過使用上可能需要注意,不要拿來作為重要應用!自己的 PC 使用自己壓製的網路線當然沒問題!另外,Cat 5e 的線材還能自己壓製, Cat 6 以上等級的線路,盡量使用資訊插座,不用自己壓製水晶頭~而且 Cat 5e 與 Cat 6 等級的水晶頭並不一樣,Cat 6 等級的水晶頭很難壓製! 即使壓製成功,其電氣效果可能也大打折扣。所以,超過 Cat 6 以上等級的網路線,就買工廠製作的線材, 如果要自己壓製,請盡量使用資訊插座吧!
我們現在知道要有網路的話,必須要有網路相關的硬體,而目前最常見的網路硬體介面為乙太網路,包括網路線、網路卡、Hub/Switch 等等。 而乙太網路上面的傳輸使用網路卡卡號為基準的 MAC 訊框,配合 CSMA/CD 的標準來傳送訊框,這就是硬體部分。 在軟體部分,我們知道 Internet 其實就是 TCP/IP 這個通訊協定的通稱,Internet 是由 InterNIC 所統一管理的, 但其實他僅是負責分配 Internet 上面的 IP 以及提供相關的 TCP/IP 技術文件而已。不過 Internet 最重要的就是 IP 協定/位址啊!所以, 這個小節就讓我們來講講網路層的 IP 與路由吧!
網際網路原本僅有 IPv4 (Internet Protocol version 4) 這個版本的 IP 協定,IPv4 的 IP 位址僅有 32 位元, 目前已經發放完畢,沒有多餘的 IPv4 位址可以提供給新進的 ISP 了!因此,很早之前,國際組織就開始著手制定 IPv6 的 IP 協定。 IPv6 的 IP 位址為 128 位元,單算數值的話, IPv6 的位址數量是 IPv4 的 296 倍數,等於是用不完的 IP 位址啦! 只是,因為 IPv6 在台灣的路由與相關網路媒體還是不熱門,所以,目前大致上還是以 IPv4 為主要的 IP 位址設定依據就是了。好, 那麼 IPv4 的封裝是怎樣呢?其實有點像這樣:
4 bits | 4 bits | 8 bits | 3 bits | 13 bits |
Version | IHL | Type of Service | Total Length | |
Identification | Flags | Fragmentation Offset | ||
Time To Live | Protocol | Header Checksum | ||
Source Address | ||||
Destination Address | ||||
Options | Padding | |||
Data |
在上面的圖示中有個地方要注意,那就是『每一行所佔用的位元數為 32 bits』。相關的表頭資料可以參考許多網路文件, 鳥哥這邊僅介紹我們比較有興趣的部份:
表示這個 IP 封包的存活時間,範圍為 0-255。當這個 IP 封包每通過一個路由器時,TTL 就會減一,當 TTL 為 0 時,這個封包將會被直接丟棄,因為代表幾乎找不到目標 IP 位址了。說實在的, 要讓 IP 封包通過 255 個路由器,還挺難的~
來自傳輸層 (layer4) 與網路層 (layer3) 本身的其他資料都是放置在 IP 封包當中的,我們可以在 IP 表頭記載這個 IP 封包內的資料是啥, 在這個欄位就是記載每種資料封包的內容啦!在這個欄位記載的代碼與相關的封包協定名稱如下所示:
IP 內的號碼 | 封包協定名稱(全名) |
---|---|
1 | ICMP (Internet Control Message Protocol) |
2 | IGMP (Internet Group Management Protocol) |
3 | GGP (Gateway-to-Gateway Protocol) |
4 | IP (IP in IP encapsulation) |
6 | TCP (Transmission Control Protocol) |
8 | EGP (Exterior Gateway Protocol) |
17 | UDP (User Datagram Protocol) |
我們比較常見到的有 TCP, UDP, ICMP等。
就是這個 IP 封包的來源位址與目標位址,兩者均是 32 位元喔!一定要記下來的是,IPv4 的 IP 位址是 32 位元這件事!
還記得我們使用 ping 的方式去探索目標主機是否存在時,螢幕上會出現 TTL 這個關鍵字嘛?對了!該數值就是從這裡取得的! IP 封包裡面紀錄的來源與目標位址,我們稱為『IP 位址』,要特別留意的是,所謂 IP 是一種封包協定,在這個 IP 封包上面, 有個來源 (發送端) 與目標 (接收端)的位址,那就我們稱的 IP 位址!通常大家習慣都說 IP,老實說,那是錯誤的!這裡了解一下即可! 另外,在協定代碼中,TCP 與 UDP 我們在本章稍後介紹,這邊先講一講 ICMP 好了。
ICMP 的全名是『 Internet Control Message Protocol, 網際網路訊息控制協定 』。基本上,ICMP 是一個錯誤偵測與回報的機制,最大的功能就是可以確保我們網路的連線狀態與連線的正確性! ICMP 也是網路層的重要封包之一,不過,這個封包並非獨立存在,而是納入到 IP 的封包中!也就是說,ICMP 同樣是透過 IP 封包來進行資料傳送的啦!因為在 Internet 上面有傳輸能力的就是 IP 封包啊!ICMP 有相當多的類別可以偵測與回報,底下是比較常見的幾個 ICMP 的類別 (Type):
類別代號 | 類別名稱與意義 |
---|---|
0 | Echo Reply (代表一個回應信息) |
3 | Destination Unreachable (表示目的地不可到達) |
4 | Source Quench (當 router 的負載過高時,此類別碼可用來讓發送端停止發送訊息) |
5 | Redirect (用來重新導向路由路徑的資訊) |
8 | Echo Request (請求回應訊息) |
11 | Time Exceeded for a Datagram (當資料封包在某些路由傳送的現象中造成逾時狀態,此類別碼可告知來源該封包已被忽略的訊息) |
12 | Parameter Problem on a Datagram (當一個 ICMP 封包重複之前的錯誤時,會回覆來源主機關於參數錯誤的訊息) |
13 | Timestamp Request (要求對方送出時間訊息,用以計算路由時間的差異,以滿足同步性協定的要求) |
14 | Timestamp Reply (此訊息純粹是回應 Timestamp Request 用的) |
15 | Information Request (在 RARP 協定應用之前,此訊息是用來在開機時取得網路信息) |
16 | Information Reply (用以回應 Infromation Request 訊息) |
17 | Address Mask Request (這訊息是用來查詢子網路 mask 設定信息) |
18 | Address Mask Reply (回應子網路 mask 查詢訊息的) |
那麼我們是如何利用 ICMP 來檢驗網路的狀態呢?最簡單的指令就是 ping 與 traceroute 了,這兩個指令可以透過 ICMP 封包的輔助來確認與回報網路主機的狀態。在設定防火牆的時候,我們最容易忽略的就是這個 ICMP 的封包了,因為只會記住 TCP/UDP 而已~事實上,ICMP 封包可以幫助連線的狀態回報,除了上述的 8 可以考慮關閉之外,基本上,ICMP 封包也不應該全部都擋掉喔!
網際網路很多的設計其實應該是有參考人類的郵務系統~所以,我們說,網路主機都會有個門牌, 這個門牌就是代表人家怎麼來到你的伺服器的主要目標,這個目標就是 IP 位址囉!前面也談到, IPv4 的 IP 位址為 32 位元, 也就是 32 個 0 與 1 組合而成的位址長度。亦即 IP 位址最小與最大的數值分別是 (使用 2 進位展示時):
IP 位址在 2 進位的表示方式: 二進位最小:00000000000000000000000000000000 二進位最大:11111111111111111111111111111111
上述的字串你真背的出來倒也真是相當不容易~為了讓人類使用習慣的 10 進位數字來記憶,因此許多作業系統都提供 8 位元為一組共拆成 4 組的 IP 位址設計方式,並且四組之間透過小數點 (.) 來區分,因此就變成這樣:
IP 位址在 10 進位的表示方式: 二轉十進位最小:00000000.00000000.00000000.00000000 ==> 0.0.0.0 二轉十進位最大:11111111.11111111.11111111.11111111 ==> 255.255.255.255
預設的 IP 位址是有等級之分的!這個『等級』的意思是,該 IP 位址的『區域網路的範圍』到哪裡的意思。 舉個簡單的例子來說好了,崑山科技大學所在的地址是:『台南市、永康區、崑大路、195號』,這個門牌的意思是:
所以說,IP 位址的數值,就跟上面的門牌號碼一樣,該 IP 位址就會決定廣播到哪裡的意思。那接下來就有趣了! 在『基本定義』上,到底 IP 位址的範圍到哪裡呢?這一開始需要從 2 進位來看才行!InterNIC 將所有 IPv4 位址分為五種基本等級:
以二進位說明 Network 第一個數字的定義: Class A : 0xxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx ==> Net_ID 的開頭是 0 |--net--|---------host------------| Class B : 10xxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx ==> Net_ID 的開頭是 10 |------net-------|------host------| Class C : 110xxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx ==> Net_ID 的開頭是 110 |-----------net-----------|-host--| Class D : 1110xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx ==> Net_ID 的開頭是 1110 Class E : 1111xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx ==> Net_ID 的開頭是 1111 五種分級在十進位的表示: Class A : 0.xx.xx.xx ~ 127.xx.xx.xx Class B : 128.xx.xx.xx ~ 191.xx.xx.xx Class C : 192.xx.xx.xx ~ 223.xx.xx.xx Class D : 224.xx.xx.xx ~ 239.xx.xx.xx Class E : 240.xx.xx.xx ~ 255.xx.xx.xx
根據上表的說明,我們可以知道,你只要知道 IP 位址的第一個十進位數字,就能夠約略瞭解到該 IP 位址屬於哪一個等級, 以及同網域 IP 數量有多少。不過,上表中你只要記憶三種等級,亦即是 Class A, B, C 即可,因為 Class D 是用來作為群播 (multicast) 的特殊功能之用 (最常用在大批電腦的網路還原),至於 Class E 則是保留沒有使用的網段。 因此,能夠用來設定在一般系統上面的,就只有 Class A, B, C 三種等級的 IP 位址囉!
我們以 class A 為範本來說明好了,假設就選 127.xx.xx.xx 這一段來說明,這一組 IP 位址的範圍會是 127.0.0.0 到 127.255.255.255 之間! 所以,這組 class A 的區域網路 IP 位址群,就總共會有 256x256x256 個 IP 位址喔!那如果以 class B 為範本呢? 定義上的 class B 不會有 172.0.0.0 ~ 172.255.255.255 這樣的分群,而是 172 底下共有 256 個分群 (172.0, 172.1, 172.2, ...), 我們拿 172.16.xx.xx 這個分群來說,這一組 IP 位址就會是 172.16.0.0 到 172.16.255.255,共會有 256x256 個 IP 位址在同一個網段喔!
我們以 192.168.0.0~192.168.0.255 這個 Class C 的網段做個簡單的介紹,基本上,這一段 IP 位址的範圍中, 最大與最小的 2 進位表示方式如下:
192.168.0.0~192.168.0.255 這個 Class C 的說明: 11000000.10101000.00000000.00000000 ==> 192.168.0.0 11000000.10101000.00000000.11111111 ==> 192.168.0.255 |----------Net_ID---------|-host--|
如之前談到的『台南市、永康區、崑大路、195號』相同,上面所謂的 Class C,他的 IP 位址分為巷子 (Net ID) 與戶號 (host ID)。 同一個區域網路,意思是說,巷子號碼要完全一樣,戶號則不能重複!就跟我們一般住家的巷子內每一戶人家的門牌設計一樣。 這就是所謂的同一網段囉!
在定義上,為了要讓大家更清楚 Net ID 的範圍,因此有定義出所謂的子網路遮罩 (subnet mask, 或僅稱 netmask),我們繼續用上面的案例做說明。 基本上, netmask 是另一個類似 IP 位址的數值,只是,它規範的是分開 Net ID 與 Host ID,簡單的設計方式是, 所有的 Net ID 都補上 2 進位的 1,所有的 Host ID 都補上 2 進位的 0,如下所示:
192.168.0.0~192.168.0.255 這個 C Class 的 Netmask 說明 第一個 IP: 11000000.10101000.00000000.00000000 最後一個 : 11000000.10101000.00000000.11111111 |----------Net_ID---------|-host--| Netmask : 11111111.11111111.11111111.00000000 <== Netmask 二進位 : 255 . 255 . 255 . 0 <== Netmask 十進位 特別注意喔,netmask 也是 32 位元,在數值上,位於 Net_ID 的為 1 而 Host_ID 為 0
另外,在定義上,上面整組 192.168.0.{0..255} 的第一個 IP 位址我們稱為網域 IP 位址 (network IP address),最後一個 IP 位址則被稱為廣播位址 (broadcast address)。同時,一段區域網路的寫法,通常是將 network IP 與 netmask 寫在一起, 另外,netmask 除了用 10 進位來寫出數值之外,還可以用『共有幾個 Net ID 的個數』來撰寫!以上面為例, netmask 在 Net ID 的部份,共佔有 24 個位元,所以,最終可以寫成這樣:
整組區網的寫法 : 192.168.0.0/255.255.255.0 ==> netmask 用 10 進位 整組區網的寫法 : 192.168.0.0/24 ==> netmask 用 bit 數 netmask : 255.255.255.0 network IP addr: 192.168.0.0 broadcast addr : 192.168.0.255 可用 IP 範圍 : 192.168.0.1 ~ 192.168.0.254
上面的整組區域網路的寫法中,未來我們會在防火牆或者是其他的伺服器軟體設定當中使用到!所以,要非常熟悉! 另外,總是思考一下記憶會比較深刻~來來~做一下底下的題目看看:
接下來要跟大家談一談也是很容易造成大家困擾的一個部分,那就是 IP 位址的種類!很多朋友常常聽到什麼『真實 IP, 實體 IP, 虛擬 IP, 假的 IP....』煩都煩死了~其實不要太緊張啦!實際上,在 IPv4 裡面就只有兩種 IP 位址的類別,分別是:
規劃私有 IP 位址時,同樣根據 Class 的分類,私有 IP 位址也分三個 class 提供給用戶或企業來設定規劃自己的區域網路, 這三段私有 IP 位址分別如下:
除了 Public / Private IP 位址之外,還有一個網段也是非常特別,當初在設計 IPv4 時,預留一段 Class A 的網段給所有的主機內部使用! 也就是說,幾乎所有能夠上網的主機,其內部都會有一個 Class A 的網段可以當作內部環境來測試應用!那個就是有名的 127.0.0.0/8 這個網段!在 Linux 的環境下,這個網段還擁有一個特別的網卡,那就是 lo 這張網卡!讓我們來看看這個網段:
# 在虛擬機器裡面,看看 loopback 長怎樣? [vbird@localhost ~]$ ip addr show lo 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever # 測試一下,名為 localhost 的主機名稱存在否? [vbird@localhost ~]$ ping -4 -c 3 localhost PING (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.033 ms 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.030 ms ....
同時你也可以發現,系統預設給了一個主機名稱 localhost (中文翻譯為本機) 對應到 127.0.0.1/8 這個 IP 位址上! 每一部主機都有自己的 127.0.0.1,每一部主機都有內部的 lo 網卡,如果沒有特別的防火牆設定與導向,這個 lo 網卡是外網連線不到的! 所以,許多在系統自己內部會用到的網路服務,沒有對外開放的,就會啟動到 lo 這個界面上! 還記得我們在設定 chronyd 服務時,需要有個 323 的埠口吧?現在再次看看這個埠口的資訊看看:
# 再次查看一下 chronyd 啟動的 323 埠口,是在哪個界面上?IP 位址又是什麼? [root@localhost ~]# netstat -tlunp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name udp 0 0 127.0.0.1:323 0.0.0.0:* 617/chronyd udp6 0 0 ::1:323 :::* 617/chronyd
從上面看起來,這個 323 埠口其實是在系統內部的 lo 界面上,這個服務開在這邊,基本上是挺安全的! 只有你自己連線的到而已!
我們前面談到,透過 10 進位的 IP 位址的第一組,我們就可以約略知道該 IP 位址的等級是 Class A/B/C 這樣。 但是,實務上,我們不可能將整個 Class A 的 Public IP 位址真的只設定為一個區域網路,這樣全世界的 IP 位址真的不夠用! 所以,子網路的切割就很重要了!而,不是標準等級的區域網路,就被我們稱為無等級的 IP 位址,簡稱為 CIDR 囉!
想像一下,假設你有一組 192.168.0.0/24 的區域網路可以使用,但是你底下有兩個團隊,這兩個團隊要求你得要讓他們各自擁有獨立的網路環境! 那麼你可以怎麼做?以『台南市、永康區、崑大路、XX號』為例,假設 XX 為 1~200 號,那要分成兩群,最簡單的方式,就是 1~100 號一組, 101~200 號一組,簡單分好!沒問題!那子網路的切割是否相同?對啊!完全相同!就對半切,立刻生成兩組啦!想法很簡單啦! 但是...網域表示怎麼說明呢?例如重要的 netmask 要怎麼設計呢?
其實很簡單啦,將原本的 8 位元 host ID 借一個位元當成 Net ID 即可!讓我們用底下的表格來了解一下:
先顯示原本的 Class C 網段的 Net_ID 與 Host_ID 11000000.10101000.00000000.00000000 Network: 192.168.0.0 11000000.10101000.00000000.11111111 Broadcast: 192.168.0.255 |----------Net_ID---------|-host--| 切成兩個子網路之後的 Net_ID 與 Host_ID 為何? 11000000.10101000.00000000.0 0000000 多了一個 Net_ID 了, 為 0 (第一個子網) 11000000.10101000.00000000.1 0000000 多了一個 Net_ID 了, 為 1 (第二個子網) |----------Net_ID-----------|-host--| 第一個子網路 Network: 11000000.10101000.00000000.0 0000000 192.168.0.0 Broadcast: 11000000.10101000.00000000.0 1111111 192.168.0.127 |----------Net_ID-----------|-host-| Netmask: 11111111.11111111.11111111.1 0000000 255.255.255.128 第二個子網路 Network: 11000000.10101000.00000000.1 0000000 192.168.0.128 Broadcast: 11000000.10101000.00000000.1 1111111 192.168.0.255 |----------Net_ID-----------|-host-| Netmask: 11111111.11111111.11111111.1 0000000 255.255.255.128
用文字說明非常痛苦...不過,用上面的表格來解釋,大家應該就能比較清楚的瞭解吧?基本上,大部分的 CIDR 都是把大的切成小的, 所以我們經常說『子網路』啊!所以,netmask 的位元數會長大,例如上面的範例中,我們的 netmask 位元數從 24 長大到 25 這樣。 主要是借用原本 host ID 的號碼來當 Net ID 的號碼而已。那 netmask 25 位元可以得到 255.255.255.128 這個數值! 然後再由 2 進位的方式,分別計算 192.168.0.XX 最後一位,就得到『二進位 0 0000000 = 十進位 0』及『二進位 1 0000000 = 十進位 128』的模樣, 所以最終就可以得到 192.168.0.0/25 及 192.168.0.128/25 這兩段區域網路了!
讓我們來做個簡單的練習~看看你會不會計算了?有個 IP 位址『 192.168.5.100/26 』,請根據上面 CIDR 的說明, 分別計算出 (1)netmask, (2)Network IP address, (3)Broadcast address, (4)可用 IP 位址範圍。
計算可用 IP 的偷吃步:以 192.168.5.100/26 來說,因為是佔用 2 bits 在第四組十進位,而 2bits 共可以分為 4 種組合,分別是 00, 01, 10, 11,也就是說,可以將最終的 0~255 平均分成 4 段的意思~所以從 256/4 可以得到 64,因此,四段子網路的開頭就會是 192.168.5.0, 192.168.5.64, 192.168.5.128, 192.168.5.192,查出 100 在 64 與 128 之間,當然最終的結果就用 192.168.5.64/26 這一段了!
從前面的 Private IP 規劃當中,我們會有 1 段 Class A, 16 段 Class B,以及 256 段 Class C,不過,如果我要放行所有的私有 IP 區段, 那麼根據標準定義,我得要寫出 1+16+256 的防火牆規則~真煩~不過,畢竟這幾個 IP 區段是連續的,那麼能不能透過 CIDR 簡化寫法呢?應該是可以的! 其中, 10.0.0.0/8 不用簡化了,因為它就是最簡的寫法...那麼 Class C 的區段呢?也很簡單,寫成 192.168.0.0/16 就可以了! 比較麻煩的應該是 172.16.0.0/16 ~ 172.31.0.0/16 這個資料。
分析一下 Class B 第二組十進位的數值,是從 16 到 31 共 16 個,這也就是 2 的 4 次方,所以看起來就是佔用了 4 個位元的意思~ 也就是說,其實第二組十進位只有 4 bits 被用來作為 Net ID 啦!所以總共的 Net ID 應該是『 第一組 8 + 第二組 4 = 12』,當然這一段私有 IP 位址段就應該要寫成 172.16.0.0/12 這樣才合理!所以最終的三段 Private IP 位址,可以透過 CIDR 簡化成為 (括號內為十進位 netmask 數值):
我們現在知道區域網路 (LAN) 裡面的電腦系統,可以透過網卡間的廣播直接進行資料的交流,那如果你要傳輸的目標主機並非在 LAN 裡面呢? 舉例來說,你得要連線到 google 去查資料時,這個封包資料會怎麼跑?基本上,跟人類的包裹流通一樣!你得要將你住家的包裹拿到路口的郵局, 或者是透過路口的便利商店的宅急便之類的店家,填好你的資料後,交由他們的郵差先生去傳輸~在區域網路內的這個郵局/宅急便, 就是所謂的通訊閘 (gateway) 或者是路由器 (router) 了!
也就是說,當你封包傳輸的目標是在區域網路內,那封包可以直接透過廣播,直接交給目的地主機來收取。那當你的封包傳輸的目標並不在區域網路內, 那這個封包就會透過你自己的路由表 (routing table),傳送到預設的通訊閘,由該設備主動幫你傳輸出去這樣!因此, 這個通訊閘就是你的區域網路與整個網際網路社會連接的重要關卡啦!一般來說,就是我們家裡/企業的 IP 分享器啦!
一般來說,路由器的 IP 位址範圍通常也是在你的區域網路內,比較常見的路由器 IP 位址,通常是可用 IP 位址範圍的最後一個 (或第一個), 這樣比較好保留與分辨~由於路由器也在你的區域網路內,所以,只要設定好預設的路由器位址,你的封包通常就可以自由的在網際網路上面流通了。 當然,某些特殊的機制,例如 pppoe 這種透過網路卡撥接的情況,則是透過點對點的連接,比較特別~無論如何, 我們主機系統的網路參數,一定得要有預設通訊閘 (gateway) 才能夠連上 Internet 就是了。
不論是廣播還是透過通訊閘傳輸你主機系統的封包,這個封包的傳輸,都是透過你本機上面的路由表來進行傳輸的! 如果路由表設計錯誤,那你的封包將可能會無法順利的傳輸到正確的目的地~那如何觀察路由表呢?很簡單,透過 route 指令即可:
# 1. 使用 route -n 觀察虛擬機器的路由表 [root@localhost ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.10.254 0.0.0.0 UG 100 0 0 enp1s0 192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 enp1s0
上面輸出的訊息共有 8 個欄位,你需要注意的大概是這幾個:
因此,我們知道虛擬機器輸出的路由表共有兩條,先談比較簡單的,也就是開頭為 192.168.10.0 那一條:
Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 enp1s0
這個路由代表的是 192.168.10.0/255.255.255.0 (Destination/Genmask) 的網段,這個網段主要透過 enp1s0 (Iface) 界面傳送,目前是可用的 (U Flags),直接透過廣播發送 (0.0.0.0, Gateway)。簡單的理解完畢,再來看一下另一條路由表:
Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.10.254 0.0.0.0 UG 100 0 0 enp1s0
這個路由代表的是不特定目標 0.0.0.0/0.0.0.0 (Destination/Genmask),透過 enp1s0 傳送,目前可用之外,還需要透過 192.168.10.254 這個通訊閘進行轉遞才行。所以,結合這兩條路由,我們就可以知道,除了 192.168.10.0/24 可以直接廣播進行訊息傳遞之外, 其他非在這個區網的封包,直接送去 192.168.10.254 之後,就可以不用理會了的意思!
其實,不一定同一個網段才可以溝通喔!你也可以強迫我們的主機透過自訂的路由來與對方進行溝通!不過要注意的是, 很可能網路連線是:『你可以連過去,但是對方連不回來...』!所以,網路設定得要雙向都進行好才行啊! 現在,讓我們來『手動』調整設計看看,能不能憑空增加/刪除某些路由呢?同樣簡單透過 route 指令來處理即可!
# 1. 在虛擬機上面,針對 192.168.20.0/24 進行直接廣播傳遞資訊 [root@localhost ~]# route add -net 192.168.20.0 netmask 255.255.255.0 dev enp1s0 # 2. 在虛擬機上面,針對 192.168.30.5 進行直接廣播傳遞資訊 [root@localhost ~]# route add -host 192.168.30.5 dev enp1s0 [root@localhost ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.10.254 0.0.0.0 UG 100 0 0 enp1s0 192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 enp1s0 192.168.20.0 0.0.0.0 255.255.255.0 U 0 0 0 enp1s0 <==針對網域 192.168.30.5 0.0.0.0 255.255.255.255 UH 0 0 0 enp1s0 <==針對單一主機 # 3. 刪除上面兩條新建的路由 [root@localhost ~]# route del -net 192.168.20.0 netmask 255.255.255.0 dev enp1s0 [root@localhost ~]# route del -host 192.168.30.5 dev enp1s0
更多詳細的用法,請 man route 查詢!
有時候,你可能有興趣針對郵局的郵差到底怎麼送貨到對方去的路線查詢,那你能不能知道你的封包到底是怎麼傳送到目的地的呢? 我們可以透過 traceroute 來追蹤一下。不過,目前很多通訊閘的防火牆,有關閉追蹤的功能,因此,許多通訊閘你無法查詢! 那也是正常的。通常我們可以透過簡單的 ICMP 查詢比較沒有問題,如果擔心出狀況,也能夠使用 UDP (port 53) 來做簡單的查詢! 比較不會卡住太久!
# 在虛擬機器上面,查詢你到 168.95.1.1 這部系統中間,到底經過幾個通訊閘? [root@localhost ~]# yum -y install traceroute [root@localhost ~]# traceroute -I 168.95.1.1 -n 1 192.168.10.254 0.161 ms 0.139 ms 0.137 ms 2 192.168.201.254 0.357 ms 0.356 ms 0.355 ms 3 172.20.168.254 1.348 ms 1.534 ms 1.744 ms 4 * * * 5 120.114.50.201 1.099 ms 1.141 ms 1.152 ms 6 * * * 7 * * * 8 * * * 9 * * * 10 * * * 11 * * * 12 168.95.1.1 2.430 ms 2.428 ms 2.426 ms [root@localhost ~]# traceroute -U 168.95.1.1 -n 1 192.168.10.254 0.258 ms 0.221 ms 0.194 ms 2 192.168.201.254 0.268 ms 0.232 ms 0.219 ms 3 172.20.168.254 1.155 ms 1.222 ms 1.322 ms 4 * * * 5 120.114.50.201 0.982 ms 0.972 ms 0.974 ms 6 * * * 7 * * * 8 * * * 9 * * * 10 * * * 11 * * * 12 * * * 13 168.95.1.1 2.429 ms 2.546 ms 2.333 ms
中間通過數個關卡之後,才能夠到答 168.95.1.1。因為某些通訊閘沒有放行查詢的功能,因此就如同上表的資料, 會出現 * 的符號!否則,通常會有檢測的數據出現!你也就能知道你的封包大致上通過哪些通訊閘了!
IPv4 的網路位址已經發放完畢了,目前新興國家或新的 ISP 若想要取得 IPv4 的話,就只能向其他已經申請的人購買~不過應該還是不夠用的! 因為現在連手機等行動裝置,還有 IoT 的偵測器與收集器都需要用到網際網路,這也都需要 IP 位址的!所以,沒有新的 IP 位址來源,那就慘了! 因此,IPv6 就這樣產生囉!IPv6 當然還有很多額外的功能,不過,在這裡我們只是介紹 IPv6 的網路位址計算/設計方式而已喔!
IPv6 跟 IPv4 一樣都在網路層 (Layer 3),使用的 IP 封包也差不多,只是表頭資料與相關功能比較不同。相關功能這裡就不說明, 要強調的是 IPv6 使用了 128bits 來作為 IP 位址使用~也就是說 IPv4 用 32 個 0 與 1 排列來展示位址,而 IPv6 用了 128 個 0 與 1 排列來展示位址。 因為用到 128 個 0 與 1 的組合,實在沒辦法簡單的寫下來二進位的列表...好長啊~
為了簡化位址長度, IPv4 是轉 2 進位為 10 進位,而 IPv6 則是轉 2 進位成為 16 進位 (2 的 4 次方),因此 128bit/4bit = 32 個 16 進位的數字! 所謂的 16 進位指的是 0, 1 ... 9, a, b, c, d, e, f ,其中 f 代表的就是 15 的意思,那每 4 個 16 進位的數字 (2 bytes) 分別做一個區隔, 因此就有 32/4 = 8 組各 4 個 16 進位的數值,最小與最大就分別是:
如上所示,用冒號 (:) 隔開共 8 組,每組裡面有 4 個 16 進位的數值,每一組最小是 0000,最大則是 FFFF。
如上所示,雖然 IPv6 的 128 位元由二進位改由十六進位的數字來簡化,不過畢竟還是有 32 個數值,真的還是太長了! 畢竟 IPv4 也才 32 位元~而且設計成為 4 組十進位而已~IPv6 光是十六進位數值,就有 32 個,想到就頭疼了! 所以,IPv6 的位址是允許做一些簡化的寫法的!簡化寫法的規則說明如下:
如下所示,第一行為標準的 IPv6 的 IP 位址寫法,第二行則符合上述第 2 點,連續的 0 可以簡化,第三行則符合上述的第 3 點,超過一個以上的 :0000: 時, 可以使用 :: 來取代,但是只能保留一組,所以第三行右側的 :0:0 就不能繼續簡化了 (通常保留左側高位的數值)
就跟 IPv4 的 IP address 一樣具有區網的 netmask,IPv4 同樣也有自己的區網所需要指定的 Netmask,只是...這個 IPv6 的 netmask 就沒道理還要用 IP 吧?當然是直接使用 bit 來展示即可!一般來說,IPv6 的 netmask 通常使用 64bit 作為區域網路的劃分,不過就如 IPv4 的無等級 IP (CIDR) 一樣,你當然也能夠指定自己的 Netmask 囉。由於 IPv6 是以 16bit 為一個 IP 位址區段分隔,因此 netmask 也通常就是 16 的倍數,這樣才能夠定位在冒號的位置上!就跟 IPv4 以 8 為倍數一樣,比較好計算。底下以『 2001:0db8:: 』 這個網段來說明:
為了簡化區域網路內部的 IPv6 之 IP 位址設定,因此 IPv6 規劃的時候,有提出一個名為區域網路連結位址 (Link Local Address) 的 IPv6 位址設定方式!規劃的資料其實很簡單,就是:
因此最終會有 fe80::/64 這一段的區網來使用喔!讓我們來瞧瞧虛擬機器裡面,預設的 IPv6 位址長怎樣?
[root@localhost ~]# ip addr show .... 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff inet 192.168.10.52/24 brd 192.168.10.255 scope global dynamic noprefixroute enp1s0 valid_lft 2861sec preferred_lft 2861sec inet6 fe80::5054:ff:feed:63aa/64 scope link noprefixroute valid_lft forever preferred_lft forever
使用網路卡本身的區域網路連結位址時,在網址最後,得要使用『 %網卡名稱』的方式來處理, 否則應該會無法使用該 IPv6 的 IP 位址~我們來自己測試一下這個 IPv6 的位址能否自己 ping 到自己? 處理的方式如下:
[root@localhost ~]# ping -c 3 fe80::5054:ff:feed:63aa%enp1s0
PING fe80::5054:ff:feed:63aa%enp1s0(fe80::5054:ff:feed:63aa%enp1s0) 56 data bytes
64 bytes from fe80::5054:ff:feed:63aa%enp1s0: icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from fe80::5054:ff:feed:63aa%enp1s0: icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from fe80::5054:ff:feed:63aa%enp1s0: icmp_seq=3 ttl=64 time=0.045 ms
所以,你會看到所有自動產生的 IPv6 的 IP 位址都是 fe80 開頭的!這是由作業系統根據網卡卡號自動計算產生的喔! 再說一次,不能夠直接對外連網,只能在區域網路內部互相連結而已喔!
與 IPv4 的 private IP 類似,IPv6 也提供一段的 IP 位址來給區網使用,使用的區段為 FC00::/7,亦即開頭為 FC00:: ~ FDFF:: 之間的 IP 段落。 目前較常使用 FD00::/8 這一網段。
至於 public IP 則使用 2000::/3 (2000:00 ~ 3FFF::) 這一大段,與 IPv4 的 public IP 一樣,你的 IPv6 位址得要從你的 ISP 處取得, 才能夠順利的以 IPv6 的 IP 位址連上 Internet 的。那麼有沒有哪一段 Public IP 可作為測試的區段呢? 有的,那就是 2001:0db8::/32 這一大段 IP 位址可以提供給測試範本 (example) 使用,亦即是,你可以使用這一段 IP 位址來測試你的 IPv6 網路囉! 所以,基本上,大家在測試環境時,似乎大部分使用 2001:0db8::/32 來處置,倒不是使用 FD00::/8 來設定呢!
透過網路層的 IP 位址以及 IP 封包,順利的將包裹送到目標主機上頭去,接下來,這個封包要不要被接受? 這個封包要交給誰來處理?那就是傳送層的任務之一。從 圖 4.1.4-1 我們可以看到傳送層有兩個重點, 一個是連接導向的 TCP 封包,一個是非連接導向的 UDP 封包,這兩個封包很重要啊!資料能不能正確的被送達目的, 與這兩個封包有關喔!
TCP 封包被稱為可靠連接導向的封包,為什麼它可靠呢?這是因為 TCP 的表頭資料比較豐富!有比較多的檢測資訊在裡面。 相關的表頭有點像這樣:
4 bits | 6 bits | 6 bits | 8 bits | 8 bits |
Source Port | Destination Port | ||
Sequence Number | |||
Acknowledge Number | |||
Data Offset |
Reserved | Code | Window |
Checksum | Urgent Pointer | ||
Options | Padding | ||
Data |
我們只講比較有趣的項目,包括底下這幾個:
在上圖的 TCP 表頭資料中,我們最需要知道的就屬那 16 位元的 Source port 與 Destination port。由於是 16 位元,因此目標與來源埠口範圍在 0 ~ 65535 號 (2 的 16 次方)! 由於網路是雙向的,要達成連線的話得要伺服器與用戶端均提供了 IP 位址與埠口才行。 因此,我們常常將這個成對的資料稱之為 Socket Pair 了!
由於 IP 位址與埠口常常連在一起說明,因此網路定址常常使用『 IP:port 』來說明,例如想要連上鳥哥的網站時, 正確的鳥哥網站寫法應該是:『 linux.vbird.org:443 』才對!但是,不對啊!明明我們在瀏覽器上面輸入的網址應該只是:『 https://linux.vbird.org 』而已,並沒有輸入 port 號碼!這是因為大家都知道 https 需要連接到 port 443 的意思! 這種大家都熟知的埠口,就稱為 well-known port,這種埠口通常會設計在 0~1023 之間的號碼,而由於伺服器網路服務通常僅有 root 能喚醒,所以 0~1023 之間的埠口,就被我們稱為特權埠口(只有 root 可以喚醒使用)。而特權埠口與其服務名稱的對應,我們 Linux 通常寫在 /etc/services 檔案內喔!底下鳥哥列出幾個常見的 port number 與網路服務的對應:
連接埠口 | 服務名稱與內容 |
---|---|
20 | FTP-data,檔案傳輸協定所使用的主動資料傳輸埠口 |
21 | FTP,檔案傳輸協定的命令通道 |
22 | SSH,較為安全的遠端連線伺服器 |
23 | Telnet,早期的遠端連線伺服器軟體 |
25 | SMTP,簡單郵件傳遞協定,用在作為 mail server 的埠口 |
53 | DNS,用在作為名稱解析的領域名稱伺服器 |
80 | WWW,這個重要吧!就是全球資訊網伺服器 |
110 | POP3,郵件收信協定,辦公室用的收信軟體都是透過他 |
443 | https,有安全加密機制的WWW伺服器 |
TCP 被稱為可靠連接導向,其連線主要是透過許多機制來達成的,其中最重要的就是三向交握的功能。當然, TCP 傳送資料的機制非常複雜,有興趣的朋友請自行參考相關網路書籍。那麼如何藉由 TCP 的表頭來確認這個封包有實際被對方接收,並進一步與對方主機達成連線?我們以底下的圖示來作為說明:
圖示中 Server / Client 往下方的箭頭代表的是時間軸,要達成連線之前,需要通過三次確認的動作,也因此這個行為就被稱為三向交握 (Three-way handshake)。我們根據上圖的 A, B, C, D 四個階段來簡單說明一下:
UDP 的全名是:『User Datagram Protocol, 用戶資料流協定』,UDP 與 TCP 不一樣, UDP 不提供可靠的傳輸模式,因為他不是連線導向的一個機制,這是因為在 UDP 的傳送過程中,接受端在接受到封包之後,不會回覆回應封包 (ACK) 給發送端,所以封包並沒有像 TCP 封包有較為嚴密的檢查機制。至於 UDP 的表頭資料如下表所示:
16 bits | 16 bits |
Source Port | Destination Port |
Message Length | Checksum |
Data |
TCP 封包確實是比較可靠的,因為通過三向交握嘛!不過,也由於三向交握的緣故, TCP 封包的傳輸速度會較慢。至於 UDP 封包由於不需要確認對方是否有正確的收到資料 (射後不理),故表頭資料較少,所以 UDP 就可以在 Data 處填入更多的資料了。同時 UDP 比較適合需要即時反應的一些資料流,例如影像即時傳送軟體等,就可以使用這類的封包傳送。也就是說, UDP 傳輸協定並不考慮連線要求、連線終止與流量控制等特性,所以使用的時機是當資料的正確性不很重要的情況,例如網路攝影機!
從上面的解釋,我們大概理解了某些網路基礎,也大致知道了 IPv4 位址以及埠口號碼的意義等等。但是, 到底那是什麼東西?然後,聽人家說被值入木馬可能會被開後門?那前門在哪裡?而,這些網路參數 (IP address, Netmask, Gateway..) 在你的主機上面是如何取得的?就讓我們好好說一說。
我們大概知道網路基礎就是所謂的 OSI 七層協定裡面的 Layer 2, 3, 4 這三層,這三層的重點封包協定主要是 MAC, IP, TCP 與 UDP 等。 然後,這三層封包上面最重要的表頭資料,分別是網卡卡號、IP 位址、埠口號碼,而網卡卡號與硬體相關性較高,IP 位址與埠口號碼, 則是軟體設定來的!可以隨時修改。基本原理是這樣,那...到底什麼是什麼?能不能用小學生知道的語言來解釋?
相對於『軟體』與『硬體』來說,網卡卡號 (MAC address) 比較偏向硬體,基本上,網卡卡號應該是不變的。 那麼 IP 位址是我們可以透過軟體去設定調整的,因此 IP 位址當然是比較偏向軟體設定,是可調整的。所以,簡單的說:
所以,你就知道網卡卡號與 IP 位址的差異了!那 port 是什麼?現在幻想一下,你從你家走路到郵局 (MAC address),看到門牌號碼 (IP address) 之後,確定是該家郵局沒問題,然後進到郵局內部,看到很多的窗口 (port),每個窗口的服務都不一樣,有匯款的、有郵寄、有信用卡業務的等等 (well-known port)。 是的,你應該可以幻想成這樣:
但是,這些窗口不見得有啟用,因為某些窗口裡面沒有服務人員 (process/service 程序),有服務人員的, 這才是有啟用的埠口。
有個路人,偷偷跑到信用卡業務的窗口上,這時,信用卡窗口就打開了 (port open),但是實際的郵局人員並不認識這個路人, 這就是所謂的被值入後門程式,值入這個後門程式就被啟動了一個埠口。那怎麼關閉這個錯誤的人啟用的埠口呢? 很簡單啊!把這個人趕走 (kill -9) 就好!也就是說,啟動埠口與窗口本身無關,是『誰』在這個窗口的位置提供服務, 這才是重點!所以我們才會說,將軟體 (尤其是伺服器軟體) 升級到最新,更新到沒有錯誤的版本上,那在窗口那個位置上的人, 就比較不容易被攻陷啊~這也就是說:
等等!不對啊!我們上面談到的都是 TCP/IP 的連網方式,也就是說,你得要知道 IP 位址才能夠連接到 server 來使用對方的服務。 但是,你實際使用網際網路連上 Internet 的時候,真的有在網址列輸入過 IP 位址嘛?沒有吧!你應該都是輸入類似: https://linux.vbird.org 這樣的主機名稱的方式吧!這代表什麼呢?應該是有一個特別的服務會提供你將主機名稱轉換成為 IP 位址的方式才對! 這就是非常重要的 DNS 系統!
你的網路參數裡面一定會有一個以上的 DNS 伺服器 IP 位址的設定,這個 DNS 伺服器 IP 位址就會在你需要將主機名稱轉成 IP 位址時, 主動的幫你進行轉譯,如此一來,你只需要輸入大家比較容易記憶的英文主機名稱,這個 DNS 服務,就會主動幫你轉成 IP 位址, 然後你使用的軟體,就可以直接連接到該 IP 位址上~簡單處理完畢!我們確實用 TCP/IP 上網,但是那個 IP 位址使用的是 DNS 服務! 更多的 DNS 說明,我們會在第三部份網際網路服務裡面談到,目前你只需要知道,DNS 伺服器的目的就是在讓你可以使用主機名稱代替 IP 位址!
從上面的所有說明當中,我們知道一部主機要能夠使用網路,必須要有 IP 位址,而 IP 位址的設定當中,就必須要有 IP address, Network IP address, Broadcast address, Netmask 等參數,此外,還需要考慮到路由裡面的 Default Gateway 才能夠正確的將非同網域的封包給他傳送出去。另外,考慮到主機名稱與 IP 位址的對應,所以你還必須要給予系統一個 DNS 伺服器的 IP 才行~ 所以說,一組合理的網路設定需要哪些資料呢?
必要的是前面三項,最後一項只是讓你在登入系統的時候,可以有比較清楚且有意義的主機名稱,避免你登入到錯誤的系統囉!
上面這三個數值要怎麼取得呢?意思是,你的主機是怎麼拿到這三個數值的?基本上可以這樣取得與設定:
不管是使用上面哪種方式取得的網路參數,你的 IP 位址都只有所謂的『 Public 與 Private IP 』而已! 而其他什麼浮動式、固定制、動態式等等有的沒有的,就只是告訴你這個 IP 位址取得的方式而已。 舉例來說,台灣地區光纖撥接後取得的 IP 位址通常是 public IP,但是鳥哥曾接到香港網友的來信,他們撥接後,取得的 IP 位址是 Private 呢!所以導致無法架設網站喔!
另外,目前我們手邊應該都有很多平板、手機、筆電等可攜式設備,而目前的無線網路應用非常的廣泛!所以, 我們的電腦系統也經常使用無線 AP (Access Point) 進行網路連線。無線 AP 基本上就是一部通訊閘, 只是這個通訊閘透過的是無線的 wifi 技術來達成乙太網路連線而已!基本上無線 AP 大概就是使用 DHCP 自動取得網路參數的方式提供用戶網路囉!