Manpages

NAME (名 稱 )

ip - Linux IPv4 協 議 實 現

SYNOPSIS(總 覽 )

#include <sys/socket.h>
#include <net/netinet.h>

tcp_socket = socket(PF_INET, SOCK_STREAM, 0);
raw_socket
= socket(PF_INET, SOCK_RAW, protocol);
udp_socket
= socket(PF_INET, SOCK_DGRAM, protocol);

DESCRIPTION(描 述 )

Linux 實 現 描 述 於 RFC791 和 RFC1122 中 的 Internet 協 議 ,版 本 4. ip 包 括 遵 循 RFC1112 的 第 二 層 的 多 信 道 廣 播 技 術 的 實 現 .它 也 包 括 含 包 過 濾 器 的 IP路 由 器 . 程 序 員 的 接 口 與 BSD 的 套 接 字 (socket)兼 容 . 要 獲 得 關 於 套 接 字 的 更 多 信 息 ,參 見 socket(7) 創 建 一 個 IP套 接 字 是 通 過 以 socket(PF_INET, socket_type, protocol) 方 式 調 用 socket(2) 函 數 來 實 現 的 . 有 效 的 套 接 字 類 型 ( socket_type) 有 : SOCK_STREAM 用 來 打 開 一 個 tcp(7) 套 接 字 , SOCK_DGRAM 用 來 打 開 一 個 udp(7) 套 接 字 , 或 者 是 SOCK_RAW 用 來 打 開 一 個 raw(7) 套 接 字 用 來 直 接 訪 問 IP 協 議 . protocol 指 的 是 要 接 收 或 者 發 送 出 去 的 包 含 在 IP 頭 標 識 (header)中 的 IP 協 議 . 對 於 TCP套 接 字 而 言 ,唯 一 的 有 效 protocol 值 是 0IPPROTO_TCP 對 於 UDP套 接 字 而 言 ,唯 一 的 有 效 protocol 值 是 0IPPROTO_UDP. 而 對 於 SOCK_RAW 你 可 以 指 定 一 個 在 RFC1700 中 定 義 的 有 效 IANA IP 協 議 代 碼 來 賦 值 . 當 一 個 進 程 希 望 接 受 新 的 來 訪 包 或 者 連 接 時 ,它 應 該 使 用 bind(2) 綁 定 一 個 套 接 字 到 一 個 本 地 接 口 地 址 . 任 意 給 定 的 本 地 (地 址 ,端 口 )對 只 能 綁 定 一 個 IP套 接 字 . 當 調 用 bind 時 中 聲 明 瞭 INADDR_ANY 時 ,套 接 字 將 會 綁 定 到 所 有 本 地 接 口 . 當 在 未 綁 定 的 套 接 字 上 調 用 listen(2) 或 者 connect(2) 時 ,套 接 字 會 自 動 綁 定 到 一 個 本 地 地 址 設 置 爲 INADDR_ANY 的 隨 機 的 空 閒 端 口 上 . 除 非 你 設 置 了 S0_REUSEADDR 標 識 , 否 則 一 個 已 綁 定 的 TCP 本 地 套 接 字 地 址 在 關 閉 後 的 一 段 時 間 內 不 可 用 . 使 用 該 標 識 的 時 候 要 小 心 , 因 爲 它 會 使 TCP 變 得 不 可 靠 .

ADDRESS FORMAT(地 址 格 式 )

一 個 IP 套 接 字 地 址 定 義 爲 一 個 IP 接 口 地 址 和 一 個 端 口 號 的 組 合 . 基 本 IP 協 議 不 會 提 供 端 口 號 ,它 們 通 過 更 高 層 次 的 協 議 如 udp(7)tcp(7) 來 實 現 . 對 於 raw套 接 字 , sin_port 設 置 爲 IP協 議 .

struct sockaddr_in {
sa_family_t sin_family; /* 地 址 族 : AF_INET */
u_int16_t sin_port; /* 按 網 絡 字 節 次 序 的 端 口 */
struct in_addr sin_addr; /* internet地 址 */ };

/* Internet地 址 . */
struct in_addr {
u_int32_t s_addr; /* 按 網 絡 字 節 次 序 的 地 址 */ };

