摘要
- RFC 2054 建议客户端依次尝试 TCP 2049、UDP 2049、NFSv3 公共零长度句柄,再依据明确错误退回 v2、PORTMAP 与传统 MOUNT。
- 公共文件句柄省掉的是一次初始绑定,不是认证、导出授权、整条路径校验,也不保证后续 READ 会取得预期字节。
- 多组件 LOOKUP 能把多轮路径解析压成一轮,但规范路径、本机路径、最终符号链接和跨文件系统仍各有独立条件。
原来的起步要经过两座柜台
传统 NFS 客户端并不能拿着路径直接开始读文件。它先要找到 RPC 程序监听在哪个端口,再把导出路径换成服务器生成的初始文件句柄。绑定服务固定在 111 端口;MOUNT 没有固定端口,所以客户端先询问 PORTMAP,再调用 MOUNTPROC_MNT,最后才拿到能进入 NFS 操作的句柄。
这种分工有实际含义:程序发现、导出路径转换和文件操作分别由不同协议承担。但在高时延链路上,每一轮都增加等待;动态 MOUNT 端口也给包过滤防火墙和代理带来麻烦。RFC 2054 的问题不是这些步骤是否“错误”,而是多数服务器已有共同习惯时,能否先采用最可能正确的答案,在失败时再补做发现。
它给出的第一层顺序很具体。客户端先连接 TCP 2049;如果连接被拒绝,再向 UDP 2049 发送 NFS 请求。只有 TCP 和 UDP 都没有响应,才用 PORTMAP 查找 NFS 端口。2049 因而是一项可验证的默认值,不是普遍事实。端口有响应,只说明某个程序面在那个地址上回答了问题。
错误类型决定退到哪一层
联系到服务器后,客户端先假定 NFSv3 与 WebNFS 语义成立,通常以 v3 的公共句柄发送路径 LOOKUP。若 RPC 返回 PROG_MISMATCH,失败的是版本假定;客户端改用 NFSv2 和 v2 公共句柄重试。
如果返回 NFS3ERR_STALE、NFS3ERR_INVAL 或 NFS3ERR_BADHANDLE,失败的则是公共句柄假定。此时不能把同一种请求无限重发,必须回到传统路线:经 PORTMAP 找到 MOUNT,再用匹配 NFS 版本的 MOUNT 协议换取初始句柄。TCP 拒绝、UDP 无响应、程序版本不符和保留句柄不被承认,是四种不同证据;把它们都记成“服务器不可用”,会丢掉规范设计中最重要的诊断边界。
零值是会合点,不是通行证
普通 NFS 文件句柄是服务器制造的不透明值。公共句柄是一个保留例外:v2 为 32 个零八位组,v3 则为长度为零的可变句柄。这个空值没有编码 inode、用户名、导出名、秘密或权限。它只要求支持该语义的服务器,从管理员指定的位置开始解释请求。
“公共”一词很容易制造错觉。公共起点不等于公共文件。配套的 RFC 2055 明确要求:目标不在导出文件系统中,服务器就要返回错误。路径跨入另一个已导出文件系统也未必允许;如果实现只在 MOUNT 阶段检查导出访问,绕过 MOUNT 后就不能自动授予第二个导出的访问。只有在每次 NFS 请求都检查导出权限的服务器上,跨越才有更大空间。决定权来自检查,而不是来自零句柄。
一次 LOOKUP 仍然包含多种路径语义
普通 LOOKUP 一次解析一个名字。a/b/c 要依次询问三次。相对于公共句柄,多组件 LOOKUP 可以把整条路径交给服务器,一次返回最终组件的句柄。
省掉轮次并没有省掉语法。以 ASCII 开头的是斜线分隔的规范路径,组件内的斜线、百分号和非 ASCII 八位组必须按规则转义;开头为斜线时相对服务器根目录,否则相对公共句柄所关联的目录。首个八位组为 0x80 时,后续采用服务器本机路径语法。这两种形式不是同一字符串的装饰,而是选择不同解释规则。
符号链接带来新的分支。服务器会解析中间组件中的链接;如果最后一个组件本身是链接,服务器返回链接句柄,客户端再用 READLINK 读取内容。绝对目标重新从公共句柄解释;相对目标要替换掉原路径最后一个组件,然后再次 LOOKUP。RFC 2054 只为通过规范路径多组件查找取得的链接定义了这套客户端处理。
文件系统边界也有限制。普通 NFS LOOKUP 通常不会跨越服务器挂载点。公共句柄查找只有在目标文件系统已导出、且服务器支持 RFC 2055 的跨导出语义时才可能越过。成功返回最终句柄,证明的是该服务器在当时的命名空间和策略下完成了这次解析,不是整条路径永远安全。
把三张回执分开保存
这段历史可以拆成三张回执。端口响应证明程序面可达;零句柄被承认证明服务器接受保留起始引用;LOOKUP 成功证明一次命名解析得到了句柄。后一张回执的含义不能倒灌给前一张,前一张也不能替代后一张。
要声称文件访问成功,还需要核验响应者身份、认证与完整性、导出与操作权限、符号链接和跨文件系统结果、目标内容、READ 是否完成,以及需要时的稳定存储和业务结果。RFC 2054 沿用 NFS/RPC 的安全考量,并允许客户端和服务器另行协商认证、完整性与隐私;它没有让公共句柄承担这些职责。
资料来源
- https://www.rfc-editor.org/rfc/rfc2054.txt
- https://www.rfc-editor.org/info/rfc2054
- https://datatracker.ietf.org/doc/rfc2054/
- https://www.rfc-editor.org/errata_search.php?rfc=2054
- https://www.rfc-editor.org/rfc/rfc2055.txt
- https://www.rfc-editor.org/info/rfc2055
- https://www.rfc-editor.org/rfc/rfc1094.txt
- https://www.rfc-editor.org/rfc/rfc1813.txt
- https://www.rfc-editor.org/rfc/rfc1831.txt
- https://www.rfc-editor.org/rfc/rfc1832.txt
- https://www.rfc-editor.org/rfc/rfc1833.txt
- https://www.rfc-editor.org/rfc/rfc1808.txt
会员简报
档案背景详情
使用相应会员等级登录,即可解锁完整简报与来源注释。
仅限 Strategic Circle
Strategic Circle
所有读者均可浏览。加入并登录后可解锁档案简报。
加入 Strategic Circle仅限 Leadership Alliance
Leadership Alliance
符合条件的 IP 资产所有者和管理层可登录查看 Leadership Alliance 简报。
加入 Leadership Alliance
