Manpages

NAME

raw, SOCK_RAW - Linux IPv4 raw socket.

總 覽

#include <sys/socket.h>
#include <netinet/in.h>
raw_socket = socket(PF_INET, SOCK_RAW, int protocol );

描 述

Raw sockets 使 得 用 戶 端 可 以 實 現 新 的 IPv4 協 議 。 raw socket 設 備 接 收 或 發 送 不 含 鏈 接 層 報 頭 的 原 始 數 據 包 。 只 有 激 活 接 口 選 項 IP_HDRINCL 時 IPv4 層 纔 會 在 傳 輸 包 中 添 加 IP 報 頭 。 而 且 當 激 活 時 , 包 中 必 須 含 有 IP 報 頭 。 包 中 含 有 IP 報 頭 才 能 被 接 收 。 只 有 user id 爲 0 或 具 有 CAP_NET_RAW 能 力 才 能 打 開 raw sockets. 所 有 匹 配 爲 此 raw socket 聲 明 的 協 議 號 的 包 或 錯 誤 都 將 被 傳 送 到 該 socket.要 察 看 許 可 的 協 議 列 表 , 請 參 考 RFC1700 給 出 的 代 號 和 getprotobyname (3).

IPPROTO_RAW 意 味 着 IP_HDRINCL 處 於 激 活 狀 態 , 也 意 味 着 接 收 所 有 IP 協 議 . 但 是 不 允 許 傳 送 。

如 果 指 定 了 IP_HDRINCL 且 IP 報 頭 含 有 的 目 的 地 址 不 是 0, 那 麼 該 socket 的 目 的 地 址 用 於 路 由 該 包 。 如 果 指 定 了 MSG_DONTROUTE 則 目 的 地 址 應 指 向 某 個 本 地 接 口 。 否 則 會 進 行 路 有 表 查 找 , 但 是 網 關 路 由 會 被 忽 略 。 如 果 未 設 定 IP_HDRINCL 則 可 通 過 setsockopt (2) 在 raw socket 中 設 定 IP header 選 項 。 參 考 ip (7) 瞭 解 更 多 信 息 。 在 Linux 2.2 下 可 以 用 IP socket 選 項 設 置 所 有 的 IP 報 頭 域 和 選 項 . 這 意 味 着 通 常 只 有 新 的 協 議 或 沒 有 用 戶 界 面 的 協 議 需 要 raw socket (就 象 ICMP). 當 收 到 一 個 包 時 , 它 首 先 被 傳 給 綁 定 到 包 協 議 的 任 何 raw socket 然 後 才 傳 給 其 他 協 議 句 柄 (handler)。 (比 如 . 內 核 協 議 模 塊 ).

地 址 格 式

raw socket 使 用 在 ip (7) 中 定 義 的 標 準 sockaddr_in 地 址 結 構 。 sin_port 域 用 於 指 定 IP 協 議 號 , 但 是 在 Linux 2.2 下 傳 送 時 應 將 其 忽 略 , 而 且 應 該 一 直 設 爲 0 (參 見 BUGS). 對 於 接 收 的 包 , sin_port 被 設 置 爲 該 包 的 協 議 號 。 參 考 其 中 包 括 介 紹 有 效 的 IP 協 議 的 文 件 .

SOCKET選 項

raw socket 選 項 可 使 用 setsockopt (2) 進 行 設 置 , 用 getsockopt (2)進 行 讀 取 ( 通 過 傳 遞 SOL_RAW 族 標 誌 ) .
ICMP_FILTER
激 活 綁 定 到 IPPROTO_ICMP 協 議 的 一 個 用 於 raw socket 特 殊 的 過 濾 器 。 該 值 對 每 種 ICMP 消 息 都 有 一 個 位 ( 掩 碼 ) , 可 以 把 那 種 ICMP 消 息 過 濾 掉 . 缺 省 時 是 不 過 濾 ICMP 消 息 . 另 外 , 還 支 持 所 有 對 數 據 報 socket 有 效 的 ip(7) SOL_IP socket 選 項 .

注 意

raw socket 包 長 超 過 接 口 MTU 時 會 把 包 分 成 碎 片 。 (另 見 BUGS). 另 一 個 更 友 好 和 快 速 的 選 擇 是 使 用 路 徑 MTU 查 找 。 在 ip (7) IP_PMTU_DISCOVER 一 段 有 詳 細 描 述 。 使 用 bind (2) 可 將 raw socket 綁 定 到 指 定 的 本 地 地 址 。 如 果 沒 有 綁 定 , 則 接 收 所 有 符 合 指 定 的 IP 協 議 的 包 。 另 外 用 SO_BINDTODEVICE 可 以 將 RAW socket 綁 定 到 指 定 的 網 絡 設 備 。 詳 見 : socket (7).

