进 阶 技 术
实 战 网 际 网 路 通 讯 协 定

协 定 是 网 路 的 语 言 , 而 网 路 赋 予 协 定 生 命 。 有 了 这 些 协 定 的 转 换 , 我 们 的 应 用 程 式 才 可 在 不 同 的 硬 体 或 介 面 之 间 游 走 , 达 成 一 统 网 路 江 湖 的 结 果 。

马 得 翔 (Derek Ma)

  我 们 常 见 的 通 讯 协 定 ( 如 图 一 所 示 ) , 有 在 第 五 到 七 层 应 用 层 的 Telnet、 FTP、 SMTP; 第 叁 、 四 层 网 路 层 和 传 输 层 的 IP与 TCP/UDP协 定 ; 而 第 二 层 资 料 连 结 层 可 能 使 用 PPP、 SLIP、 ARP、 RARP等 等 协 定 。 有 了 这 些 协 定 的 保 护 , 我 们 所 送 出 的 资 料 才 能 安 全 地 到 达 对 方 ; 同 理 , 有 了 这 些 协 定 的 转 换 , 我 们 的 应 用 程 式 就 可 在 不 同 的 硬 体 或 介 面 之 间 游 走 , 达 成 一 统 网 路 江 湖 。

  Internet的 语 言 是 TCP/IP, 所 以 送 收 两 方 的 网 路 层 和 传 输 层 都 要 一 样 才 行 , 否 则 必 须 藉 助 於 闸 道 器 ( Gateway) 来 把 资 料 做 转 换 ; 不 过 闸 道 器 的 价 钱 太 贵 , 也 不 太 符 合 经 济 效 益 。

   表 一 为 我 们 常 见 的 协 定 与 RFC的 对 照 表 , 小 弟 把 它 整 理 出 来 并 列 出 其 对 应 的 OSI层 级 , 希 望 读 者 能 有 整 体 的 了 解 ; 若 想 要 深 入 了 解 的 读 者 可 参 阅 它 的 RFC, 而 上 述 所 列 出 的 RFC不 一 定 是 该 协 定 的 最 新 版 本 , 如 Finger协 定 在 RFC742、 1194、 1196与 1288, 都 有 定 义 , 但 RFC1288是 最 新 版 , 而 RFC1196、 RFC1194、 RFC742都 被 废 除 了 ( Obsolete) 。

Internet活动委员会

  它 是 制 定 Internet的 技 术 方 向 且 决 定 协 定 何 时 成 为 标 准 , IAB组 织 ( Internet Activities Board) 并 协 调 了 与 大 多 数 TCP/IP协 定 有 关 的 研 究 开 发 与 改 进 。

  IAB在 1989年 夏 天 改 组 , 除 本 身 的 委 员 会 外 , 它 包 含 两 个 主 要 的 任 务 小 组 : 网 际 网 路 工 程 任 务 小 组 ( IETF, Internet Engineering Task Force) 与 网 际 网 路 研 究 任 务 小 组 ( IRTF, Internet Research TaskForce) 。 IETF负 责 短 中 期 工 程 问 题 , 但 IETF实 在 太 大 了 , 主 席 无 法 管 制 , 所 以 它 被 分 为 8个 区 , 每 区 都 有 负 责 人 , IETF主 席 和 8区 的 负 责 人 组 成 Internet工 程 执 行 组 ( Internet Engineering Steering Group, IESG) , 负 责 协 调 所 有 IETF任 务 小 组 的 工 作 。

图二、IAB组织图

  IRTF是 负 责 协 调 TCP/IP协 定 以 及 Internet架 构 有 关 的 研 究 活 动 , IRTF也 有 一 个 小 组 叫 Internet研 究 执 行 组 ( Internet Research Steering Group, IRSG) , 负 责 确 定 研 究 活 动 的 优 先 顺 序 并 协 调 各 研 究 活 动 。 IRTF比 IETF小 得 多 , 也 不 再 分 区 。

  关 於 Internet的 工 作 文 件 , 对 新 的 或 修 改 的 协 定 以 及 TCP/IP协 定 标 准 等 资 讯 以 一 系 列 技 术 报 告 叫 做 Internet评 议 请 求 ( Request For Comments, RFC) , RFC可 长 可 短 , 或 为 一 般 概 念 或 为 详 细 细 节 , 可 能 是 标 准 也 可 能 仅 是 对 新 协 定 的 建 议 。 而 RFC的 编 辑 叫 代 理 Internet建 师 ( Deputy Internet Arc hitect) , 他 是 IAB的 成 员 。

