伺服器架設篇 - RockyLinux 9

第四章、網路基礎學習

網路基礎真的很重要!但是,資料太多,好雜啊!慢慢看底下的資料,真的是挺重要的!

最近更新時間: 2023/08/09

網路基礎原本就是很難理解的東西!而且資料還異常的多!包括 OSI 七層協定、TCP/IP、IPv4 表頭資料、IPv6 位址理解、 路由概念、TCP 與 UDP 的埠口意義等!光是解釋這些東西,腦袋就炸裂了...不過不要緊,這一小節你隨時都可以回來慢慢參考, 最重要的是 4.5 小節,將網卡卡號、IP位址、埠口號碼、埠口啟動等,連結到地理位置、門牌號碼、服務窗口、服務人員等概念, 並且懂得上網需要 IP/Netmask, Gateway, DNS 等參數,這樣就很棒了!

4.1、網路相關術語簡介

現在的人們都離不開網路,尤其是智慧型手機熱門應用之後,年輕的世代更是一出生就跟著網路活動了! 但是,我們不要只是『會用』而已啊,資訊人員還是得要了解這些網路底層的物理連接方式,以及網路軟體相關概念, 這樣未來如果網路出問題,或者是想要從事網路資訊行業,才不會因為一些小細節沒注意到,就導致網路連接的崩潰啊! 所以,底下我們先來介紹一下在區域網路裡面常見的連結方式與相關硬體,然後介紹一下網路架構 (OSI 七層堆疊的概念), 以及目前應用的 TCP/IP 協定!了解一下就很棒了!不用深入研究更內部的理論啦!

4.1.1、網路組成元件

一般來說,在企業內部或者是學校計中單位的電腦教室內,我們透過一個交換器 (switch) 為中心, 以實體網路線將所有設備接在一起。有時候還會額外提供一台無線存取點 (Access Point, AP), 提供智慧型手機或筆記型電腦連線。然後這個交換器會連結到具有兩個網路界面以上的路由器或 Linux 防火牆, 再透過電信業者 (Internet Service Provider, ISP) 的協助,連接到網際網路上。相關的連線圖示有點像底下這樣:

網路連接示意圖
圖 4.1.1-1、區域網路內電腦與網路設備連接示意圖

