最近更新日期:2011/07/15
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) 的概念囉! 如果以圖示來說,那麼這七個階層的相關性有點像底下這樣: 圖 2.1-2、OSI 七層協定各階層的相關性 依據定義來說,越接近硬體的階層為底層 (layer 1),越接近應用程式的則是高層 (layer 7)。 不論是接收端還是發送端,每個一階層只認識對方的同一階層資料。 而整個傳送的過程就好像人們在玩整人遊戲一般,我們透過應用程式將資料放入第七層的包裹,再將第七層的包裹放到第六層的包裹內, 依序一直放到第一層的最大的包裹內,然後傳送出去給接收端。接收端的主機就得由第一個包裹開始,依序將每個包裹拆開, 然後一個一個交給對應負責的階層來視察!這就是整人遊戲...喔!是 OSI 七層協定在階層定義方面需要注意的特色。 既然說是包裹,那我們都知道,包裹表面都會有個重要的資訊,這些資訊包括有來自哪裡、要去哪裡、接收者是誰等等, 而包裹裡面才是真正的資料。同樣的,在七層協定中,每層都會有自己獨特的表頭資料 (header),告知對方這裡面的資訊是什麼, 而真正的資料就附在後頭囉!我們可以使用如下的圖示來表示這七層每一層的名字,以及資料是如何放置到每一層的包裹內: 圖 2.1-3、OSI 七層協定資料的傳遞方式 上圖中仔細看每個資料包的部分,上層的包裹是放入下層的資料中,而資料前面則是這個資料的表頭。其中比較特殊的是第二層, 因為第二層 (資料鏈結層) 主要是位於軟體封包 (packet) 以及硬體訊框 (frame) 中間的一個階層, 他必須要將軟體包裝的包裹放入到硬體能夠處理的包裹中,因此這個階層又分為兩個子層在處理相對應的資料。 因為比較特殊,所以您瞧瞧,第二層的資料格式比較不一樣喔,尾端還出現一個檢查碼哩∼ 每一個階層所負責的任務是什麼呢?簡單的說,每一層負責的任務如下:(註6, 註8, 註9)
事實上, 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 七層協定簡化而來,那麼這兩者之間有沒有什麼相關性呢?它們的相關性可以圖示如下, 同時這裡也列出目前在這架構底下常見的通訊協定、封包格式與相關標準: 圖 2.1-4、OSI 與 TCP/IP 協定之相關性 從上圖中,我們可以發現 TCP/IP 將應用、表現、會談三層整合成一個應用層,在應用層上面可以實作的程式協定有 HTTP, SMTP, DNS 等等。 傳送層則沒有變,不過依據傳送的可靠性又將封包格式分為連接導向的 TCP 及非連接導向的 UDP 封包格式。網路層也沒有變,主要內容是提供了 IP 封包,並可選擇最佳路由來到達目標 IP 位址。資料鏈結層與實體層則整合成為一個鏈結層,包括定義硬體訊號、 訊框轉位元串的編碼等等,因此主要與硬體 (不論是區網還是廣域網路) 有關。 那 TCP/IP 是如何運作的呢?我們就拿妳常常連上的 Yahoo 入口網站來做個說明好了,整個連線的狀態可以這樣看:
等到 Yahoo 收到你的包裹後,在依據相反方向拆解開來,然後交給對應的層級進行分析,最後就讓 Yahoo 的 WWW 伺服器軟體得到你所想要的資料,該伺服器軟體再根據你的要求,取得正確的資料後,又依循上述的流程,一層一層的包裝起來, 最後傳送到你的手上!就是這樣囉! 根據這樣的流程,我們就得要知道每個分層所需要瞭解的基礎知識,這樣才算學習網路基礎嘛!所以底下我們會依據 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 乙太網路』一書,該書內容相當的有趣,挺適合閱讀的吶。
底下我們僅做個簡單的介紹而已。
乙太網路的流行主要是它成為國際公認的標準所致。早先 IEEE 所制訂的乙太網路標準為 802.3 的 IEEE 10BASE5 ,這個標準主要的定義是:『10 代表傳輸速度為 10Mbps,BASE 表示採用基頻信號來進行傳輸,至於 5 則是指每個網路節點之間最長可達 500 公尺。』 由於網路的傳輸資訊就是 0 與 1 啊,因此,資料傳輸的單位為每秒多少 bit , 亦即是 M bits/second, Mbps 的意思。那麼為何制訂成為 10Mbps 呢? 這是因為早期的網路線壓製的方法以及相關的製作方法,還有乙太網路卡製作的技術並不是很好, 加上當時的資料傳輸需求並沒有像現在這麼高,所以 10Mbps 已經可以符合大多數人的需求了。
早期的網路線使用的是舊式的同軸電纜線,這種線路在現在幾乎已經看不到了。取而代之的是類似傳統電話線的雙絞線 (Twisted Pair Ethernet) ,IEEE 並將這種線路的乙太網路傳輸方法制訂成為 10BASE-T 的標準。 10BASE-T 使用的是 10 Mbps 全速運作且採用無遮蔽式雙絞線 (UTP) 的網路線。此外, 10BASE-T 的 UTP 網路線可以使用星形連線(star), 也就是以一個集線器為中心來串連各網路設備的一個方法,圖 2.1-1 就是星形連線的一個示意圖。 不同於早期以一條同軸電纜線連結所有的電腦的 bus 連線,透過星形連線的幫助, 我們可以很簡單的加裝其他的設備或者是移除其他設備,而不會受到其他裝置的影響,這對網路設備的擴充性與除錯來說, 都是一項相當棒的設計!也因此 10BASE-T 讓乙太網路設備的銷售額大幅提昇啊! 後來 IEEE 更制訂了 802.3u 這個支援到 100Mbps 傳輸速度的 100BASE-T 標準,這個標準與 10BASE-T 差異不大, 只是雙絞線線材製作需要更精良,同時也已經支援使用了四對絞線的網路線了, 也就是目前很常見的八蕊網路線吶!這種網路線我們常稱為等級五 (Category 5, CAT5) 的網路線。 這種傳輸速度的乙太網路就被稱為 Fast ethernet 。至於目前我們常常聽到的 Gigabit 網路速度 1000 Mbps 又是什麼吶?那就是 Gigabit ethernet 哩!只是 Gigabit ethernet 的網路線就需要更加的精良。
為什麼每當傳輸速度增加時,網路線的要求就更嚴格呢?這是因為當傳輸速度增加時,線材的電磁效應相互干擾會增強,
因此在網路線的製作時就得需要特別注意線材的質料以及內部線蕊心之間的纏繞情況配置等,
以使電子流之間的電磁干擾降到最小,才能使傳輸速度提升到應有的 Gigabit 。
所以說,在乙太網路世界當中,如果你想要提升原有的 fast ethernet 到 gigabit ethernet 的話,
除了網路卡需要升級之外,主機與主機之間的網路線,
以及連接主機線路的集線器/交換器等,都必須要提升到可以支援 gigabit 速度等級的設備才行喔!
前面提到,網路的速度與線材是有一定程度的相關性的,那麼線材的接頭又是怎樣呢? 目前在乙太網路上最常見到的接頭就是 RJ-45 的網路接頭,共有八蕊的接頭,有點像是胖了的電話線接頭, 如下所示: 圖 2.2-1、RJ-45 接頭示意圖 而 RJ-45 接頭又因為每條蕊線的對應不同而分為 568A 與 568B 接頭,這兩款接頭內的蕊線對應如下表:
事實上,雖然目前的乙太網路線有八蕊且兩兩成對,但實際使用的只有 1,2,3,6 蕊而已, 其他的則是某些特殊用途的場合才會使用到。但由於主機與主機的連線以及主機與集線器的連線時, 所使用的網路線腳位定義並不相同,因此由於接頭的不同網路線又可分為兩種:
2.2.3 乙太網路的傳輸協定:CSMA/CD 整個乙太網路的重心就是乙太網路卡啦!所以說,乙太網路的傳輸主要就是網路卡對網路卡之間的資料傳遞而已。 每張乙太網路卡出廠時,就會賦予一個獨一無二的卡號,那就是所謂的 MAC (Media Access Control) 啦! 理論上,網卡卡號是不能修改的,不過某些筆記型電腦的網卡卡號是能夠修改的呦! 那麼乙太網路的網卡之間資料是如何傳輸的呢?那就得要談一下 IEEE 802.3 的標準 CSMA/CD (Carrier Sense Multiple Access with Collision Detection) 了!我們以下圖來作為簡介,下圖內的中心點為集線器, 各個主機都是連線到集線器,然後透過集線器的功能向所有主機發起連線的。 圖 2.2-2、CSMA/CD連線示意圖,由 A 發送資料給 D 時,注意箭頭方向 集線器是一種網路共享媒體,什麼是網路共享媒體啊?想像一下上述的環境就像一個十字路口,而集線器就是那個路口! 這個路口一次只允許一輛車通過,如果兩輛車同時使用這個路口,那麼就會發生碰撞的車禍事件啊!那就是所謂的共享媒體。 也就是說,網路共享媒體在單一時間點內, 僅能被一部主機所使用。 理解了共享媒體的意義後,再來,我們就得要討論,那麼乙太網路的網卡之間是如何傳輸的呢?我們以上圖中的 A 要發給 D 網卡為例好了,簡單的說, CSMA/CD 搭配上述的環境,它的傳輸情況需要有以下的流程:
瞭解這個程序很重要嗎?我們就來談談:
2.2.4 MAC 的封裝格式 上面提到的 CSMA/CD 傳送出去的訊框資料,其實就是 MAC 啦!MAC 其實就是我們上面一直講到的訊框 (frame) 囉! 只是這個訊框上面有兩個很重要的資料,就是目標與來源的網卡卡號,因此我們又簡稱網卡卡號為 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 相接嘛!所以,資料的流通會變成:
也就是說,只要透過 B (就是路由器) 才將封包送到另一個網域 (IP 部分會講) 去的時候, 那麼訊框內的硬體位址就會被改變,然後才能夠在同一個網域裡面直接進行訊框的流通啊!
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 嘛!
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 數)
在上面的圖示中有個地方要注意,那就是『每一行所佔用的位元數為 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 最小可以由 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) 就是網域號碼,最後面一組數字則稱為主機號碼。 至於同一個網域的定義是『在同一個物理網段內,主機的 IP 具有相同的 Net_ID ,並且具有獨特的 Host_ID』,那麼這些 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
衝突,可能會造成兩部主機都沒有辦法使用網路的問題!
那麼同一個網域該怎麼設定,與將 IP 設定在同一個網域之內有什麼好處呢?
所以說,貴單位公司內的電腦群,或者是你宿舍或家裡面的所有電腦,當然都設定在同一個網域內是最方便的,
因為如此一來每一部電腦都可以直接透過 MAC 來進行資料的交流,而不必經由
Router (路由器) 來進行封包的轉遞呢!(Router
這部份在第八章才會提及)。
剛接觸到 IP 組成的朋友都很困擾,又分啥網域號碼與主機號碼,煩死了!其實,你不用煩惱啊!使用門牌號碼的概念來想即可。 既然 IP 是門牌,那拿我們崑山科技大學的門牌來說好了,我們的門牌是:『台南市永康區大灣路 949 號』, 假設整個大灣路是同一個巷弄,那麼我們這個門牌的網域號碼『台南市永康區大灣路』而我的主機號碼就是『 949 號』, 那麼整條大灣路上面只要是開頭為『台南市永康區大灣路』的,就是跟我們同一個網域囉!當然啦,門牌號碼不可能有第二個 949 號啊!這樣理解否? 另外,Host_ID 全為 0 與全為 1 (二進位的概念) 時,代表整條巷子的第一個與最後一個門牌,而第一個門牌我們讓他代表整條巷子, 所以又稱為 Network IP,就是巷子口那個 XXX 巷的立牌啦!至於最後一個 IP ,則代表巷子尾,亦即本條巷子的最後一個門牌, 那就是我們在巷子內廣播時的最後一個 IP ,又稱為 Broadcast IP 的囉。 在我們這個巷子內,我們可以透過大聲公用廣播的方式跟大家溝通訊息,例如前幾年很熱門的張君雅小妹妹的泡麵廣告, 在巷子內透過廣播告訴張君雅小妹妹,你阿嬤將泡麵煮好了,趕快回家吃麵去!那如果不是張君雅小妹妹呢?就將該訊息略過啊! 這樣有沒有聯想到 CSMA/CD 的概念呢? 那如果你的資料不是要給本巷子內的門牌呢?此時你就得要將資料拿給巷子內的郵局 (路由器),由郵局幫你傳送,
你只要知道巷子內的那間郵局在哪裡即可,其他的就讓郵局自己幫你把信件傳出去即可啊!這就是整個區網與門牌對應的想法!
這樣有沒有比較清晰啊?
你應該要想到一個問題,那就是我的總門牌『台南市永康區大灣路 949 號』中,到哪裡是巷子而到哪裡是門牌? 如果到『台南市』是巷子,那麼我的門牌將有好多鄉鎮的組成,如果巷子號碼到『台南市永康區』時, 那麼我們的門牌就又少了點。所以說,這個『巷子』的大小,將會影響到我們主機號碼的數量! 為了解決這個問題,以及為了 IP 管理與發放註冊的方便性,InterNIC 將整個 IP 網段分為五種等級, 每種等級的範圍主要與 IP 那 32 bits 數值的前面幾個位元有關,基本定義如下:
根據上表的說明,我們可以知道,你只要知道 IP 的第一個十進位數字,就能夠約略瞭解到該 IP 屬於哪一個等級, 以及同網域 IP 數量有多少。這也是為啥我們上頭選了 192.168.0.0 這一 IP 網段來說明時,會將巷子定義到第三個數字之故。 不過,上表中你只要記憶三種等級,亦即是 Class A, B, C 即可,因為 Class D 是用來作為群播 (multicast) 的特殊功能之用 (最常用在大批電腦的網路還原),至於 Class E 則是保留沒有使用的網段。因此,能夠用來設定在一般系統上面的,就只有 Class A, B, C 三種等級的 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 囉!
好了,那麼除了這個預留的 IP 網段的問題之外,還有沒有什麼其他的怪東西呢?當然是有啦!不然鳥哥幹嘛花時間來唬 XX 呢?沒錯,還有一個奇怪的 Class A 的網域,那就是 lo 這個奇怪的網域啦 (注意:是小寫的 o 而不是零喔)!這個 lo 的網路是當初被用來作為測試作業系統內部迴圈所用的一個網域,同時也能夠提供給系統內部原本就需要使用網路介面的服務 (daemon) 所使用。 簡單的說,如果你沒有安裝網路卡在的機器上面, 但是你又希望可以測試一下在你的機器上面設定的伺服器環境到底可不可以順利運作,這個時候怎麼辦, 嘿嘿!就是利用這個所謂的內部迴圈網路啦!這個網段在 127.0.0.0/8 這個 Class A,而且預設的主機 (localhost) 的 IP 是 127.0.0.1 呦!所以囉,當你啟動了你的 WWW 伺服器,然後在你的主機的 X-Window 上面執行 http://localhost 就可以直接看到你的主頁囉!而且不需要安裝網路卡呢!測試很方便吧! 此外,你的內部使用的 mail 怎麼運送郵件呢?例如你的主機系統如何
mail 給 root 這個人呢?嘿嘿!也就是使用這一個內部迴圈啦!當要測試你的
TCP/IP 封包與狀態是否正常時,可以使用這個呦!(所以哪一天有人問你嘿!你的主機上面沒有網路卡,
那麼你可以測試你的 WWW 伺服器設定是否正確嗎?這個時候可得回答:當然可以囉!使用 127.0.0.1
這個 Address 呀! ^_^ )
談完了 IP 的種類與等級還有相關的子網域概念後,接下來我們得來瞭解一下,那麼主機的 IP 是如何設定的呢? 基本上,主機的 IP 與相關網域的設定方式主要有:
不管是使用上面哪種方式取得的 IP ,你的 IP 都只有所謂的『 Public 與 Private IP 』而已!而其他什麼浮動式、固定制、 動態式等等有的沒有的,就只是告訴你這個 IP 取得的方式而已。舉例來說,台灣地區 ADSL 撥接後取得的 IP 通常是 public IP, 但是鳥哥曾接到香港網友的來信,他們 ADSL 撥接後,取得的 IP 是 Private ,所以導致無法架設網站喔! 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
了!這樣一來,就能夠將原本的一個網域切為兩個較細小的網域,方便分門別類的設計喔。
那到底是什麼參數來達成子網路的切分呢?那就是 Netmask (子網路遮罩) 的用途啦!這個 Netmask 是用來定義出網域的最重要的一個參數了!不過他也最難理解了∼@_@。為了幫助大家比較容易記憶住 Netmask 的設定依據,底下我們介紹一個比較容易記憶的方法。同樣以 192.168.0.0 ~ 192.168.0.255 這個網域為範例好了,如下所示,這個 IP 網段可以分為 Net_ID 與 Host_ID,既然 Net_ID 是不可變的,那就假設他所佔據的 bits 已經被用光了 (全部為 1),而 Host_ID 是可變的,就將他想成是保留著 (全部為 0),所以, Netmask 的表示就成為:
將他轉成十進位的話,就成為『255.255.255.0』啦! 這樣記憶簡單多了吧!照這樣的記憶方法,那麼 A, B, C Class 的 Netmask 表示就成為這樣:
所以說, 192.168.0.0 ~ 192.168.0.255 這個 Class C 的網域中,他的 Netmask 就是 255.255.255.0 !再來,我們剛剛提到了當 Host_ID 全部為 0 以及全部為 1 的時後該 IP 是不可以使用的,因為 Host_ID 全部為 0 的時後,表示 IP 是該網段的 Network ,至於全部為 1 的時後就表示該網段最後一個 IP ,也稱為 Broadcast ,所以說,在 192.168.0.0 ~ 192.168.0.255 這個 IP 網段裡面的相關網路參數就有:
好了,剛剛提到 Class C 還可以繼續進行子網域 (Subnet) 的切分啊,以 192.168.0.0 ~192.168.0.255 這個情況為例,他要如何再細分為兩個子網域呢?我們已經知道 Host_ID 可以拿來當作 Net_ID,那麼 Net_ID 使用了 25 bits 時,就會如下所示:
所以說,當再細分下去時,就會得到兩個子網域,而兩個子網域還可以再細分下去喔 (Net_ID 用掉 26 bits ....)。呵呵!如果你真的能夠理解 IP, Network, Broadcast, Netmask 的話,恭喜你,未來的伺服器學習之路已經順暢了一半啦! ^_^
其實子網路的計算是有偷吃步的,我們知道 IP 是二進位,每個位元就是 2 的次方。又由於 IP 數量都是平均分配到每個子網路去, 所以,如果我們以 192.168.0.0 ~ 192.168.0.255 這個網段來說,要是給予 Net_ID 是 26 位元時,總共分為幾段呢? 因為 26-24=2 ,所以總共用掉兩個位元,因此有 2 的 2 次方,得到 4 個網段。再將 256 個 IP 平均分配到 4 個網段去, 那我們就可以知道這四個網段分別是:
有沒有變簡單的感覺啊?那你再想想,如果同樣一個網段,那 Net_ID 變成 27 個位元時,又該如何計算呢?自己算算看吧!
一般來說,如果我們知道了 Network 以及 Netmask 之後,就可以定義出該網域的所有 IP 了!因為由 Netmask 就可以推算出來 Broadcast 的 IP 啊!因此,我們常常會以 Network 以及 Netmask 來表示一個網域,例如這樣的寫法:
另外,既然 Netmask 裡面的 Net_ID 都是 1 ,那麼 Class C 共有 24 bits 的 Net_ID ,所以啦,就有類似上面 192.168.0.0/24 這樣的寫法囉!這就是一般網域的表示方法。 同理可證,在上述的偷吃步計算網域方法中,四個網段的寫法就可以寫成:
事實上,由於網路細分的情況太嚴重,為了擔心路由資訊過於龐大導致網路效能不佳,因此,某些特殊情況下, 我們反而是將 Net_ID 借用來作為 Host_ID 的情況!這樣就能夠將多個網域寫成一個啦!舉例來說,我們將 256 個 Class C 的私有 IP (192.168.0.0~192.168.255.255) 寫成一個路由資訊的話,那麼這個網段的寫法就會變成: 192.168.0.0/16,反而將 192 開頭的 Class C 變成 class B 的樣子了! 這種打破原本 IP 代表等級的方式 (透過 Netmask 的規範) 就被稱為無等級網域間路由 (CIDR) 囉! (註14) 老實說,你無須理會啥是無等級網域間路由啦!只要知道,那個 Network/Netmask 的寫法,通常就是 CIDR 的寫法! 然後,你也要知道如何透過 Netmask 去計算出 Network, Broadcast 及可用的 IP 等,那你的 IP 概念就相當完整了!^_^ 2.3.5 路由概念 我們知道在同一個區網裡面,可以透過 IP 廣播的方式來達到資料傳遞的目的。但如果是非區網內的資料呢? 這時就得要透過那個所謂的郵局 (路由器) 的幫忙了!這也是網路層非常重要的概念喔!先來看看什麼是區網吧!
如上題所述,那麼這兩個網段的資料無法透過廣播來達到資料的傳遞啊,那怎辦? 此時就得要經過 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 呢?
大致的情況就是這樣,所以每一部主機裡面都會存在著一個路由表 (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 ,這個指令挺難的,我們在後面章節再繼續的介紹,這裡僅說明一些比較簡單的用法:
在上面的例子當中,鳥哥是以 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 來幫他們負責所有非網域內的封包轉遞!這是很重要的概念喔!^_^! 關於更多的路由功能與設定方法,我們在第八章當中會再次的提及呢! 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)。
那如何取得本機的 ARP 表格內的 IP/MAC 對應資料呢?就透過 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):
那麼我們是如何利用 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 封包的表頭是長這個樣子的:
上圖就是一個 TCP 封包的表頭資料,各個項目以 Source Port, Destination Port 及 Code 算是比較重要的項目,底下我們就分別來談一談各個表頭資料的內容吧!
談完了 TCP 表頭資料後,再來讓我們瞭解一下這個表頭裡面最重要的埠口資訊吧!
在上圖的 TCP 表頭資料中,最重要的就屬那 16 位元的兩個咚咚,亦即來源與目標的埠口。由於是 16 位元,因此目標與來源埠口最大可達 65535 號 (2 的 16 次方)! 那這個埠口有什麼用途呢?上面稍微提到過,網路是雙向的,伺服器與用戶端要達成連線的話, 兩邊應該要有一個對應的埠口來達成連線通道,好讓資料可以透過這個通道來進行溝通。 那麼這個埠口怎麼打開呢?就是透過程式的執行!舉例來說,鳥哥的網站上,必須要啟動一個 WWW 伺服器軟體, 這個伺服器軟體會主動的喚起 port 80 來等待用戶端的連線。你想要看我網站上的資料,就得要利用瀏覽器, 填入網址,然後瀏覽器也會啟動一個埠口,並將 TCP 的表頭填寫目標埠口為 80 ,而來源埠口是你主機隨機啟動的一個埠口, 然後將 TCP 封包封裝到 IP 後,送出到網路上。等鳥站主機接收到你這個封包後,再依據你的埠口給予回應。 這麼說你或許不好理解,我們換個說法好了。假如 IP 是網路世界的門牌,那麼這個埠口就是那個門牌號碼上建築物的樓層! 每個建築物都有 1~65535 層樓,你需要什麼網路服務,就得要去該對應的樓層取得正確的資料。但那個樓層裡面有沒有人在服務你呢? 這就得要看有沒有程式真的在執行啦。所以,IP 是門牌,TCP 是樓層,真正提供服務的, 是在該樓層的那個人 (程式)!
你現在瞭解了埠口的意義後,再來想想,網路既然是雙向的,一定有一個發起端。問題是,到底要連線到伺服器取得啥玩意兒? 也就是說,哪支程式應該在哪個埠口執行,以讓大家都知道該埠口就是提供哪個服務,如此一來,才不會造成廣大用戶的困擾嘛! 所以囉,Internet 上面已經有很多規範好的固定 port (well-known port), 這些 port number 通常小於 1024 ,且是提供給許多知名的網路服務軟體用的。 在我們的 Linux 環境下,各網路服務與 port number 的對應預設給他寫在 /etc/services 檔案內喔! 底下鳥哥列出幾個常見的 port number 與網路服務的對應:
另外一點比較值得注意的是,小於 1024 以下的埠口要啟動時,
啟動者的身份必須要是 root 才行,所以才叫做特權埠口嘛!這個限制挺重要的,大家不要忘記了喔!
不過如果是 client 端的話,由於 client 端都是主動向 server 端要資料,
所以 client 端的 port number 就使用隨機取一個大於 1024 以上且沒有在用的 port number。
由於網路是雙向的,要達成連線的話得要伺服器與用戶端均提供了 IP 與埠口才行。 因此,我們常常將這個成對的資料稱之為 Socket Pair 了!
由於 IP 與埠口常常連在一起說明,因此網路定址常常使用『 IP:port 』來說明,例如想要連上鳥哥的網站時, 正確的鳥哥網站寫法應該是:『 linux.vbird.org:80 』才對! 2.4.2 TCP 的三向交握 TCP 被稱為可靠的連線封包,主要是透過許多機制來達成的,其中最重要的就是三向交握的功能。 當然, TCP 傳送資料的機制非常複雜,有興趣的朋友請自行參考相關網路書籍。 OK,那麼如何藉由 TCP 的表頭來確認這個封包有實際被對方接收,並進一步與對方主機達成連線? 我們以底下的圖示來作為說明。 圖 2.4-3、三向交握之封包連接模式 在上面的封包連接模式當中,在建立連線之前都必須要通過三個確認的動作, 所以這種連線方式也就被稱為三向交握(Three-way handshake)。 那麼我們將整個流程依據上面的 A, B, C, D 四個階段來說明一下:
也就是說,你必須要瞭解『網路是雙向的』這個事實! 所以不論是伺服器端還是用戶端,都必須要透過一次 SYN 與 ACK 來建立連線,所以總共會進行三次的交談! 在設定防火牆或者是追蹤網路連線的問題時,這個『雙向』的概念最容易被忽略, 而常常導致無法連線成功的問題啊!切記切記!
2.4.3 非連接導向的 UDP 協定 UDP 的全名是:『User Datagram Protocol, 用戶資料流協定』,UDP 與 TCP 不一樣, UDP 不提供可靠的傳輸模式,因為他不是連線導向的一個機制,這是因為在 UDP 的傳送過程中,接受端在接受到封包之後,不會回覆回應封包 (ACK) 給發送端,所以封包並沒有像 TCP 封包有較為嚴密的檢查機制。至於 UDP 的表頭資料如下表所示:
TCP 封包確實是比較可靠的,因為通過三向交握嘛!不過,也由於三向交握的緣故, TCP 封包的傳輸速度會較慢。 至於 UDP 封包由於不需要確認對方是否有正確的收到資料,故表頭資料較少,所以 UDP 就可以在 Data 處填入更多的資料了。同時 UDP 比較適合需要即時反應的一些資料流,例如影像即時傳送軟體等, 就可以使用這類的封包傳送。也就是說, UDP 傳輸協定並不考慮連線要求、連線終止與流量控制等特性, 所以使用的時機是當資料的正確性不很重要的情況,例如網路攝影機! 另外,很多的軟體其實是同時提供 TCP 與 UDP 的傳輸協定的,舉例來說,查詢主機名稱的 DNS 服務就同時提供了 UDP/TCP 協定。由於 UDP 較為快速,所以我們 client 端可以先使用 UDP 來與伺服器連線。 但是當使用 UDP 連線卻還是無法取得正確的資料時,便轉換為較為可靠的 TCP 傳輸協定來進行資料的傳輸囉。 這樣可以同時兼顧快速與可靠的傳輸說!
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) 已經有一定程度的差異了,第三版又針對整個內容與閱讀順序進行調整 (2010/08),希望網友們如果有時間的話,能夠再次的閱讀,以釐清一些基本概念喔!
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 相關的層級分別介紹,更改的幅度不小喔! 2011/07/15:將基於 CentOS 5.x 所撰寫的文章移動到此處 2002/07/18以來統計人數 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||