# 網絡操作
[TOC=2,3]
## 前言
前面章節已經介紹了Shell編程范例之數值、布爾值、字符串、文件、文件系統、進程等的操作。這些內容基本覆蓋了網絡中某個獨立機器正常工作的“方方面面”,現在需要把視角從單一的機器延伸到這些機器通過各種網絡設備和協議連接起來的網絡世界,分析網絡拓撲結構、網絡工作原理、了解各種常見網絡協議、各種常見硬件工作原理、網絡通信與安全相關軟件以及工作原理分析等。
不過,因為網絡相關的問題確實太復雜了,這里不可能介紹具體,因此如果想了解更多細節,還是建議參考相關資料。但Linux是一個網絡原理學習和實踐的好平臺,不僅因為它本身對網絡體系結構的實現是開放源代碼的,而且各種相關的分析工具和函數庫數不勝數,因此,如果你是學生,千萬不要錯過通過它來做相關的實踐工作。
## 網絡原理介紹
### 我們的網絡世界
在進行所有介紹之前,來直觀地感受一下那個真真實實存在的網絡世界吧。當我在 Linux 下通過 `Web` 編輯器寫這篇 Blog 時,一邊用 `mplayer` 聽著遠程音樂,累了時則打開蘭大的網絡 `TV` 頻道開始看看鳳凰衛視……這些“現代化”的生活,我想,如果沒有網絡,將變得無法想象。
下面來構想一下這樣一個網絡世界的優美圖畫:
> 一邊盯著顯示器,一邊敲擊著鍵盤,一邊掛著耳機。
> 主機電源燈燦爛得很,發著綠光,這時很容易想象主機背后的那個網卡位置肯定有兩個不同顏色的燈光在閃爍,它顯示著主機正在與計算機網絡世界打著交道。
> 就在實驗室的某個角落,有一個交換機上的一個網口的網線連到主機上,這個交換機接到了一個局域網的網關上,然后這個網關再接到了信息樓的某個路由器上,再轉接到學校網絡中心的另外一個路由器上……
> 期間,有一個路由器連接到了這個 Blog 服務器上,而另外一個則可能連到了那個網絡 `TV` 服務器上,還有呢,另外一些則連接到了電信網絡里頭的某個音樂服務器上……
下面用 `dia` 繪制一個簡單的“網絡地圖”:

該圖把一些最常見的網絡設備和網絡服務基本都呈現出來了,包括本地主機、路由、交換機、網橋,域名服務器,萬維網服務,視頻服務,防火墻服務,動態 `IP` 地址服務等。其中各種設備構成了整個物理網絡,而網絡服務則是構建在這些設備上的各種網絡應用。
現在的網絡應用越來越豐富多樣,比如即時聊天(`IM`)、 `p2p` 資源共享、網絡搜索等,它們是如何實現的,它們如何構建在各種各樣的網絡設備之上,并且能夠安全有效的工作呢?這取決于這背后逐步完善的網絡體系結構和各種相關網絡協議的開發、實現和應用。
### 網絡體系結構和網絡協議介紹
那么網絡體系結構是怎么樣的呢?涉及到哪些相關的網絡協議呢?什么又是網絡協議呢?
在《計算機網絡——自頂向下的方法》一書中非常巧妙地給出了網絡體系結構分層的比喻,把網絡中各層跟交通運輸體系中的各個環節對照起來,讓人通俗易懂。在交通運輸體系中,運輸的是人和物品,在計算機網絡體系中,運輸的是電子數據。考慮到交通運輸網絡和計算機網絡中最終都可以劃歸為點對點的信息傳輸。這里考慮兩點之間的信息傳遞過程,得到這樣一個對照關系,見下圖:

對照上圖,更容易理解右側網絡體系結構的分層原理(如果比照一封信發出到收到的這一中間過程可能更容易理解),上圖右側是 `TCP/IP` 網絡體系結構的一個網絡分層示意圖,在把數據發送到網絡之前,在各層中需要進行各種“打包”的操作,而從網絡接收到數據后,就需要進行“解包”操作,最終把純粹的數據信息給提取出來。這種分層的方式是為了傳輸數據的需要,也是兩個主機之間如何建立連接以及如何保證數據傳輸的完整性和可靠性的需要。通過把各種需要分散在不同的層次,使得整個體系結構更加清晰和明了。這些“需求”具體通過各種對應的協議來規范,這些規范統成為網絡協議。
關于 `OSI` 模型(7 層)比照 `TCP/IP` 模型(4 層)的協議棧可以從下圖(來自網絡)看個明了:

而下圖(來自網絡)則更清晰地體現了 `TCP/IP` 分層模型。