RFC的 标 准 化 可 分 为 叁 个 阶 段 :

  首 先 是 从 Proposal Standard( 案 ) , 然 後 进 行 提 案 审 议 , 通 过 之 後 作 成 Draft Standar( 标 准 案 ) , 然 後 再 经 过 一 系 列 的 审 查 与 实 际 上 之 运 作 , 最 後 才 形 成 标 准 ( Standard) 。 有 这 麽 多 协 定 , 要 都 弄 懂 不 是 件 简 单 的 事 , 不 过 倒 是 有 几 种 方 法 可 以 依 循 :

  1. 先 去 执 行 与 这 个 协 定 有 关 程 式 , 看 看 它 有 何 种 功 能 , 并 且 去 阅 读 它 的 Manual 或 Readme。
  2. 参 阅 RFC1000的 主 题 索 引 资 料 , 选 定 该 协 定 的 主 题 後 , 再 去 阅 读 有 关 的 RFC , 这 样 基 本 观 念 就 可 以 掌 握 着 八 成 。
  3. 如 果 该 协 定 的 程 式 是 我 们 很 常 用 的 话 , 我 们 可 以 利 用 archie把 该 程 式 的 Source Code抓 回 来 , 然 後 重 新 编 译 与 连 结 , 如 果 能 成 功 地 执 行 的 话 , 我 们 就 开 始 trace该 支 程 式 了 。

  当 然 , 并 不 是 说 每 支 程 式 都 要 trace, 我 们 才 能 了 解 ; 或 者 是 一 定 要 看 别 人 所 写 的 Source Code, 我 们 才 能 开 始 写 程 式 ; 其 实 RFC已 经 包 含 了 很 多 的 资 料 , 如 果 您 功 力 很 强 的 话 , 看 完 RFC就 可 以 自 己 Implement该 协 定 , 不 必 多 费 功 夫 去 Trace别 人 的 程 式 。

  在 写 这 类 协 定 前 , TCP/UDP/IP协 定 的 了 解 和 Socket Programming是 非 常 重 要 , 因 大 部 份 协 定 都 是 位 於 第 五 层 之 上 , 也 就 是 它 们 都 会 利 用 下 层 的 网 路 层 ( IP) 与 传 输 层 ( TCP/UDP) 所 提 供 的 网 路 服 务 , 这 方 面 实 例 请 参 阅 有 关 Socket Programming的 资 料 。

练好马步 Telnet协定 ( RFC854)

  小 弟 认 为 所 有 协 定 中 Telnet是 个 满 基 本 也 满 重 要 的 协 定 , 简 单 地 说 , 它 是 要 让 我 们 用 远 端 的 Terminal就 如 同 用 本 地 的 Terminal一 样 。 而 有 一 点 大 家 常 忘 记 的 , 那 就 是 我 们 可 以 利 用 Telnet来 去 模 拟 别 的 通 讯 协 定 , 省 去 了 实 作 上 的 麻 烦 。

  它 是 架 在 TCP之 上 , 提 供 一 条 双 向 8bit 的 连 结 ; 它 的 协 定 和 它 的 执 行 档 一 样 都 叫 Telnet, 基 本 上 这 个 Telnet协 定 有 叁 个 设 计 理 念 :

1、 网 路 虚 拟 终 端 机
( NVT, Network Virtual Terminal) 用 Telnet协 定 , 我 们 可 以 连 到 任 何 有 Tel -netServer的 地 方 , 因 而 使 用 远 方 主 机 的 资 源 。 最 重 要 的 是 , 我 们 把 远 方 的 主 机 当 成 是 本 地 的 主 机 看 待 , 是 没 有 任 何 差 异 的 , 而 连 结 的 双 方 都 把 对 方 视 为 NVT。

2、 协 商 选 项
世 间 的 任 何 事 物 都 须 要 协 商 , 否 则 就 叫 做 独 裁 。 同 理 , Telnet利 用 协 商 选 项 来 让 NVT间 了 解 彼 此 所 提 供 的 服 务 或 禁 止 的 项 目 。 比 方 说 , “ DON’ T X、 WON’ T X” 是 属 於 禁 止 X这 个 选 项 , 而 “ DO Y、 WILL Y” 是 属 於 同 意 Y这 个 选 项 。

