本文已不再維護,更新文章請參考這裡

你的伺服器是放在網路網路上面來提供服務的,所以,如果沒有網路或者是網路不通,那麼你的伺服器當然是英雄無用武之地啦! 此外,伺服器上面的網路服務都是用來達成某項網際網路的通訊協定,以提供相對應的服務而已。所以囉, 你當然得要知道這個最基礎的網路概念,否則,當伺服器的服務出現問題時,你該如何解決啊?您說對吧! 這部份最重要的是 TCP/IP 與 OSI 七層協定的相關概念了,這部份難的很∼難的很∼ 在這一章中,鳥哥以較為口語的方式來介紹這些基礎網路架構,希望能帶給朋友們快速瞭解網路是啥。 當然,想要更瞭解網路相關功能的話,文末的參考資料可以參考看看喔! ^_^

2.1 網路是個什麼玩意兒
  2.1.1 什麼是網路
  2.1.2 電腦網路組成元件
  2.1.3 電腦網路區域範圍
  2.1.4 電腦網路通訊協定: OSI 七層協定
  2.1.5 電腦網路通訊協定: TCP/IP
2.2 TCP/IP 的鏈結層相關協定
  2.2.1 廣域網路使用的設備
  2.2.2 區域網路使用的設備-乙太網路, 速度與標準, RJ45接頭 (跳線/平行線)
  2.2.3 乙太網路的傳輸協定:CSMA/CD
  2.2.4 MAC 的封裝格式
  2.2.5 MTU 最大傳輸單位
  2.2.6 集線器、交換器與相關機制
2.3 TCP/IP 的網路層相關封包與資料
  2.3.1 IP 封包的封裝
  2.3.2 IP 位址的組成與分級網域, IP 與門牌關連, 分級 (Class A, B, C)
  2.3.3 IP 的種類與取得方式loopback, IP 的取得方式
  2.3.4 Netmask, 子網路與 CIDR (Classless Interdomain Routing)
  2.3.5 路由概念
  2.3.6 觀察主機路由route
  2.3.7 IP 與 MAC:鏈結層的 ARP 與 RARP 協定arp
  2.3.8 ICMP 協定
2.4 TCP/IP 的傳輸層相關封包與資料
  2.4.1 可靠連線的 TCP 協定通訊埠口, 特權埠口 (Privileged Ports), Socket Pair
  2.4.2 TCP 的三向交握
  2.4.3 非連接導向的 UDP 協定
  2.4.4 網路防火牆與 OSI 七層協定
2.5 連上 Internet 前的準備事項
  2.5.1 用 IP 上網?主機名稱上網?DNS 系統?
  2.5.2 一組可以連上 Internet 的必要網路參數
2.6 重點回顧
2.7 本章習題
2.8 參考資料與延伸閱讀
2.9 針對本文的建議:http://phorum.vbird.org/viewtopic.php?t=25884

2.1 網路是個什麼玩意兒

全世界的人種有很多,人類使用的語言種類也多的很。那如果你想要跟外國人溝通時,除了比手劃腳之外,你要如何跟對方講話? 大概只有兩種方式囉,一種是強迫他學中文,一種則是我們學他的語言,這樣才能溝通啊。在目前世界上的強勢語言還是屬於英語系國家, 所以囉,不管是啥人種,只要學好英文,那麼大家都講英文,彼此就能夠溝通了。希望不久的未來,咱們的中文能夠成為強勢語言啊!

這個觀念延伸到網路上面也是行的通的,全世界的作業系統多的很,不是只有 Windows/Linux 而已,還有蘋果電腦自己的作業系統, Unix like 的作業系統也非常多!那麼多的作業系統 (人種) 要如何進行網路溝通 (語言) 呢?那就得要制訂共同遵守的標準才行了。這個標準是由國際組織規範的,你的系統裡面只要提供可以加入該標準的程式碼, 那你就能夠透過這個標準與其他系統進行溝通!所以囉,網路是跨平台的,並不是只有 Linux 才這麼做!因此,這部份的資料你學完後,是可以應用在所以作業系統上面的!觀念都相同啊!

另外,這一個章節旨在引導網路新鮮人快速進入網路的世界,所以鳥哥寫的比較淺顯一些些,基本上, 還有一堆網路硬體與通訊協定並沒有被包含在這篇短文裡頭。如果你的求知慾已經高過本章節, 那麼請自行到書局尋找適合你自己的書籍來閱讀!當然,你也可以在網際網路上面找到你所需要的資料。 在本章最後的參考資料可以瞧一瞧吶!


2.1.1 什麼是網路

我們都知道,網路就是幾部電腦主機或者是網路印表機之類的周邊設備, 透過網路線或者是無線網路的技術,將這些主機與設備連接起來, 使得資料可以透過網路媒體(網路線以及其他網路卡等硬體)來傳輸的一種方式。 請你想像一下,如果你家裡面只有電腦、印表機、傳真機等機器,卻沒有網路連接這些硬體, 那麼使用上會不會很麻煩?如果將這個場景移到需要工作的辦公室時, 電腦的資料無法使用網路連接到印表機來列印,那是否很傷腦筋呢? 對吧!光用想的就覺得很麻煩吧!不幸的是,這些麻煩事在 1970 年代以前,確實是存在的啊!


2.1.2 電腦網路組成元件

接下來,讓我們來談談那麼組成電腦網路的元件有哪些呢?這些元件的定義為何啊?我們得要先知道有哪些硬體嘛! 接下來才好理解啊。在這裡,我們以底下這張連線示意圖來解釋好了:

電腦網路連線示意圖
圖 2.1-1、電腦網路連線示意圖

在上圖中,我們主要需要注意到的硬體有哪些呢?大致有底下這些啦:

網路設備其實非常多也非常複雜,不過如果以小型企業角度來看,我們能夠瞭解上述圖示內各設備的角色,那應該也足夠囉! 接下來,讓我們繼續來討論一下網路範圍的大小吧!


2.1.3 電腦網路區域範圍

由於各個節點的距離不同,連線的線材與方式也有所差異,由於線材的差異也導致網路速度的不同,讓網路的應用方向也不一樣。 根據這些差異,早期我們習慣將網路的大小範圍定義如下:(註6)