上述的連接網路,目前主流都是使用乙太網路 (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 標準。 後來大家都可以透過這個標準界面來開發自己的硬體囉!

老實說,現在很多非資訊背景的家庭,都不用筆電了,當然也沒有桌機~靠手機的 4G/5G 以及未來的 6G 網路, 就完成一切的作業活動。所以,上述的環境,未來漸漸的只會出現在企業辦公環境或學校教學環境中。另外, 要不是從 2020 年以來受新冠肺炎的影響,某幾個學期遠距教學成為常態,這才造成筆電再次流行。 否則,上面的連線,大家很難在一般家庭看到了。
對於資訊人員來說,只會用螢幕觸控輸入法,其實很危險!畢竟在生產工作 (寫 code、系統維護等) 大多還是使用伺服器、工作站等, 還是需要鍵盤輸入!因此,如果要走資訊這一塊,建議還是趕緊熟悉鍵盤打字方式!

上圖 4.1.1-1 是一種所謂的『星形連線』拓樸 (topology),因為交換器就像是星星一樣,透過網路線如同光線發散到各個節點上, 所以稱為星形連線。目前網路都是一堆大大小小的星形連線所組合起來的啦!至於星形連線裡面,連結的元件大概是:

  • 節點 (node):節點主要是具有網路位址 (IP address) 的設備之稱, 因此上面圖示中的一般 PC、網路伺服器、 路由器/防火牆、網路印表機等,個別都可以稱為一個 node。中間那個交換器 (swich/hub) 是不是節點呢? 基本上,基礎交換器是不具備 IP 的,所以不算節點。
  • 網路伺服器 (server):就網路連線的方向來說,提供資料以『回應』給用戶的主機,都可以被稱為是一部伺服器。 舉例來說,google 是個 WWW 伺服器,鳥站也是個網頁伺服器。當然啦,伺服器上面當然就得要有『服務』以及相關的『資料』提供才行!
  • 工作站 (workstation) 或用戶端 (client):任何可以在電腦網路輸入的設備都可以是工作站,若以連線發起的方向來說, 主動發起連線去『要求』資料的,就可以稱為是用戶端 (client)。舉例來說,一般 PC 打開瀏覽器對 google 要求新聞資料,那一般 PC 就是用戶端。
  • 路由器 (router) 或通訊閘 (gateway):具有兩個以上的網路介面,可以連接兩個以上不同的網段的設備, 例如 IP 分享器就是一個常見的路由器設備。鳥哥更喜歡使用省電的 Linux 伺服器來作為防火牆或路由器! (你會發現到,上圖的節點裝置中,僅有『路由器/通訊閘』以及『無線AP』才具有兩條以上網路線連接,其他都只有一條線而已。 這就代表這兩個節點具有兩個以上的網路界面喔)
  • 無線 AP (Access point):無線 AP 也是有兩個界面,其實就跟上面的路由器相同功能,可以溝通兩個不同的界面進行傳輸。 其中一個界面是用有線網路連接到上層路由器,另一個界面則是透過無線基地台功能,提供用戶端 (智慧型手機、筆記型電腦) 以無線網卡連接進來。
  • 網路卡 (Network Interface Card, NIC):內建或者是外插在主機上面的一個設備,主要提供網路連線的卡片, 目前大都使用具有 RJ-45 接頭的乙太網路卡 (稍後解釋),在超過 25Gbps 以上的網路媒體,則大部分使用光纖接頭的乙太網路。一般 node 上都具有一個以上的網路卡,以達成網路連線的功能。另外,臨時需要無線網路時,也可以透過 USB 界面的無線網卡來進行設定!
  • LAN 與 WAN

在你接觸的無線 AP 當中,你應該經常會看到兩種埠口的名稱 (IP 分享器後面的接孔),一個是 LAN 一個是 WAN,這兩個東西是啥鬼? 基本上,原本的定義是這樣的:

  • 區域網路 (Local Area Network, LAN):

    節點之間的傳輸距離較近,例如一棟大樓內,或一個學校的校區內。可以使用較為昂貴的連線材料, 例如光纖或是高品質網路線 (CAT 6) 等。網路速度較快,連線品質較佳且可靠,因此可應用於科學運算的叢集式系統、 分散式系統、雲端負荷分擔系統等。

  • 廣域網路 (Wide Area Network, WAN):

    傳輸距離較遠,例如城市與城市之間的距離,因此使用的連線媒體需要較為便宜的設備,例如經常使用的電話線就是一例。 由於線材品質較差,因此網路速度較慢且可靠性較低一些,網路應用方面大多為類似 email, FTP, WWW 瀏覽等功能。

雖說是如此,但是,目前 (2023) 家庭網路撥接速度已經可以來到 1Gpbs/600Mbps (下載/上傳速度), 所以,定義上面雖然說 WAN 使用的連線媒體較為便宜,不過以目前的現有環境來看,事實上速度與媒體都有一定程度的提昇了! 所以,老實說,現在的定義喔,可以說,內部環境就說是 LAN,連到 internet 的那個連線口就簡稱為 WAN 就好了! 不用太鑽牛角尖啦!

4.1.2、網路線水晶頭 (RJ-45/8P8C)、資訊座與乙太網路

前一小節談到,所有的節點與拓樸中央的交換器,都是透過網路線連接的。網路線總有插頭與插孔, 網路線插頭我們通常稱為水晶頭,因為通常這個插頭是透明塑膠材質,亮晶晶啊~所以稱為水晶頭。 比較專業的說法,則是 RJ-45 (Registered Jack) 接頭或 8P8C 線材 (8 position 8 contact)。 相關的圖示有點像底下這樣:

RJ-45水晶頭
圖 4.1.2-1、RJ-45水晶頭示意圖,畫面中 8 芯號碼為從左到右是 1 至 8 號

在線材裡面的 8 芯是有顏色分別的,每個編號都有對應的顏色,根據顏色的定義,主要有兩種線路配置,分別是 568A, 568B。 目前的主流大致上都以 568B 為主,所以,未來你只要知道 568B 就好了!568A 自動略過吧!

RJ-45 水晶頭 8 芯顏色的排列順序
接頭名稱\蕊線順序123 45678
568A白綠白橙白藍白棕
568B白橙白綠白藍白棕

早期的 cat5 網路線,雖然是 8P8C 了,但是因為速度只到 100Mbps,事實上僅有 4P4C,亦即僅有兩對共四條芯在進行接收與傳輸而已。 不過,從 1000Mbps 的速度之後,所有 8 芯都用上了!因此,每一個線路都很重要!如果自己壓製好了水晶頭,一定要用測線器分析過! 避免訊號不良,導致網路降速或者是不穩定喔!

如果距離比較遠,一般建議施做資訊座會比較好!資訊座除了比較好壓製之外,它也比較不容易損壞,而且還能夠搭配桌上盒或牆壁上的插孔, 作為一個固定的插座。一般桌機或筆電,則直接拿市面上壓製好的網路線來連接即可。資訊座相關的圖示以及與網路線的壓製狀況, 有點像底下這樣:

RJ-45資訊座 RJ-45資訊座
圖 4.1.2-2、RJ-45資訊座示意圖(圖片來源:https://www.commscope.com/globalassets/digizuite/55287-eng-cd-1375055-n-pdf.pdf)
如果是某一個點到某一個點的網路線路,建議使用資訊座來佈線,同樣也是依據 568B 的接頭樣式壓製資訊座即可。 自製水晶頭大多用在應急的環境中而已!不過,雖然沒有很建議自己壓製水晶頭,但是,這個技術還是得要學會才好!
  • 乙太網路的速度與標準

乙太網路的流行主要是它成為國際公認的標準所致。早先 IEEE 所制訂的乙太網路標準為 802.3 的 IEEE 10BASE5,這個標準主要的定義是:『10 代表傳輸速度為 10Mbps,BASE 表示採用基頻信號來進行傳輸,至於 5 則是指每個網路節點之間最長可達 500 公尺。』目前的主流則是 1000BASE-T,高階一點則會使用 10GBASE-T, 使用的就是 8P8C 的線材,速度在 1Gbit/s 以及 10Gbit/s 。不同的線材可到達的標準不同喔!

網路線的等級與網路速度的對照
名稱速度搭配的網路線等級
Ethernet10Mbps -
Fast Ethernet100MbpsCat 5
1G Ethernet1GbpsCat 5e / Cat 6
10G Ethernet10GbpsCat 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 以上等級的線材喔!

在 2023 年的現在, 10G 的乙太網路其實還挺常見的,但是,10G 的 switch 還是稍貴了,而所有的網路連線,又以最慢的那個媒體為限制, 並不是平均值~但是,誰知道哪一天 10G 網路媒體會突然變便宜呢!所以,為了向未來環境靠攏,建議新的佈線,還是使用好一點的線材啦! 未來只要換上新的網路媒體,你的網路速度就可能會提昇 10 倍了耶。
  • 乙太網路向下相容的狀態與相關機制

再次重申喔,兩個節點之間的網路傳輸速度,是以通過的所有元件中,最慢的那個網路媒體所限制的! 因此,你買的新的主機,裡面的網卡速度高達 10Gbps 好了,但是家用的 switch port 都是 Gbps 時,那麼所有的速度就會是 Gbps 囉! 除了這個之外,事實上,乙太網路媒體通常還會有這些機制喔:

  • 網路速度自動協商機制 (auto-gegotiation)

    那麼你的網路媒體怎麼知道最低限制的速度是網路線材?還是網路卡呢?因為目前幾乎所有的乙太網路媒體都具有一個很特別的機制, 稱為自動協商機制 (auto negotiation),這個機制會在兩個 node 之間傳輸時,自動協商最佳可接受的速度來進行傳輸!如果 1Gbps 不能動,那就自動降一級,直到可以接受的那一級速度為止。

  • 全雙工與半雙工 (full-duplext & half-duplex)

    另外,網路線 8 芯裡面,如果傳送與接收可以同時進行,那就稱為全雙工 (full-duplex), 如果同一時間只能進行傳輸或只能進行接收,無法同時進行,那就稱為半雙工 (half-duplex)。如果網路頻寬為 1Gbps 而有全雙工的情境下, 那總頻寬 (上傳+下載) 就可以達到 2Gbps 了!但是,單一方向最大就是 1Gbps 喔!這個要注意! 此外,中心連接的媒體要是 switch 才能達到全雙工,共享媒體的 hub 是無法達到全雙工的!

  • 自動分辨網路線跳線或平行線 (Auto MDI/MDIX)

    以前的網路媒體當中, switch 與 PC 之間的接法並不相同,因此需要網路線兩頭分別使用 568A 及 568B 進行跳接, 這種接法的網路線被稱為『跳線』。這樣很麻煩啊~因此在 1Gbps 之後的乙太網路媒體,已經加上了 auto MDI 或 MDIX 機制, 這種機制會自動判斷線路形式而進行跳接,所以,目前網路線僅須兩端均為 568B 的平行線即可!

  • 在 Linux 下,使用 ethtool 觀察實體網卡支援的機制

我們可以透過 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 囉!

目前,大部分的 Linux distribution 的網路卡設置,大多會針對 1Gbps 的網路卡進行優化,所以,除非有特殊需求, 否則,不太需要進行額外的參數修改。但,如果是 10Gbps 以上的網路,可能會有一些優化動作需要進行! 所以, ethtool 倒是很重要的喔!此外,上述的設定在下次開機並不會生效!除非寫入 /etc/rc.d/rc.local 或自訂的 systemctl 服務中。

4.1.3、OSI 七層協定

就如同語言一樣,如果沒有一致的標準,那麼大家各講各的,誰也聽不懂誰的語言~那就無法溝通了!網路世界也一樣, 除了上述的硬體標準 (乙太網路) 之外, 還有所謂的網路 OSI 七層協定 (Open System Interconnection, OSI) 的資料, 目的在指導作業系統想要加入網路時,所需要撰寫的網路連線程式模型。這個 OSI 七層協定只是在提出一個加入網路所需要的模型與概念, 只要能夠參考 OSI 七層協定的規範所設計出來的作業系統,理論上就可以加入以 OSI 七層協定為共同標準的網路世界之意。 (有點像目前的強勢語言還是英文,所以出國在外,大家都用英文溝通是一樣的意思。)

  • 分七層的堆疊?目的是什麼?

網路不就是網路,為什麼要分為 7 層呢?除了每一層的定義清晰,設計比較方便之外,分不同層級來設計時, debug 也比較方便的。 如果你曾經設計過程式,應該就會知道,如果將全部的資料寫在主程式,那未來這個主程式越來越大的時候,將很難維護! 同時,如果有同事想要協助你程式的維護與開發,那將會造成非常大的困擾...每個人寫 code 的習慣不同啊~

所以,將主程式拆開成數個函數,當要使用的時候才去呼叫!每個函數都有特定的輸入/輸出參數, 如此一來,要使用的時候,填入固定的參數,而你也可以預期該函數會輸出什麼資料!這樣就很容易維護! 同事如果想要幫忙某個寫的比較不這麼好的函數,那他只要去讀該函數內容即可,不用完整的看完所有主程式!真是相當愉快! 這就是分層堆疊的好處之一!

OSI七層堆疊示意
圖 4.1.3-1、OSI 網路七層堆疊示意圖

如上圖所示,就是 OSI 七層堆疊的示意圖。依據定義來說,越接近硬體的階層為底層 (layer 1),越接近應用程式的則是高層 (layer 7)。不論是接收端還是發送端,每個一階層只認識對方的同一階層資料。而整個傳送的過程就好像人們在玩整人遊戲一般, 我們透過應用程式將資料放入第七層的包裹,再將第七層的包裹放到第六層的包裹內,依序一直放到第一層的最大的包裹內,然後傳送出去給接收端。 接收端的主機就得由第一個包裹開始,依序將每個包裹拆開,然後一個一個交給對應負責的階層來視察!這就是整人遊戲...喔!是 OSI 七層協定在階層定義方面需要注意的特色。

不論是寫程式、寫網頁、寫 PHP 等等,會持續用到的部份,請盡量使用副程式或函數來處理,要用到的時候就呼叫, 這樣好處很多!因為除了你不用改寫之外,未來這段程式碼如果有優化,任何呼叫到這段程式碼的其他程式,都可以享受到優化後的成果! 而且維護也會變得很方便!
  • OSI 七層堆疊的實際分層名稱與功能

既然說是包裹,那我們都知道,包裹封面都會有個重要的資訊,這些資訊包括有來自哪裡、要去哪裡、接收者是誰等等, 而包裹裡面才是真正的資料。同樣的,在七層協定中,每層都會有自己獨特的表頭資料 (header),告知對方這裡面的資訊是什麼, 而真正的資料就附在後頭囉!我們可以使用如下的圖示來表示這七層每一層的名字,以及資料是如何放置到每一層的包裹內:

OSI七層堆疊示意
圖 4.1.3-2、OSI 七層分層的名稱示意圖

OSI 七層協定的七層,從底層往上層的名稱如上圖所示。當應用程式,例如瀏覽器或者是 WWW 伺服器軟體將資料收集完畢之後, 就會將資料塞入應用層,應用層會在表頭記載該資料的特性,然後再往底下塞給表現層,表現層又寫一個自己的表頭資料,再往下塞給會談層, 這樣一層一層的往下塞,直到最底層的實體層,轉成電子訊號之後,就交給作業系統,然後提交給網路卡進行傳送。 那接收端的系統從網卡接收到這些訊號之後,再由實體層、鍊結層一個一個的拆解,最終再由應用層將資料傳輸給應用程式。 至於每一層的名稱與功能,簡述如下,看看就好。

OSI 七層協定的分層負責內容解釋
分層負責內容
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 這個玩意兒吧!

  • Layer2, Layer3, Layer4 的重要封包表頭資料與防火牆

我們經常講到『網路基礎』或者是『防火牆』或者是『第二層交換器』或『第三層交換器』等網路專業術語中,會用到的層級概念, 都是使用 OSI 七層協定的規範!而所謂的『封包過濾式防火牆』主要就是在控制第 2, 3, 4 層的封包過濾, 而『網路基礎』的概念,則也是著重在 2, 3, 4 層的介紹與使用的!所以,你一定要知道這七層協定以及各協定的表頭資料喔! 當然,只要知道 layer 2, 3, 4 就是了!

那麼 Layer 2, 3, 4 裡面跟防火牆有關的封包與表頭資料,各別有什麼呢?

  • Layer 2:主要是 MAC 訊框 (frame),表頭資料主要為 MAC 位址,習慣稱為網卡卡號
  • Layer 3:主要是 IP 封包 (packet),表頭資料主要是 IP 位址,目前有 IPv4 與 IPv6 兩種 IP 協定
  • Layer 4:主要是 TCP 或 UDP 封包,兩者的表頭資料都有 port 號碼,基本號碼可達 65535 號。

另外,網路是雙向的, client 會向 server 要求資料,而 server 自然就會回應資料給 client, 所以,防火牆與相關的網路路由規劃,都需要注意到雙向傳輸這件事喔!所以上述的 MAC 位址、IP 位址、port 號碼, 都有 server 端與 client 端的紀錄喔!如下圖所示,下圖為第二、三、四層的表頭資料最重要的兩個數據而已! 並不是所有的表頭資料喔!

網路基礎的表頭資料
圖 4.1.3-3、網路基礎 (layer2, 3, 4) 的表頭資料示意圖

所以,所謂的『第二層交換器』,其主要針對的設備為網路卡卡號,比較偏向於硬體方面的設定。而防火牆管理第二層時, 主要也是透過管理主機的網路卡卡號位址!所謂的『第三層交換器』代表該交換器基本上有 IP 位址, 而且比較偏向管理軟體封包,而不只是針對硬體而已,當然價格就更高檔。而防火牆針對第三層網路層, 主要就是針對作業系統的 IP 位址進行限制。第四層傳輸層,用在防火牆的規範中,就是針對軟體連接到某個應用程式來限制, 這時就是針對服務啟動在某個埠口 (port number) 來管理!這樣,對 layer 2, 3, 4 有沒有稍微清楚些?

4.1.4、TCP/IP 網際網路協定

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 七層協定簡化而來,那麼這兩者之間有沒有什麼相關性呢?它們的相關性可以圖示如下, 同時這裡也列出目前在這架構底下常見的通訊協定、封包格式與相關標準:

OSI 與 TCP/IP
圖 4.1.4-1、OSI 與 TCP/IP 的相關性示意圖

TCP/IP 將 OSI 最上層的三層結合成為一個應用層,中間的傳輸、網路層則保留,最底層的硬體與鍊結層結合成為鍊結層,所以僅有 4 層而已。 由於應用層偏向於應用程式的呼叫使用,因此基礎網路大概就是底下三層,其實對應起來,也就是 OSI 七層協定的 layer 2, 3, 4 啦!

如同前幾個小節提到的,在 TCP/IP 當中,鍊結層最重要的資料其實是 layer 2 的 MAC 訊框資料,而網路層最重要的其實是 IP 封包 (packet) 與表頭資料,傳輸層有兩種重要的封包,一個是可靠連線的 TCP 封包,一個是非連接導向的 UDP 封包。 至於應用層的相關封包協定,則大多與網路服務有關!那已經是應用程式使用的層級,不算是基礎網路概念。 不過比較重要的網路服務協定你還是得要注意一下!尤其是各個服務預設會啟用在某些特定的埠口號碼!

4.2、Layer 2 的相關協定

OSI 七層協定的第二層是所謂的『資料鏈結層』,這一層裡面最重要的是一個名為 Media Access Control, MAC 的包裹, 這個包裹主要跟硬體的資源比較有關系,因此,被稱為訊框 (frame) 而不是軟體包裹而來的封包 (packet)。不過, 其實就是名稱不太一樣就是了,你還是可以將它想成是個包裹啦!

那這個訊框的表頭資料裡面有什麼?還有,我們前面談到的網路卡卡號又該如何查看? 以及資料如何在網路卡之間傳遞?這就是 Layer 2 相關的資料了!

4.2.1、MAC 的封裝格式與 MTU

Layer 2 最重要的訊框 (frame) 就是 MAC 訊框,這個訊框上面有兩個很重要的資料,就是目標與來源的網卡卡號, 因此我們又簡稱網卡卡號為 MAC 位址而已。簡單的說,你可以把 MAC 訊框想成是一個在網路線上面傳遞的包裹, 而這個包裹是整個網路硬體上面傳送資料的最小單位了。也就是說,網路線可想成是一條『一次僅可通過一個人』的獨木橋, 而 MAC 訊框就是在這個獨木橋上面動的人啦!接下來,來看一看 MAC 這個訊框的內容吧!

乙太網路訊框表頭資料
圖 4.2.1-1、乙太網路 MAC 訊框表頭資料示意圖

上圖中的目的位址與來源位址指的就是網卡卡號 (hardware address, 硬體位址),每一張網卡都有一個獨一無二的卡號, 那個卡號的目的就在這個訊框的表頭資料使用到啦!硬體位址最小由 00:00:00:00:00:00 到 FF:FF:FF:FF:FF:FF (16 進位法,共 12 個值), 這 6 bytes 當中,前 3bytes 為廠商的代碼,後 3bytes 則是該廠商自行設定的裝置碼了。

還記得 nmap 這個指令嘛?用 nmap 去掃描自己的區網主機群的時候,nmap 會順便告訴你該主機可能是哪個廠牌, 就是根據 MAC 位址前三個 bytes 的分析啦!另外,雖然網路卡的 MAC 位址可以透過 ip 指令偽裝與修改, 但是很不建議這樣做喔!
  • 為什麼資料量在 46bytes 到 1500bytes 呢?

早期訊框內的資料內容最大僅能到 1500bytes 而已,近期則可能可以放大到 9000bytes 左右。但是,為何需要規範最小資料量為 46byes 呢? 這是由於 CSMA/CD (稍後說明) 機制所算出來的!在這個機制上面可算出若要偵測碰撞,則訊框總資料量最小得要有 64bytes , 那再扣除目的位址、來源位址、檢查碼 (前導碼不算) 後,就可得到資料量最小得要有 46bytes 了!也就是說,如果妳要傳輸的資料小於 46byes ,那我們的系統會主動的填上一些填充碼,以補齊至少 46bytes 的容量才行!這都是 TCP/IP 網路功能自動處理, 你不用理會的!

  • MTU (Maximum Transmission Unit) 最大傳輸單位

通過上面 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 喔!

MTU 真的不能亂改!鳥哥許多環工模式的運算系統,都沒有對外網路,因此內部喜歡使用 10G 網卡搭配 9K 的 MTU 來設計! 但是,使用了華碩 10G 的網卡,沿用了 9K MTU 的設計後,雖然使用 ethtool 看起來是 10G 的連網速度,但是實際使用 NFS 檔案系統操作時,檔案傳輸速度竟然掉到 100Mbps 而已...嚇死我了!改回 1500 的 MTU 設計,立刻恢復正常,大約回到 6G~7Gbps 的頻寬使用率。 所以說,要變更網路參數時,在變更前/後,最好都使用測試方式 (第二章後面談到的內容) 來測試效能,比較能夠有依據的反應你的調整是否有效。
  • 使用 ifconfig, ip link 等方式查看/修改網卡卡號 (MAC address) 與 MTU

查看網卡卡號也是挺容易的,好幾個指令功能可以處理。我們來看看簡單的 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 這個指令的配合!這邊只是先行測試而已!

4.2.2、乙太網路的 CSMA/CD

了解了 MAC 訊框與其表頭資料之後,接下來讓我們了解一下,那麼這個 MAC 訊框的包裹,是怎麼在主機之間互相傳送的呢? 基本上,乙太網路的 MAC 訊框,主要是透過 CSMA/CD (Carrier Sense Multiple Access with Collision Detection) 的方式進行傳送的! 這個 CSMA/CD 是 IEEE 802.3 的標準,整體流程我們使用底下的圖示來進行說明:

CSMA/CD 圖示說明
圖 4.2.2-1、CSMA/CD連線示意圖,由 A 發送資料給 D 時,注意箭頭方向

集線器是一種網路共享媒體,什麼是網路共享媒體啊?想像一下上述的環境就像一個十字路口,而集線器就是那個路口! 這個路口一次只允許一輛車通過,如果兩輛車同時使用這個路口,那麼就會發生碰撞的車禍事件啊!那就是所謂的共享媒體。 也就是說,網路共享媒體在單一時間點內, 僅能被一部主機所使用。

理解了共享媒體的意義後,再來,我們就得要討論,那麼乙太網路的網卡之間是如何傳輸的呢?我們以上圖中的 A 網卡要發資料給 D 網卡為例好了,簡單的說,CSMA/CD 搭配上述的環境,它的傳輸情況需要有以下的流程:(A 所發送的訊框,MAC 的表頭資料中, 來源卡號為 A 的卡號,目標卡號為 D 的卡號)

  • 監聽媒體使用情況 (Carrier Sense, CS):

    A 主機要發送 MAC 訊框前,需要先對網路媒體進行監聽,確認沒有人在使用後,才能夠發送出訊框

  • 多點傳輸/接收 (Multiple Access, MA):

    A 主機所送出的 MAC 訊框會被集線器複製一份,然後以廣播的方式傳送給所有連接到此集線器的主機!也就是說,A 所送出的資料, B, C, D 三部電腦都能夠接收的到!但由於目標是 D 主機,因此 B 與 C 會將此訊框資料丟棄,而 D 則會抓下來處理;

  • 碰撞偵測 (Collision Detection):

    該訊框資料附有檢測能力,若其他主機例如 B 電腦也剛好在同時間發送訊框資料時,那麼 A 與 B 送出的資料碰撞在一塊 (出車禍), 此時這些訊框就是損毀,那麼 A 與 B 就會各自隨機等待一個時間, 然後重新透過第一步再傳送一次該訊框資料。

強者我同事蔡董大大說了一個非常有趣的 CSMA/CD 的解釋~所謂的 CSMA/CD ,就好像鄉下人騎摩托車過馬路十字路口, 過馬路前先看一下 (CS) ,沒人用的話,就直接過去了 (MA),如果有人在用,那就等一下。萬一大家都覺得你會讓我, 所以都衝過去,但是撞到了?那就把摩托車都牽回來,等待一段時間再衝過去 (CD)...好像很傳神!不用管有沒有紅綠燈...
  • CSMA/CD 透過共享媒體所產生的問題:

透過上述的 CSMA/CD 方式,我們就可以很輕鬆的將 MAC 訊框這個包裹,在區域網路內,透過共享媒體直接傳輸! 但是,這個情境有點問題呢!有什麼問題呢?我們輕鬆的說一說好了。

  • 網路忙碌時,集線器燈號閃個不停,但我的主機明明沒有使用網路:

    透過上述的流程我們會知道,不管哪一部主機發送出訊框,所有的電腦都會接收到!因為集線器會複製一份該資料給所有電腦。 因此,雖然只有一部主機在對外連線,但是在集線器上面的所有電腦燈號就都會閃個不停!大家都瘋狂收到該 MAC 訊框資料喔!

  • 我的電腦明明沒有被入侵,為何我的資料會被隔壁的電腦竊取:

    透過上述的流程,我們只要在 C 電腦上面安裝一套監聽軟體,這套軟體將原本要丟棄的訊框資料捉下來分析,並且加以重組, 就能夠知道原本 A 所送出的訊息了。這也是為什麼我們都建議重要資料在網際網路上面得要『加密』後再傳輸!看不懂嘛?沒關係, 我們來想個人間類似的情境好了。假設你在教室上課,老師正在講一些政治八卦,旁邊路過的同學覺得很有趣,但是他不想進入教室, 所以就拿錄音筆在教室外面錄音。此時,教室內的老師、同學都不會知道有人錄音走了這些資料 (沒人被入侵), 但是上課的內容都被錄音竊取了(資料被竊取)!這樣的意思!

  • 既然共享媒體只有一個主機可以使用,為何大家可以同時上網:

    這個問題就有趣了,既然共享媒體一次只能被一個主機所使用,那麼萬一我傳輸 100MB 的檔案,集線器就得被我使用 80 秒 (以 10Mbps 傳輸時),在這期間其他人都不可以使用嗎?不是的,由於標準的訊框資料在網路卡與其他乙太網路媒體一次只能傳輸 1500bytes,因此:

    • 我的 100MB 檔案就得要拆成多個小資料包,然後一個一個的傳送,
    • 每個資料包傳送前都要經過 CSMA/CD 的機制。

    所以,這個集線器的使用權是大家搶著用的!即使只有一部主機在使用網路媒體時,那麼這部主機在發送每個封包間, 也都是需要等待一段時間的 (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 秒的意思!

  • Layer 3 的 ARP 協定找尋目標 MAC 訊框位址

等等,上面的 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 位址。

arp 設定靜態 MAC 位址對應,在某些狀況底下可能很有用,例如在某些 proxy 的情況下。除此之外, 大部分的情況下,設定靜態 MAC 並不是好事...如果設定錯誤,該部主機你永遠都連不上了...

4.2.3、hub 與 switch

剛剛我們上面提到了,當一個很忙碌的網路在運作時,集線器 (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,那就傷腦筋了!

switch 運作方式
圖 4.2.3-1、交換器每個埠口的頻寬使用示意圖
  • 訊號衰減的問題

另外,在佈線的時候你也需要注意,一般來說,當你的網路線拉的線段太長,然後水晶頭壓製的不夠好,這個時候, 電子訊號由於衰減的關係,可能會造成連線品質不良,因此網路情況就會時通時不通~一般來說,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 以上等級的網路線,就買工廠製作的線材, 如果要自己壓製,請盡量使用資訊插座吧!

說到壓製水晶頭,鳥哥是老派的老人家,一直以為網路水晶頭只有一種格式,沒想到目前有直接穿透式的水晶頭格式,大家可以使用 google 找『RJ-45 穿透式』關鍵字,就會知道鳥哥在說什麼。這種穿透式的水晶頭真的很好壓製,只是據說裸露的銅線很容易由於風化而生鏽, 導致訊號不佳。不過...自己壓製的水晶頭能用個幾年年也 OK 了!好壓製就好!用這種水晶頭來讓學生體驗壓製網路線, 成功率大大提昇!同學們有自信多了!哈哈!

4.3、Layer 3 的相關協定

我們現在知道要有網路的話,必須要有網路相關的硬體,而目前最常見的網路硬體介面為乙太網路,包括網路線、網路卡、Hub/Switch 等等。 而乙太網路上面的傳輸使用網路卡卡號為基準的 MAC 訊框,配合 CSMA/CD 的標準來傳送訊框,這就是硬體部分。 在軟體部分,我們知道 Internet 其實就是 TCP/IP 這個通訊協定的通稱,Internet 是由 InterNIC 所統一管理的, 但其實他僅是負責分配 Internet 上面的 IP 以及提供相關的 TCP/IP 技術文件而已。不過 Internet 最重要的就是 IP 協定/位址啊!所以, 這個小節就讓我們來講講網路層的 IP 與路由吧!

4.3.1、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
圖 4.3.1-1、IPv4 封包的表頭資料

在上面的圖示中有個地方要注意,那就是『每一行所佔用的位元數為 32 bits』。相關的表頭資料可以參考許多網路文件, 鳥哥這邊僅介紹我們比較有興趣的部份:

  • Time To Live(TTL, 存活時間)

    表示這個 IP 封包的存活時間,範圍為 0-255。當這個 IP 封包每通過一個路由器時,TTL 就會減一,當 TTL 為 0 時,這個封包將會被直接丟棄,因為代表幾乎找不到目標 IP 位址了。說實在的, 要讓 IP 封包通過 255 個路由器,還挺難的~

  • Protocol Number(協定代碼):

    來自傳輸層 (layer4) 與網路層 (layer3) 本身的其他資料都是放置在 IP 封包當中的,我們可以在 IP 表頭記載這個 IP 封包內的資料是啥, 在這個欄位就是記載每種資料封包的內容啦!在這個欄位記載的代碼與相關的封包協定名稱如下所示:

    IP 內的號碼封包協定名稱(全名)
    1ICMP (Internet Control Message Protocol)
    2IGMP (Internet Group Management Protocol)
    3GGP (Gateway-to-Gateway Protocol)
    4IP (IP in IP encapsulation)
    6TCP (Transmission Control Protocol)
    8EGP (Exterior Gateway Protocol)
    17UDP (User Datagram Protocol)

    我們比較常見到的有 TCP, UDP, ICMP等。

  • Source Address 與 Destination Address

    就是這個 IP 封包的來源位址與目標位址,兩者均是 32 位元喔!一定要記下來的是,IPv4 的 IP 位址是 32 位元這件事!

還記得我們使用 ping 的方式去探索目標主機是否存在時,螢幕上會出現 TTL 這個關鍵字嘛?對了!該數值就是從這裡取得的! IP 封包裡面紀錄的來源與目標位址,我們稱為『IP 位址』,要特別留意的是,所謂 IP 是一種封包協定,在這個 IP 封包上面, 有個來源 (發送端) 與目標 (接收端)的位址,那就我們稱的 IP 位址!通常大家習慣都說 IP,老實說,那是錯誤的!這裡了解一下即可! 另外,在協定代碼中,TCP 與 UDP 我們在本章稍後介紹,這邊先講一講 ICMP 好了。

  • Layer 3 的 ICMP 協定

ICMP 的全名是『 Internet Control Message Protocol, 網際網路訊息控制協定 』。基本上,ICMP 是一個錯誤偵測與回報的機制,最大的功能就是可以確保我們網路的連線狀態與連線的正確性! ICMP 也是網路層的重要封包之一,不過,這個封包並非獨立存在,而是納入到 IP 的封包中!也就是說,ICMP 同樣是透過 IP 封包來進行資料傳送的啦!因為在 Internet 上面有傳輸能力的就是 IP 封包啊!ICMP 有相當多的類別可以偵測與回報,底下是比較常見的幾個 ICMP 的類別 (Type):

ICMP 協定之類別代號意義
類別代號類別名稱與意義
0Echo Reply (代表一個回應信息)
3Destination Unreachable (表示目的地不可到達)
4Source Quench (當 router 的負載過高時,此類別碼可用來讓發送端停止發送訊息)
5Redirect (用來重新導向路由路徑的資訊)
8Echo Request (請求回應訊息)
11Time Exceeded for a Datagram (當資料封包在某些路由傳送的現象中造成逾時狀態,此類別碼可告知來源該封包已被忽略的訊息)
12Parameter Problem on a Datagram (當一個 ICMP 封包重複之前的錯誤時,會回覆來源主機關於參數錯誤的訊息)
13Timestamp Request (要求對方送出時間訊息,用以計算路由時間的差異,以滿足同步性協定的要求)
14Timestamp Reply (此訊息純粹是回應 Timestamp Request 用的)
15Information Request (在 RARP 協定應用之前,此訊息是用來在開機時取得網路信息)
16Information Reply (用以回應 Infromation Request 訊息)
17Address Mask Request (這訊息是用來查詢子網路 mask 設定信息)
18Address Mask Reply (回應子網路 mask 查詢訊息的)

那麼我們是如何利用 ICMP 來檢驗網路的狀態呢?最簡單的指令就是 ping 與 traceroute 了,這兩個指令可以透過 ICMP 封包的輔助來確認與回報網路主機的狀態。在設定防火牆的時候,我們最容易忽略的就是這個 ICMP 的封包了,因為只會記住 TCP/UDP 而已~事實上,ICMP 封包可以幫助連線的狀態回報,除了上述的 8 可以考慮關閉之外,基本上,ICMP 封包也不應該全部都擋掉喔!

4.3.2、IPv4 位址與區域網路

網際網路很多的設計其實應該是有參考人類的郵務系統~所以,我們說,網路主機都會有個門牌, 這個門牌就是代表人家怎麼來到你的伺服器的主要目標,這個目標就是 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 位址是有等級之分的!這個『等級』的意思是,該 IP 位址的『區域網路的範圍』到哪裡的意思。 舉個簡單的例子來說好了,崑山科技大學所在的地址是:『台南市、永康區、崑大路、195號』,這個門牌的意思是:

  • 台南市的市長 (Class A):台南市.XX.XX.XX 都是我管的!
    代表『台南市』是市長管理的,底下的永康區、北區、東區、仁德區等等,都是市長管理的!所以,『台南市』名稱不能變,其他區、路、號碼不能重複! 在台南市底下的所有區,所有的 XX.XX.XX 居民們,都可以透過廣播器互通訊息。
  • 永康區的區長 (Class B):台南市.永康區.XX.XX 是我區長管的
    代表『台南市、永康區』是區長管理的,這個大門牌基本不變。而後續的崑大路、大灣路、永大路、文化路等等, 這些門牌就屬於永康區長管理的!所以,在永康區底下的所有住戶,同樣可以透過廣播器互通訊息。
  • 崑大路的路長 (Class C):台南市.永康區.崑大路.XX 是我路長管的
    代表『台南市、永康區、崑大路』是路長管理的,裡面的所有號碼 (包括 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 位址在同一個網段喔!

所以,一般比較有經驗的網管人員,大概一看第一組的 IP 位址,就知道這組 IP 位址的範圍到哪裡了! 也就能夠設計好一整個區段的電腦囉!
  • 同一個區域網路:在同一個 LAN 的意義

我們以 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 為 119.231.23.52,請問這個 IP 是 Class A, B, C 的那一個?
  • 承上,那麼該 IP 所在的網段理論上,其 (1)Netmask IP, (2)Network IP address, (3)Broadcast address, (4)可用 IP 範圍,各別是多少?
  • 承上,有沒有可能存在類似 119.231.23.0 這樣的『可用 IP』呢?
  • IP address 的種類: Public / Private

接下來要跟大家談一談也是很容易造成大家困擾的一個部分,那就是 IP 位址的種類!很多朋友常常聽到什麼『真實 IP, 實體 IP, 虛擬 IP, 假的 IP....』煩都煩死了~其實不要太緊張啦!實際上,在 IPv4 裡面就只有兩種 IP 位址的類別,分別是:

  • Public IP (公共 IP 或公開 IP 位址):
    這種 IP 位址必須要從 ISP 申請而來,以學校來說,就是要跟計算機中心申請;以住家來說,就是需要向類似中華電信申請 (要花錢)。 這種 IP 位址可以直接上網,也可以架設網站,全世界都可以直接跟這個 IP 位址連線與溝通。
  • Private IP (私有 IP 或保留 IP 位址):
    當初設計 IPv4 時,預設保留給內部網路設定用的 IP 位址區段。這種 IP 位址不能直接上網, 需要透過 IP 分享器 (透過 NAT 技術) 後才能夠上網。當區域網路還不需要連上 Internet 時,可以使用這種 IP 位址來設定內部裝置, 未來有 Internet 的需求,只需要加上 IP 分享器即可。這種 IP 位址所架設的網站,也需要透過 IP 分享器的轉遞 (port mapping) 後, 才有可能讓 Internet 瀏覽到。

規劃私有 IP 位址時,同樣根據 Class 的分類,私有 IP 位址也分三個 class 提供給用戶或企業來設定規劃自己的區域網路, 這三段私有 IP 位址分別如下:

  • Class A:10.0.0.0/8,一組 Class A
  • Class B:172.16.0.0/16, 172.17.0.0/16..., 172.31.0.0/16,共 16 組 Class B
  • Class C:192.168.0.0/24, 192.168.1.0/24..., 192.168.255.0/24,共 256 組 Class C
思考例題:下列哪幾個是屬於 Private IP address,這種 IP 位址需要透過 IP 分享或偽裝才能夠連上 Internet
  1. 172.15.1.1/16
  2. 192.28.1.1/24
  3. 10.100.1.1/8
  4. 172.20.1.1/16
  5. 192.168.5.1/24
  6. 61.5.5.1/8
  • 特殊的 Loopback 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 界面上,這個服務開在這邊,基本上是挺安全的! 只有你自己連線的到而已!

所以,當有人想要攻擊你的主機,並且要你說你主機的 IP 位址時,請告訴對方,你的 IP 位址是 127.0.0.1 就是了! 千萬不要遲疑!讓對方攻擊這個 IP 位址就對了!

4.3.3、無等級 IP 位址 (Classless Interdomain Routing, CIDR)

我們前面談到,透過 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 位址範圍。

  • 先計算 netmask:
    一般做這種筆算的網路參數運算,大多會先計算 netmask!因為 Net ID 佔用 26 位元 (/26),也就是『11111111.11111111.11111111.11000000』, 所以最後一個 byte 的二進位內容會是『 11 000000 』,那就可以推算出十進位 255.255.255.192 這個子網路遮罩的參數了!
  • 再計算第一個 IP 位址,意即是 Network IP address:
    由 192.168.5.100 中,前面 192.168.5 已經是固定不會變度動,而 100 推算成二進位,就會是:『 01100100 』這樣, 前面兩個位元是 01,所以第四組十進位數值可以得到的第一個 IP 位址就會是『 01 000000 』的樣式,計算成為十進位就會是 64 了! 所以得到 192.168.5.64 為其 Network IP address
  • 計算最後一個 IP 位址,亦即 Broadcase address:
    承上 Network IP address 的說明,第四組十進位數值的最後一個 IP 位址就會是『 01 111111 』的樣式,計算成為十進位就會是 127 了! 所以 Broadcase address 會是 192.168.5.127。
  • 可用於設定主機的 IP 位址範圍:
    介於 network ip address 與 broadcast address 之間的 IP 位址,就是可用的範圍!所以會是: 192.168.5.65 ~ 192.168.5.126

計算可用 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 這一段了!

思考例題:
  • 再請嘗試計算出 192.168.10.200/27 的 Netmask IP address, Network IP address, Broadcast IP address, 可用 IP address 範圍分別是什麼?
  • 三段 Private IP 位址的簡化

從前面的 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 數值):

  • 10.0.0.0/8 (255.0.0.0)
  • 172.16.0.0/12 (255.240.0.0)
  • 192.168.0.0/16 (255.255.0.0)

4.3.4、路由概念 (gateway)

我們現在知道區域網路 (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 個欄位,你需要注意的大概是這幾個:

  • Destination:其實就是 Network IP address 的意思!
  • Gateway:就是該界面的 Gateway IP 位址,如果是 0.0.0.0,代表直接透過廣播,不用額外的 gateway IP 位址。
  • Genmask:就是 Netmask,與 Destination 欄位可以組合成為一個區域網路的網域。
  • Flags:旗標,底下是常見的旗標意義:
    • U:代表該路由是可用的
    • G:代表該路由需要透過 gateway 來幫忙轉遞
    • H:代表路由為一部主機,而非一整段網域的意思。
  • Iface:基本上,就是網路卡界面。

因此,我們知道虛擬機器輸出的路由表共有兩條,先談比較簡單的,也就是開頭為 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 查詢通過的通訊閘

有時候,你可能有興趣針對郵局的郵差到底怎麼送貨到對方去的路線查詢,那你能不能知道你的封包到底是怎麼傳送到目的地的呢? 我們可以透過 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。因為某些通訊閘沒有放行查詢的功能,因此就如同上表的資料, 會出現 * 的符號!否則,通常會有檢測的數據出現!你也就能知道你的封包大致上通過哪些通訊閘了!

4.3.5、IPv6 位址認識

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 進位的數值,最小與最大就分別是:

  • 0000:0000:0000:0000:0000:0000:0000:0000
  • FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

如上所示,用冒號 (:) 隔開共 8 組,每組裡面有 4 個 16 進位的數值,每一組最小是 0000,最大則是 FFFF。

  • IPv6 的 IP 位址簡化表示法:

如上所示,雖然 IPv6 的 128 位元由二進位改由十六進位的數字來簡化,不過畢竟還是有 32 個數值,真的還是太長了! 畢竟 IPv4 也才 32 位元~而且設計成為 4 組十進位而已~IPv6 光是十六進位數值,就有 32 個,想到就頭疼了! 所以,IPv6 的位址是允許做一些簡化的寫法的!簡化寫法的規則說明如下:

  • 在同一個冒號之間的數值,若為連續的 0,則只填一個 0 即可,例如『 :0000: 』可寫成『 :0: 』
  • 在同一個冒號區間的數值,左邊高位元若為連續的0,則可以簡化略過不寫,例如『 :002a: 』可寫成『 :2a: 』
  • 連續(含)一個以上的 :0000: 時,可以使用 :: 來取代,但只能保留一組 :: 的存在。

如下所示,第一行為標準的 IPv6 的 IP 位址寫法,第二行則符合上述第 2 點,連續的 0 可以簡化,第三行則符合上述的第 3 點,超過一個以上的 :0000: 時, 可以使用 :: 來取代,但是只能保留一組,所以第三行右側的 :0:0 就不能繼續簡化了 (通常保留左側高位的數值)

  • 原本的樣式:FE80:1234:5678:0000:0000:0010:0000:0000
  • 先簡化一次:FE80:1234:5678:0:0:10:0:0
  • 再次簡化後:FE80:1234:5678::10:0:0
  • IPv6 的子網路遮罩 (Netmask)

就跟 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:: 』 這個網段來說明:

  • Netmask 為 32 bit 時:
    • Network IP: 2001:0db8:0000:0000:0000:0000:0000:0000
      • 可以簡化為: 2001:db8::
    • Broadcast IP: 2001:0db8:ffff:ffff:ffff:ffff:ffff:ffff
    • 網域表示方式:2001:db8::/32
  • Netmask 為 64 bit 時:
    • Network IP: 2001:0db8:1234:5678:0000:0000:0000:0000
      • 可以簡化為: 2001:db8:1234:5678::
    • Broadcast IP: 2001:0db8:1234:5678:ffff:ffff:ffff:ffff
    • 網域表示方式:2001:db8:1234:5678::/64
  • 只用於區網且只與網卡卡號有關的 Link Local Address 的 IPv6 位址

為了簡化區域網路內部的 IPv6 之 IP 位址設定,因此 IPv6 規劃的時候,有提出一個名為區域網路連結位址 (Link Local Address) 的 IPv6 位址設定方式!規劃的資料其實很簡單,就是:

  • 提供 fe80::/10 的區段給 LAN 使用
  • 且最後的 64 位元 (最後 4 組位址數值) 使用網卡卡號來計算
  • 同時能使用的區網為 64bit 的設計

因此最終會有 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 開頭的!這是由作業系統根據網卡卡號自動計算產生的喔! 再說一次,不能夠直接對外連網,只能在區域網路內部互相連結而已喔!

  • IPv6 的 private IP (Unique Local Address) 與 public IP (Global Unicast Address)

與 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 來設定呢!

4.4、Layer 4 的相關協定

透過網路層的 IP 位址以及 IP 封包,順利的將包裹送到目標主機上頭去,接下來,這個封包要不要被接受? 這個封包要交給誰來處理?那就是傳送層的任務之一。從 圖 4.1.4-1 我們可以看到傳送層有兩個重點, 一個是連接導向的 TCP 封包,一個是非連接導向的 UDP 封包,這兩個封包很重要啊!資料能不能正確的被送達目的, 與這兩個封包有關喔!

4.4.1、可靠連線的 TCP 協定

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
圖 4.4.1-1、TCP 封包的表頭資料

我們只講比較有趣的項目,包括底下這幾個:

  • Source Port & Destination Port (來源埠口 & 目標埠口)
    如果說 IP 位址是地址,那麼 TCP 的埠口 (port) 就是該地址上面的樓層!每個連線的 server / client 兩端互相溝通時, 就是透過這個埠口號碼來進行正確目標的連線處理。以網頁伺服器與瀏覽器來說,網頁伺服器需要先啟動一個例如 port 80 的埠口, 然後用戶端使用隨機的一個埠口 (Source port) 連線到網頁伺服器的 80 號埠口 (Destination port),server/client 透過這條『通道』就可以傳輸資料了。
  • Sequence Number (封包序號)
    由於 TCP 封包必須要帶入 IP 封包當中,所以如果 TCP 資料太大時(大於 IP 封包的容許程度), 就得要進行分段。這個 Sequence Number 就是記錄每個封包的序號,可以讓收受端重新將 TCP 的資料組合起來。
  • Acknowledge Number (回應序號)
    為了確認主機端確實有收到我們 client 端所送出的封包資料,我們 client 端當然希望能夠收到主機方面的回應,那就是這個 Acknowledge Number 的用途了。 當 client 端收到這個確認碼時,就能夠確定之前傳遞的封包已經被正確的收下了。(所以,通常回應序號會使用序號+1的方式做編號)
  • Code (Control Flag, 控制標誌碼)
    當我們在進行網路連線的時候,必須要說明這個連線的狀態,好讓接收端瞭解這個封包的主要動作。 這可是一個非常重要的控制碼喔!這個欄位共有 6 個 bits ,分別代表 6 個控制碼,若為 1 則為啟動。分別說明如下:
    • URG(Urgent):若為 1 則代表該封包為緊急封包, 接收端應該要緊急處理,且圖 4.4.1-1 當中的 Urgent Pointer 欄位也會被啟用。
    • ACK(Acknowledge):若為 1 代表這個封包為回應封包, 與上面提到的 Acknowledge Number 有關。
    • PSH(Push function):若為 1 時,代表要求對方立即傳送緩衝區內的其他對應封包,而無須等待緩衝區滿了才送。
    • RST(Reset):若為 1 的時候,表示連線會被馬上結束,而無需等待終止確認手續。這也就是說, 這是個強制結束的連線,且發送端已斷線。
    • SYN(Synchronous):若為 1,表示發送端希望雙方建立同步處理, 也就是要求建立連線。通常帶有 SYN 標誌的封包表示『主動』要連接到對方的意思。
    • FIN(Finish):若為 1 ,表示傳送結束,所以通知對方資料傳畢, 是否同意斷線,只是發送者還在等待對方的回應而已。
    其實每個項目都很重要,不過我們這裡僅對 ACK/SYN 有興趣而已,這樣未來在談到防火牆的時候,你才會比較清楚為啥每個 TCP 封包都有所謂的『狀態』條件!那就是因為連線方向的不同所致啊!底下我們會進一步討論喔! 至於其他的資料,就得請您自行查詢網路相關書籍了!
  • Socket Pair 與特權埠口 (Privileged Ports)

在上圖的 TCP 表頭資料中,我們最需要知道的就屬那 16 位元的 Source port 與 Destination port。由於是 16 位元,因此目標與來源埠口範圍在 0 ~ 65535 號 (2 的 16 次方)! 由於網路是雙向的,要達成連線的話得要伺服器與用戶端均提供了 IP 位址與埠口才行。 因此,我們常常將這個成對的資料稱之為 Socket Pair 了!

  • 來源 IP + 來源埠口 (Source Address + Source Port)
  • 目的 IP + 目的埠口 (Destination Address + Destination Port)

由於 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 與網路服務的對應:

一般常見埠口號碼 (port number) 對應的服務
連接埠口服務名稱與內容
20FTP-data,檔案傳輸協定所使用的主動資料傳輸埠口
21FTP,檔案傳輸協定的命令通道
22SSH,較為安全的遠端連線伺服器
23Telnet,早期的遠端連線伺服器軟體
25SMTP,簡單郵件傳遞協定,用在作為 mail server 的埠口
53DNS,用在作為名稱解析的領域名稱伺服器
80WWW,這個重要吧!就是全球資訊網伺服器
110POP3,郵件收信協定,辦公室用的收信軟體都是透過他
443https,有安全加密機制的WWW伺服器
    TCP 封包的三向交握 (Three-way handshake)

TCP 被稱為可靠連接導向,其連線主要是透過許多機制來達成的,其中最重要的就是三向交握的功能。當然, TCP 傳送資料的機制非常複雜,有興趣的朋友請自行參考相關網路書籍。那麼如何藉由 TCP 的表頭來確認這個封包有實際被對方接收,並進一步與對方主機達成連線?我們以底下的圖示來作為說明:

TCP 的三向交握
圖 4.4.1-2、TCP 的三向交握示意圖

圖示中 Server / Client 往下方的箭頭代表的是時間軸,要達成連線之前,需要通過三次確認的動作,也因此這個行為就被稱為三向交握 (Three-way handshake)。我們根據上圖的 A, B, C, D 四個階段來簡單說明一下:

  • A:封包發起狀態,TCP 封包帶有 SYN 旗標,假設序號為 10001 號
    當用戶端想要對伺服器端連線時,就必須要送出一個要求連線的封包,此時用戶端必須隨機取用一個大於 1024 以上的埠口來做為程式溝通的介面。然後在 TCP 的表頭當中,必須要帶有 SYN 的主動連線旗標(SYN=1),並且記下發送出連線封包給伺服器端的序號 (Sequence number = 10001)
  • B:封包接收並發送確認封包,TCP 封包同時帶有 ACK 與 SYN 旗標,假設序號 20001,回應序號為 10001+1
    當伺服器接到這個封包,並且確定要接收這個封包後,就會開始製作一個同時帶有 SYN=1, ACK=1 的封包,其中那個 acknowledge 的號碼是要給 client 端確認用的,所以該數字會比(A 步驟)裡面的 Sequence 號碼多一號 (ack = 10001+1 = 10002), 那我們伺服器也必須要確認用戶端確實可以接收我們的封包才行,所以也會發送出一個 Sequence (seq=20001) 給用戶端,並且開始等待用戶端給我們伺服器端的回應喔!
  • C:送出確認封包,TCP 封包帶有 ACK 旗標:
    當用戶端收到來自伺服器端的 ACK 數字後 (10002) 就能夠確認之前那個要求封包被正確的收受了, 接下來如果用戶端也同意與伺服器端建立連線時,就會再次的發送一個確認封包 (ACK=1) 給伺服器,亦即是 acknowledge = 20001+1 = 20002 囉。
  • D:取得最後確認
    若一切都順利,在伺服器端收到帶有 ACK=1 且 ack=20002 序號的封包後,就能夠建立起這次的連線了。
鳥哥上課談到 TCP 最常做的事就是,叫一個同學起來,實際表演三向交握給大家看!
1. 鳥哥說:甲同學你在不在(SYN)?
2. 甲同學說:我在(ACK)!那鳥哥你在不在(SYN)?
3. 鳥哥說:我也在(ACK)
此時兩個人就確認彼此都可以聽到對方在講啥,這就是可靠連線啦! ^_^

4.4.2、非連接導向的 UDP 協定

UDP 的全名是:『User Datagram Protocol, 用戶資料流協定』,UDP 與 TCP 不一樣, UDP 不提供可靠的傳輸模式,因為他不是連線導向的一個機制,這是因為在 UDP 的傳送過程中,接受端在接受到封包之後,不會回覆回應封包 (ACK) 給發送端,所以封包並沒有像 TCP 封包有較為嚴密的檢查機制。至於 UDP 的表頭資料如下表所示:

16 bits 16 bits
Source Port Destination Port
Message Length Checksum
Data
圖 4.4.2-1、UDP 封包的表頭資料

TCP 封包確實是比較可靠的,因為通過三向交握嘛!不過,也由於三向交握的緣故, TCP 封包的傳輸速度會較慢。至於 UDP 封包由於不需要確認對方是否有正確的收到資料 (射後不理),故表頭資料較少,所以 UDP 就可以在 Data 處填入更多的資料了。同時 UDP 比較適合需要即時反應的一些資料流,例如影像即時傳送軟體等,就可以使用這類的封包傳送。也就是說, UDP 傳輸協定並不考慮連線要求、連線終止與流量控制等特性,所以使用的時機是當資料的正確性不很重要的情況,例如網路攝影機!

那麼上課時怎麼介紹 UDP 呢?很簡單喔!鳥哥就會說:『現在老師就是在進行 UDP 的傳送,因為老師一直講一直講, 俺也沒有注意到你有沒有聽到,也不需要等待你的回應封包!就這樣一直講!當然,你沒有聽到鳥哥講啥,我也不會知道...』

4.5、網路基礎與上網參數取得

從上面的解釋,我們大概理解了某些網路基礎,也大致知道了 IPv4 位址以及埠口號碼的意義等等。但是, 到底那是什麼東西?然後,聽人家說被值入木馬可能會被開後門?那前門在哪裡?而,這些網路參數 (IP address, Netmask, Gateway..) 在你的主機上面是如何取得的?就讓我們好好說一說。

  • Layer 2, 3, 4 與郵務系統比對

我們大概知道網路基礎就是所謂的 OSI 七層協定裡面的 Layer 2, 3, 4 這三層,這三層的重點封包協定主要是 MAC, IP, TCP 與 UDP 等。 然後,這三層封包上面最重要的表頭資料,分別是網卡卡號、IP 位址、埠口號碼,而網卡卡號與硬體相關性較高,IP 位址與埠口號碼, 則是軟體設定來的!可以隨時修改。基本原理是這樣,那...到底什麼是什麼?能不能用小學生知道的語言來解釋?

相對於『軟體』與『硬體』來說,網卡卡號 (MAC address) 比較偏向硬體,基本上,網卡卡號應該是不變的。 那麼 IP 位址是我們可以透過軟體去設定調整的,因此 IP 位址當然是比較偏向軟體設定,是可調整的。所以,簡單的說:

  • 網卡卡號可以想成是我們家與郵局的實際地理位置,道路可以看成是一個 switch ,連接兩個網卡 (實際的地理條件)。
  • 至於 IP 位址,則是門牌!就是我們家 (client) 與郵局 (server) 的門牌號碼,門牌可以透過申請來修改!

所以,你就知道網卡卡號與 IP 位址的差異了!那 port 是什麼?現在幻想一下,你從你家走路到郵局 (MAC address),看到門牌號碼 (IP address) 之後,確定是該家郵局沒問題,然後進到郵局內部,看到很多的窗口 (port),每個窗口的服務都不一樣,有匯款的、有郵寄、有信用卡業務的等等 (well-known port)。 是的,你應該可以幻想成這樣:

  • 埠口號碼可以想成是在該郵局裡面的窗口號碼,而某些特定的窗口號碼會有約定俗成的固定的服務。

但是,這些窗口不見得有啟用,因為某些窗口裡面沒有服務人員 (process/service 程序),有服務人員的, 這才是有啟用的埠口。

有個路人,偷偷跑到信用卡業務的窗口上,這時,信用卡窗口就打開了 (port open),但是實際的郵局人員並不認識這個路人, 這就是所謂的被值入後門程式,值入這個後門程式就被啟動了一個埠口。那怎麼關閉這個錯誤的人啟用的埠口呢? 很簡單啊!把這個人趕走 (kill -9) 就好!也就是說,啟動埠口與窗口本身無關,是『誰』在這個窗口的位置提供服務, 這才是重點!所以我們才會說,將軟體 (尤其是伺服器軟體) 升級到最新,更新到沒有錯誤的版本上,那在窗口那個位置上的人, 就比較不容易被攻陷啊~這也就是說:

  • 埠口的啟用與否,可以想成窗口裡面那個提供服務的人員,窗口裡面有人,窗口就是啟用的,無論這個人是否是正常的...
  • 主機名稱與 DNS 系統

等等!不對啊!我們上面談到的都是 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 位址!

  • 連上 Internet 必要的網路參數

從上面的所有說明當中,我們知道一部主機要能夠使用網路,必須要有 IP 位址,而 IP 位址的設定當中,就必須要有 IP address, Network IP address, Broadcast address, Netmask 等參數,此外,還需要考慮到路由裡面的 Default Gateway 才能夠正確的將非同網域的封包給他傳送出去。另外,考慮到主機名稱與 IP 位址的對應,所以你還必須要給予系統一個 DNS 伺服器的 IP 才行~ 所以說,一組合理的網路設定需要哪些資料呢?

  1. IP/Netmask:這個組合還包含自動計算出來的 Network IP, Broadcast IP 位址等。
  2. Gateway IP address
  3. DNS IP address
  4. 一個好記的主機名稱 (預設通常是 localhost)

必要的是前面三項,最後一項只是讓你在登入系統的時候,可以有比較清楚且有意義的主機名稱,避免你登入到錯誤的系統囉!

思考例題:假設你有一個區域網路是 Class C 的 192.168.1.0/24,而你想要用最後一個可用 IP 位址當成 gateway, 且使用中華電信的 168.95.1.1 當成 DNS 伺服器的服務 IP 位址,那麼第一個可用 IP 位址拿來當用戶端電腦的設定時, 上面三個需要的設定值就會是:
  • IP: 192.168.1.1/24
  • GW: 192.168.1.254
  • DNS: 168.95.1.1
  • 網路參數的取得方式

上面這三個數值要怎麼取得呢?意思是,你的主機是怎麼拿到這三個數值的?基本上可以這樣取得與設定:

  • 直接手動設定 (manual, static):
    你可以直接向你的網管人員詢問可用的網路參數,然後使用 nmcli 之類的軟體來設定好你的網路。這種方式常見於校園網路中, 以及向你的 ISP 申請固定 IP 位址的連線環境。
  • 自動取得網路參數 (auto, DHCP):
    在區域網路內會有一部主機負責管理所有電腦的網路參數,你的主機開機時就會主動向該伺服器要求相關的網路參數, 若取得網路相關參數後,你的主機就能夠自行設定好所有伺服器給你的網路參數了。 最常使用於企業內部、IP 分享器後端、校園網路與宿舍環境,及纜線寬頻 (第四台的訊號線) 等連線方式。
  • 透過撥接取得 (pppoe):
    向你的 ISP 申請註冊,取得帳號密碼後,直接撥接到 ISP ,你的 ISP 會透過他們自己的設定,讓你的作業系統取得正確的網路參數。 此時你並不需要手動去編輯與設定相關的網路參數啦。目前台灣的 ADSL 撥接、光纖到大樓、光纖到府等,大部分都是使用撥接的方式。

不管是使用上面哪種方式取得的網路參數,你的 IP 位址都只有所謂的『 Public 與 Private IP 』而已! 而其他什麼浮動式、固定制、動態式等等有的沒有的,就只是告訴你這個 IP 位址取得的方式而已。 舉例來說,台灣地區光纖撥接後取得的 IP 位址通常是 public IP,但是鳥哥曾接到香港網友的來信,他們撥接後,取得的 IP 位址是 Private 呢!所以導致無法架設網站喔!

另外,目前我們手邊應該都有很多平板、手機、筆電等可攜式設備,而目前的無線網路應用非常的廣泛!所以, 我們的電腦系統也經常使用無線 AP (Access Point) 進行網路連線。無線 AP 基本上就是一部通訊閘, 只是這個通訊閘透過的是無線的 wifi 技術來達成乙太網路連線而已!基本上無線 AP 大概就是使用 DHCP 自動取得網路參數的方式提供用戶網路囉!

參考資料

修改歷史:
  • 2023/08/09:在 2022 年暑假寫了 2/3 的資料,因為新冠確診以及後續學校課程的緣故,讓這篇文章延遲了一年...去年思考的想法都被今年否決...寫的真辛苦...
2023/08/09以來統計人數
計數器
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計