3、 对 称 ( Symmetry) 选 项 商 议 机 制
NVT两 端 都 可 发 出 某 些 选 项 , 如 “ WILLX” , 即 表 示 “ 你 同 意 让 我 使 用 选 项 X吗 ? ” 而 回 应 是 “ DO X” 或 “ DON’ T X” , 表 示 「 我 同 意 让 我 使 用 选 项 X」 或 「 我 不 同 意 你 使 用 选 项 X」 。 而 “ DO X” 也 可 以 请 求 接 收 方 启 用 选 项 X, 而 “ WILL X” 或 “ WON’ T X” 表 示 「 我 将 启 动 选 项 X」 或 「 我 将 不 启 动 选 项 X」 , 而 这 样 双 方 都 可 以 发 出 WILL或 DO的 请 求 , 因 此 叫 做 对 称 选 项 商 议 机 制 。

  但 这 种 对 称 选 项 商 议 机 制 是 会 引 起 潜 在 的 loop, 如 上 述 的 DOX而 言 , 到 底 它 是 请 求 还 是 回 应 的 确 认 ; 如 果 把 回 应 的 确 认 误 判 为 请 求 , 那 麽 又 会 多 送 出 一 个 WILL X或 WON’ T X; 对 方 收 到 後 , 如 果 它 没 有 请 求 , 它 就 不 会 把 刚 收 到 的 选 项 看 成 回 应 的 确 认 , 而 是 把 它 当 成 是 对 方 的 请 求 , 之 後 送 出 确 认 ; 而 对 方 收 到 後 因 它 没 有 发 出 请 求 , 所 以 它 不 会 把 这 选 项 看 成 回 应 的 确 认 , 而 又 把 它 当 成 请 求 , 而 又 送 出 确 认 ; 这 样 下 去 没 完 没 了 , 而 为 了 解 决 这 个 问 题 , Telnet 对 选 项 做 了 如 下 的 规 范 来 避 开 loop的 问 题 :

  1. 任 何 一 端 只 能 在 它 要 变 更 选 项 的 内 容 时 才 能 发 出 请 求 。
  2. 如 果 接 收 端 早 已 进 入 发 送 端 所 指 定 的 选 项 , 而 发 送 端 又 发 出 同 样 的 选 项 请 求 时 , 接 收 端 将 不 会 送 出 确 认 给 送 方 。

  让 我 们 用 一 个 例 子 来 了 解 Telnet是 如 何 运 作 的 。 如 图 叁 , 这 是 一 个 标 准 的 Client-Server 模 式 , 首 先 Telnet Server先 在 port 23等 待 一 个 TCP的 连 结 , 之 後 使 用 者 ( client) 用 telnet连 至 该 主 机 , 接 下 来 , 使 用 者 每 敲 下 一 个 键 ( 1) , 经 由 Telnet Clinet( 在 本 地 执 行 ) 这 个 命 令 都 会 传 入 远 方 的 Server中 ( 2), 而 Server执 行 命 令 ( 3) 之 後 , 把 结 果 传 回 , Telnet Client接 收 後 把 结 果 显 示 於 Terminal上 ( 5) 。

