章 5. 網絡設置

# 章 5. 網絡設置

| 提示
關於Debian專屬的網絡手冊，請查看Debian管理員手冊—網絡調配。

| 提示
systemd環境下，可以用networkd來調配網絡。請參考systemd-networkd(8)。

## 5.1. 基本網絡架構

讓我們來回顧一下現代Debian作業系統中的基本網絡架構。

表格 5.1. 網絡調配工具一覽表

軟體包 | 流行度 | 大小 | 類型 | 說明
--- | --- | --- | --- | ---
`network-manager` | V:422, I:469 | 7021 | 調配：：NM | NetworkManager（守衛行程）：自動管理網絡
`network-manager-gnome` | V:39, I:156 | 18 | 調配：：NM | NetworkManager（GNOME前端）
`netplan.io` | V:1.4, I:8.6 | 340 | 配置：：NM+networkd | Netplan (生成器): 統一的，宣告網路介面到 NetworkManager 和 systemd-networkd 後端
`ifupdown` | V:640, I:972 | 201 | 調配：：ifupdown | 用來啓動/關閉網絡的標準工具（Debian特有）
`pppoeconf` | V:0.2, I:4.0 | 176 | 調配：：輔助 | 調配助手，以便於使用PPPoE連接
`wpasupplicant` | V:411, I:513 | 3896 | 調配：：輔助 | WPA和WPA2客戶端支援（IEEE 802.11i)
`wpagui` | V:0.2, I:1.4 | 779 | 調配：：輔助 | wpa_supplicant Qt 圖形界面客戶端
`wireless-tools` | V:190, I:260 | 232 | 調配：：輔助 | 操控Linux無線擴展的工具
`iw` | V:38, I:472 | 332 | 調配：：輔助 | 配置 Linux 無線裝置的工具
`iproute2` | V:775, I:987 | 4123 | 調配：：iproute2 | iproute2, IPv6和其他高級網絡調配：ip(8),tc(8)等等
`iptables` | V:382, I:642 | 2408 | 調配：：Netfilter | 封包過濾和網絡地址轉換管理工具（Netfilter）
`nftables` | V:254, I:872 | 189 | 調配：：Netfilter | 封包過濾和網路地址轉換管理工具（Netfilter） ({ip,ip6,arp,eb}tables 的後續替代者)
`iputils-ping` | V:198, I:998 | 188 | 測試 | 測試能否連接遠程主機，通過主機名或IP 地址（iproute2）
`iputils-arping` | V:2, I:18 | 53 | 測試 | 測試能否連接遠程主機，通過ARP地址
`iputils-tracepath` | V:2, I:21 | 50 | 測試 | 跟蹤存取遠程主機的路徑
`ethtool` | V:97, I:254 | 1093 | 測試 | 顯示或更改以太網設備的設定
`mtr-tiny` | V:4, I:39 | 182 | 測試：：底層 | 追蹤連接遠程主機的路徑（文本界面）
`mtr` | V:4, I:41 | 231 | 測試：：底層 | 追蹤連接遠程主機的路徑（文本界面和GTK界面）
`gnome-nettool` | V:0.5, I:9.1 | 2480 | 測試：：底層 | 獲得常見網絡資訊的工具（GNOME)
`nmap` | V:25, I:186 | 4759 | 測試：：底層 | 網絡映射/端口掃描（Nmap，控制檯）
`tcpdump` | V:19, I:177 | 1346 | 測試：：底層 | 網絡流量分析（Tcpdump，控制檯）
`wireshark` | V:4, I:39 | 17068 | 測試：：底層 | 網絡流量分析（Wireshark,GTK）
`tshark` | V:2, I:24 | 433 | 測試：：底層 | 網絡流量分析(控制檯）
`tcptrace` | V:0.2, I:1.7 | 407 | 測試：：底層 | 根據`tcpdump`的輸出生成的連接數據統計
`dnsutils` | V:5, I:156 | 23 | 測試：：底層 | BIND軟體包提供的網絡客戶端程序：nslookup(8),nsupdate(8),dig(8)
`dlint` | V:0.1, I:2.1 | 52 | 測試：：底層 | 利用域名服務器查詢來查看DNS域資訊
`dnstracer` | V:0.1, I:1.1 | 63 | 測試：：底層 | 跟蹤DNS查詢直至源頭

### 5.1.1. 主機名解析

主機名解析，目前也是由 NSS (名字服務轉換 Name Service Switch) 機制來支援。這個解析的流程如下。

1. "`/etc/nsswitch.conf`" 檔案裡的 "`hosts: files dns`" 這段規定主機名解析順序。 (代替 "`/etc/host.conf`" 檔案裡的"`order`" 這段原有的功能。)

2. `files` 方式首先被呼叫。如果主機名在 "`/etc/hosts`" 檔案裡面發現，則回傳所有有效地址並退出。 ( "`/etc/host.conf`" 檔案包含 "`multi on`".)

3. `dns` 方式被呼叫。如果主機名通過查詢 "`/etc/resolv.conf`" 檔案裡面寫的 網際網路域名系統 Domain Name System (DNS) 來找到，則回傳所有有效地址並退出。

一個典型的工作站在安裝時就會設定主機名，例如"host_name"和設定為空字串的可選域名。這樣，"`/etc/hosts`"看起來像下文所示的這樣。

    127.0.0.1 localhost
    127.0.1.1 host_name

    # The following lines are desirable for IPv6 capable hosts
    ::1     localhost ip6-localhost ip6-loopback
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters

每一行由 IP 地址 開始，接下來是相關聯的主機名.

在這個例子的第二行 `127.0.1.1` IP 地址也許不會在其它類 Unix 系統發現。Debian Installer 為沒有永久 IP 地址的系統建立這個條目，作為某些軟體（如 GNOME）的一個變通方法，見文件 bug #719621.

host_name 匹配在"`/etc/hostname`"裡定義的主機名。(參見 節 3.8.1, “主機名”)。

對於有永久 IP 地址的系統，這個永久 IP 地址應當代替這裡的 `127.0.1.1`。

對於有永久 IP 地址和有 域名系統 Domain Name System (DNS)提供完全資格域名 fully qualified domain name (FQDN) 的系統，規範名 host_name.domain_name 應當被用來代替 host_name.

如果 `resolvconf` 軟體包沒有安裝，"`/etc/resolv.conf`" 是一個靜態檔案。如果安裝了，它是一個符號連結。此外，它包含有解析策略的初始化資訊。如 DNS 是 IP="`192.168.11.1`",則包含如下。

    nameserver 192.168.11.1

`resolvconf` 軟體包使這個 "`/etc/resolv.conf`" 檔案成為一個符號連結，並通過鉤子指令碼自動管理其內容。

對於典型 adhoc 區域網環境下的 PC 工作站，除了基本的 `files` 和 `dns` 方式之外，主機名還能夠通過 Multicast DNS (mDNS)進行解析。

- Avahi 提供 Debian 下的組播 DNS 發現框架。

- 它和 Apple Bonjour / Apple Rendezvous 相當.

- `libnss-mdns` 外掛包提供 mDNS 的主機名解析，GNU C 庫 (glibc)的 GNU 名字服務轉換 Name Service Switch (NSS) 功能支援 mDNS。

- "`/etc/nsswitch.conf`" 檔案應當有像 "`hosts: files mdns4_minimal [NOTFOUND=return] dns`" 這樣的一段(其它配置參見 `/usr/share/doc/libnss-mdns/README.Debian`)。

- 一個使用 ".local" pseudo-top-level domain 字尾的主機名解析，是用 IPv4 地址 "`224.0.0.251`" 或 IPv6 地址 "`FF02::FB`"傳送一個組播 UDP 包的 mDNS 查詢資訊。

| 注意
域名系統 Domain Name System 中的擴充通用頂級域名 expansion of generic Top-Level Domains (gTLD) 還在進行中。在區域網內，選擇一個域名時，請提防名字衝突 name collision。

| 注意
使用軟體包，比如 `libnss-resolve` 聯合 `systemd-resolved`, 或者 `libnss-myhostname`, 或者 `libnss-mymachine`, 並在 "`/etc/nsswitch.conf`" 檔案裡面的 "`hosts`" 行裡相應列出 mymachines 或 myhostname 關鍵字，這將忽略我們上面討論的傳統網路配置。更多資訊參見 nss-resolve(8)、systemd-resolved(8)、nss-myhostname(8)和 nss-mymachines(8)。

### 5.1.2. 網路介面名稱

systemd 使用"`enp0s25`" 之類的 "可預測網路介面名稱"。

### 5.1.3. 區域網網路地址範圍

讓我們重新提醒下在 rfc1918 裡規定的區域網 local area networks (LANs)IPv4 32 位地址在各類地址的保留範圍. 這些地址保證不會與因特網上專有的地址衝突。

| 注意
IP 地址書寫中有冒號的是 IPv6 地址，例如，"`::1`" 是 `localhost 本地主機`。

表格 5.2. 網路地址範圍列表

類別 | 網路地址 | 子網掩碼 | 子網掩碼/位數 | 子網數
--- | --- | --- | --- | ---
A | 10.x.x.x | 255.0.0.0 | /8 | 1
B | 172.16.x.x — 172.31.x.x | 255.255.0.0 | /16 | 16
C | 192.168.0.x — 192.168.255.x | 255.255.255.0 | /24 | 256

| 注意
如果這些地址分配到一個主機，那麼這個主機一定不能夠直接存取網際網路，必須通過一個作為閘道器的代理服務或通過 網路地址轉換 Network Address Translation (NAT). 消費區域網環境，寬頻路由器通常使用 NAT。

### 5.1.4. 網路裝置支援

儘管 Debian 系統支援大多數硬體裝置，但依舊有一些網路裝置需要 DFSG non-free 韌體來支援它們。參見 節 9.10.5, “硬體驅動和韌體”。

## 5.2. 現代的桌面網路調配

對於使用 `systemd` 的現代 Debian 桌面系統，網路介面通常由兩個服務進行初始化：`lo` 介面通常在“`networking.service`”處理，而其它介面則由“`NetworkManager.service`”處理。

Debian 可以通過後臺守護程序（daemon）管理軟體來管理網路連線，例如 NetworkManager (NM)（network-manager 和相關軟體包）。

- 它們有自己的 GUI 和指令列程式來作為使用者介面。

- 它們有自己的後臺背景程式（daemon）作為它們的系統後端。

- 它們使你可以簡單地將系統連線到網路。

- 它們使你可以簡單地管理有線和無線網路的調配。

- 它們允許你調配網路而不依賴傳統的 `ifupdown` 軟體包。

| 注意
不要在伺服器上使用這些自動網路調配工具。它們主要針對於膝上型電腦上的移動桌面使用者。

這些現代的網路調配工具需要進行適當的調配，以避免與傳統 `ifupdown` 軟體包發生衝突，它的組態檔案位於 “`/etc/network/interfaces`”。

### 5.2.1. 圖形介面的網路調配工具

Debian 系統 NM 的官方文件位於 “`/usr/share/doc/network-manager/README.Debian`” 。

本質上，如下操作即可完成桌面的網路調配。

1. 通過下列指令使桌面使用者 `foo` 歸屬 “`netdev`” 組（另外，例如 GNOME 和 KDE 這樣的現代桌面環境會通過 D-bus 自動完成該操作）。

       $ sudo usermod -a -G netdev foo

2. 使 “`/etc/network/interfaces`” 的調配保持下面那樣簡潔。

       auto lo
       iface lo inet loopback

3. 通過下列命令重新啟動 NM。

       $ sudo systemctl restart NetworkManager

4. 通過圖形介面調配網路。

| 注意
只有不列在 “`/etc/network/interfaces`” 中的介面會被 NM 管理，以避免與 `ifupdown` 的衝突。

| 提示
如果你想擴充 NM 的網路組態功能，請尋找適當的外掛模組和補充軟體包，例如 `network-manager-openconnect`、`network-manager-openvpn-gnome`、`network-manager-pptp-gnome`、`mobile-broadband-provider-info`、`gnome-bluetooth` 等等。這同樣適用於 Wicd。

## 5.3. 沒有影像介面的現代網路配置

使用 systemd 的系統中，可以在 `/etc/systemd/network/` 裡調配網路。參見 systemd-resolved(8)、resolved.conf(5) 和 systemd-networkd(8)。

這個允許在沒有影像介面的情況下配置現代網路。

DHCP 客戶端的配置可以通過建立 "`/etc/systemd/network/dhcp.network`" 檔案來進行設定。例如：

    [Match]
    Name=en*

    [Network]
    DHCP=yes

一個靜態網路配置能夠通過建立 "`/etc/systemd/network/static.network`" 來設定.比如：

    [Match]
    Name=en*

    [Network]
    Address=192.168.0.15/24
    Gateway=192.168.0.1

## 5.4. 現代雲網絡配置

雲的現代網路配置可以使用 `cloud-init` 和 `netplan.io` 軟體包(參見 節 3.8.4, “雲系統初始化”)。

`netplan.io` 軟體包支援把 `systemd-networkd` 和 `NetworkManager` 作為它的網路配置後端，能夠使用 YAML 資料宣告網路配置。當你改變 YAML:

- 執行 "`netplan generate`" 命令，從 YAML 生成所有必須的後端配置。

- 執行 "`netplan apply`" 命令應用生成的配置到後端。

參見 "Netplan documentation", netplan(5), netplan-generate(8)和 netplan-apply(8)。

也可以參見 "Cloud-init documentation" (特別是圍繞 "Configuration sources" 和 "Netplan Passthrough") 瞭解 `cloud-init` 是怎樣能夠整合替代的資料來源到`netplan.io` 配置。

### 5.4.1. 使用 DHCP 的現代雲網絡配置

DHCP 客戶端的配置可以通過建立一個數據原始檔"`/etc/netplan/50-dhcp.yaml`"來進行設定：

    network:
      version: 2
      ethernets:
        all-en:
          match:
            name: "en*"
          dhcp4: true
          dhcp6: true

### 5.4.2. 使用靜態 IP 的現代雲網絡配置

一個靜態網路配置能夠通過建立一個數據原始檔 "`/etc/netplan/50-static.yaml`"來設定：

    network:
      version: 2
      ethernets:
        eth0:
          addresses:
            - 192.168.0.15/24
          routes:
            - to: default
              via: 192.168.0.1

### 5.4.3. 使用 Network Manager 的現代雲網絡配置

使用 Network Manager 架構的網路客戶端配置，可以通過建立一個數據原始檔 "`/etc/netplan/00-network-manager.yaml`"來進行設定：

    network:
      version: 2
      renderer: NetworkManager

## 5.5. 底層網路調配

在 Linux 上的底層網路配置，使用 iproute2 程式 (ip(8), …) .

### 5.5.1. Iproute2 指令

Iproute2 指令集提供完整的底層網路調配能力。有個從舊的 net-tools 指令集到新的 iproute2 指令集的轉換表。

表格 5.3. 從舊的 `net-tools` 指令集到新的 `iproute2` 指令集轉換表

舊的 net-tools | 新的 iproute2 | 操作
--- | --- | ---
ifconfig(8) | `ip addr` | 一個裝置上的協議（IP 或 IPv6）地址
route(8) | `ip route` | 路由表條目
arp(8) | `ip neigh` | ARP 或 NDISC 快取條目
`ipmaddr` | `ip maddr` | 多播地址
`iptunnel` | `ip tunnel` | IP 隧道
nameif(8) | ifrename(8) | 基於 MAC 地址的網路介面名
mii-tool(8) | ethtool(8) | 乙太網路裝置設定

參見 ip(8) 和 Linux 高階路由和流量控制（Linux Advanced Routing & Traffic Control）.

### 5.5.2. 安全的底層網路操作

你可以按下面的方式安全的使用底層網路指令，這些指令不會改變網路調配。

表格 5.4. 底層網路指令列表

指令 | 說明
--- | ---
`ip addr show` | 顯示活動的網路介面連線和地址狀態
`route -n` | 用數字地址顯示全部路由表
`ip route show` | 用數字地址顯示全部路由表
`arp` | 顯示當前 ARP 快取表的內容
`ip neigh` | 顯示當前 ARP 快取表的內容
`plog` | 顯示 ppp 後臺背景程式（daemon）日誌
`ping yahoo.com` | 檢查到 "`yahoo.com`" 的因特網連線
`whois yahoo.com` | 在域名資料庫裡面檢查誰註冊了 "`yahoo.com`"
`traceroute yahoo.com` | 跟蹤到 "`yahoo.com`" 的因特網連線
`tracepath yahoo.com` | 跟蹤到 "`yahoo.com`" 的因特網連線
`mtr yahoo.com` | 跟蹤到 "`yahoo.com`" 的因特網連線（重複的）
`dig [@dns-server.com] example.com [{a|mx|any}]` | 查詢由 "`dns-server.com`" 提供服務的 "`example.com`" 域名的 DNS 記錄： "`a`", "`mx`" 或 "`any`" 記錄
`iptables -L -n` | 檢視包過濾
`ss -a` | 找出所有開啟的埠
`ss -l` | 找出監聽埠
`ss -l -t -n` | 找出 TCP 監聽埠（數字的）
`dlint example.com` | 查詢 "`example.com`" 的 DNS zone 資訊

| 提示
部分底層網路調配工具放在 "`/usr/sbin/`" 目錄。你可以像 "`/usr/sbin/ifconfig`" 這樣使用完整指令路徑，或把 "`/usr/sbin`" 加到 "`~/.bashrc`" 檔案列出的 "`$PATH`" 環境變數裡 。

## 5.6. 網路最佳化

通用的網路優化超出了本文的範圍。我提及消費等級連線相關的主題。

表格 5.5. 網路最佳化工具清單

軟體包 | 流行度 | 大小 | 說明
--- | --- | --- | ---
`iftop` | V:6, I:88 | 93 | 顯示一個網路介面上的頻寬使用資訊
`iperf` | V:2, I:34 | 431 | 網際網路協議頻寬測量工具
`ifstat` | V:0.6, I:5.5 | 52 | 介面統計監控
`bmon` | V:2, I:20 | 141 | 行動式頻寬監視器和網速估計工具
`ethstatus` | V:0.2, I:2.6 | 41 | 快速測量網路裝置吞吐的指令碼
`bing` | V:0.07, I:0.50 | 80 | 實驗性的隨機頻寬測試器
`bwm-ng` | V:1.0, I:9.6 | 95 | 小巧簡單的控制檯頻寬監測器
`ethstats` | V:0.05, I:0.39 | 21 | 基於控制檯的乙太網路統計監視器
`ipfm` | V:0.04, I:0.11 | 78 | 頻寬分析工具

### 5.6.1. 找出最佳 MTU

網路管理器通常會自動設定最佳 最大傳輸單元 (MTU) 。

在一些場景中，在用 ping(8) 加上"`-M do`"選項傳送各種大小的 ICMP 報文資料包進行實驗後，你希望可以手動設定 MTU。MTU 是最大可完成沒有 IP 分片的資料包大小加上 28 位元組（IPv4）或 48 位元組（IPv6）。下面的列子，發現 IPv4 連線的 MTU 是 1460，IPv6 連線的 MTU 是 1500。

    $ ping -4 -c 1 -s $((1500-28)) -M do www.debian.org
    PING  (149.20.4.15) 1472(1500) bytes of data.
    ping: local error: message too long, mtu=1460

    ---  ping statistics ---
    1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

    $ ping -4 -c 1 -s $((1460-28)) -M do www.debian.org
    PING  (130.89.148.77) 1432(1460) bytes of data.
    1440 bytes from klecker-misc.debian.org (130.89.148.77): icmp_seq=1 ttl=50 time=325 ms

    ---  ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 325.318/325.318/325.318/0.000 ms
    $ ping -6 -c 1 -s $((1500-48)) -M do www.debian.org
    PING www.debian.org(mirror-csail.debian.org (2603:400a:ffff:bb8::801f:3e)) 1452 data bytes
    1460 bytes from mirror-csail.debian.org (2603:400a:ffff:bb8::801f:3e): icmp_seq=1 ttl=47 time=191 ms

    --- www.debian.org ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 191.332/191.332/191.332/0.000 ms

這個過程是 路徑 MTU (PMTU) 發現 (RFC1191) ， tracepath(8) 指令能夠自動完成這個。

表格 5.6. 最佳 MTU 值的基本指引方法

網路環境 | MTU | 基本原理
--- | --- | ---
撥號連線(IP: PPP) | 576 | 標準的
乙太網路連線 (IP: DHCP 或固定) | 1500 | 預設標準值

除了這些基本的指引方法外，你還應當知道下面的資訊。

- 使用任何隧道方式(VPN 等.)的最佳 MTU 需要進一步減去它們上面的頭部。

- MTU 值不應當超過通過實驗驗證的 PMTU 值。

- 當遇到其它限制的時候，較大的 MTU 值通常比較好。

最大分片大小 (MSS) 是另外一種衡量包大小的方法。MSS 和 MTU 的關係如下.

- 對於 IPv4， MSS = MTU - 40

- 對於 IPv6，MSS = MTU - 60

| 注意
基於 iptables(8) (參見 節 5.7, “Netfilter 網路過濾框架”) 的優化，能夠通過 MSS 來壓縮包大小，路由器會用到 MMS 。參見 iptables(8)中的"TCPMSS" .

### 5.6.2. WAN TCP 最佳化

現代大頻寬和高延時的 WAN，TCP 吞吐量能夠通過調整 TCP 緩衝大小的引數，在"TCP 調整"裡，來最大化。到目前為止，當前 Debian 預設設定能夠很好的服務好我的 1G bps 光纖到戶 LAN 連線。

## 5.7. Netfilter 網路過濾框架

Netfilter 使用 Linux 核心 模組 (參見 節 3.10, “核心模組初始化”) 提供 狀態防火牆 和 網路地址轉換 (NAT) 框架。

表格 5.7. 防火牆工具列表

軟體包 | 流行度 | 大小 | 說明
--- | --- | --- | ---
`nftables` | V:254, I:872 | 189 | 封包過濾和網路地址轉換管理工具（Netfilter） ({ip,ip6,arp,eb}tables 的後續替代者)
`iptables` | V:382, I:642 | 2408 | netfilter 管理工具(iptables(8) 用於 IPv4, ip6tables(8) 用於 IPv6)
`arptables` | V:0.1, I:1.8 | 102 | netfilter 管理工具(arptables(8) 用於 ARP)
`ebtables` | V:14, I:24 | 276 | netfilter 管理工具 (ebtables(8) 用於乙太網路橋)
`iptstate` | V:0.2, I:1.7 | 121 | 持續性監控 netfilter 狀態 (和 top(1) 相似)
`ufw` | V:82, I:109 | 862 | Uncomplicated Firewall (UFW) 是一個管理 netfilter 防火牆的程式
`gufw` | V:6, I:11 | 3682 | Uncomplicated Firewall (UFW) 的影像使用者介面
`firewalld` | V:14, I:22 | 2581 | firewalld 是一個動態管理防火牆的程式，支援網路區域
`firewall-config` | V:0.7, I:3.3 | 1096 | firewalld 影像使用者介面
`shorewall-init` | V:0.18, I:0.40 | 88 | Shoreline 防火牆 初始化
`shorewall` | V:2.2, I:5.0 | 3090 | Shoreline 防火牆, netfilter 組態檔案生成器
`shorewall-lite` | V:0.02, I:0.06 | 71 | Shoreline 防火牆, netfilter 組態檔案生成器 (精簡版)
`shorewall6` | V:0.7, I:1.3 | 1334 | Shoreline 防火牆, netfilter 組態檔案生成器(IPv6 版本)
`shorewall6-lite` | V:0.01, I:0.02 | 71 | Shoreline 防火牆, netfilter 組態檔案生成器 (IPv6,精簡版)

See The netfilter.org "nftables" project for the newer user space nft(8) command in the `nftables` package. (Linux kernel >= 3.13)

See The netfilter.org "iptables" project for the older user space iptables(8) and similar commands in the `iptables` and similar packages. (Linux kernel >= 2.4.x)

You can manually configure netfilter interactively from shell, save its state with "`nft list ruleset > file`" or iptables-save(8), and restore it via init script with "`nft -f file`" or iptables-restore(8) upon system reboot.

像 shorewall 這樣的調配幫助指令碼能夠使這個過程變得更簡單。

參見 Netfilter 文件 上的文件(或在 "`/usr/share/doc/iptables/html/`" 裡面的文件)。

- Linux Networking-concepts HOWTO

- Linux 2.4 Packet Filtering HOWTO

- Linux 2.4 NAT HOWTO

- nftables HOWTO

章 4. 認證和訪問控制 |  | 章 6. 網路應用