上面介紹了網絡原理方面的基本內容,如果想了解更多網絡原理和操作系統對網絡支持的實現,可以考慮閱讀后面的參考資料。下面將做一些實踐,即在 Linux 下如何聯網,如何用 Linux 搭建各種網絡服務,并進行網絡安全方面的考量以及基本的網絡編程和開發的介紹。
## Linux 下網絡“實戰”
### 如何把我們的 Linux 主機接入網絡
如果要讓一個系統能夠聯網,首先當然是搭建好物理網絡了。接入網絡的物理方式還是蠻多的,比如直接用網線接入以太網,用無線網卡上網,用 `ADSL` 撥號上網……
對于用以太網網卡接入網絡的常見方式,在搭建好物理網絡并確保連接正常后,可以通過配置 `IP` 地址和默認網關來接入網絡,這個可以通過手工配置和動態獲取兩種方式。
#### 范例:通過dhclient獲取IP地址
如果所在的局域網有 `DHCP` 服務,那么可以這么獲取,`N` 是設備名稱,如果只有一塊網卡,一般是 0 或者 1 。
~~~
$ dhclient ethN
~~~
#### 范例:靜態配置IP地址
當然,也可以考慮采用靜態配置的方式,`ip_address` 是本地主機的 `IP` 地址,`gw_ip_address` 是接入網絡的網關的 `IP` 地址。
~~~
$ ifconfig eth0 ip_address on
$ route add deafult gw gw_ip_address
~~~
如果上面不工作,記得通過 `ifconfig/mii-tool/ethtool` 等工具檢查網卡是否有被驅動起來,然后通過 `lspci/dmesg` 等檢查網卡類型(或者通過主板手冊和獨立網卡自帶的手冊查看),接著安裝或者編譯相關驅動,最后把驅動通過 `insmod/modprobe` 等工具加載到內核中。
### 用 Linux 搭建網橋
網橋工作在 `OSI` 模型的第二層,即數據鏈路層,它只需要知道目標主機的 `MAC` 地址就可以工作。 Linux 內核在 `2.2` 開始就已經支持了這個功能,具體怎么配置看看后續[參考資料](http://www.ibm.com/developerworks/cn/linux/kernel/l-netbr/index.html)吧。如果要把 Linux 主機配置成一個網橋,至少需要兩個網卡。
網橋的作用相當于一根網線,用戶無須關心里頭有什么東西,把它的兩個網口連接到兩個主機上就可以讓這兩個主機支持相互通信。不過它比網線更厲害,如果配上防火墻,就可以隔離連接在它兩端的網段(注意這里是網絡,因為它不識別 `IP`),另外,如果這個網橋有多個網口,那么可以實現一個功能復雜的交換機,而如果有效組合多個網橋,則有可能實現一個復雜的可實現流量控制和負載平衡的防火墻系統。
### 用 Linux 做路由
路由工作在 `OSI` 模型的第三層,即網絡層,通過 `router` 可以配置 Linux 的路由,當然,Linux 下也有很多工具支持動態路由的。相關的資料在網路中鋪天蓋地,由于時間關系,這里不做介紹。
### 用 Linux 搭建各種常規的網絡服務
需要什么網絡服務呢?
- 給局域網弄個 `DHCP` 服務器,那就弄個 `dhcpd`,看看[參考資料](http://tldp.org/HOWTO/DHCP/);
- 如果想弄個郵件發送服務器,那就安裝個 `sendmail` 或者 `exim4` ;
- 如果再想弄個郵件列表服務器呢,那就裝個 `mailman` ;
- 如果想弄個接收郵件的服務器呢,那就安裝個 `pop3` 服務器;
- 如果想弄個 `web` 站點,那就弄個 `apache` 或者 `nginx` 服務器;
- 如果想弄上防火墻服務,那么通過 `iptables` 工具配置 `netfilter` 就可以
What's more?如果你能想到,Linux上基本都有相應的實現。
### Linux 下網絡問題診斷與維護
如果出現網絡問題,不要驚慌,逐步檢查網絡的各個層次:物理鏈接、鏈路層、網絡層直到應用層,熟悉使用各種如下的工具,包括 `ethereal/tcpdump`,`hping`,`nmap`,`netstat`,`netpipe`,`netperf`,`vnstat`,`ntop` 等。
關于這些工具的詳細用法和網絡問題診斷和維護的相關知識,請看后續相關資料。
### Linux 下網絡編程與開發
如果想做網絡編程開發,比如:
- 要實現一個客戶端 `/` 服務器架構的應用,可以采用 Linux 下的 `socket` 編程了;
- 如果想寫一個數據包抓獲和協議分析的程序,可以采用 `libpap` 等函數庫;
- 如果想實現某個協議呢,那就可以參考相關的 `RFC` 文檔,并通過 `socket` 編程來實現。
這個可以參考相關的 `Linux socket` 編程等資料。
## 后記
本來介紹網絡相關的一些基本內容,但因時間關系,沒有詳述,更多細節請參考相關資料。
到這里,整個《Shell編程范例》算是很粗略地完成了,不過“范例”卻缺少實例,特別是這一節。因此,如果時間允許,會逐步補充一些實例。
## 參考資料
- 計算機網絡——自上而下的分析方法
- Linux 網絡體系結構(清華大學出版社出版)
- Linux 系統故障診斷與排除 第13章 網絡問題(人民郵電出版社)
- 在 Linux 下用 ADSL 撥號上網
- Linux 下無線網絡相關資料收集
- [Linux網橋的實現分析與使用](http://www.ibm.com/developerworks/cn/linux/kernel/l-netbr/index.html)
- [DHCP mini howto](http://tldp.org/HOWTO/DHCP/)
- 最佳的 75 個安全工具
- 網絡管理員必須掌握的知識
- Linux 上檢測 rootkit 的兩種工具: Rootkit Hunter 和 Chkrootkit
- 數據包抓獲與 ip 協議的簡單分析(基于 pcap 庫)
- [RFC](http://www.ietf.org/rfc)
- [HTTP 協議的 C 語言編程實現實例](http://zhoulifa.bokee.com/4640913.html)