LOADING

加载过慢请开启缓存 浏览器默认开启

文章目录

文件网络传输协议选型

2026/5/16 约1分钟 NAS NAS 网络

文件网络传输协议选型

前言

五一期间折腾 NAS 选择文件网络传输协议给我折腾坏了,所以写篇笔记记录一下,避免以后再踩坑。

SMB

  1. Windows 生态

SMB 是 Windows 生态的原生文件共享协议,支持网络发现。微软从 1983 年就开始做 SMB,迭代了好几轮,3.x 版本基本解决了早期安全性低的问题。它主要面向企业级文件共享和协作,在 Windows Server + Active Directory 环境里用得最多。

  1. 底层与工作方式

    • 网络层:直接运行在 TCP/IP 之上,客户端发起 TCP 连接后,双方先协商 SMB 版本,再进行身份验证。
    • 会话与安全:身份验证使用 NTLM 或更安全的 Kerberos。SMB 3.0 起可以对传输数据直接加密,无需配置复杂的 IPsec VPN。
    • 文件交互:客户端不直接读写整个文件。比如 SMB 发送 “打开文件 报告.xlsx,读取第 100-200 字节” 这样的命令,其会调用高效的缓存锁机制,服务器给客户端授权一个”缓存许可”,如果只有单个用户访问,客户端就可以在本地缓存文件内容,读写速度极快;同时如果有多个客户端访问同一文件,服务器会智能地管理锁和缓存一致性,确保数据不冲突。
  2. 性能优化

    • 多通道:客户端和服务端如果有多条网络(比如连了 WiFi + 网线),SMB 3.x 能自动发现并绑定,同一文件的多个片段同时传,速度可以翻好几倍。
    • SMB Direct:支持 RDMA 网卡直接把数据从 NAS 内存拉到你的内存,绕过 CPU 和操作系统内核,CPU 占用和延迟都很低,对高性能 NAS 很实用。

NFS

  1. Linux/Unix 生态

NFS 是 Linux/Unix 下的原生共享标准,追求简单和高效,在受控开发环境、渲染集群、ESXi 虚拟化后端这些场景里基本是唯一选择。

  1. 底层与工作方式

    • RPC:NFS 并非一个独立应用,它是 Sun RPC(远程过程调用)的一个服务。它的”命令”就是一个个的远程函数,如 NFSPROC3_READ,参数和返回值经由 XDR 编码在网络上传输。
    • 文件定位:文件句柄:挂载时,客户端通过 mountd 拿到一个根目录的”文件句柄”(不透明的一串字节,服务器内部用来定位文件)。之后所有读写操作,只需带着这个句柄发 RPC 请求,无需每次解析路径。
    • v3 无状态 vs v4 有状态:NFS v3 是无状态的,服务器不记忆客户端的”会话”,每次请求都独立处理。这简化了崩溃恢复,但引入了复杂的辅助锁协议(NLM),且安全性薄弱(AUTH_SYS 只简单传 UID/GID)。NFSv4 则是一个有状态的全新协议,把挂载、锁、安全都集成在一个端口(2049)内。这使其能天然集成 Kerberos(RPCSEC_GSS),牺牲了部分无状态的简约,换取了安全和防火墙可操作性。
  2. 性能优化

    • 读写大小:NFS v3 默认读写块大小是 4KB,v4 可以支持更大的块(比如 64KB),减少网络往返次数。
    • 直接 I/O:NFS v4 支持直接 I/O 模式,客户端可以绕过内核缓存直接与服务器交换数据,适合数据库等对缓存一致性要求高的应用。
    • “Close-to-Open”缓存一致:为了性能在客户端大量缓存,为了简单不实现 SMB 那样的锁中断。NFS 协议约定当关闭一个文件时,所有改动才必须更新到服务器;当打开一个文件时,必须先查询服务器文件是否被修改过,再决定用缓存还是新数据。这种模型对程序编译、视频渲染等上下游明确的工作流非常高效。

iSCSI

iSCSI 提供的是块级存储,不能准确算在本篇文章范围内,因此不在此详细讨论。iSCSI 不共享文件,而是把服务器上硬盘/分区/LVM 卷,把 TCP 用作物理连接线直接接到电脑上。

会话建立后会多出一块”裸盘”(比如 /dev/sdc)。需要用户像新插一块硬盘一样,自行创建分区表(gpt/mbr),格式化为想要的文件系统(ntfs/ext4/btrfs)。小文件读写性能很好(比 SMB 快 3 倍左右),因为完全绕过了服务器的文件系统,直接操作底层块设备。