sin_family 總 是 設 置 爲 AF_INET. 這 是 必 需 的 ; 在 Linux 2.2 中 , 如 果 該 設 置 缺 失 , 大 多 數 聯 網 函 數 會 返 回 EINVAL sin_port 包 含 按 網 絡 字 節 排 序 的 端 口 號 . 端 口 號 在 1024以 下 的 稱 爲 保 留 端 口 . 只 有 那 些 有 效 用 戶 標 識 爲 0 或 者 CAP_NET_BIND_SERVICE 有 功 能 的 進 程 纔 可 以 bind(2) 到 這 些 套 接 字 . 注 意 原 始 的 ( raw) IPv4協 議 沒 有 這 樣 的 端 口 概 念 ,它 們 只 通 過 更 高 的 協 議 如 tcp(7)udp(7) 來 實 現 .

sin_addr 指 的 是 IP 主 機 地 址 . 在 struct in_addr 中 的 addr 部 分 包 含 按 網 絡 字 節 序 的 主 機 接 口 地 址 . in_addr 應 該 只 能 通 過 使 用 inet_aton(3), inet_addr(3), inet_makeaddr(3) 庫 函 數 或 者 直 接 通 過 名 字 解 析 器 ( 參 見 gethostbyname(3)) 來 訪 問 . IPv4 地 址 分 成 單 點 廣 播 , 廣 播 傳 送 和 多 點 廣 播 地 址 . 單 點 廣 播 地 址 指 定 了 一 臺 主 機 的 單 一 接 口 , 廣 播 地 址 指 定 了 在 一 個 網 段 上 的 所 有 主 機 , 而 多 點 廣 播 地 址 則 在 一 個 多 點 傳 送 組 中 尋 址 所 有 主 機 . 只 有 當 設 置 了 套 接 字 標 識 SO_BROADCAST 時 , 才 能 收 發 數 據 報 到 廣 播 地 址 . 在 當 前 的 實 現 中 , 面 向 連 接 的 套 接 字 只 允 許 使 用 單 點 傳 送 地 址 . 注 意 地 址 和 端 口 總 是 按 照 網 絡 字 節 序 存 儲 的 . 這 意 味 着 你 需 要 對 分 配 給 端 口 的 號 碼 調 用 htons(3) 所 有 在 標 準 庫 中 的 地 址 /端 口 處 理 函 數 都 是 按 網 絡 字 節 序 運 行 的 . 有 幾 個 特 殊 的 地 址 : INADDR_LOOPBACK (127.0.0.1) 總 是 代 表 經 由 迴 環 設 備 的 本 地 主 機 ; INADDR_ANY (0.0.0.0) 表 示 任 何 可 綁 定 的 地 址 ; INADDR_BROADCAST (255.255.255.255) 表 示 任 何 主 機 , 由 於 歷 史 的 原 因 , 這 與 綁 定 爲 INADDR_ANY 有 同 樣 的 效 果 .

SOCKET OPTIONS(套 接 字 選 項 )

IP 支 持 一 些 與 協 議 相 關 的 套 接 字 選 項 , 這 些 選 項 可 以 通 過 setsockopt(2) 設 置 , 並 可 以 通 過 getsockopt(2) 讀 取 . IP 的 套 接 字 選 項 級 別 爲 SOL_IP 這 是 一 個 布 爾 整 型 標 識 ,當 值 爲 0時 爲 假 ,否 則 則 爲 真 .
IP_OPTIONS
設 置 或 者 獲 取 將 由 該 套 接 字 發 送 的 每 個 包 的 IP 選 項 . 該 參 數 是 一 個 指 向 包 含 選 項 和 選 項 長 度 的 存 儲 緩 衝 區 的 指 針 . setsockopt(2) 系 統 調 用 設 置 與 一 個 套 接 字 相 關 聯 的 IP 選 項 . IPv4 的 最 大 選 項 長 度 爲 40 字 節 . 參 閱 RFC791 獲 取 可 用 的 選 項 . 如 果 一 個 SOCK_STREAM 套 接 字 收 到 的 初 始 連 接 請 求 包 包 含 IP 選 項 時 , IP 選 項 自 動 設 置 爲 來 自 初 始 包 的 選 項 , 同 時 反 轉 路 由 頭 . 在 連 接 建 立 以 後 將 不 允 許 來 訪 的 包 修 改 選 項 . 缺 省 情 況 下 是 關 閉 對 所 有 來 訪 包 的 源 路 由 選 項 的 , 你 可 以 用 accept_source_route sysctl 來 激 活 . 仍 然 處 理 其 它 選 項 如 時 間 戳 ( timestamp) . 對 於 數 據 報 套 接 字 而 言 , IP 選 項 只 能 由 本 地 用 戶 設 置 . 調 用 帶 IP_OPTIONSgetsockopt(2) 會 把 當 前 用 於 發 送 的 IP 選 項 放 到 你 提 供 的 緩 衝 區 中 .
IP_PKTINFO
傳 遞 一 條 包 含 pktinfo 結 構 (該 結 構 提 供 一 些 來 訪 包 的 相 關 信 息 )的 IP_PKTINFO 輔 助 信 息 . 這 個 選 項 只 對 數 據 報 類 的 套 接 字 有 效 .

