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

试 图 绑 定 到 一 个 已 在 使 用 的 地 址 .

ENOMEMENOBUFS

没 有 足 够 的 内 存 可 用 .

ENOPROTOOPTEOPNOTSUPP

传 递 无 效 的 套 接 字 选 项 .

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

COMMENTS