是资料或是命令 ?

  Telnet的 命 令 是 以 IAC( Interrupt As Command) 起 始 再 加 表 二 的 Telnet控 制 命 令 , 比 方 说 若 要 要 求 Server中 止 程 式 的 执 行 ( IP, interrupt process) 的 话 , Client必 须 送 出 IAC IP, 即 十 进 位 的 255与 244来 告 知 Server。 而 如 果 255是 资 料 而 不 是 命 令 的 话 , 它 会 被 发 送 两 次 , 即 255 255, 而 255 255会 被 Server当 成 只 有 一 笔 255的 资 料 , 所 以 资 料 和 命 令 就 不 会 混 淆 了 。

  表 二 中 Telnet命 令 从 243到 249是 属 於 控 制 函 数 , 它 会 以 out of band也 就 是 紧 急 形 式 传 出 ; 以 TCP而 言 , 它 会 把 TCP标 头 选 项 ( options) 栏 的 URGENT设 为 1, 同 时 它 还 会 以 普 通 形 式 传 出 DMARK( 242) , 因 控 制 函 数 的 封 包 是 以 out of band传 出, 它 是 独 立 於 先 前 的 普 通 资 料 流 , 而 较 快 到 达 , Server收 到 後 会 去 把 DMARK之 前 的 资 料 以 Outof Band所 指 定 的 控 制 函 数 来 处 理 , 而 DMARK後 的 资 料 又 回 到 了 普 通 的 状 态 。

  由 上 可 知 , Telnet的 资 料 和 控 制 是 走 一 条 相 同 的 路 径 , 但 可 能 是 以 普 通 或 紧 急 的 型 式 传 出 ; 但 FTP却 不 一 样 , 它 是 以 一 条 路 径 做 控 制 ( TCP埠 号 为 21) , 另 一 条 路 径 为 资 料 传 输 ( TCP埠 号 为 20) , 由 於 资 料 和 控 制 分 开 , 所 以 FTP在 传 资 料 遇 到 255时 , 就 不 用 像 Telnet那 样 丢 两 个 255了 。

  而 常 见 的 选 项 见 表 叁 。 接 下 来 我 们 来 看 看 表 四 中 Telnet NVT对 USASCII控 制 字 元 的 解 释 ( Telnet对 tab的 长 度 并 不 指 定 ) 。

  为 了 包 容 异 质 性 ( Heterogeneity), Client端 的 Telnet把 使 用 者 键 入 的 字 元 转 换 为 NVT格 式 , 如 敲 下 ENTER/RETURN会 转 换 为 CR-LF, 也 就 是 十 进 位 的 13与 10会 被 送 出 。 而 Server收 到 後 会 把 NVT格 式 的 字 元 转 换 为 Server本 身 机 器 的 格 式 , 处 理 後 , 再 把 资 料 转 为 NVT送 出 , 而 Client收 到 再 从 NVT转 为 它 自 己 机 器 的 格 式 。 这 个 过 程 就 如 翻 译 般 , 把 中 文 翻 成 英 文 ( Local to NV T) , 再 从 英 文 翻 成 法 文 ( NVT to Server) , 那 麽 法 国 人 就 听 得 懂 中 文 ( Local to Server) 了 ; 同 理 , 走 相 反 的 方 向 , 中 国 人 也 听 得 懂 法 文 了 ( Server to Local) 。

  USASCII就 是 只 用 7bit来 表 示 资 料 , 也 就 是 资 料 只 能 在 0到 127之 间 , 它 有 95个 可 列 印 的 字 元 , 外 加 32个 控 制 码 , 这 些 控 制 码 Telnet NVT并 没 有 全 部 使 用 , 它 却 只 使 用 少 数 几 个 ( 如 上 表 ) , 而 以 7bit传 输 就 是 NVT启 动 的 内 定 格 式 ; 有 些 Telnet不 能 使 用 中 文 就 是 因 为 它 是 7bit的 , 因 为 它 没 有 去 协 商 传 输 二 进 制 的 选 项 ( 见 选 项 表 ) 来 把 内 定 的 7bit传 输 改 为 8bit, 所 以 大 量 使 用 8bit 为 字 码 的 中 文 系 统 就 不 能 跑 了 。

  不 能 输 入 中 文 的 问 题 还 可 能 是 由 Terminal port的 options没 选 好 所 引 起 的 , 通 常 我 们 会 用 stty cs8-parenb-istrip来 把 Terminal转 换 为 8bit( 参 数 意 义 请 见 man stty) , 这 样 8-bit的 telnet外 加 8-bit的 terminal就 可 以 显 示 中 文 了 。

  有 了 Telnet提 供 一 条 双 向 8bit的 TCP/IP连 结 之 後 , 现 在 让 我 们 用 Telnet协 定 来 模 拟 其 他 的 协 定 。

Finger协 定 RFC742

  使 用 者 资 讯 的 查 询 程 式 -Finger, 它 bind在 TCP埠 号 79, 提 供 一 条 双 向 的 连 结 , 它 的 协 定 非 常 简 单 , 那 就 是 Client送 出 “ command line” , 以 〈 CRLF〉 来 代 表 命 令 结 束 , Server收 到 并 执 行 後 , 把 结 果 传 回 给 client, 然 後 把 连 结 关 闭 , 而 这 样 就 是 Finger协 定 。 而 这 送 给 Finger Daemon的 命 令 可 能 以 user name、 login name来 查 询 或 把 目 前 正 在 使 用 此 系 统 的 人 列 出 ( 直 接 敲 Enter即 可 ) , 如 我 们 敲 下 telnetcis.nctu.edu.tw 79连 上 交 大 资 科 的 Finger Daemon, 然 後 直 接 按 Enter来 看 目 前 使 用 的 情 况 , 或 敲 下 telnetcs.purdue.edu 79连 上 美 国 普 度 大 学 资 讯 科 学 系 , 出 现 connected tocs.purdue.edu後 , 敲 下 Lee, 来 查 查 看 有 关 Lee的 使 用 者 资 料 。

  Finger其 实 是 满 好 利 用 的 工 具 , 如 我 们 用 fingerinfo@cdrom.com或 telnetcdrom.com 79出 现 connected之 後 回 info, 就 可 以 拿 到 该 公 司 最 新 CD的 目 录 , 而 不 必 麻 烦 他 们 邮 递 最 新 的 目 录 了 ; 同 理 , 同 学 也 可 利 用 finger某 某 老 师 , 来 查 询 该 老 师 接 见 学 生 的 时 间 或 一 些 相 关 的 课 程 资 料 。