struct in_pktinfo
{
unsigned int ipi_ifindex; /* 接 口 索 引 */
struct in_addr ipi_spec_dst; /* 路 由 目 的 地 址 */
struct in_addr ipi_addr; /* 頭 標 識 目 的 地 址 */ };

ipi_ifindex 指 的 是 接 收 包 的 接 口 的 唯 一 索 引 . ipi_spec_dst 指 的 是 路 由 表 記 錄 中 的 目 的 地 址 , 而 ipi_addr 指 的 是 包 頭 中 的 目 的 地 址 . 如 果 給 sendmsg (2)傳 遞 了 IP_PKTINFO, 那 麼 外 發 的 包 會 通 過 在 ipi_ifindex 中 指 定 的 接 口 發 送 出 去 , 同 時 把 ipi_spec_dst 設 置 爲 目 的 地 址 .

IP_RECVTOS 如 果 打 開 了 這 個 選 項 , 則 IP_TOS , 輔 助 信 息 會 與 來 訪 包 一 起 傳 遞 . 它 包 含 一 個 字 節 用 來 指 定 包 頭 中 的 服 務 /優 先 級 字 段 的 類 型 . 該 字 節 爲 一 個 布 爾 整 型 標 識 .
IP_RECVTTL
當 設 置 了 該 標 識 時 , 傳 送 一 條 帶 有 用 一 個 字 節 表 示 的 接 收 包 生 存 時 間 ( time to live) 字 段 的 IP_RECVTTL 控 制 信 息 . 此 選 項 還 不 支 持 SOCK_STREAM 套 接 字 .
IP_RECVOPTS
用 一 條 IP_OPTIONS 控 制 信 息 傳 遞 所 有 來 訪 的 IP 選 項 給 用 戶 . 路 由 頭 標 識 和 其 它 選 項 已 經 爲 本 地 主 機 填 好 . 此 選 項 還 不 支 持 SOCK_STREAM 套 接 字 .
IP_RETOPTS
等 同 於 IP_RECVOPTS 但 是 返 回 的 是 帶 有 時 間 戳 的 未 處 理 的 原 始 選 項 和 在 這 段 路 由 中 未 填 入 的 路 由 記 錄 項 目 .

IP_TOS 設 置 或 者 接 收 源 於 該 套 接 字 的 每 個

IP包 的 Type-Of-Service ( TOS 服 務

類 型 ) 字 段 . 它 被 用 來 在 網 絡 上 區 分 包 的 優 先 級 . TOS 是 單 字 節 的 字 段 . 定 義 了 一 些 的 標 準 TOS 標 識 : IPTOS_LOWDELAY 用 來 爲 交 互 式 通 信 最 小 化 延 遲 時 間 , IPTOS_THROUGHPUT 用 來 優 化 吞 吐 量 , IPTOS_RELIABILITY 用 來 作 可 靠 性 優 化 , IPTOS_MINCOST 應 該 被 用 作 "填 充 數 據 ", 對 於 這 些 數 據 , 低 速 傳 輸 是 無 關 緊 要 的 . 至 多 隻 能 聲 明 這 些 TOS 值 中 的 一 個 . 其 它 的 都 是 無 效 的 , 應 當 被 清 除 . 缺 省 時 ,Linux首 先 發 送 IPTOS_LOWDELAY 數 據 報 , 但 是 確 切 的 做 法 要 看 配 置 的 排 隊 規 則 而 定 . 一 些 高 優 先 級 的 層 次 可 能 會 要 求 一 個 有 效 的 用 戶 標 識 0 或 者 CAP_NET_ADMIN 能 力 . 優 先 級 也 可 以 以 於 協 議 無 關 的 方 式 通 過 ( SOL_SOCKET, SO_PRIORITY )套 接 字 選 項 (參 看 socket(7) )來 設 置 .

IP_TTL 設 置 或 者 檢 索 從 此 套 接 字 發 出 的 包 的 當 前 生 存 時 間 字 段

