在Linux下配置TCP/IP(轉)

post0發表於2007-08-10
在Linux下配置TCP/IP(轉)[@more@]

這是IBM公司的教學課程,送初級Linux學生!!呵呵~~

關鍵檔案和指令碼

網路介面初始化的實際過程(有時也稱做“啟動介面”)是由一組配置檔案和指令碼控制的,這些檔案和指令碼大多數在/etc 目錄下。這些配置檔案告訴 Linux 它的 IP 地址、主機名和域名;指令碼則負責網路介面的初始化。

遺憾的是,不同分發版(distribution)中檔案位置和命名約定至今還沒有統一的標準。為給本文提供具體的示例,將基於廣泛使用的 Red Hat 7.0 包做出描述。請記住,若您的分發版不是使用 Red Hat 或不是基於 Red Hat 約定(如 Mandrake 分發版),在此所引用的一些檔案會位於別的目錄中或有其它的名稱。然而,網路效果和實際效果是一樣的 — 將儲存在一系列配置檔案中的網路資訊傳遞給指令碼,然後用指令碼初始化介面和網路路由。

涉及初始化和配置網路介面的關鍵檔案有:

/etc/hosts (將主機名對映到 IP 地址)

/etc/networks (將域名對映到網路地址)

/etc/sysconfig/network (開啟或關閉聯網,設定主機名和閘道器)

/etc/resolv.conf (設定名稱伺服器或 DNS 伺服器的 IP 地址)

/etc/rc.d/rc3.d/S10network (在引導時啟用已配置的乙太網介面,由執行級別目錄 /etc/rc.d/rcN.d/ 中的符號連結呼叫)

/etc/sysconfig/network-scripts 中一些檔案的集合。這些檔案包括用於網路連線的主要配置,以及提供介面狀態和控制功能的符號連結。

/etc/hosts