IPPROTO_RAW 只 能 傳 送 。 如 果 你 確 實 想 接 收 所 有 的 IP 包 用 packet (7) socket 和 ETH_P_IP 協 議 . 請 注 意 packet socket不 象 raw socket 那 樣 對 IP 碎 片 進 行 重 組 。 如 果 想 要 爲 一 個 datagram socket 接 收 的 所 有 ICMP 包 , 那 麼 最 好 在 那 個 socket 上 使 用 IP_RECVERR。 詳 見 : ip (7).

raw socket 能 竊 聽 所 有 的 IP 協 議 , 即 使 象 ICMP 或 TCP 這 樣 在 內 核 中 有 協 議 模 塊 的 也 不 例 外 。 這 時 候 包 會 同 時 傳 送 到 核 心 模 塊 和 raw socket. 一 個 可 移 植 的 程 序 不 能 依 賴 這 個 特 性 , 許 多 其 他 BSD socket 實 現 在 這 方 面 有 侷 限 .

Linux 從 不 改 變 用 戶 傳 輸 的 包 (除 了 前 面 提 到 的 IP_HDRINCL , 填 入 一 些 0字 段 ).這 與 其 他 raw socket 實 現 方 式 是 不 同 的 .

RAW socket 通 常 很 難 移 植 . socket 傳 輸 時 使 用 sin_port 中 設 置 的 協 議 , 但 Linux2.2 下 不 行 了 , 解 決 辦 法 是 使 用 IP_HDRINCL.

錯 誤 處 理

只 有 連 接 了 socket 或 IP_RECVERR 設 置 爲 有 效 時 , 網 絡 錯 誤 纔 會 傳 送 給 用 戶 。 因 爲 兼 容 性 的 原 因 只 有 EMSGSIZE 和 EPROTO 被 傳 送 給 socket.

錯 誤

IP_RECVERR 使 得 所 有 的 錯 誤 存 儲 到 error queue( 錯 誤 隊 列 ) .
EMSGSIZE
包 太 大 。 或 者 因 爲 路 徑 MTU 查 找 ( IP_PMTU_DISCOVER) 設 置 爲 有 效 , 或 者 因 爲 包 的 尺 寸 超 過 IPv4 規 定 的 包 最 大 尺 寸 64KB.

EACCES 用 戶 試 圖 傳 送 到 某 廣 播 地 址 但 是 並 未 事 先 在

socket中 設 置 廣 播 標 誌 。

EPROTO

ICMP 錯 誤 報 告 有 參 數 問 題 。

EFAULT 無 效 內 存 地 址 。

EOPNOTSUPP 傳 送 給 socket 的 標 誌 無 效 (比 如 : MSG_OOB ).

EINVAL 無 效 參 數

.

EPERM 用 戶 無 權

打 開 raw socket. 只 有 用 戶 id 爲 0 或 具 有 CAP_NET_RAW 屬 性 方 可 。

版 本

IP_RECVERR 和 ICMP_FILTER 是 Linux 2.2 的 新 實 現 . 不 能 用 於 可 移 植 程 序 。 如 果 設 置 了 SO_BSDCOMPAT 標 誌 , Linux 2.0 裏 面 有 和 BSD 裏 兼 容 的 raw socket 代 碼 錯 誤 , 在 2.2 裏 已 經 修 補 了 .

BUGS

沒 有 描 述 透 明 代 理 擴 展 . 當 設 置 IP_HDRINCL 選 項 後 datagrams( 自 尋 址 數 據 包 ) 不 會 被 分 段 並 受 MTU 限 制 . 這 是 Linux 2.2 的 限 制 . 在 Linux 2.2 sin_port 中 設 置 的 IP 協 議 會 丟 失 。 使 用 的 是 綁 定 了 socket 的 協 議 , 或 在 socket (2)初 始 化 調 用 中 指 定 的 協 議 。

作 者

Andi Kleen.

另 見

ip(7), socket(7), recvmsg(2), sendmsg(2).

RFC1191 for path MTU discovery.
RFC791 and the include file for the IP protocol.

[中 文 版 維 護 人 ]

RedCandle <redcandle51 [AT] chinaren.com>

[中 文 版 最 新 更 新 ]

2000/10/15

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

http://cmpp.linuxforum.net

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