.

IP_HDRINCL 如 果 打 開 的 話 , 那 麼 用 戶 可 在 用 戶 數 據 前 面 提 供 一 個 ip 頭 . 這 隻 對 SOCK_RAW 有 效 .參 看 raw(7) 以 獲 得 更 多 信 息 .當 激 活 了 該 標 識 之 後 ,其 值 由 IP_OPTIONS 設 定 ,並 且 IP_TOS 被 忽 略 .
IP_RECVERR
允 許 傳 遞 擴 展 的 可 靠 的 錯 誤 信 息 . 如 果 在 數 據 報 上 激 活 了 該 標 識 , 那 麼 所 有 產 生 的 錯 誤 會 在 每 套 接 字 一 個 的 錯 誤 隊 列 中 排 隊 等 待 . 當 用 戶 從 套 接 字 操 作 中 收 到 錯 誤 時 ,就 可 以 通 過 調 用 設 置 了 MSG_ERRQUEUE 標 識 的 recvmsg(2) 來 接 收 . 描 述 錯 誤 的 sock_extended_err 結 構 將 通 過 一 條 類 型 爲 IP_RECVERR , 級 別 爲 SOL_IP的 輔 助 信 息 進 行 傳 遞 . 這 個 選 項 對 在 未 連 接 的 套 接 字 上 可 靠 地 處 理 錯 誤 很 有 用 . 錯 誤 隊 列 的 已 收 到 的 數 據 部 分 包 含 錯 誤 包 .

IP 按 照 下 面 的 方 法 使 用 sock_extended_err 結 構 : ICMP 包 接 收 的 錯 誤 ee_origin 設 爲 SO_EE_ORIGIN_ICMP , 對 於 本 地 產 生 的 錯 誤 則 設 爲 SO_EE_ORIGIN_LOCAL . ee_typeee_code 設 置 爲 ICMP 頭 標 識 的 類 型 和 代 碼 字 段 . ee_info 包 含 用 於 EMSGSIZE 時 找 到 的 MTU. ee_data 目 前 沒 有 使 用 . 當 錯 誤 來 自 於 網 絡 時 ,該 套 接 字 上 所 有 IP選 項 都 被 激 活 (IP_OPTIONS, IP_TTL, 等 . )並 且 當 做 控 制 信 息 包 含 錯 誤 包 中 傳 遞 .引 發 錯 誤 的 包 的 有 效 載 荷 會 以 正 常 數 據 返 回 . 在 SOCK_STREAM 套 接 字 上 , IP_RECVERR 會 有 細 微 的 語 義 不 同 .它 並 不 保 存 下 次 超 時 的 錯 誤 ,而 是 立 即 傳 遞 所 有 進 來 的 錯 誤 給 用 戶 . 這 對 TCP 連 接 時 間 很 短 的 情 況 很 有 用 ,因 爲 它 要 求 快 速 的 錯 誤 處 理 . 使 用 該 選 項 要 小 心 :因 爲 不 允 許 從 路 由 轉 移 和 其 它 正 常 條 件 下 正 確 地 進 行 恢 復 ,它 使 得 TCP變 得 不 可 靠 ,並 且 破 壞 協 議 的 規 範 . 注 意 TCP沒 有 錯 誤 隊 列 ; MSG_ERRQUEUE 對 於 SOCK_STREAM 套 接 字 是 非 法 的 . 因 此 所 有 錯 誤 都 會 由 套 接 字 函 數 返 回 ,或 者 只 返 回 SO_ERROR . 對 於 原 始 (raw)套 接 字 而 言 , IP_RECVERR 允 許 傳 遞 所 有 接 收 到 的 ICMP錯 誤 給 應 用 程 序 ,否 則 錯 誤 只 在 連 接 的 套 接 字 上 報 告 出 來 . 它 設 置 或 者 檢 索 一 個 整 型 布 爾 標 識 . IP_RECVERR 缺 省 設 置 爲 off(關 閉 ).