/etc/hosts 是將 IP 地址和主機名聯絡起來的簡單文字檔案。 TCP/IP 網路中的每臺計算機都必須有唯一的 IP 地址。hosts 檔案只允許使用者將主機名與 IP 地址聯絡起來,以便當訪問計算機時使用該名稱,而不用輸入一長串數字。/etc/hosts 中的每一項都依次包含一個 IP 地址、空白和主機名和/或別名。井號(#)表示註釋開始。例如:

# /etc/hosts

# last updated 12/3/2000

127.0.0.1 loopback localhost # loopback (lo0) name/address

192.168.1.5 janus.syroidmanor.com janus

192.168.1.6 thumper.syroidmanor.com thumper

192.168.1.7 donovan.syroidmanor.com donovan

192.168.1.8 raidserver

192.168.1.20 phoenix.syroidmanor.com phoenix

192.168.1.15 hydras.syroidmanor.com hydras

在上面顯示的 Hosts 檔案中,IP 地址 192.168.1.5 對映到主機 janus.syroidmanor.com ,並且分配給它一個備用主機名(或別名)janus。儘管 DNS 已經取代了這個主機檔案,但出於以下原因仍然使用它:

大多數系統都有一個包含本地網路上的關鍵主機的名稱和地址資訊的小主機表。當 DNS 未執行時,例如,在最初系統啟動期間,則使用該表。即便本地 DNS 伺服器正在執行,在每個系統上也應該有一個小 hosts 檔案,該檔案包含一個主機本身項、一個 localhost 項以及區域網上任何主要的閘道器和伺服器項。

未連線到因特網或其他網路的小網路不需要 DNS 服務。然而,這些網路上的主機也需要知道如何定位同一網路上的其它主機。

/etc/networks

就如主機有名稱和地址一樣,為方便起見,也可以為網路和子網命名。 /etc/networks 檔案在佈局上與 /etc/hosts 很相似,只不過名稱和地址互換了一下。

# /etc/networks for syroidmanor.com

localnet 127.0.0.0 #loopback

syroid-C1 192.168.1 #development, class C

syroid-C2 192.168.2 #support, class C

在上面的示例中,可將網路名稱 syroid-C1 用於指令碼或任何命令列實用程式中來引用 192.168.1 這個 C 類網。

/etc/sysconfig/network

將 /etc/sysconfig/network(注意與 /etc/networks 檔案不同,這個 network 是單數而不是複數)用於指定所期望的網路配置資訊;在引導時,有幾個指令碼要使用它。該檔案可以包含下列所示的一個或多個關鍵字/值對:

NETWORKING=YES|NO -- YES 表示需要配置網路;NO 表示不需要配置網路。

HOSTNAME=hostname — 主機的全限定域名;為與較老的程式相容,這應該與在 /etc/hosts 中的主機項相匹配。

GATEWAY=gw-ip — 網路閘道器的 IP 地址。

GATEWAYDEV=gw-dev — 閘道器裝置的名稱(例如 eth0)。

NISDOMAIN=dom-name — 表示 NIS 域,如果有的話。

下面是 /etc/sysconfig/network 最小配置的示例:

NETWORKING=yes

HOSTNAME=phoenix.syroidmanor.com

GATEWAY=192.168.1.1

/etc/resolv.conf 和 /etc/rc.d/rc3.d/S10network

/etc/resolv.conf 是網路用來確定主機解析的關鍵檔案之一。在此可以標識最多三個名稱伺服器;如果列在第一位的伺服器未對查詢做出響應,則後面兩個起到備用的作用。 domain 項定義預設域名。解析器(順便提一下,該解析器不是一個單獨的程式,而是由網路程式呼叫的例程庫)將這裡所列出的域名附加在任何不包含句點的主機查詢上。

# /etc/resolv.conf

# domain name resolver config file

domain syroidmanor.com

nameserver 192.168.1.7

nameserver 192.168.1.10

nameserver 165.142.268.19

在上面所顯示的示例中,如果提交給解析器的查詢是想要查詢找主機 phoenix(注意,沒有點),則將該域附加到這個請求之後,這會將該查詢擴充套件為 phoenix.syroidmanor.com。若需要了解更多詳細資訊和可以使用的選項,請輸入 man resolv.conf 。

/etc/rc.d/rc3.d/S10network 是指向 /etc/rc.d/init.d/network 指令碼的符號連結。當系統達到執行級別 3 時,它負責初始化所有已配置的網路介面。在這裡我們不想花時間來詳細討論該檔案後面的邏輯,因為該檔案主要是呼叫本節中所提到的其它指令碼和程式。但是,如果您對 S10network 中初始化各種網路元件和服務的順序感興趣的話,則可以使用 less /etc/rc.d/rc3.d/S10network 命令來仔細研讀它。

/etc/sysconfig/network-scripts/

最後,通常可在 /etc/sysconfig/network-scripts/ 目錄中查詢到下列檔案:

/etc/sysconfig/network-scripts/ifup

/etc/sysconfig/network-scripts/ifdown

/etc/sysconfig/network-scripts/network-functions

/etc/sysconfig/network-scripts/ifcfg-interface-name

/etc/sysconfig/network-scripts/ifcfg-interface-name:clone-name

/etc/sysconfig/network-scripts/chat-interface-name

/etc/sysconfig/network-scripts/dip-interface-name

/etc/sysconfig/network-scripts/ifup-post

……/network-scripts/,第一部分

/etc/sysconfig/network-scripts 中的 ifup 和 ifdown 項實際是分別指向 /sbin/ifup 和 /sbin/ifdown 的符號連結。這兩個指令碼是在該目錄下唯一應該直接呼叫的指令碼,並且它們按需要呼叫所有其它指令碼。

ifup 和 ifdown 通常只帶一個引數:裝置名(例如 eth0)。系統在引導過程期間用引數“boot”呼叫它們,以便於不啟用沒有被配置成在系統啟動時初始化的裝置(請參閱下面關於 interface-name 描述中的 ONBOOT=no)。

network-function 不是公共檔案。它包含這個目錄中的幾個指令碼所需的函式。具體地說,它包含了用於處理替代介面配置的大多數程式碼。

……/network-scripts/,第二部分

配置檔案 ifcfg-interface-name 和 ifcfg-interface-name:clone-name 包含了初始化介面所需的大部分詳細資訊。第一個檔案定義介面,而第二個檔案僅包含與“別名”(或替代)介面相關的部分定義。例如,網路地址或許不同,但其它可能會一樣。

在 ifcfg 檔案中定義的各專案取決於介面型別;下列值很常見:

DEVICE=name ,其中 name 是物理裝置名

IPADDR=addr ,其中 addr 是 IP 地址

NETMASK=mask ,其中 mask 是網路掩碼值

NETWORK=addr ,其中 addr 是網路地址

BROADCAST=addr ,其中 addr 是廣播地址

GATEWAY=addr ,其中 addr 是閘道器地址

ONBOOT=answer ,其中 answer 是“yes”(引導時啟用裝置)或“no”

USERCTL=answer ,其中 answer 是“yes”(非 root 使用者可以控制該裝置)或“no”

BOOTPROTO=proto ,其中 proto 取下列值之一:“none”(引導時不使用協議)“bootp”(使用 BOOTP 協議)或“dhcp”(使用 DHCP 協議)

此外,下列值對所有的 SLIP(序列線 IP)檔案是公共的:

PERSIST=answer ,其中 answer 是“yes”(即使調變解調器已經結束通話連線,也保持裝置處於啟用狀態)或“no”(不保持啟用狀態)

MODEMPORT=port ,其中 port 是調變解調器埠的裝置名(例如,/dev/modem)

LINESPEED=baud ,其中 baud 是調變解調器的線路速度

DEFABORT=answer ,其中 answer 是“yes”(當建立/編輯該介面的指令碼時,插入預設的異常終止字串)或“no”(不插入預設的異常終止字串)

……/network-scripts/,第三部分

chat-interface-name 檔案是用於 SLIP 連線的交談指令碼(chat script)。它的功能是啟動 SLIP 連線。對於 SLIP 裝置,DIP 指令碼是根據這個交談指令碼編寫的。

chat-interface-name 是隻寫指令碼,它由程式 netcfg 根據交談指令碼建立的。不要修改該檔案。

當初始化任何網路裝置(除了 SLIP 裝置)時,呼叫 /etc/sysconfig/network-scripts/ifup-post。它呼叫 /etc/sysconfig/network-scripts/ifup-routes 以啟動依賴於該裝置的靜態路由,它還啟動為該裝置配置的任何別名,並且,如果還沒有設定主機名,則設定主機名 — 這樣找到與該裝置 IP 地址匹配的主機名。最後,ifup-post 給請求通知網路事件的任何程式傳送訊號(SIGIO)。

配置網路介面和路由

ifconfig 程式

ifconfig 命令設定、檢查或監控網路介面的配置值。它還可以用於設定介面的“狀態”— 即“up”(啟動)或“down”(關閉)。一個對 ifconfig 簡單的呼叫是:

ifconfig interface-name ip-address up|down

這會啟用指定的介面並將所提供的 IP 地址分配給它。

ifconfig 有許多個可用的選項(metric、mtu 以及 pointtopoint 等等;有關詳細資訊,請參閱幫助頁)用於顯式地設定唯一的介面引數,但一般來說,提供介面名稱(例如, eth0)、IP 地址和網路掩碼就足夠了。例如:

ifconfig eth0 192.168.1.5 netmask 255.255.255.0 up

分配給介面 eth0 的 IP 為 192.168.1.5,網路掩碼為 255.255.255.0 並“啟動該介面”或將其初始化。類似的,若將介面“關閉”,則輸入 ifconfig eth0 down ;不需要指定 IP 和網路掩碼。

使用 ifconfig 檢查介面

執行不帶引數的 ifconfig 會使該程式顯示所有網路介面的狀態。若要檢查特定介面的狀態,則在 ifconfig 後附加這個介面的名稱。例如:

[tom@phoenix tom]$ /sbin/ifconfig eth0

eth0 Link encap:Ethernet HWaddr 00:10:5A:00:87:22

inet addr:192.168.1.20 Bcast:192.168.1.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:9625272 errors:0 dropped:0 overruns:0 frame:0

TX packets:6997276 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:100

Interrupt:19 Base address:0xc800

以上輸出顯示 MAC 地址(Hwaddr)、所分配的 IP 地址(inet addr)、廣播地址(Bcast)和網路掩碼(Mask)。另外可以看出該介面處於 UP 狀態,其 MTU 為 1500 並且 Metric 為 1。接下來的兩行給出有關接收到(RX)和已傳送的(TX)資訊包數,以及錯誤、丟棄和溢位資訊包數的統計。最後兩行顯示衝突資訊包的數目、傳送佇列大小(txqueuelen)和 IRQ 以及這塊卡的基址。

配置路由

讓我們透過檢視尚未配置閘道器的網路介面來看一下如何配置路由。正如您所見,使用不帶引數的 route 命令將顯示核心路由表。

[root@phoenix tom]# /sbin/route

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

127.0.0.0 127.0.0.1 255.0.0.0 U 0 0 0 lo

192.168.1.0 192.168.1.5 255.255.255.0 U 0 0 0 eth0

第一項是到 localhost 的回送路由,它是在配置 lo 時自動建立的。第二項是透過介面 eth0 到網路 192.168.1.0 的路由。地址 192.168.1.5 不是遠端閘道器地址。它是分配給 phoenix eth0 的地址。

注意每項的標誌。它們都設定了 U(啟動)標誌,這表示準備使用它們,但它們都未設定 G(閘道器)標誌。不設定 G 標誌是因為這兩個路由都是透過本地介面,而不是透過外部閘道器的直接路由。

上述示例僅包含一個網路路由 192.168.1.0。因而 phoenix 僅可以與位於 192.168.1.0 網路中的主機進行通訊。

新增靜態路由

最小的路由表僅允許在同一網路中的主機互相通訊。要與遠端主機通訊,必須將透過外部閘道器的路由新增到路由表中。達到該目的的一種方法是透過使用 /sbin/route 命令。拿上頁中的例子來說,我們現在就將路由 192.168.1.1 新增到網路配置中。

[root@phoenix tom]# /sbin/route add default 192.168.1.1 1

在上面這個示例中,route 命令後的第一個引數是關鍵字 add 。在 route 命令上的第一個關鍵字要麼是 add 要麼是 del (刪除路由)。下一個值是目的地地址,它是透過該路由到達的地址。如果關鍵字 default 用於目的地地址,則建立預設路由。只要沒有到目的地的特定路由時,就使用預設路由;通常,這就是您在路由表中唯一需要的項。如果網路中只有一個閘道器,則使用預設路由引導所有要到遠端網路的資料流量透過那個閘道器。

這個命令列的下一個引數是閘道器地址。該地址必須是直接連線本機所在網路的閘道器地址。在到遠端目的地的網路路徑中,TCP/IP 路由要指定下一跳(next-hop)。這個下一中繼必須是本機可直接訪問的;因而,它必須是在直接連線在本機所在的網路中。

注:因為大多數的路由都是在系統啟動過程早期時新增的,所以建議用數字的 IP 地址替代主機名。這樣做就可以確保路由配置不依賴於名稱伺服器的狀態。而且要確保總是使用完整的數字地址(共 4 個位元組);如果不用完整的 IP 地址,則路由只能猜想部分 IP 地址,這樣可能會導致不正確的配置。

route 命令中,最後一個引數是數字 1,稱之為路由度量(routing metric)。當刪除路由時是不需要此 metric 引數的,但是在新增路由時許多系統都需要它。儘管需要度量,route 僅使用它來確定路由是透過直接連線的介面還是透過外部的閘道器。如果 metric 是 0,建立的這條路由是透過本機介面且不設定 G 標誌;如果 metric 值比 0 大,則建立的這條路由帶 G 標誌且閘道器地址被認為是外部的。靜態路由不使用其它 metric 值。需要真正用到多個 metric 值的是動態路由。

要顯示新的路由表,輸入 /sbin/route 或使用 netstat -rn 命令(我們將再下一節討論該命令):

[root@phoenix tom]# netstat -rn

Kernel IP routing table

Destination Gateway Genmask Flags MSS Window irtt Iface

192.168.1.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.1.1 0.0.0.0 UG 0 0 0 eth0

最後做一個測試來證明一切都如同我們講到的那樣執行,ping 另一個網路上的主機;應該可以接收到響應。如果沒有接收到響應,則重新檢查您的配置。

要熟悉 route 其它的選項和引數,請輸入 man route 。

netstat 程式

如果管理任意規模的 TCP/IP 網路,則 netstat 程式是一個相當有價值的工具。它可以顯示核心路由表,活動網路連線的狀態和每個已安裝網路介面的一些有用的統計資訊。

象大多數 Linux 管理命令列程式一樣,netstat 可以透過其後面的附加選項或標誌來選擇所顯示資訊的細節數量和/或資訊的範圍。一些常用選項有:

-a — 顯示所有連線的資訊,包括那些正在偵聽的

-i — 顯示所有已配置網路裝置的統計資訊

-c — 持續更新網路狀態(每秒一次)直至被人為中止(^C)

-r — 顯示核心路由表

-n — 以數字(原始)格式而不是已解析的名稱顯示遠端和本地地址

-t — 僅顯示 TCP 套接字資訊(不包括任何 UCP 套接字資訊)

-v — 顯示 netstat 的版本資訊

輸入 man netstat 可獲得所有可用標誌的完整列表和詳細說明每個標誌的用途。請注意還可以組合這些標誌,所以輸入 netstat -rn 將以原始的 IP 地址格式顯示關於本地和遠端主機(n)的系統路由表(r)。

顯示活動的網路連線

netstat 支援一組顯示活動或非活動的套接字的選項:-t、-u、-w 和 -x 分別顯示活動的 TCP、UDP、RAW 或 UNIX 套接字連線。如果加上 -a 標誌,還會顯示等待連線的(換句話說,就是偵聽)套接字。這將為您顯示現在正在系統上執行的所有伺服器。

例如:在主機 phoenix 上輸入 netstat -ta 會顯示下列內容:

[tom@phoenix tom]$ netstat -ta

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 40 phoenix.syroidmanor:ssh 192.168.1.5:1132 ESTABLISHED

tcp 0 0 *:ssh *:* LISTEN

tcp 0 0 phoenix.syroidmano:1028 hydras.syro:netbios-ssn ESTABLISHED

tcp 0 0 phoenix.syroidmano:1027 raidserver:netbios-ssn ESTABLISHED

tcp 0 0 *:printer *:* LISTEN

tcp 0 0 *:auth *:* LISTEN

tcp 0 0 *:1024 *:* LISTEN

tcp 0 0 *:sunrpc *:* LISTEN

上述輸出顯示大多數的伺服器僅僅在等待到來的連線(LISTEN)。但是,第一行顯示主機 phoenix 和 IP 地址為 192.168.1.5 之間的連線;第三和第四行顯示兩個 netbios 連線(Samba SMB 共享)。

用 netstat 檢視路由表

當使用 -r 標誌時,netstat 顯示核心中的路由表,這類似於輸入 /sbin/route :

[tom@phoenix tom]$ netstat -nr

Kernel IP routing table

Destination Gateway Genmask Flags MSS Window irtt Iface

192.168.1.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.1.1 0.0.0.0 UG 0 0 0 eth0

-n 選項強制 netstat 以點分四組 IP 數字的形式,而不是主機和網路名稱的形式輸出地址。當您不想透過網路(例如,用 DNS 或 NIS 伺服器)進行地址查詢時,這個選項特別有用。

第二列顯示路由項中所指向的閘道器。如果沒有使用閘道器,就會顯示星號。第三列是路由的網路掩碼。核心在將資訊包的 IP 地址與路由的目的地 IP 地址進行比較之前,將 Genmask 值與資訊包的 IP 地址逐位進行“與”操作,從而使路由“通用化”。

第四列顯示路由的標誌:U 表示處於活動狀態,H 表示主機,G 表示閘道器,D 表示動態路由,而 M 表示已經修改過。

[tom@phoenix tom]$ netstat -nr

Kernel IP routing table

Destination Gateway Genmask Flags MSS Window irtt Iface

192.168.1.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.1.1 0.0.0.0 UG 0 0 0 eth0

接下來的三列顯示 MSS、Window 和 irtt,它們將被應用於透過該路由建立的 TCP 連線。MSS(Maximum Segment Size)表示“最大分段尺寸”,也是核心所構建以透過該路由傳送的資料包的最大尺寸。Window 表示系統一次從遠端主機接收突發的最大量資料。

首字母縮寫詞 irtt 代表“初始往返時間(initial round trip tim)”。TCP 協議確保主機間可靠地傳送資料,如果資料已經丟失,則重新傳送。TCP 協議一直對傳送給遠端端點的資料包和接收到的確認所花費的時間進行記數,以便知道假定要重發資料包前需要等待的時間;這個過程稱為往返時間。TCP 協議將使用第一次建立連線時所用時間作為初始往返時間的值。對於大多數型別的網路,用預設值就夠了,但對某些速度較慢的網路(特別是某些業餘的分組無線網路),這個時間太短了,會造成不必要的重發。可以使用 route 命令設定 irtt 值。在上面這個路由表中,這些欄位均為零值,這表明正在使用預設值。

最後,最後這個欄位表示的是所顯示的路由使用的網路介面。

用 netstat 顯示一些網路介面使用的統計資訊

用 -i 選項呼叫 netstat 可以顯示所有已配置介面的一些有用的統計資訊 — 這是一個用於排除網路故障的非常有用的工具。有了該命令,很容易檢查連線的狀態以及連線是否“正常”。

[tom@phoenix tom]$ netstat -i

Kernel Interface table

eth0 Link encap:Ethernet HWaddr 00:10:5A:00:87:22

inet addr:192.168.1.20 Bcast:192.168.1.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:10554374 errors:0 dropped:0 overruns:0 frame:0

TX packets:8528339 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:100

Interrupt:19 Base address:0xc800

lo Link encap:Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0

UP LOOPBACK RUNNING MTU:3924 Metric:1

RX packets:5612 errors:0 dropped:0 overruns:0 frame:0

TX packets:5612 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX packets 和 TX packets 行分別顯示了已經接收到的資訊包或已經傳送了的資訊包數目以及出錯的資訊包、丟失的資訊包以及溢位的 RX/TX 統計資訊。最常見的介面錯誤都是源於不正確的配置,所以,如果遇到了某些困難,最好再三檢查所有的設定來進行診斷。

假使介面已經啟動,則應該沒有資訊包排隊等候傳送(txqueuelen)— 如果有,則可能是由於網路電纜或網路卡有問題。首先換一根備用電纜,然後重新檢查連線。RX/TX 錯誤應該近乎為零。如果 TX 錯誤過多,則表示網路已經飽和或物理連線有問題;如果 RX 錯誤過多,則表示網路已經飽和、物理連線有問題或主機過載。如果遇到過高的衝突率(衝突率是輸出資訊包(output packet)的百分比,而不是從傳送/接收資訊包的總數中計算得出),它可能也表示網路已經飽和;透過從同一子網上的另一臺主機執行 netstat -i 命令並比較結果來證實這一點。

要解決網路中錯誤,一定要仔細地以及系統地分析介面的所有方面(硬體和軟體),這是必要的。不要匆忙行事,……啊……我們提到了總是要先檢查網路電纜。在這一點,相信我。

參考資料

在網上有:

Linux System Administrator's Guide

學習如何 Easily configure TCP/IP on your AIX system

IBM 提供了一些用於網路監控的工具,譬如 Tivoli NetView Performance Monitor for TCP/IP

訪問 TCP/IP for OS/40O 的主頁

請閱讀關於實現 iSeries 和 AS/400 的 TCP/IP 和因特網訪問

如果您可以線上搜尋和參考,則我強烈向您推薦 O'Reilly 新的 Safari 訂閱服務。您可以完全搜尋並選擇一些曾經出版過的有關網路方面最好的書籍。

出版的書籍有:

TCP/IP Network Administration, 2nd Edition,Craig Hunt(O'Reilly)ISBN:1-56592-322-7

Linux in a Nutshell, 3rd Edition,Siever, Spainhour, Figgins, and Hekman(O'Reilly)ISBN:0-596-00025-1

Running Linux, 3rd Edition, Welsh, Dalheimer, and Kaufman(O'Reilly)ISBN:1-56592-469-X

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-940165/,如需轉載,請註明出處,否則將追究法律責任。

相關文章