除了這兩個之外,還有所謂的都會網路 (Metropolitan Area Network, MAN),不過近來比較少提及,因此你只要知道有 LAN 及 WAN 即可。這兩個名詞在很多地方你都可以看的到喔!改天你回家看看你家的 ADSL 數據機或 IP 分享器後面的插孔看看,你就能夠看到有 WAN 與 LAN 的插孔,現在你就知道為啥有這兩個燈號與插孔了吧。

一般來說,LAN 指的是區域範圍較小的環境,例如一棟大樓或一間學校,所以在我們生活周遭有著許許多多的 LAN 存在。 那這些 LAN 彼此串接在一起,全部的 LAN 串在一塊就是一個大型的 WAN 囉!簡單的說,就是這樣分。

不過,現在的環境跟以前不一樣了,舉例來說,前幾天剛剛宣布 (2011/07),光纖的速度已經可以到達 100Mbps/10Mbps 的下載/上傳頻寬了!再舉例來說,台灣的學術網路通通是串在一塊的,鳥哥在台南崑山連線到高雄義守大學下載 CentOS 映像檔時,你猜下載的速度有多快?每秒鐘可高達 100Mbps 左右!這已經是一個內部區網的速度了!所以,用以前的觀點來看, 其實對目前的網路環境有點不符現象了。因此,目前你可以使用『速度』作為一個網路區域範圍的評量。 或許現在我們可以說,整個台灣的學術網路 (TANET, 註7) 可以視為是一個區域網路呢!


2.1.4 電腦網路通訊協定: OSI 七層協定

談完了網路需要制訂的標準、網路連線的元件以及網路的範圍之後,接下來就是要講到,那麼各個節點之間是如何溝通訊息的呢? 其實就是透過標準的通訊協定啦!但是,整個網路連接的過程相當複雜,包括硬體、軟體資料封包與應用程式的互相連結等等, 如果想要寫一支將聯網全部功能都串連在一塊的程式,那麼當某個小環節出現問題時,整隻程式都需要改寫啊!真麻煩!

那怎辦?沒關係,我們可以將整個網路連接過程分成數個階層 (layer),每個階層都有特別的獨立的功能, 而且每個階層的程式碼可以獨立撰寫,因為每個階層之間的功能並不會互相干擾的。 如此一來,當某個小環節出現問題時,只要將該層級的程式碼重新撰寫即可。所以程式撰寫也容易,整個網路概念也就更清晰! 那就是目前你常聽到的 OSI 七層協定 (Open System Interconnection) 的概念囉!

如果以圖示來說,那麼這七個階層的相關性有點像底下這樣:

OSI 七層協定各階層的相關性
圖 2.1-2、OSI 七層協定各階層的相關性

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

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

OSI 七層協定資料的傳遞方式
圖 2.1-3、OSI 七層協定資料的傳遞方式

上圖中仔細看每個資料包的部分,上層的包裹是放入下層的資料中,而資料前面則是這個資料的表頭。其中比較特殊的是第二層, 因為第二層 (資料鏈結層) 主要是位於軟體封包 (packet) 以及硬體訊框 (frame) 中間的一個階層, 他必須要將軟體包裝的包裹放入到硬體能夠處理的包裹中,因此這個階層又分為兩個子層在處理相對應的資料。 因為比較特殊,所以您瞧瞧,第二層的資料格式比較不一樣喔,尾端還出現一個檢查碼哩∼

每一個階層所負責的任務是什麼呢?簡單的說,每一層負責的任務如下:(註6, 註8, 註9)