IP_PMTU_DISCOVER 爲 套 接 字 設 置 或 接 收 Path MTU Discovery setting(路 徑 MTU發 現 設 置 ). 當 允 許 時 ,Linux會 在 該 套 接 字 上 執 行 定 義 於 RFC1191中 的 Path MTU Discovery(路 徑 MTU發 現 ). don’t 段 標 識 會 設 置 在 所 有 外 發 的 數 據 報 上 . 系 統 級 別 的 缺 省 值 是 這 樣 的 : SOCK_STREAM 套 接 字 由 ip_no_pmtu_disc sysctl 控 制 , 而 對 其 它 所 有 的 套 接 字 都 被 都 屏 蔽 掉 了 , 對 於 非 SOCK_STREAM 套 接 字 而 言 , 用 戶 有 責 任 按 照 MTU的 大 小 對 數 據 分 塊 並 在 必 要 的 情 況 下 進 行 中 繼 重 發 .如 果 設 置 了 該 標 識 (用 EMSGSIZE ),內 核 會 拒 絕 比 已 知 路 徑 MTU更 大 的 包 .

當 允 許 PMTU ( 路 徑 MTU) 搜 索 時 , 內 核 會 自 動 記 錄 每 個 目 的 主 機 的 path MTU(路 徑 MTU).當 它 使 用 connect(2) 連 接 到 一 個 指 定 的 對 端 機 器 時 ,可 以 方 便 地 使 用 IP_MTU 套 接 字 選 項 檢 索 當 前 已 知 的 path MTU(路 徑 MTU)(比 如 , 在 發 生 了 一 個 EMSGSIZE 錯 誤 後 ).它 可 能 隨 着 時 間 的 推 移 而 改 變 . 對 於 帶 有 許 多 目 的 端 的 非 連 接 的 套 接 字 ,一 個 特 定 目 的 端 的 新 到 來 的 MTU 也 可 以 使 用 錯 誤 隊 列 (參 看 IP_RECVERR) 來 存 取 訪 問 . 新 的 錯 誤 會 爲 每 次 到 來 的 MTU 的 更 新 排 隊 等 待 . 當 進 行 MTU 搜 索 時 ,來 自 數 據 報 套 接 字 的 初 始 包 可 能 會 被 丟 棄 . 使 用 UDP 的 應 用 程 序 應 該 知 道 這 個 並 且 考 慮 其 包 的 中 繼 傳 送 策 略 . 爲 了 在 未 連 接 的 套 接 字 上 引 導 路 徑 MTU 發 現 進 程 , 我 們 可 以 用 一 個 大 的 數 據 報 (頭 尺 寸 超 過 64K字 節 )啓 動 , 並 令 其 通 過 更 新 路 徑 MTU 逐 步 收 縮 . 爲 了 獲 得 路 徑 MTU連 接 的 初 始 估 計 ,可 通 過 使 用 connect(2) 把 一 個 數 據 報 套 接 字 連 接 到 目 的 地 址 ,並 通 過 調 用 帶 IP_MTU選 項 的 getsockopt(2) 檢 索 該 MTU.

IP_MTU 檢 索 當 前 套 接 字 的 當 前 已 知 路 徑

MTU.只 有 在 套 接 字 被 連 接 時 纔 是 有 效

的 .返 回 一 個 整 數 .只 有 作 爲 一 個 getsockopt(2) 纔 有 效 .

IP_ROUTER_ALERT 給 該 套 接 字 所 有 將 要 轉 發 的 包 設 置 IP路 由 器 警 告 ( IP RouterAlert option) 選 項 . 只 對 原 始 套 接 字 ( raw socket) 有 效 ,這 對 用 戶 空 間 的 RSVP後 臺 守 護 程 序 之 類 很 有 用 . 分 解 的 包 不 能 被 內 核 轉 發 ,用 戶 有 責 任 轉 發 它 們 .套 接 字 綁 定 被 忽 略 , 這 些 包 只 按 協 議 過 濾 . 要 求 獲 得 一 個 整 型 標 識 .
IP_MULTICAST_TTL
設 置 或 者 讀 取 該 套 接 字 的 外 發 多 點 廣 播 包 的 生 存 時 間 值 . 這 對 於 多 點 廣 播 包 設 置 可 能 的 最 小 TTL很 重 要 . 缺 省 值 爲 1,這 意 味 着 多 點 廣 播 包 不 會 超 出 本 地 網 段 , 除 非 用 戶 程 序 明 確 地 要 求 這 麼 做 .參 數 是 一 個 整 數 .
IP_MULTICAST_LOOP
設 置 或 讀 取 一 個 布 爾 整 型 參 數 以 決 定 發 送 的 多 點 廣 播 包 是 否 應 該 被 回 送 到 本 地 套 接 字 .
IP_ADD_MEMBERSHIP
加 入 一 個 多 點 廣 播 組 .參 數 爲 struct ip_mreqn 結 構 .