这块虚拟盘通常不能同时被另一台机器挂载读写(除非用集群文件系统),否则文件系统元数据冲突会直接搞崩数据。好处是性能接近本地硬盘,没有文件级协议的各种共享锁开销,所以常被用来跑数据库、虚拟机虚拟磁盘——让这些应用直接管底层块,换极致的小文件随机读写性能。

FTP & SFTP & FTPS

FTP

  1. 定位
    FTP 是最古老的文件传输协议,设计时只是为了传文件而生,所有的内容和密码都明文传输,目前多数已经被淘汰,只有少部分学校、老企业还在使用。
  2. 底层与工作方式
    FTP 使用两条独立的 TCP 连接:
  • 控制连接:默认使用 21 端口。控制连接负责发送命令,如 USER 用户名、PASS 密码、LIST 列表等,服务器返回命令执行结果。
  • 数据连接:默认使用 20 端口。数据连接负责传输文件数据,如 RETR 下载、STOR 上传等。每次传输都是动态建立的,传输完成后就关闭。

FTP 这种设计带来了著名的”主动vs被动”模式问题:

  • 主动模式:服务器连接客户端的数据端口。由于端口极低且由服务端主动发起,在现代网络环境中经常被 NAT 和防火墙阻止,导致传输失败。
  • 被动模式:客户端连接服务器的数据端口。虽然解决了 NAT 问题,但服务器需要开放大量随机端口,增加了配置复杂度和安全风险。
  1. 性能
    FTP 协议本身不支持多线程,因此无法同时传输多个文件。此外,FTP 协议不支持断点续传,如果传输过程中断,需要重新开始。

FTPS

  1. 定位
    FTP + SSL/TLS 加密。FTP 的安全版,但依然存在主动被动模式的问题。
  2. 底层与工作方式
  • 显式 FTPS:客户端向服务端 21 端口发送 AUTH TLS 命令,协商加密连接。服务器支持后立刻加密所有后续通信,包括数据流。
  • 隐式 FTPS:客户端直接连接服务器的 990 端口,默认使用 TLS 加密,否则断连。服务器在这个端口上只接受加密连接,所有通信都被保护。因为同样存在主动被动问题,目前该协议也不太常见了。
  1. 性能
    FTPS 的性能与 FTP 基本相同,但由于加密和解密的开销,传输大文件时可能会有明显的性能下降,尤其是在 CPU 性能较弱的设备上。

SFTP

  1. 定位
    SSH + FTP。SSH 是有端到端加密的远程通讯协议,通常用于远程控制。SFTP 是基于 SSH 协议的文件传输协议。SFTP 使用 SSH 的加密和认证机制,保证了数据传输的安全性。
  2. 底层与工作方式
    SFTP 使用 SSH 协议进行通信,客户端和服务器之间建立 SSH 连接后,通过 SSH 通道进行文件传输。SFTP 协议支持多线程,可以同时传输多个文件,并且支持断点续传。
  3. 性能
    SFTP 比 FTP/FTPS 快,因为 SSH 加密通道的网络开销更低。多线程和断点续传也有帮助。

WebDAV

  1. 我是网页!

WebDAV 是 HTTP/1.1 协议的核心扩展,目的是把 HTTP 从单纯的”看网页”变成支持远程协作编辑。其被各大网盘作为底层,也能在终端上提供类似网盘的体验。

  1. 底层与工作方式

    • HTTP 方法扩展:在 GET、POST 之外,新增了 PROPFIND(获取文件详细属性)、COPY、MOVE、LOCK、UNLOCK 等。
    • TLS 安全访问:给 WebDAV 服务配上反向代理,它就是标准的 443 端口 + TLS 加密,可以在任何地方通过浏览器或挂载的本地盘访问,基本不挑网络环境。
    • 锁与协作:最特别的特性是写入锁。你可以 LOCK 一个文档,在编辑完成前,其他人只能看不能改,这为多人在线协同办公提供了一个很基础的底层保障。
    • 数据交互:所有操作都是标准的 HTTP 请求-响应模型,数据可以走分块传输或范围请求,对 CDN 和代理的穿透力是它的天生优势。不过因为是基于 XML 的属性描述和大量的请求头,批量小文件操作的效率不及 SMB/NFS。
  2. 性能
    WebDAV 比 SMB 和 NFS 慢,HTTP 协议本身有额外开销。大量小文件操作时尤其明显。大文件传输和远程协作编辑倒是完全够用。

结论

内网用 SMB(Windows 多)或 NFS(Linux/Unix 多)。需要外部访问则 WebDAV 直接作为网页最省心,SFTP 也不错,就是缺少文件锁机制不适合多人协作。跑数据库或者虚拟机就别折腾文件级协议了,直接上 iSCSI。