分層負責內容
Layer 1
實體層
Physical Layer
由於網路媒體只能傳送 0 與 1 這種位元串,因此實體層必須定義所使用的媒體設備之電壓與訊號等, 同時還必須瞭解資料訊框轉成位元串的編碼方式,最後連接實體媒體並傳送/接收位元串。
Layer 2
資料鏈結層
Data-Link Layer
這一層是比較特殊的一個階層,因為底下是實體的定義,而上層則是軟體封裝的定義。因此第二層又分兩個子層在進行資料的轉換動作。 在偏硬體媒體部分,主要負責的是 MAC (Madia 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 這個玩意兒吧!


2.1.5 電腦網路通訊協定: TCP/IP

雖然 OSI 七層協定的架構非常嚴謹,是學習網路的好材料。但是也就是因為太過嚴謹了,因此程式撰寫相當不容易, 所以造成它在發展上面些許的困擾。而由 ARPANET 發展而來的 TCP/IP 又如何呢?其實 TCP/IP 也是使用 OSI 七層協定的觀念, 所以同樣具有分層的架構,只是將它簡化為四層,在結構上面比較沒有這麼嚴謹,程式撰寫會比較容易些。後來在 1990 年代由於 email, WWW 的流行,造成 TCP/IP 這個標準為大家所接受,這也造就目前我們的網路社會囉!

既然 TCP/IP 是由 OSI 七層協定簡化而來,那麼這兩者之間有沒有什麼相關性呢?它們的相關性可以圖示如下, 同時這裡也列出目前在這架構底下常見的通訊協定、封包格式與相關標準:

OSI 與 TCP/IP 協定之相關性
圖 2.1-4、OSI 與 TCP/IP 協定之相關性

從上圖中,我們可以發現 TCP/IP 將應用、表現、會談三層整合成一個應用層,在應用層上面可以實作的程式協定有 HTTP, SMTP, DNS 等等。 傳送層則沒有變,不過依據傳送的可靠性又將封包格式分為連接導向的 TCP 及非連接導向的 UDP 封包格式。網路層也沒有變,主要內容是提供了 IP 封包,並可選擇最佳路由來到達目標 IP 位址。資料鏈結層與實體層則整合成為一個鏈結層,包括定義硬體訊號、 訊框轉位元串的編碼等等,因此主要與硬體 (不論是區網還是廣域網路) 有關。

那 TCP/IP 是如何運作的呢?我們就拿妳常常連上的 Yahoo 入口網站來做個說明好了,整個連線的狀態可以這樣看:

  1. 應用程式階段:妳打開瀏覽器,在瀏覽器上面輸入網址列,按下 [Enter]。此時網址列與相關資料會被瀏覽器包成一個資料, 並向下傳給 TCP/IP 的應用層;
  2. 應用層:由應用層提供的 HTTP 通訊協定,將來自瀏覽器的資料包起來,並給予一個應用層表頭,再向傳送層丟去;
  3. 傳送層:由於 HTTP 為可靠連線,因此將該資料丟入 TCP 封包內,並給予一個 TCP 封包的表頭,向網路層丟去;
  4. 網路層:將 TCP 包裹包進 IP 封包內,再給予一個 IP 表頭 (主要就是來源與目標的 IP 囉),向鏈結層丟去;
  5. 鏈結層:如果使用乙太網路時,此時 IP 會依據 CSMA/CD 的標準,包裹到 MAC 訊框中,並給予 MAC 表頭,再轉成位元串後, 利用傳輸媒體傳送到遠端主機上。

等到 Yahoo 收到你的包裹後,在依據相反方向拆解開來,然後交給對應的層級進行分析,最後就讓 Yahoo 的 WWW 伺服器軟體得到你所想要的資料,該伺服器軟體再根據你的要求,取得正確的資料後,又依循上述的流程,一層一層的包裝起來, 最後傳送到你的手上!就是這樣囉!

根據這樣的流程,我們就得要知道每個分層所需要瞭解的基礎知識,這樣才算學習網路基礎嘛!所以底下我們會依據 TCP/IP 的鏈結層、網路層、傳送層來進行說明,應用層的協定則在後續章節中有對應的協定再來談囉!同時我們也知道, 網路媒體一次傳輸的資料量是有限的,因此如果要被傳輸的資料太大時,我們在分層的包裝中,就得要將資料先拆開放到不同的包裹中, 再給包裹一個序號,好讓目的端的主機能夠藉由這些序號再重新將資料整合回來!很有趣吧!接下來就讓我們一層一層來介紹囉!

一般來說,因為應用程式與程式設計師比較有關係,而網路層以下的資料則主要是作業系統提供的,因此, 我們又將 TCP/IP 當中的應用層視為使用者層,而底下的三層才是我們主要談及的網路基礎!所以這個章節主要就是介紹這三層啦!

2.2 TCP/IP 的鏈結層相關協定

TCP/IP 最底層的鏈結層主要與硬體比較有關係,因此底下我們主要介紹一些 WAN 與 LAN 的硬體。 同時會開始介紹那重要的 CSMA/CD 的乙太網路協定,以及相關的硬體與 MAC 訊框格式等。那就開始來聊聊囉!


2.2.1 廣域網路使用的設備

在 2.1.3 節我們有提到過,廣域網路使用的設備價格較為低廉。不過廣域網路使用到的設備非常的多, 一般用戶通常會接觸到的主要是 ADSL 數據機或者是光纖到大廈,以及第四台的 Cable 寬頻等。在這裡我們先介紹一些比較常見的設備,如果以後你有機會接觸到其他設備,再請你依據需求自行查閱相關書籍吧!


2.2.2 區域網路使用的設備-乙太網路

在區域網路的環境中,我們最常使用的就是乙太網路。當然啦,在某些超高速網路應用的環境中, 還可能會用到價格相當昂貴的光纖通道哩。只是如同前面提到的,乙太網路因為已經標準化了,設備設置費用相對低廉, 所以一般你會聽到什麼網路線或者是網路媒體,幾乎都是使用乙太網路來架設的環境啦! 只是這裡還是要提醒您,整個網路世界並非僅有乙太網路這個硬體介面喔! 事實上,想瞭解整個乙太網路的發展,建議你可以直接參考風信子與張民人先生翻譯的 『Switched & Fast 乙太網路』一書,該書內容相當的有趣,挺適合閱讀的吶。 底下我們僅做個簡單的介紹而已。


2.2.3 乙太網路的傳輸協定:CSMA/CD

整個乙太網路的重心就是乙太網路卡啦!所以說,乙太網路的傳輸主要就是網路卡對網路卡之間的資料傳遞而已。 每張乙太網路卡出廠時,就會賦予一個獨一無二的卡號,那就是所謂的 MAC (Media Access Control) 啦! 理論上,網卡卡號是不能修改的,不過某些筆記型電腦的網卡卡號是能夠修改的呦! 那麼乙太網路的網卡之間資料是如何傳輸的呢?那就得要談一下 IEEE 802.3 的標準 CSMA/CD (Carrier Sense Multiple Access with Collision Detection) 了!我們以下圖來作為簡介,下圖內的中心點為集線器, 各個主機都是連線到集線器,然後透過集線器的功能向所有主機發起連線的。

CSMA/CD連線示意圖
圖 2.2-2、CSMA/CD連線示意圖

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

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

  1. 監聽媒體使用情況 (Carrier Sense):A 主機要發送網路封包前,需要先對網路媒體進行監聽,確認沒有人在使用後, 才能夠發送出訊框;

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

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

瞭解這個程序很重要嗎?我們就來談談:


2.2.4 MAC 的封裝格式

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

乙太網路的 MAC 訊框
圖 2.2-3、乙太網路的 MAC 訊框

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

在 Linux 當中,你可以使用 ifconfig 這個指令來查閱你的網路卡卡號喔!特別注意,在這個 MAC 的傳送中,他僅在區域網路內生效,如果跨過不同的網域 (這個後面 IP 的部分時會介紹),那麼來源與目的的硬體位址就會跟著改變了。 這是因為變成不同網路卡之間的交流了嘛!所以卡號當然不同了!如下所示:

同一訊框在不同網域的主機間傳送時,訊框的表頭變化
圖 2.2-4、同一訊框在不同網域的主機間傳送時,訊框的表頭變化

例如上面的圖示,我的資料要由電腦 A 通過 B 後才送達 C ,而 B 電腦有兩塊網路卡,其中 MAC-2 與 A 電腦的 MAC-1 互通,至於 MAC-3 則與 C 電腦的 MAC-4 互通。但是 MAC-1 不能與 MAC-3 與 MAC-4 互通,為啥?因為 MAC-1 這塊網路卡並沒有與 MAC-3 及 MAC-4 使用同樣的 switch/hub 相接嘛!所以,資料的流通會變成:

  1. 先由 MAC-1 傳送到 MAC-2 ,此時來源是 MAC-1 而目的地是 MAC-2;
  2. B 電腦接收後,察看該訊框,發現目標其實是 C 電腦,而為了與 C 電腦溝通, 所以他會將訊框內的來源 MAC 改為 MAC-3 ,而目的改為 MAC-4 ,如此就可以直接傳送到 C 電腦了。

也就是說,只要透過 B (就是路由器) 才將封包送到另一個網域 (IP 部分會講) 去的時候, 那麼訊框內的硬體位址就會被改變,然後才能夠在同一個網域裡面直接進行訊框的流通啊!

由於網路卡卡號是跟著網路卡走的,並不會因為重灌作業系統而改變, 所以防火牆軟體大多也能夠針對網路卡來進行抵擋的工作喔! 不過抵擋網卡僅能在區域網路內進行而已,因為 MAC 不能跨 router 嘛!!

2.2.5 MTU 最大傳輸單位

通過上面 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 到多大,你必須要考量到你的封包需要傳到目的地時, 所需要經過的所有網路媒體,然後再來決定你的 MTU 設定才行。就因為這樣,我們才不建議你修改標準乙太網路的 MTU 嘛!

早期某些網路媒體 (例如 IP 分享器) 支援的是 802.2, 802.3 標準所組合成的 MAC 封裝,它的 MTU 就是 1492 , 而且這些設備可能不會進行封包重組,因此早期網路上面常常有朋友問說,他們連上某些網站時,總是會連線逾時而斷線。 但透過修改用戶端的 MTU 成為 1492 之後,上網就沒有問題了。原因是什麼呢?讀完上頭的資料,您應該能理解了吧?^_^

2.2.6 集線器、交換器與相關機制

2.3 TCP/IP 的網路層相關封包與資料

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


2.3.1 IP 封包的封裝

目前網際網路社會的 IP 有兩種版本,一種是目前使用最廣泛的 IPv4 (Internet Protocol version 4, 網際網路協定第四版), 一種則是預期未來會熱門的 IPv6 。IPv4 記錄的位址由於僅有 32 位元,預計在 2020 年前後就會分發完畢,如此一來, 新興國家或者是新的網路公司,將沒有網路可以使用。為了避免這個問題發生,因此就有 IPv6 的產生。 IPv6 的位址可以達到 128 位元,可以多出 2 的 96 次方倍的網址數量,這樣的 IP 數量幾乎用不完啦!雖然 IPv6 具有前瞻性,但目前主流媒體大多還是使用 IPv4 ,因此本文主要談到的 IP 都指 IPv4 而言喔!(註13)

我們在前一小節談到 MAC 的封裝,那麼 IP 封包的封裝也得要來瞭解一下,才能知道 IP 到底是如何產生的啊! IP 封包可以達到 65535 bytes 這麼大,在比 MAC 大的情況下,我們的作業系統會對 IP 進行拆解的動作。至於 IP 封裝的表頭資料繪製如下:(下圖第一行為每個欄位的 bit 數)

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

在上面的圖示中有個地方要注意,那就是『每一行所佔用的位元數為 32 bits』, 各個表頭的內容分別介紹如下:

你只要知道 IP 表頭裡面含有: TTL, Protocol, 來源位址與目標位址也就夠了!而這個 IP 表頭的來源與目標 IP ,以及那個判斷通過多少路由器的 TTL ,就能瞭解到這個 IP 將被如何傳送到目的端吶。後續各小節我們將介紹 IP 的組成與範圍,還有 IP 封包如何傳送的機制 (路由) 等等。


2.3.2 IP 位址的組成與分級

現在我們知道 IP (Internet Protocol) 其實是一種網路封包,而這個封包的表頭最重要的就是那個 32 位元的來源與目標位址! 為了方便記憶,所以我們也稱這個 32 bits 的數值為 IP 網路位址就是了。因為網路是人類發明的,所以很多概念與郵務系統類似! 那這個 IP 其實就類似所謂的『門牌號碼』啦!那麼這個 IP 有哪些重要的地方需要瞭解的呢?底下我們就來談一談吧!

既然 IP 的組成是 32 bits 的數值,也就是由 32 個 0 與 1 組成的一連串數字!那麼當我們思考所有跟 IP 有關的參數時,你就應該要將該參數想成是 32 位元的資料喔! 不過,因為人類對於二進位實在是不怎麼熟悉,所以為了順應人們對於十進位的依賴性,因此,就將 32 bits 的 IP 分成四小段,每段含有 8 個 bits ,將 8 個 bits 計算成為十進位,並且每一段中間以小數點隔開,那就成了目前大家所熟悉的 IP 的書寫模樣了。如下所示:

IP 的表示式:
00000000.00000000.00000000.00000000   ==> 0.0.0.0
11111111.11111111.11111111.11111111   ==> 255.255.255.255

所以 IP 最小可以由 0.0.0.0 一直到 255.255.255.255 哩!但在這一串數字中,其實還可以分為兩個部分喔! 主要分為 Net_ID (網域號碼)與 Host_ID (主機號碼) 兩部份。我們先以 192.168.0.0 ~ 192.168.0.255 這個 Class C 的網域當作例子來說明好了:

192.168.0.0~192.168.0.255 這個 Class C 的說明:
11000000.10101000.00000000.00000000
11000000.10101000.00000000.11111111
|----------Net_ID---------|-host--|

在上面的範例當中,前面三組數字 (192.168.0) 就是網域號碼,最後面一組數字則稱為主機號碼。 至於同一個網域的定義是『在同一個物理網段內,主機的 IP 具有相同的 Net_ID ,並且具有獨特的 Host_ID』,那麼這些 IP 群就是同一個網域內的 IP 網段啦!

什麼是物理網段呢?當所有的主機都是使用同一個網路媒體串在一起, 這個時候這些主機在實體裝置上面其實是連線在一起的,那麼就可以稱為這些主機在同一個物理網段內了! 同時並請注意,同一個物理網段之內,可以依據不同的 IP 的設定,而設定成多個『IP 網段』喔!

上面例子當中的 192.168.0.0, 192.168.0.1, 192.168.0.2, ...., 192.168.0.255 (共 256 個) 這些 IP 就是同一個網域內的 IP 群(同一個網域也稱為同一個網段!),請注意,同一個 Net_ID 內,不能具有相同的 Host_ID ,否則就會發生 IP 衝突,可能會造成兩部主機都沒有辦法使用網路的問題!


2.3.3 IP 的種類與取得方式

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

早在 IPv4 規劃的時候就擔心 IP 會有不足的情況,而且為了應付某些企業內部的網路設定,於是就有了私有 IP (Private IP) 的產生了。私有 IP 也分別在 A, B, C 三個 Class 當中各保留一段作為私有 IP 網段,那就是:

由於這三個 Class 的 IP 是預留使用的,所以並不能直接作為 Internet 上面的連接之用,不然的話,到處就都有相同的 IP 囉!那怎麼行!網路豈不混亂?所以囉,這三個 IP 網段就只做為內部私有網域的 IP 溝通之用。簡單的說,他有底下的幾個限制:

這個私有 IP 有什麼好處呢?由於他的私有路由不能對外直接提供資訊,所以,你的內部網路將不會直接被 Internet 上面的 Cracker 所攻擊!但是,你也就無法以私有 IP 來『直接上網』囉!因此相當適合一些尚未具有 Public IP 的企業內部用來規劃其網路之設定!否則當你隨便指定一些可能是 Public IP 的網段來規劃你企業內部的網路設定時,萬一哪一天真的連上 Internet 了,那麼豈不是可能會造成跟 Internet 上面的 Public IP 相同了嗎?

此外,在沒有可用的公開網路情況下,如果你想要跟同學玩連線遊戲怎辦?也就是說,在區網內自己玩自己的連線遊戲, 此時你只要規範好所有同學在同一段私有 IP 網段中,就能夠順利的玩你的網路啦!就這麼簡單呢!

那麼萬一你又要將這些私有 IP 送上 Internet 呢?這個簡單,設定一個簡單的防火牆加上 NAT (Network Address Transfer) 服務,你就可以透過 IP 偽裝 (不要急,這個在後面也會提到) 來使你的私有 IP 的電腦也可以連上 Internet 囉!


2.3.4 Netmask, 子網路與 CIDR (Classless Interdomain Routing)

我們前面談到 IP 是有等級的,而設定在一般電腦系統上面的則是 Class A, B, C。現在我們來想一想,如果我們設定一個區網, 使用的是 Class A ,那麼我們很容易就會想到,哪有這麼多電腦可以設定在同一個 Class A 的區段內 (256x256x256-2=16777214) ? 而且,假設真有這麼多電腦好了,回想一下 CSMA/CD 吧,你的網路恐怕會一直非常停頓,因為妳得要接到一千多萬台電腦對你的廣播... 光是想到一千多萬台的廣播,你的網路還能使用嗎?真沒效率!

此外,分為 Class 的 IP 等級,是為了管理方面的考量,事實上,我們不可能將一個 Class A 僅劃定為一個區網。舉例來說, 我們崑山取得的 Public IP 是 120.xxx 開頭的,但是其實我們只有 120.114.xxx.xxx 而已,並沒有取得整個 Class A 喔! 因為我們學校也用不了這麼多嘛!這個時候,我們就得要理解一下囉,就是,怎麼將 Class A 的網段變小?換句話說, 我們如何將網域切的更細呢?這樣不就可以分出更多段的區網給大家設定了?

前面我們提到 IP 這個 32 位元的數值中分為網域號碼與主機號碼,其中 Class C 的網域號碼佔了 24 位元,而其實我們還可以將這樣的網域切的更細,就是讓第一個 Host_ID 被拿來作為 Net_ID ,所以,整個 Net_ID 就有 25 bits ,至於 Host_ID 則減少為 7 bits 。在這樣的情況下,原來的一個 Class C 的網域就可以被切分為兩個子網域,而每個子網域就有『 256/2 - 2 = 126 』個可用的 IP 了!這樣一來,就能夠將原本的一個網域切為兩個較細小的網域,方便分門別類的設計喔。


2.3.5 路由概念

我們知道在同一個區網裡面,可以透過 IP 廣播的方式來達到資料傳遞的目的。但如果是非區網內的資料呢? 這時就得要透過那個所謂的郵局 (路由器) 的幫忙了!這也是網路層非常重要的概念喔!先來看看什麼是區網吧!

例題:
請問 192.168.10.100/25 與 192.168.10.200/25 是否在同一個網域內?
答:
如果經過計算,會發現 192.168.10.100 的 Network 為 192.168.10.0 ,但是 192.168.10.200 的 Network 卻是 192.168.10.128,由於 Net_ID 不相同,所以當然不在同一個網段內! 關於 Network 與 Netmask 的算法則請參考上一小節。

如上題所述,那麼這兩個網段的資料無法透過廣播來達到資料的傳遞啊,那怎辦? 此時就得要經過 IP 的路徑選擇 (routing) 功能啦!我們以下面圖示的例子來做說明。 下列圖示當中共有兩個不同的網段,分別是 Network A 與 Network B,這兩個網段是經由一部路由器 (Server A) 來進行資料轉遞的,好了,那麼當 PC01 這部主機想要傳送資料到 PC11 時, 他的 IP 封包該如何傳輸呢?

簡易的路由示意圖
圖 2.3-2、簡易的路由示意圖

我們知道 Network A(192.168.0.0/24) 與 Network B(192.168.1.0/24) 是不同網段,所以 PC01 與 PC11 是不能直接互通資料的。不過, PC01 與 PC11 是如何知道他們兩個不在同一個網段內?這當然是透過 Net_ID 來發現的!那麼當主機想要傳送資料時,他主要的參考是啥? 很簡單!是『路由表 (route table)』,每部主機都有自己的路由表』, 讓我們來看一看預設的情況下, PC01 要如何將資料傳送到 PC02 呢?

  1. 查詢 IP 封包的目標 IP 位址
    當 PC01 有 IP 封包需要傳送時,主機會查閱 IP 封包表頭的目標 IP 位址;

  2. 查詢是否位於本機所在的網域之路由設定
    PC01 主機會分析自己的路由表,當發現目標 IP 與本機 IP 的 Net_ID 相同時(同一網域),則 PC01 會直接透過區網功能,將資料直接傳送給目的地主機。

  3. 查詢預設路由 (default gateway)
    但在本案例中, PC01 與 PC11 並非同一網域,因此 PC01 會分析路由表當中是否有其他相符合的路由設定, 如果沒有的話,就直接將該 IP 封包送到預設路由器 (default gateway) 上頭去,在本案例當中 default gateway 則是 Server A 這一部。

  4. 送出封包至 gateway 後,不理會封包流向
    當 IP 由 PC01 送給 Server A 之後, PC01 就不理會接下來的工作。而 Server A 接收到這個封包後, 會依據上述的流程,也分析自己的路由資訊,然後向後繼續傳輸到正確的目的地主機上頭。
Gateway / Router :網關/路由器的功能就是在負責不同網域之間的封包轉遞 (IP Forwarding),由於路由器具有 IP Forwarding 的功能,並且具有管理路由的能力, 所以可以將來自不同網域之間的封包進行轉遞的功能。此外,你的主機與你主機設定的 Gateway 必定是在同一個網段內喔!

大致的情況就是這樣,所以每一部主機裡面都會存在著一個路由表 (Route table),資料的傳遞將依據這個路由表進行傳送!而一旦封包已經經由路由表的規則傳送出去後, 那麼主機本身就已經不再管封包的流向了,因為該封包的流向將是下一個主機 (也就是那部 Router) 來進行傳送,而 Router 在傳送時,也是依據 Router 自己的路由表來判斷該封包應該經由哪裡傳送出去的!整體來說,資料傳送有點像這樣:

路由的概念
圖 2.3-3、路由的概念

PC 01 要將資料送到 Server Bingo 去,則依據自己的路由表,將該封包送到 Server A 去,Server A 再繼續送到 Server B ,然後在一個一個的接力給他送下去,最後總是可以到達 Server Bingo 的。

上面的案例是一個很簡單的路由概念,事實上, Internet 上面的路由協定與變化是相當複雜的,因為 Internet 上面的路由並不是靜態的,他可以隨時因為環境的變化而修訂每個封包的傳送方向。 舉例來說,數年前在新竹因為土木施工導致台灣西部整個網路纜線的中斷。 不過南北的網路竟然還是能通,為什麼呢?因為路由已經判斷出西部纜線的終止, 因此他自動的導向台灣東部的花蓮路線,雖然如此一來繞了一大圈,而且造成網路的大塞車, 不過封包還是能通就是了!這個例子僅是想告訴大家,我們上面提的路由僅是一個很簡單的靜態路由情況, 如果想要更深入的瞭解 route ,請自行參考相關書籍喔! ^_^ 。

此外,在屬於 Public 的 Internet 環境中,由於最早時的 IP 分配都已經配置妥當, 所以各單位的路由一經設定妥當後,上層的路由則無須擔心啊!IP 的分配可以參考底下的網頁:


2.3.6 觀察主機路由: route

既然路由是這麼的重要,而且『路由一旦設定錯誤, 將會造成某些封包完全無法正確的送出去!』 所以我們當然需要好好的來觀察一下我們主機的路由表啦!還是請再注意一下, 每一部主機都有自己的路由表喔!觀察路由表的指令很簡單,就是 route ,這個指令挺難的,我們在後面章節再繼續的介紹,這裡僅說明一些比較簡單的用法:

[root@www ~]# route [-n]
選項與參數:
-n : 將主機名稱以 IP 的方式顯示

[root@www ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref  Use Iface
192.168.0.0     *               255.255.255.0   U     0      0      0 eth0
127.0.0.0       *               255.0.0.0       U     0      0      0 lo
default         192.168.0.254   0.0.0.0         UG    0      0      0 eth0

[root@www ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref  Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0      0 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0      0 lo
0.0.0.0         192.168.0.254   0.0.0.0         UG    0      0      0 eth0

# 上面輸出的資料共有八個欄位,你需要注意的有幾個地方:
# Destination :其實就是 Network 的意思;
# Gateway     :就是該介面的 Gateway 那個 IP 啦!若為 0.0.0.0 表示不需要額外的 IP;
# Genmask     :就是 Netmask 啦!與 Destination 組合成為一部主機或網域;
# Flags       :共有多個旗標可以來表示該網域或主機代表的意義:
#               U:代表該路由可用;
#               G:代表該網域需要經由 Gateway 來幫忙轉遞;
#               H:代表該行路由為一部主機,而非一整個網域;
# Iface       :就是 Interface (介面) 的意思。

在上面的例子當中,鳥哥是以 PC 01 這部主機的路由狀態來進行說明。由於 PC 01 為 192.168.0.0/24 這個網域,所以主機已經建立了這個網域的路由了,那就是『 192.168.0.0 * 255.255.255.0 ... 』那一行所顯示的訊息!當你下達 route 時, 螢幕上說明了這部機器上面共有三個路由規則,第一欄為『目的地的網域』,例如 192.168.0.0 就是一個網域咯,最後一欄顯示的是 『要去到這個目的地要使用哪一個網路介面!』例如 eth0 就是網路卡的裝置代號啦。如果我們要傳送的封包在路由規則裡面的 192.168.0.0/255.255.255.0 或者 127.0.0.0/255.0.0.0 裡面時,因為第二欄 Gateway 為 * ,所以就會直接以後面的網路介面來傳送出去,而不透過 Gateway 咯!

萬一我們要傳送的封包目的地 IP 不在路由規則裡面,那麼就會將封包傳送到『default』所在的那個路由規則去,也就是 192.168.0.254 那個 Gateway 喔!所以,幾乎每一部主機都會有一個 default gateway 來幫他們負責所有非網域內的封包轉遞!這是很重要的概念喔!^_^! 關於更多的路由功能與設定方法,我們在後面的『簡易 Router 架設』 當中會再次的提及呢!


2.3.7 IP 與 MAC:鏈結層的 ARP 與 RARP 協定

現在我們知道 Internet 上面最重要的就是那個 IP 了,也會計算所謂的區域網路與路由。 但是,事實上用在傳遞資料的明明就是乙太網路啊!乙太網路主要是用網卡卡號 (MAC) 的嘛!這就有問題啦!那這兩者 (IP 與 MAC) 勢必有一個關連性存在吧?沒錯!那就是我們要談到的 ARP (Address Resolution Protocol, 網路位址解析) 協定,以及 RARP (Revers ARP, 反向網路位址解析)

當我們想要瞭解某個 IP 其實是設定於某張乙太網路卡上頭時,我們的主機會對整個區網發送出 ARP 封包, 對方收到 ARP 封包後就會回傳他的 MAC 給我們,我們的主機就會知道對方所在的網卡,那接下來就能夠開始傳遞資料囉。 如果每次要傳送都得要重新來一遍這個 ARP 協定那不是很煩?因此,當使用 ARP 協定取得目標 IP 與他網卡卡號後, 就會將該筆記錄寫入我們主機的 ARP table 中 (記憶體內的資料) 記錄 20 分鐘 (註14)。

例題:
如何取得自己本機的網卡卡號 (MAC)
答:
在 Linux 環境下
[root@www ~]# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:01:03:43:E5:34
          inet addr:192.168.1.100   Bcast:192.168.1.255   Mask:255.255.255.0
          inet6 addr: fe80::201:3ff:fe43:e534/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
.....

在 Windows 環境下
C:\Documents and Settings\admin..> ipconfig /all
....
        Physical Address. . . . . . . . . : 00-01-03-43-E5-34
....

那如何取得本機的 ARP 表格內的 IP/MAC 對應資料呢?就透過 arp 這個指令吧!

[root@www ~]# arp -[nd] hostname
[root@www ~]# arp -s hostname(IP) Hardware_address
選項與參數:
-n :將主機名稱以 IP 的型態顯示
-d :將 hostname 的 hardware_address 由 ARP table 當中刪除掉
-s :設定某個 IP 或 hostname 的 MAC 到 ARP table 當中 

範例一:列出目前主機上面記載的 IP/MAC 對應的 ARP 表格
[root@www ~]# arp -n
Address            HWtype  HWaddress           Flags Mask    Iface
192.168.1.100      ether   00:01:03:01:02:03      C          eth0
192.168.1.240      ether   00:01:03:01:DE:0A      C          eth0
192.168.1.254      ether   00:01:03:55:74:AB      C          eth0

範例二:將 192.168.1.100 那部主機的網卡卡號直接寫入 ARP 表格中
[root@www ~]# arp -s 192.168.1.100  01:00:2D:23:A1:0E
# 這個指令的目的在建立靜態 ARP 

如同上面提到的,當你發送 ARP 封包取得的 IP/MAC 對應,這個記錄的 ARP table 是動態的資訊 (一般保留 20 分鐘),他會隨時隨著你的網域裡面電腦的 IP 更動而變化,所以,即使你常常更動你的電腦 IP,不要擔心,因為 ARP table 會自動的重新對應 IP 與 MAC 的表格內容!但如果你有特殊需求的話, 也可以利用『 arp -s 』這個選項來定義靜態的 ARP 對應喔!


2.3.8 ICMP 協定

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

類別代號類別名稱與意義
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 封包也不應該全部都擋掉喔!


2.4 TCP/IP 的傳輸層相關封包與資料

網路層的 IP 封包只負責將資料送到正確的目標主機去,但這個封包到底會不會被接受,或者是有沒有被正確的接收, 那就不是 IP 的任務啦!那是傳送層的任務之一。從 圖 2.1-4 我們可以看到傳送層有兩個重點, 一個是連接導向的 TCP 封包,一個是非連接導向的 UDP 封包,這兩個封包很重要啊!資料能不能正確的被送達目的, 與這兩個封包有關喔!


2.4.1 可靠連線的 TCP 協定

在前面的 OSI 七層協定當中,在網路層的 IP 之上則是傳送層,而傳送層的資料打包成什麼? 最常見的就是 TCP 封包了。這個 TCP 封包資料必須要能夠放到 IP 的資料袋當中才行喔! 所以,我們將圖 2.1-4 簡化一下,將 MAC, IP 與 TCP 的封包資料這樣看:

各封包之間的相關性
圖 2.4-1、各封包之間的相關性

想當然爾,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
圖 2.4-2、TCP 封包的表頭資料

上圖就是一個 TCP 封包的表頭資料,各個項目以 Source Port, Destination Port 及 Code 算是比較重要的項目,底下我們就分別來談一談各個表頭資料的內容吧!

談完了 TCP 表頭資料後,再來讓我們瞭解一下這個表頭裡面最重要的埠口資訊吧!


2.4.2 TCP 的三向交握

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

三向交握之封包連接模式
圖 2.4-3、三向交握之封包連接模式

在上面的封包連接模式當中,在建立連線之前都必須要通過三個確認的動作, 所以這種連線方式也就被稱為三向交握(Three-way handshake)。 那麼我們將整個流程依據上面的 A, B, C, D 四個階段來說明一下:

也就是說,你必須要瞭解『網路是雙向的』這個事實! 所以不論是伺服器端還是用戶端,都必須要透過一次 SYN 與 ACK 來建立連線,所以總共會進行三次的交談! 在設定防火牆或者是追蹤網路連線的問題時,這個『雙向』的概念最容易被忽略, 而常常導致無法連線成功的問題啊!切記切記!

鳥哥上課談到 TCP 最常做的事就是,叫一個同學起來,實際表演三向交握給大家看!
1. 鳥哥說:A同學你在不在?
2. A同學說:我在!那鳥哥你在不在?
3. 鳥哥說:我也在
此時兩個人就確認彼此都可以聽到對方在講啥,這就是可靠連線啦! ^_^

2.4.3 非連接導向的 UDP 協定

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

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

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

另外,很多的軟體其實是同時提供 TCP 與 UDP 的傳輸協定的,舉例來說,查詢主機名稱的 DNS 服務就同時提供了 UDP/TCP 協定。由於 UDP 較為快速,所以我們 client 端可以先使用 UDP 來與伺服器連線。 但是當使用 UDP 連線卻還是無法取得正確的資料時,便轉換為較為可靠的 TCP 傳輸協定來進行資料的傳輸囉。 這樣可以同時兼顧快速與可靠的傳輸說!

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

2.4.4 網路防火牆與 OSI 七層協定

由上面的說明當中,我們知道資料的傳送其實就是封包的發出與接受的動作啦!並且不同的封包上面都有不一樣的表頭 (header),此外,封包上面通常都會具有四個基本的資訊,那就是 socket pair 裡面提到的『來源與目的 IP 以及來源與目的端的 port number』 。當然啦,如果是可靠性連線的 TCP 封包,還包含 Control Flag 裡面的 SYN/ACK 等等重要的資訊呢!好了,開始動一動腦筋,有沒有想到『網路防火牆』的字眼啊?

封包過濾式的網路防火牆可以抵擋掉一些可能有問題的封包, Linux 系統上面是怎麼擋掉封包的呢?其實說來也是很簡單,既然封包的表頭上面已經有這麼多的重要資訊, 那麼我就利用一些防火牆機制與軟體來進行封包表頭的分析,並且設定分析的規則,當發現某些特定的 IP 、特定的埠口或者是特定的封包資訊(SYN/ACK等等),那麼就將該封包給他丟棄, 那就是最基本的防火牆原理了!

舉例來說,大家都知道 Telnet 這個伺服器是挺危險的,而 Telnet 使用的 port number 為 23 ,所以,當我們使用軟體去分析要送進我們主機的封包時, 只要發現該封包的目的地是我們主機的 port 23 ,就將該封包丟掉去!那就是最基本的防火牆案例啦! 如果以 OSI 七層協定來說,每一層可以抵擋的資料有:

更多的防火牆資訊我們會在後頭的『簡易防火牆』與 『認識網路安全』當中進行更多的說明喔!


2.5 連上 Internet 前的準備事項

講了這麼多,其實我們最需要的僅是『連接上 Internet 』啦!那麼在 Internet 上面其實使用的是 TCP/IP 這個通訊協定,所以我們就需要 Public IP 來連接上 Internet 啊!你說對吧∼ 不過,你有沒有發現一件事,那就是『為啥我不知道 Yahoo 的主機 IP ,但是俺的主機卻可以連到 Yahoo 主機上?』 如果你有發現這個問題的話,哈哈!你可以準備開始設定網路囉∼ ^_^


2.5.1 用 IP 上網?主機名稱上網?DNS 系統?

講完了上頭的基本資料,現在你知道要連上 Internet 就得要有 TCP/IP 才行!尤其是那重要的 IP 啊! 問題是,電腦網路是依據人類的需要來建立的,不過人類對於 IP 這一類的數字並不具有敏感性,即使 IP 已經被簡化為十進位了,但是人類就是對數字沒有辦法啊!怎麼辦?沒關係,反正電腦都有主機名稱嘛! 那麼我就將主機名稱與他的 IP 對應起來,未來要連接上該電腦時,只要知道該電腦的主機名稱就好了,因為 IP 已經對應到主機名稱了嘛!所以人類也容易記憶文字類的主機名稱,電腦也可以藉由對應來找到他必須要知道的 IP ,啊!真是皆大歡喜啊!

這個主機名稱 (Hostname) 對應 IP 的系統,就是鼎鼎有名的 Domain Name System (DNS) 咯!也就是說, DNS 這個服務的最大功能就是在進行『主機名稱與該主機的 IP 的對應』的一項協定。 DNS 在網路環境當中是相當常被使用到的一項協定喔!舉個例子來說,像鳥哥我常常會連到奇摩雅虎的 WWW 網站去看最新的新聞,那麼我一定需要將奇摩雅虎的 WWW 網站的 IP 背下來嗎?天吶, 鳥哥的忘性這麼好,怎麼可能將 IP 背下來?!不過,如果是要將奇摩站的主機名稱背下來的話, 那就容易的多了!不就是 http://tw.yahoo.com 嗎?而既然電腦主機只認識 IP 而已, 因此當我在瀏覽器上面輸入了『http://tw.yahoo.com』的時後,我的電腦首先就會藉由向 DNS 主機查詢 tw.yahoo.com 的 IP 後,再將查詢到的 IP 結果回應給我的瀏覽器, 那麼我的瀏覽器就可以藉由該 IP 來連接上主機啦!

發現了嗎?我的電腦必須要向 DNS 伺服器查詢 Hostname 對應 IP 的資訊 喔!那麼那部 DNS 主機的 IP 就必須要在我的電腦裡面設定好才行,並且必須要是輸入 IP 喔,不然我的電腦怎麼連到 DNS 伺服器去要求資料呢?呵呵!在 Linux 裡面,DNS 主機 IP 的設定就是在 /etc/resolv.conf 這個檔案裡面啦!

目前各大 ISP 都有提供他們的 DNS 伺服器的 IP 給他們的用戶,好設定客戶自己電腦的 DNS 查詢主機, 不過,如果你忘記了或者是你使用的環境中並沒有提供 DNS 主機呢?呵呵!沒有關係, 那就設定 Hinet 那個最大的 DNS 伺服器吧! IP 是 168.95.1.1 咯!要設定好 DNS 之後,未來上網瀏覽時,才能使用主機名稱喔!不然就得一定需要使用 IP 才能上網呢!DNS 是很重要的,他的原理也頂複雜的,更詳細的原理我們在後面的 『DNS 伺服器架設』裡面進行更多更詳細的說明喔!這裡僅提個大綱!


2.5.2 一組可以連上 Internet 的必要網路參數

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

其中,由於 Network 與 Broadcast 可以經由 IP/Netmask 的計算而得到,因此需要設定於你 PC 端的網路參數, 主要就是 IP, Netmask, Default Gateway, DNS 這四個就是了!

沒錯!就是這些資料!如果你是使用 ADSL 撥接來上網的話,上面這些資料都是由 ISP 直接給你的,那你只要使用撥接程式進行撥接到 ISP 的工作之後, 這些資料就自動的在你的主機上面設定完成了!但是如果是固定制 (如學術網路) 的話,那麼就得自行使用上面的參數來設定你的主機囉!缺一不可呢!以 192.168.1.0/24 這個 Class C 為例的話,那麼你就必須要在你的主機上面設定好底下的參數:


2.6 重點回顧:

2.7 本章習題

2.8 參考資料與延伸閱讀
特別感謝:
本文在 2002/07 發出之後,收到相當多朋友的關心,也從而發現了自己誤會的一些基礎的網路理論,真的是感謝好朋友 Netman 兄與 ZMAN 兄的指導!這篇短文在 2003/08/03 做了相當大幅度的修訂,與原來的文章 (上次更新日期 2002/09) 已經有一定程度的差異了,希望網友們如果有時間的話,能夠再次的閱讀, 以釐清一些基本概念喔!

2002/07/18:第一次完成日期!
2002/09/26:修改了部分可能引起誤解的文章部分!
2003/08/03:重新編排版面,並且重新檢視文章內容,修訂文章!
2003/08/20:增加重點回顧與課後練習
2003/09/06:加入參考用解答
2004/03/16:修訂 N-Way 的錯誤,訂正為 Auto MDI/MDIX 的功能!
2006/02/09:將舊的文章移動到 此處
2006/07/12:參考了粘教授與風信子兄的書籍,修改了很多基礎資料喔!還有重點整理,不過,練習尚未更新
2006/07/16:加入習題練習囉!
2007/10/21:圖14那個 UDP 的表頭資料中,16 bits 誤植為 16 bytes,感謝討論區 ricky.liu 的告知!
2008/04/21:經由網友 chyanlong 兄的指點,IHL 的大小單位誤植為 byte,應該是字組 (word) 才對。
2010/07/22:將基於 CentOS4.x 所寫的資料放置於此處
2010/08/15:將章節依據 TCP/IP 相關的層級分別介紹,更改的幅度不小喔!