struct ip_mreqn
{
struct in_addr imr_multiaddr; /* IP多 點 傳 送 組 地 址 */
struct in_addr imr_address; /* 本 地 接 口 的 IP地 址 */
int imr_ifindex; /* 接 口 索 引 */ };

imr_multiaddr 包 含 應 用 程 序 希 望 加 入 或 者 退 出 的 多 點 廣 播 組 的 地 址 . 它 必 須 是 一 個 有 效 的 多 點 廣 播 地 址 . imr_address 指 的 是 系 統 用 來 加 入 多 點 廣 播 組 的 本 地 接 口 地 址 ;如 果 它 與 INADDR_ANY 一 致 ,那 麼 由 系 統 選 擇 一 個 合 適 的 接 口 . imr_ifindex 指 的 是 要 加 入 /脫 離 imr_multiaddr 組 的 接 口 索 引 ,或 者 設 爲 0表 示 任 何 接 口 . 由 於 兼 容 性 的 緣 故 ,老 的 ip_mreq 接 口 仍 然 被 支 持 .它 與 ip_mreqn 只 有 一 個 地 方 不 同 ,就 是 沒 有 包 括 imr_ifindex 字 段 .這 隻 在 作 爲 一 個 setsockopt(2) 時 纔 有 效 .

IP_DROP_MEMBERSHIP 脫 離 一 個 多 點 廣 播 組 .參 數 爲 ip_mreqn 或 者 ip_mreq 結 構 ,這 與 IP_ADD_MEMBERSHIP 類 似 .
IP_MULTICAST_IF
爲 多 點 廣 播 套 接 字 設 置 本 地 設 備 .參 數 爲 ip_mreqn 或 者 ip_mreq 結 構 ,它 與 IP_ADD_MEMBERSHIP 類 似 . 當 傳 遞 一 個 無 效 的 套 接 字 選 項 時 ,返 回 ENOPROTOOPT .

SYSCTLS