SMTP协定 RFC821

  实 作 SMTP协 定 , RFC821规 定 最 少 要 有 7 个 命 令 才 行 , 它 们 分 别 是 : ( 见 表 五

  当 然 还 有 SEND( SEND) 、 SEND OR MAIL( SOML) 、 SEND AND MAIL( SAML) 、 VERIFY( VRFY) 、 EXPAND( EXPN) 、 HELP( HELP) 、 TURN( TURN) 等 命 令 , 这 些 都 可 在 RFC821内 得 到 更 详 细 的 资 料 。

   表 五 是 Sender-SMTP送 给 receiver-SMTP的 命 令 , 而 表 六 的 那 些 码 是 receiver-SMTP丢 还 给 sender-SMTP的 命 令 执 行 结 果 , 我 们 常 见 到 的 Server ready( 220) 或 OK( 250) 都 是 由 receiver-SMTP告 知 sender-SMTP的 。

  同 样 地 , 我 们 也 以 Telnet来 模 拟 SMTP, 首 先 敲 入 telnet tpev1 25, 我 们 得 到


〉 Trying...

〉 Connected to tpev1.verifone.com.

〉 Escape character is‘ ^]’ .

〉 220TPEV1.VERIFONE.COM--

Server  ESMTP ( PMDF V4.3-7 #5453) 

好 消 息 , 220耶 ! , 先 别 太 高 兴 , 执 行 一 下 help再 说


〉 214-Available commands:

〉 214-

〉 214-DATA, EHLO, EXPN, 

  HELO , HELP, MAIL FROM

〉 214-NOOP, QUIT, RCPT TO, 

  RSET, SAML FROM

〉 214-SEND FROM, SOML FROM,       

  TICK, VERB, VRFY

〉 214-XADR, XSTA

〉 214

看 似 没 有 问 题 , 我 们 say HELLO to tpev1吧 !


〉 HELO tpev1.verifone.com

〉 250 TPEV1.VERIFONE.COM 

  OK,  khhh1.

又 是 好 消 息 , 250, 我 们 开 始 指 定 送 /收 信 人 的 , 我 们 先 指 定 送 信 人 为 “ root”


〉 MAIL FROM: “ root” 

〉 250 Address Ok.

送 信 人 指 定 成 功 , 再 指 定 收 信 人 为 “ DEREK_M1” 。


〉 RCPT TO: “ DEREK_M1” 

〉 553unknown or illegal user: 

“ DERE-K_M1” @tpev1.verifone.com

糟 糕 ! 回 应 553, username应 为 小 写 才 对 , 再 试 一 次


〉 RCPT TO: “ derek_m1” 

〉 250“ derek_m1” OK.

终 於 出 现 250了 , 我 们 先 敲 入 DATA, 之 後 再 键 入 信 件 内 容


〉 DATA

〉 354 Enter mail, end with a 

single “ .” .

354出 现 表 示 我 们 可 以 真 正 输 入 资 料 了


〉 this is a test

以 〈 CRLF〉 . 〈 CRLF〉 来 表 式 信 件 结 束


〉 . 

〉 250 Ok.

250, 离 开 吧 ! 敲 下 QUIT


〉 QUIT

〉 221 Bye received. Goodbye.

〉 Connection closed by foreign host.

  送 信 出 去 , 收 信 者 并 不 一 定 马 上 会 收 到 , 原 因 是 送 信 的 daemon并 不 是 时 时 刻 刻 都 与 SMTP Server相 连 。 相 反 地 , 它 们 通 常 把 信 件 先 Queue住 , 之 後 每 隔 一 段 时 间 ( 如 30分 钟 ) 再 传 出 去 , 所 以 送 信 时 会 有 一 些 delay。

  看 来 SMTP的 协 定 不 难 , sender-SMTP ( SMTP Client) 与 receiver-SMTP( SMTP Server) 是 一 个 口 令 一 个 动 作 , 完 全 依 据 协 定 的 规 范 来 运 行 。 同 理 , 在 网 路 的 世 界 里 也 都 是 跟 着 协 定 的 标 准 来 制 作 程 式 , 不 同 厂 家 依 据 该 协 定 的 标 准 , 如 RFC等 , 这 样 做 出 来 的 程 式 才 能 互 通 与 相 容 。

( 作 者 现 任 职 於 台 湾 金 讯 电 子 股 份 有 限 公 司 , E-Mail:derek_m1@tptev1.verifone.com