IP協 議 支 持 sysctl 接 口 配 置 一 些 全 局 選 項 .sysctl可 通 過 讀 取 或 者 寫 入 /proc/sys/net/ipv4/* 文 件 或 使 用 sysctl(2) 接 口 來 存 取 訪 問 .
ip_default_ttl
設 置 外 發 包 的 缺 省 生 存 時 間 值 .此 值 可 以 對 每 個 套 接 字 通 過 IP_TTL 選 項 來 修 改 .
ip_forward
以 一 個 布 爾 標 識 來 激 活 IP轉 發 功 能 .IP轉 發 也 可 以 按 接 口 來 設 置
ip_dynaddr
打 開 接 口 地 址 改 變 時 動 態 套 接 字 地 址 和 僞 裝 記 錄 的 重 寫 . 這 對 具 有 變 化 的 IP地 址 的 撥 號 接 口 很 有 用 .0表 示 不 重 寫 ,1打 開 其 功 能 ,而 2則 激 活 冗 餘 模 式 .
ip_autoconfig
無 文 檔
ip_local_port_range
包 含 兩 個 整 數 ,定 義 了 缺 省 分 配 給 套 接 字 的 本 地 端 口 範 圍 . 分 配 起 始 於 第 一 個 數 而 終 止 於 第 二 個 數 . 注 意 這 些 端 口 不 能 與 僞 裝 所 使 用 的 端 口 相 沖 突 (儘 管 這 種 情 況 也 可 以 處 理 ). 同 時 ,隨 意 的 選 擇 可 能 會 導 致 一 些 防 火 牆 包 過 濾 器 的 問 題 ,它 們 會 誤 認 爲 本 地 端 口 在 使 用 . 第 一 個 數 必 須 至 少 >1024,最 好 是 >4096以 避 免 與 衆 所 周 知 的 端 口 發 生 衝 突 , 從 而 最 大 可 能 的 減 少 防 火 牆 問 題 .
ip_no_pmtu_disc
如 果 打 開 了 ,缺 省 情 況 下 不 對 TCP套 接 字 執 行 路 徑 MTU發 現 . 如 果 在 路 徑 上 誤 配 置 了 防 火 牆 (用 來 丟 棄 所 有 ICMP包 )或 者 誤 配 置 了 接 口 (例 如 ,設 置 了 一 個 兩 端 MTU不 同 的 端 對 端 連 接 ),路 徑 MTU發 現 可 能 會 失 敗 . 寧 願 修 復 路 徑 上 的 損 壞 的 路 由 器 ,也 好 過 整 個 地 關 閉 路 徑 MTU發 現 , 因 爲 這 樣 做 會 導 致 網 絡 上 的 高 開 銷 .
ipfrag_high_thresh, ipfrag_low_thresh
如 果 排 隊 等 待 的 IP碎 片 的 數 目 達 到 ipfrag_high_thresh , 隊 列 被 排 空 爲 ipfrag_low_thresh . 這 包 含 一 個 表 示 字 節 數 的 整 數 .
ip_always_defrag

[kernel 2.2.13中 的 新 功 能 ;在 早 期 內 核 版 本 中 ,該 功 能 在 編 譯 時 通 過 CONFIG_IP_ALWAYS_DEFRAG 選 項 來 控 制 ] 當 該 布 爾 標 識 被 激 活 (不 等 於 0)時 , 來 訪 的 碎 片 (IP包 的 一 部 分 ,這 生 成 於 當 一 些 在 源 端 和 目 的 端 之 間 的 主 機 認 定 包 太 大 而 分 割 成 許 多 碎 片 的 情 況 下 )將 在 處 理 之 前 重 新 組 合 (碎 片 整 理 ), 即 使 它 們 馬 上 要 被 轉 發 也 如 此 . 只 在 運 行 着 一 臺 與 網 絡 單 一 連 接 的 防 火 牆 或 者 透 明 代 理 服 務 器 時 才 這 麼 幹 ; 對 於 正 常 的 路 由 器 或 者 主 機 , 永 遠 不 要 打 開 它 . 否 則 當 碎 片 在 不 同 連 接 中 通 過 時 碎 片 的 通 信 可 能 會 被 擾 亂 . 而 且 碎 片 重 組 也 需 要 花 費 大 量 的 內 存 和 CPU 時 間 . 這 在 配 置 了 僞 裝 或 者 透 明 代 理 的 情 況 下 自 動 打 開 .

neigh/* 參 看 arp(7)

IOCTLS

所 有 在 socket(7) 中 有 描 述 的 ioctl 都 可 應 用 於 ip. 用 於 配 置 防 火 牆 應 用 的 ioctl記 載 在 ipchains 包 的 ipfw(7) 的 文 檔 中 . 用 來 配 置 普 通 設 備 參 數 的 ioctl在 netdevice(7) 中 有 描 述 .

NOTES(備 註 )

使 用 SO_BROADCAST 選 項 要 小 心 - 它 在 Linux 中 沒 有 權 限 要 求 . 不 小 心 的 廣 播 很 容 易 導 致 網 絡 過 載 .對 於 新 的 應 用 協 議 而 言 ,最 好 是 使 用 多 點 廣 播 組 來 替 代 廣 播 .我 們 不 鼓 勵 使 用 廣 播 . 有 些 其 它 的 BSD套 接 字 實 現 提 供 了 IP_RCVDSTADDRIP_RECVIF 套 接 字 選 項 來 獲 得 目 的 地 址 以 及 接 收 數 據 報 的 接 口 .Linux有 更 通 用 的 IP_PKTINFO 來 完 成 相 同 任 務 .

ERRORS(錯 誤 )

ENOBUFS,EPERM對 EACCES等 .)
ENOTCONN
操 作 只 定 義 於 連 接 的 套 接 字 ,而 該 套 接 字 卻 沒 有 連 接 .

EINVAL 傳 遞 無 效 的 參 數

. 對 於 發 送 操 作 ,這 可 以 因 發 送 到 一 個 blackhole(黑 洞 )

路 由 而 引 發 .

EMSGSIZE 數 據 報 大 於 該 路 徑 上 的 MTU,並 且 它 不 能 被 分 成 碎 片 .

EACCES 沒 有 必 要 權 限 的 用 戶 試 圖 執 行 一 項 需 要 某 些 權 限 的 操 作

. 這 包 括 : 在 沒

SO_BROADCAST 標 識 設 置 的 情 況 下 發 送 一 個 包 到 廣 播 地 址 . 通 過 一 條 禁 止 的 路 由 發 送 包 . 在 沒 有 CAP_NET_ADMIN 或 者 有 效 用 戶 標 識 不 爲 0的 情 況 下 修 改 防 火 牆 設 置 . 在 沒 有 CAP_NET_BIND_SERVICE 能 力 或 者 有 效 用 戶 標 識 不 爲 零 0的 情 況 下 綁 定 一 個 保 留 端 口 .

EADDRINUSE 試 圖 綁 定 到 一 個 已 在 使 用 的 地 址 .
ENOMEM
ENOBUFS 沒 有 足 夠 的 內 存 可 用 .
ENOPROTOOPT
EOPNOTSUPP 傳 遞 無 效 的 套 接 字 選 項 .

EPERM 用 戶 沒 有 權 限 設 置 高 優 先 級 ,修 改 配 置 或 者 發 送 信 號 到 請 求 的 進 程 或 組

.

EADDRNOTAVAIL 請 求 一 個 不 存 在 的 接 口 或 者 請 求 的 源 端 地 址 不 是 本 地 的 .

EAGAIN 在 一 個 非 阻 塞 的 套 接 字 上 進 行 操 作 會 阻 塞

.

ESOCKTNOSUPPORT 套 接 字 未 配 置 或 者 請 求 了 一 個 未 知 類 型 的 套 接 字 .
EISCONN
在 一 個 已 經 連 接 的 套 接 字 上 調 用 connect(2).
EALREADY
在 一 個 非 阻 塞 的 套 接 字 上 的 連 接 操 作 已 經 在 進 行 中 .
ECONNABORTED
在 一 次 accept(2) 執 行 中 連 接 被 關 閉 .

EPIPE 連 接 意 外 關 閉 或 者 被 對 端 關 閉

.

ENOENT 在 沒 有 報 到 達 的 套 接 字 上 調 用

SIOCGSTAMP .

EHOSTUNREACH 沒 有 有 效 路 由 表 記 錄 匹 配 目 的 地 址 .該 錯 誤 可 以 被 來 自 遠 程 路 由 器 的 ICMP消 息 或 者 因 爲 本 地 路 由 表 的 緣 故 而 引 發 .

ENODEV 網 絡 設 備 不 可 用 或 者 不 適 於 發 送

IP.

ENOPKG 內 核 子 系 統 沒 有 配 置

.
ENOBUFS, ENOMEM
沒 有 足 夠 的 空 閒 內 存 . 這 常 常 意 味 着 內 存 分 配 因 套 接 字 緩 衝 區 的 限 制 而 受 限 , 而 不 是 因 爲 系 統 內 存 的 緣 故 ,但 是 這 也 不 是 100%正 確 . 其 它 錯 誤 可 能 由 重 疊 協 議 族 生 成 ;參 看 tcp(7), raw(7), udp(7)socket(7).

VERSIONS(版 本 )

IP_PKTINFO, IP_MTU, IP_PMTU_DISCOVER, IP_PKTINFO, IP_RECVERRIP_ROUTER_ALERT 是 Linux 2.2中 的 新 選 項 .

struct ip_mreqn 也 是 新 出 現 在 Linux 2.2中 的 .Linux 2.0只 支 持 ip_mreq.

sysctl是 在 Linux 2.2中 引 入 的 .

COMPATIBILITY(兼 容 性 )

爲 了 與 Linux 2.0相 容 ,仍 然 支 持 用 過 時 的 socket(PF_INET, SOCK_RAW, protocol) 語 法 打 開 一 個 packet(7) 套 接 字 .我 們 不 贊 成 這 麼 用 ,而 且 應 該 被 socket(PF_PACKET, SOCK_RAW, protocol) 所 代 替 .主 要 的 區 別 就 是 新 的 針 對 一 般 鏈 接 層 信 息 的 sockaddr_ll 地 址 結 構 替 換 了 舊 的 sockaddr_pkt 地 址 結 構 .

BUGS

有 許 多 不 連 貫 的 錯 誤 碼 . 沒 有 描 述 用 來 配 置 特 定 IP接 口 選 項 和 ARP表 的 ioctl.

AUTHORS(作 者 )

該 man頁 作 者 是 Andi Kleen.

SEE ALSO(另 見 )

sendmsg(2), recvmsg(2), socket(7), netlink(7), tcp(7), udp(7), raw(7), ipfw(7).

RFC791:原 始 IP規 範 .
RFC1122:IPv4主 機 需 求 .
RFC1812:IPv4路 由 器 需 求 .

[中 文 版 維 護 人 ]

riser <boomer [AT] ccidnet.com>

[中 文 版 最 新 更 新 ]

2001/07/19

《 中 國 linux論 壇 man手 冊 頁 翻 譯 計 劃 》 :

http://cmpp.linuxforum.net

本 頁 面 中 文 版 由 中 文 man 手 冊 頁 計 劃 提 供 。 中 文 man 手 冊 頁 計 劃 : https://github.com/man-pages-zh/manpages-zh