适用对象 :网络通信、嵌入式开发、服务器运维和 GNSS 数据处理初学者。
阅读目标:理解 FTP 与 FTPS 的用途、双连接机制、主动与被动模式、WinSCP 的角色,以及它们在 GNSS 文件回传中的适用边界。
1. 结论
- FTP 是基于 TCP 的远程文件传输与文件管理协议。
- FTPS 是 FTP 叠加 TLS,不是 SFTP。
- WinSCP 是客户端软件,不是协议,也不是 FTP 服务器。
- FTP 使用控制连接和数据连接两类 TCP 连接。
- 主动模式与被动模式只决定数据连接由谁发起,不决定文件内容的传输方向。
- 普通 FTP 默认明文传输,不适合直接暴露在不可信公网。
- 显式 FTPS 只有在
AUTH TLS成功后,后续控制命令才受 TLS 保护;数据连接还需使用PROT P才会加密。 - GNSS 实时 RTCM 应使用 NTRIP 等流式协议;FTP、FTPS 或 SFTP 更适合传输 RINEX、原始文件和处理结果。
2. FTP、FTPS 与 WinSCP 的关系
三者处于不同层次:
#mermaid-svg-YzikwSpZKUHCS0mx{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YzikwSpZKUHCS0mx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YzikwSpZKUHCS0mx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YzikwSpZKUHCS0mx .error-icon{fill:#552222;}#mermaid-svg-YzikwSpZKUHCS0mx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YzikwSpZKUHCS0mx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YzikwSpZKUHCS0mx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YzikwSpZKUHCS0mx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YzikwSpZKUHCS0mx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YzikwSpZKUHCS0mx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YzikwSpZKUHCS0mx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YzikwSpZKUHCS0mx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YzikwSpZKUHCS0mx .marker.cross{stroke:#333333;}#mermaid-svg-YzikwSpZKUHCS0mx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YzikwSpZKUHCS0mx p{margin:0;}#mermaid-svg-YzikwSpZKUHCS0mx .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-YzikwSpZKUHCS0mx .cluster-label text{fill:#333;}#mermaid-svg-YzikwSpZKUHCS0mx .cluster-label span{color:#333;}#mermaid-svg-YzikwSpZKUHCS0mx .cluster-label span p{background-color:transparent;}#mermaid-svg-YzikwSpZKUHCS0mx .label text,#mermaid-svg-YzikwSpZKUHCS0mx span{fill:#333;color:#333;}#mermaid-svg-YzikwSpZKUHCS0mx .node rect,#mermaid-svg-YzikwSpZKUHCS0mx .node circle,#mermaid-svg-YzikwSpZKUHCS0mx .node ellipse,#mermaid-svg-YzikwSpZKUHCS0mx .node polygon,#mermaid-svg-YzikwSpZKUHCS0mx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YzikwSpZKUHCS0mx .rough-node .label text,#mermaid-svg-YzikwSpZKUHCS0mx .node .label text,#mermaid-svg-YzikwSpZKUHCS0mx .image-shape .label,#mermaid-svg-YzikwSpZKUHCS0mx .icon-shape .label{text-anchor:middle;}#mermaid-svg-YzikwSpZKUHCS0mx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-YzikwSpZKUHCS0mx .rough-node .label,#mermaid-svg-YzikwSpZKUHCS0mx .node .label,#mermaid-svg-YzikwSpZKUHCS0mx .image-shape .label,#mermaid-svg-YzikwSpZKUHCS0mx .icon-shape .label{text-align:center;}#mermaid-svg-YzikwSpZKUHCS0mx .node.clickable{cursor:pointer;}#mermaid-svg-YzikwSpZKUHCS0mx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-YzikwSpZKUHCS0mx .arrowheadPath{fill:#333333;}#mermaid-svg-YzikwSpZKUHCS0mx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YzikwSpZKUHCS0mx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YzikwSpZKUHCS0mx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YzikwSpZKUHCS0mx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-YzikwSpZKUHCS0mx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YzikwSpZKUHCS0mx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-YzikwSpZKUHCS0mx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YzikwSpZKUHCS0mx .cluster text{fill:#333;}#mermaid-svg-YzikwSpZKUHCS0mx .cluster span{color:#333;}#mermaid-svg-YzikwSpZKUHCS0mx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YzikwSpZKUHCS0mx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-YzikwSpZKUHCS0mx rect.text{fill:none;stroke-width:0;}#mermaid-svg-YzikwSpZKUHCS0mx .icon-shape,#mermaid-svg-YzikwSpZKUHCS0mx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YzikwSpZKUHCS0mx .icon-shape p,#mermaid-svg-YzikwSpZKUHCS0mx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-YzikwSpZKUHCS0mx .icon-shape .label rect,#mermaid-svg-YzikwSpZKUHCS0mx .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YzikwSpZKUHCS0mx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-YzikwSpZKUHCS0mx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-YzikwSpZKUHCS0mx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} FTP或FTPS协议
规定客户端与服务器怎样通信
FTP或FTPS服务器
提供账号 目录和文件服务
WinSCP客户端
使用协议连接服务器
可以类比为:
text
HTTP/HTTPS:通信协议
Web 服务器:提供网站服务
浏览器:使用协议访问服务器
对应到文件传输:
text
FTP/FTPS:通信协议
FTP/FTPS Server:服务器端服务
WinSCP:Windows 客户端软件
安装 WinSCP 不会自动创建 FTP 或 FTPS 服务器。
3. FTP 是什么
FTP 是 File Transfer Protocol 的缩写,中文通常译为文件传输协议。
它采用客户端---服务器结构:
text
FTP 客户端 ───────── FTP 服务器
FTP 可以完成:
- 用户登录;
- 目录浏览;
- 文件上传和下载;
- 创建、删除和切换目录;
- 文件重命名和删除;
- 查询文件大小和修改时间;
- 在客户端与服务器都支持时进行断点续传。
FTP 的核心用途是:
让不同计算机通过统一协议进行远程文件交换和常用文件管理。
FTP 不是完整的远程文件系统。它通常不提供 SMB、NFS 那样的文件锁、随机读写和透明挂载语义。
4. FTP 解决了什么问题
不同计算机之间交换文件时,常见痛点包括:
- 操作系统和文件系统不同;
- 无法直接访问远端磁盘;
- 上传、下载和目录管理缺少统一接口;
- 大文件需要较长传输时间;
- 自动化程序需要统一命令;
- 用户和目录权限需要集中管理。
FTP 将常见操作定义为统一命令:
| 命令 | 作用 |
|---|---|
USER |
发送用户名 |
PASS |
发送密码 |
PWD |
查看当前目录 |
CWD |
切换目录 |
LIST |
获取传统目录列表 |
MLSD |
获取机器可解析的目录列表 |
RETR |
下载文件 |
STOR |
上传文件 |
DELE |
删除文件 |
RNFR、RNTO |
重命名文件 |
REST |
指定恢复位置 |
TYPE |
设置传输类型 |
FEAT |
查询服务器扩展能力 |
QUIT |
结束会话 |
因此,FTP 同时提供:
text
身份认证 + 目录操作 + 文件传输 + 状态反馈
5. FTP 客户端与服务器
5.1 FTP 服务器
服务器负责:
- 监听客户端连接;
- 验证用户身份;
- 管理目录和访问权限;
- 接收上传文件;
- 提供下载文件;
- 返回状态码;
- 记录登录和传输日志。
常见服务器软件包括:
- vsftpd;
- ProFTPD;
- Pure-FTPd;
- FileZilla Server;
- IIS FTP Server;
- NAS、路由器和测量仪器内置 FTP Server。
5.2 FTP 客户端
客户端负责:
- 连接服务器;
- 发送账号信息;
- 发送 FTP 命令;
- 展示远程目录;
- 上传和下载文件;
- 根据服务器能力进行断点续传;
- 执行同步和自动化任务。
常见客户端包括:
- WinSCP;
- FileZilla Client;
curl;lftp;- Windows
ftp.exe; - 程序中的 FTP 库。
6. FTP 为什么使用两类连接
FTP 的重要特点是:
控制命令和文件数据使用不同的 TCP 连接。
6.1 控制连接
控制连接用于传输:
- 用户名和密码;
- 目录切换命令;
- 上传和下载请求;
- 服务器响应码;
- 会话控制信息。
默认情况下,客户端连接服务器 TCP 端口:
text
21
端口 21 只是默认值,服务器可以配置其他端口。
控制连接通常在整个会话期间保持打开。
6.2 数据连接
数据连接用于传输:
- 文件内容;
- 目录列表;
- 其他批量数据。
执行以下命令时,通常会建立单独的数据连接:
text
LIST
MLSD
RETR
STOR
目录查询或每次文件传输通常使用一条新的数据连接。
6.3 双连接结构
#mermaid-svg-GxJHrWJ7uFNWTekl{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GxJHrWJ7uFNWTekl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GxJHrWJ7uFNWTekl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GxJHrWJ7uFNWTekl .error-icon{fill:#552222;}#mermaid-svg-GxJHrWJ7uFNWTekl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GxJHrWJ7uFNWTekl .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GxJHrWJ7uFNWTekl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GxJHrWJ7uFNWTekl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GxJHrWJ7uFNWTekl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GxJHrWJ7uFNWTekl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GxJHrWJ7uFNWTekl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GxJHrWJ7uFNWTekl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GxJHrWJ7uFNWTekl .marker.cross{stroke:#333333;}#mermaid-svg-GxJHrWJ7uFNWTekl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GxJHrWJ7uFNWTekl p{margin:0;}#mermaid-svg-GxJHrWJ7uFNWTekl .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-GxJHrWJ7uFNWTekl .cluster-label text{fill:#333;}#mermaid-svg-GxJHrWJ7uFNWTekl .cluster-label span{color:#333;}#mermaid-svg-GxJHrWJ7uFNWTekl .cluster-label span p{background-color:transparent;}#mermaid-svg-GxJHrWJ7uFNWTekl .label text,#mermaid-svg-GxJHrWJ7uFNWTekl span{fill:#333;color:#333;}#mermaid-svg-GxJHrWJ7uFNWTekl .node rect,#mermaid-svg-GxJHrWJ7uFNWTekl .node circle,#mermaid-svg-GxJHrWJ7uFNWTekl .node ellipse,#mermaid-svg-GxJHrWJ7uFNWTekl .node polygon,#mermaid-svg-GxJHrWJ7uFNWTekl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GxJHrWJ7uFNWTekl .rough-node .label text,#mermaid-svg-GxJHrWJ7uFNWTekl .node .label text,#mermaid-svg-GxJHrWJ7uFNWTekl .image-shape .label,#mermaid-svg-GxJHrWJ7uFNWTekl .icon-shape .label{text-anchor:middle;}#mermaid-svg-GxJHrWJ7uFNWTekl .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-GxJHrWJ7uFNWTekl .rough-node .label,#mermaid-svg-GxJHrWJ7uFNWTekl .node .label,#mermaid-svg-GxJHrWJ7uFNWTekl .image-shape .label,#mermaid-svg-GxJHrWJ7uFNWTekl .icon-shape .label{text-align:center;}#mermaid-svg-GxJHrWJ7uFNWTekl .node.clickable{cursor:pointer;}#mermaid-svg-GxJHrWJ7uFNWTekl .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-GxJHrWJ7uFNWTekl .arrowheadPath{fill:#333333;}#mermaid-svg-GxJHrWJ7uFNWTekl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GxJHrWJ7uFNWTekl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GxJHrWJ7uFNWTekl .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GxJHrWJ7uFNWTekl .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-GxJHrWJ7uFNWTekl .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GxJHrWJ7uFNWTekl .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-GxJHrWJ7uFNWTekl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GxJHrWJ7uFNWTekl .cluster text{fill:#333;}#mermaid-svg-GxJHrWJ7uFNWTekl .cluster span{color:#333;}#mermaid-svg-GxJHrWJ7uFNWTekl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GxJHrWJ7uFNWTekl .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-GxJHrWJ7uFNWTekl rect.text{fill:none;stroke-width:0;}#mermaid-svg-GxJHrWJ7uFNWTekl .icon-shape,#mermaid-svg-GxJHrWJ7uFNWTekl .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GxJHrWJ7uFNWTekl .icon-shape p,#mermaid-svg-GxJHrWJ7uFNWTekl .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-GxJHrWJ7uFNWTekl .icon-shape .label rect,#mermaid-svg-GxJHrWJ7uFNWTekl .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GxJHrWJ7uFNWTekl .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-GxJHrWJ7uFNWTekl .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-GxJHrWJ7uFNWTekl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 控制连接
命令和响应
数据连接
目录和文件
FTP客户端
FTP服务器
这种设计使控制信息与大文件数据相互独立,但也带来:
- 防火墙需要处理多条连接;
- NAT 需要正确转换地址和端口;
- 被动模式需要配置数据端口范围;
- FTPS 加密后,传统 FTP ALG 可能无法读取控制命令;
- 控制连接成功不代表数据连接一定成功。
7. FTP 状态码
FTP 服务器通常返回三位数字状态码。
| 首位数字 | 含义 |
|---|---|
1xx |
操作已开始,还需等待后续结果 |
2xx |
操作成功 |
3xx |
已接受部分信息,还需要继续输入 |
4xx |
临时失败,可以稍后重试 |
5xx |
永久失败,需要修改配置、权限或命令 |
常见状态码:
text
220 服务器已就绪
230 登录成功
331 需要密码
425 无法建立数据连接
426 数据连接中断
530 未登录或认证失败
550 文件不存在或权限不足
排查问题时,应保留完整的客户端日志和服务器状态码。
8. FTP 主动模式
8.1 工作流程
主动模式中:
- 客户端建立控制连接;
- 客户端监听一个本地数据端口;
- 客户端通过
PORT或EPRT告知服务器; - 服务器主动连接客户端的数据端口;
- 双方传输目录或文件。
FTP服务器 FTP客户端 FTP服务器 FTP客户端 #mermaid-svg-HMMDtARrAP7hAp4S{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-HMMDtARrAP7hAp4S .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-HMMDtARrAP7hAp4S .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-HMMDtARrAP7hAp4S .error-icon{fill:#552222;}#mermaid-svg-HMMDtARrAP7hAp4S .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HMMDtARrAP7hAp4S .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-HMMDtARrAP7hAp4S .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HMMDtARrAP7hAp4S .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HMMDtARrAP7hAp4S .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-HMMDtARrAP7hAp4S .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HMMDtARrAP7hAp4S .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HMMDtARrAP7hAp4S .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HMMDtARrAP7hAp4S .marker.cross{stroke:#333333;}#mermaid-svg-HMMDtARrAP7hAp4S svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HMMDtARrAP7hAp4S p{margin:0;}#mermaid-svg-HMMDtARrAP7hAp4S .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-HMMDtARrAP7hAp4S text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-HMMDtARrAP7hAp4S .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-HMMDtARrAP7hAp4S .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-HMMDtARrAP7hAp4S .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-HMMDtARrAP7hAp4S .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-HMMDtARrAP7hAp4S #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-HMMDtARrAP7hAp4S .sequenceNumber{fill:white;}#mermaid-svg-HMMDtARrAP7hAp4S #sequencenumber{fill:#333;}#mermaid-svg-HMMDtARrAP7hAp4S #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-HMMDtARrAP7hAp4S .messageText{fill:#333;stroke:none;}#mermaid-svg-HMMDtARrAP7hAp4S .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-HMMDtARrAP7hAp4S .labelText,#mermaid-svg-HMMDtARrAP7hAp4S .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-HMMDtARrAP7hAp4S .loopText,#mermaid-svg-HMMDtARrAP7hAp4S .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-HMMDtARrAP7hAp4S .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-HMMDtARrAP7hAp4S .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-HMMDtARrAP7hAp4S .noteText,#mermaid-svg-HMMDtARrAP7hAp4S .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-HMMDtARrAP7hAp4S .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-HMMDtARrAP7hAp4S .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-HMMDtARrAP7hAp4S .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-HMMDtARrAP7hAp4S .actorPopupMenu{position:absolute;}#mermaid-svg-HMMDtARrAP7hAp4S .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-HMMDtARrAP7hAp4S .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-HMMDtARrAP7hAp4S .actor-man circle,#mermaid-svg-HMMDtARrAP7hAp4S line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-HMMDtARrAP7hAp4S :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 客户端监听数据端口 建立控制连接登录PORT或EPRT服务器建立数据连接上传或下载文件返回传输结果
需要特别区分:
- 连接发起方向:服务器连接客户端;
- 文件数据方向 :由
RETR或STOR决定,可以是下载,也可以是上传。
传统 IPv4 主动模式中,服务器数据连接常从 TCP 20 发起,但不能把"所有主动模式都固定使用端口 20"作为绝对规则。
8.2 主动模式的困难
服务器需要主动访问客户端的数据端口。
如果客户端位于以下网络后面:
- 家庭路由器;
- 企业防火墙;
- 4G/5G CGNAT;
- 云桌面;
- VPN 或多级 NAT;
服务器通常无法直接访问客户端,因此现代互联网环境更常使用被动模式。
9. FTP 被动模式
9.1 工作流程
被动模式中:
- 客户端建立控制连接;
- 客户端发送
PASV或EPSV; - 服务器选择一个数据端口;
- 服务器把端口信息返回客户端;
- 客户端连接服务器的数据端口;
- 双方传输目录或文件。
FTP服务器 FTP客户端 FTP服务器 FTP客户端 #mermaid-svg-z2qRPFn3fnNVvqr8{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-z2qRPFn3fnNVvqr8 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-z2qRPFn3fnNVvqr8 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-z2qRPFn3fnNVvqr8 .error-icon{fill:#552222;}#mermaid-svg-z2qRPFn3fnNVvqr8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-z2qRPFn3fnNVvqr8 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-z2qRPFn3fnNVvqr8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-z2qRPFn3fnNVvqr8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-z2qRPFn3fnNVvqr8 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-z2qRPFn3fnNVvqr8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-z2qRPFn3fnNVvqr8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-z2qRPFn3fnNVvqr8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-z2qRPFn3fnNVvqr8 .marker.cross{stroke:#333333;}#mermaid-svg-z2qRPFn3fnNVvqr8 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-z2qRPFn3fnNVvqr8 p{margin:0;}#mermaid-svg-z2qRPFn3fnNVvqr8 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-z2qRPFn3fnNVvqr8 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-z2qRPFn3fnNVvqr8 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-z2qRPFn3fnNVvqr8 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-z2qRPFn3fnNVvqr8 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-z2qRPFn3fnNVvqr8 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-z2qRPFn3fnNVvqr8 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-z2qRPFn3fnNVvqr8 .sequenceNumber{fill:white;}#mermaid-svg-z2qRPFn3fnNVvqr8 #sequencenumber{fill:#333;}#mermaid-svg-z2qRPFn3fnNVvqr8 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-z2qRPFn3fnNVvqr8 .messageText{fill:#333;stroke:none;}#mermaid-svg-z2qRPFn3fnNVvqr8 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-z2qRPFn3fnNVvqr8 .labelText,#mermaid-svg-z2qRPFn3fnNVvqr8 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-z2qRPFn3fnNVvqr8 .loopText,#mermaid-svg-z2qRPFn3fnNVvqr8 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-z2qRPFn3fnNVvqr8 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-z2qRPFn3fnNVvqr8 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-z2qRPFn3fnNVvqr8 .noteText,#mermaid-svg-z2qRPFn3fnNVvqr8 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-z2qRPFn3fnNVvqr8 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-z2qRPFn3fnNVvqr8 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-z2qRPFn3fnNVvqr8 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-z2qRPFn3fnNVvqr8 .actorPopupMenu{position:absolute;}#mermaid-svg-z2qRPFn3fnNVvqr8 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-z2qRPFn3fnNVvqr8 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-z2qRPFn3fnNVvqr8 .actor-man circle,#mermaid-svg-z2qRPFn3fnNVvqr8 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-z2qRPFn3fnNVvqr8 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 建立控制连接登录PASV或EPSV返回被动数据端口客户端建立数据连接上传或下载文件返回传输结果
被动模式中,控制连接和数据连接均由客户端发起,因此更容易穿过客户端侧 NAT 和防火墙。
9.2 服务器侧配置
服务器需要:
- 配置固定的被动端口范围;
- 放行控制端口和被动端口;
- 正确配置公网地址;
- 正确配置 NAT 端口映射;
- 保证云安全组和操作系统防火墙同时放行。
9.3 PASV 与 EPSV
PASV 的响应包含服务器地址和端口。如果服务器位于 NAT 后,可能错误返回内网地址。
EPSV 通常只返回端口,不重新携带服务器 IP,因此:
- 更适合 NAT 环境;
- 同时适用于 IPv4 和 IPv6;
- 可减少返回错误内网地址的问题。
IPv6 环境通常使用:
EPSV:扩展被动模式;EPRT:扩展主动模式。
9.4 主动模式与被动模式对比
| 对比项 | 主动模式 | 被动模式 |
|---|---|---|
| 控制连接发起方 | 客户端 | 客户端 |
| 数据连接发起方 | 服务器 | 客户端 |
| 文件数据方向 | 由上传或下载命令决定 | 由上传或下载命令决定 |
| 客户端是否接受入站连接 | 需要 | 通常不需要 |
| 对客户端 NAT 的适应性 | 较差 | 较好 |
| 服务器端配置 | 相对简单 | 需配置被动端口范围 |
| 常见命令 | PORT、EPRT |
PASV、EPSV |
10. ASCII 模式与二进制模式
10.1 ASCII 模式
命令:
text
TYPE A
ASCII 模式可能转换不同操作系统之间的文本换行符,适合部分纯文本文件,但会改变原始字节内容。
10.2 二进制模式
命令:
text
TYPE I
I 表示 Image,即按原始字节传输。
以下文件必须使用二进制模式:
- GNSS 接收机原始数据;
- 压缩文件;
- 固件;
- 图片;
- 可执行文件;
- 数据库;
- 二进制产品文件。
GNSS 自动化系统通常建议所有文件统一使用二进制模式,包括 RINEX 文本文件,以避免客户端转换换行符。
使用 ASCII 模式传输二进制文件,可能造成文件损坏。
11. 目录列表与自动化
11.1 LIST
LIST 输出主要面向人工阅读,例如:
text
-rw-r--r-- 1 user group 123456 Jul 22 12:00 BJ01.obs
它存在以下问题:
- 不同服务器格式不同;
- Windows 与 Linux 输出不同;
- 日期格式可能不同;
- 文件名包含空格时难以解析。
11.2 MLSD、MLST
MLSD 和 MLST 提供更适合程序解析的格式,例如:
text
type=file;size=123456;modify=20260722040000; BJ01.obs
自动化程序优先使用:
text
MLSD
MLST
SIZE
MDTM
服务器是否支持这些扩展,可通过 FEAT 查询。
SIZE、MDTM 和 MLSD 仍属于服务器可选扩展,脚本必须处理"不支持该命令"的情况。
12. 断点续传的边界
FTP 可通过 REST 指定恢复位置,但断点续传能力取决于:
- 服务器实现;
- 客户端实现;
- 下载还是上传;
- 后续命令组合;
- 文件是否发生变化;
- 用户权限。
下载续传常见组合:
text
REST 偏移量
RETR 文件名
上传续传可能使用:
REST+STOR;APPE;- 客户端特定实现。
不能默认所有服务器都支持上传续传。
工程系统应:
- 检查服务器返回码;
- 核对远端文件大小;
- 对完整文件进行哈希校验;
- 续传失败时安全地重新上传;
- 避免把不完整文件当成完整文件。
13. 普通 FTP 为什么不安全
普通 FTP 默认不加密。
攻击者如果能够监听链路,可能看到:
- 用户名;
- 密码;
- 文件名;
- 目录结构;
- FTP 命令;
- 文件内容。
text
客户端 ── 明文账号、命令和文件 ── FTP服务器
↑
中间链路可以窃听
普通 FTP 还需要防范:
- 弱密码和暴力破解;
- 匿名写权限;
- FTP Bounce;
- 目录权限错误;
- 服务器软件漏洞;
- 日志和审计不足。
因此:
明文 FTP 不适合直接暴露在不可信公网。
14. FTPS 是什么
FTPS 是 FTP over TLS:
text
FTPS = FTP + TLS
在配置正确并完成证书校验时,TLS 可以提供:
- 服务器身份认证;
- 可选的客户端证书认证;
- 控制命令加密;
- 用户名和密码加密;
- 数据传输加密;
- 传输过程完整性保护。
需要区分两类认证:
- TLS 证书认证:主要用于确认连接的服务器身份;
- FTP 用户认证:通常仍通过用户名和密码完成。
服务器证书可信,不代表当前 FTP 用户自动拥有访问权限。
FTPS 仍保留 FTP 的:
- 控制连接;
- 数据连接;
- 主动模式;
- 被动模式;
- FTP 命令与状态码。
15. 显式 FTPS 与隐式 FTPS
15.1 显式 FTPS
显式 FTPS 又称:
- Explicit FTPS;
- FTPES;
- FTP with explicit TLS。
客户端先建立普通 FTP 控制连接,然后发送:
text
AUTH TLS
请求升级为 TLS。
FTPS服务器 FTPS客户端 FTPS服务器 FTPS客户端 #mermaid-svg-UV1y6qEVh0quP4qN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-UV1y6qEVh0quP4qN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UV1y6qEVh0quP4qN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UV1y6qEVh0quP4qN .error-icon{fill:#552222;}#mermaid-svg-UV1y6qEVh0quP4qN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UV1y6qEVh0quP4qN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UV1y6qEVh0quP4qN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UV1y6qEVh0quP4qN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UV1y6qEVh0quP4qN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UV1y6qEVh0quP4qN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UV1y6qEVh0quP4qN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UV1y6qEVh0quP4qN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UV1y6qEVh0quP4qN .marker.cross{stroke:#333333;}#mermaid-svg-UV1y6qEVh0quP4qN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UV1y6qEVh0quP4qN p{margin:0;}#mermaid-svg-UV1y6qEVh0quP4qN .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-UV1y6qEVh0quP4qN text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-UV1y6qEVh0quP4qN .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-UV1y6qEVh0quP4qN .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-UV1y6qEVh0quP4qN .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-UV1y6qEVh0quP4qN .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-UV1y6qEVh0quP4qN #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-UV1y6qEVh0quP4qN .sequenceNumber{fill:white;}#mermaid-svg-UV1y6qEVh0quP4qN #sequencenumber{fill:#333;}#mermaid-svg-UV1y6qEVh0quP4qN #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-UV1y6qEVh0quP4qN .messageText{fill:#333;stroke:none;}#mermaid-svg-UV1y6qEVh0quP4qN .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-UV1y6qEVh0quP4qN .labelText,#mermaid-svg-UV1y6qEVh0quP4qN .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-UV1y6qEVh0quP4qN .loopText,#mermaid-svg-UV1y6qEVh0quP4qN .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-UV1y6qEVh0quP4qN .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-UV1y6qEVh0quP4qN .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-UV1y6qEVh0quP4qN .noteText,#mermaid-svg-UV1y6qEVh0quP4qN .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-UV1y6qEVh0quP4qN .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-UV1y6qEVh0quP4qN .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-UV1y6qEVh0quP4qN .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-UV1y6qEVh0quP4qN .actorPopupMenu{position:absolute;}#mermaid-svg-UV1y6qEVh0quP4qN .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-UV1y6qEVh0quP4qN .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-UV1y6qEVh0quP4qN .actor-man circle,#mermaid-svg-UV1y6qEVh0quP4qN line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-UV1y6qEVh0quP4qN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 建立TCP控制连接明文FTP欢迎响应明文发送AUTH TLS同意升级TLS握手并校验证书加密发送USER和PASSPBSZ 0PROT PPASV或EPSV建立受TLS保护的数据连接
关键点:
AUTH TLS之前的欢迎信息和升级命令仍是明文;- TLS 建立后,后续控制命令才受保护;
- 服务器应要求客户端在发送用户名和密码前完成 TLS 升级。
常见命令:
AUTH TLS:升级控制连接;PBSZ 0:设置保护缓冲区;PROT P:要求数据连接加密;PROT C:数据连接保持明文。
控制连接已经建立 TLS,不代表数据连接一定加密。数据连接需要使用
PROT P。
显式 FTPS 常用控制端口为 21,也可以配置其他端口。
15.2 隐式 FTPS
隐式 FTPS 中,客户端建立 TCP 连接后立即进行 TLS 握手:
text
TCP 连接 → TLS 握手 → 加密 FTP 会话
常见控制端口为:
text
990
隐式 FTPS 从连接开始就不允许发送明文 FTP 命令。
它常用于旧系统、托管平台和厂商规定的行业接口。选择显式或隐式 FTPS,必须与服务器配置一致。
| 对比项 | 显式 FTPS | 隐式 FTPS |
|---|---|---|
| 初始连接 | 先建立 FTP,再升级 TLS | 连接后立即建立 TLS |
| 常见控制端口 | 21 | 990 |
| TLS 启动方式 | AUTH TLS |
连接开始即加密 |
AUTH TLS 前是否明文 |
是 | 不适用 |
| 新系统使用建议 | 通常优先 | 服务器明确要求时使用 |
16. FTPS 数据连接的特殊问题
FTPS 的每一条数据连接都可能进行独立 TLS 握手。
常见问题包括:
- 数据端口未放行;
- FTP ALG 无法解析加密后的控制命令;
- 数据连接 TLS 握手失败;
- 服务器要求 TLS 会话复用;
- 客户端与服务器对会话复用要求不一致;
- 控制连接成功,但目录列表或文件传输失败。
部分服务器会要求数据连接复用控制连接的 TLS 会话,以降低数据连接被劫持的风险。
典型现象:
text
登录成功
目录列表失败
上传或下载时数据连接立即断开
此时需要检查:
- 被动端口;
PROT P;- TLS 版本;
- TLS 会话复用;
- 客户端与服务器兼容性。
17. FTP、FTPS 与 SFTP
SFTP 是 SSH File Transfer Protocol,不是"Secure FTP",也不是"FTP + SSH"。
正确关系是:
text
FTPS = FTP + TLS
SFTP = 基于 SSH 的独立文件传输协议
| 对比项 | FTP | FTPS | SFTP |
|---|---|---|---|
| 基础协议 | FTP | FTP + TLS | SSH |
| 控制连接加密 | 否 | TLS 建立后加密 | 是 |
| 数据连接加密 | 否 | PROT P 时加密 |
是 |
| 连接模型 | 控制连接 + 数据连接 | 控制连接 + 数据连接 | 通常复用一条 SSH 传输连接 |
| 常见端口 | 21 + 数据端口 | 21/990 + 数据端口 | 22 |
| 防火墙配置 | 较复杂 | 较复杂 | 相对简单 |
| 常见认证 | 密码、匿名 | 密码、TLS 证书 | 密码、SSH 密钥 |
| 是否兼容 FTP 服务器 | 是 | 是 | 否 |
服务器支持 FTPS,不代表它支持 SFTP。
18. 与其他文件协议的区别
18.1 TFTP
TFTP 是 Trivial File Transfer Protocol。
特点:
- 基于 UDP;
- 初始请求通常发往端口 69;
- 后续传输通常使用动态 UDP 端口;
- 没有完整目录管理;
- 通常没有用户名和密码;
- 常用于网络启动和简单固件下载。
18.2 SCP
SCP 基于 SSH,主要用于简单复制文件。
相较 SFTP:
- 文件管理能力较少;
- 接口和错误恢复能力通常较弱;
- 新系统自动化通常更倾向 SFTP。
18.3 HTTP/HTTPS
HTTP/HTTPS 更适合:
- 浏览器下载;
- REST API;
- 软件分发;
- CDN;
- 对象存储。
普通 HTTP 不提供 FTP 式完整目录操作,除非配合:
- WebDAV;
- 专用 API;
- 对象存储接口。
18.4 SMB
SMB 更接近远程文件系统,适合 Windows 局域网共享。
- SMB:文件系统式访问;
- FTP:命令式上传和下载。
19. WinSCP 是什么
WinSCP 是 Windows 平台上的文件传输客户端和文件管理软件。
它可使用多种协议,包括:
- SFTP;
- SCP;
- FTP;
- FTPS;
- WebDAV;
- S3。
WinSCP 可以:
- 浏览本地和远程目录;
- 拖拽上传和下载;
- 编辑远程文件;
- 目录同步;
- 保存站点配置;
- 运行脚本;
- 使用命令行;
- 通过 .NET 程序集自动化。
WinSCP 通常不是:
- FTP 或 FTPS 服务器;
- 文件存储服务;
- 通信协议本身。
19.1 显式 FTPS 配置示例
text
文件协议:FTP
加密:TLS/SSL 显式加密
主机名:ftp.example.com
端口:21
用户名:user
密码:******
19.2 隐式 FTPS 配置示例
text
文件协议:FTP
加密:TLS/SSL 隐式加密
主机名:ftp.example.com
端口:990
用户名:user
密码:******
端口必须以服务器配置为准。
19.3 证书校验
首次连接时应检查:
- 证书颁发者;
- 证书有效期;
- 证书主机名;
- 证书链;
- 证书指纹。
使用 IP 地址连接时,如果证书只包含域名,可能出现主机名不匹配。
自签名证书不能简单永久接受,应通过管理员提供的证书指纹进行核对。
20. FTP 的优势与适用场景
20.1 主要优势
FTP 的优势主要来自:
- 协议成熟;
- 客户端和服务器实现广泛;
- 支持常用目录与文件操作;
- 适合批量文件和长时间传输;
- 支持脚本和自动化;
- 大量老设备已经实现。
但这些优势不等同于:
- 比 SFTP 更安全;
- 比 HTTPS 更容易穿越防火墙;
- 适合所有新系统。
20.2 是否存在独有场景
FTP 的大部分能力可以由 FTPS、SFTP、HTTPS、WebDAV、SMB 或对象存储替代。
FTP 最难替换的场景是:
现有设备或行业系统只实现 FTP,需要保持兼容,并且能够通过隔离网络或 VPN 控制风险。
典型场景:
- 老旧工业设备只支持 FTP 上传日志;
- GNSS 接收机只支持 FTP 上传原始文件;
- NAS 或测量仪器内置 FTP Server;
- 已运行多年的批处理系统;
- 受控局域网中的文件交换;
- 传统匿名文件分发服务。
其核心价值是:
text
兼容性 + 存量设备 + 成熟工具
21. FTP/FTPS 在 GNSS 工程中的应用
21.1 适合传输的文件
FTP、FTPS 或 SFTP 适合传输:
- RINEX 观测文件;
- GNSS 接收机原始数据;
- 广播星历;
- SP3 精密轨道;
- CLK 精密钟差;
- ERP 文件;
- Bias-SINEX、OSB 文件;
- 站点日志;
- 配置文件;
- 固件;
- PPP、RTK 和质量分析结果;
.pos、.trace等调试文件。
21.2 不适合替代实时数据流
FTP 不适合直接替代:
- NTRIP 实时 RTCM;
- 实时 SSR;
- TCP 长连接观测流;
- UDP 低时延数据;
- MQTT 状态消息。
推荐关系:
text
实时 RTCM:NTRIP/TCP
实时 SSR:专用流协议或 NTRIP
小时/每日 RINEX:FTPS、SFTP 或 HTTPS
历史文件补传:FTPS、SFTP 或对象存储
设备状态告警:MQTT 或 HTTP API
21.3 GNSS 文件回传流程
#mermaid-svg-hJetwjtsT83Qh2LX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-hJetwjtsT83Qh2LX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hJetwjtsT83Qh2LX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hJetwjtsT83Qh2LX .error-icon{fill:#552222;}#mermaid-svg-hJetwjtsT83Qh2LX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hJetwjtsT83Qh2LX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hJetwjtsT83Qh2LX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hJetwjtsT83Qh2LX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hJetwjtsT83Qh2LX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hJetwjtsT83Qh2LX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hJetwjtsT83Qh2LX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hJetwjtsT83Qh2LX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hJetwjtsT83Qh2LX .marker.cross{stroke:#333333;}#mermaid-svg-hJetwjtsT83Qh2LX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hJetwjtsT83Qh2LX p{margin:0;}#mermaid-svg-hJetwjtsT83Qh2LX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hJetwjtsT83Qh2LX .cluster-label text{fill:#333;}#mermaid-svg-hJetwjtsT83Qh2LX .cluster-label span{color:#333;}#mermaid-svg-hJetwjtsT83Qh2LX .cluster-label span p{background-color:transparent;}#mermaid-svg-hJetwjtsT83Qh2LX .label text,#mermaid-svg-hJetwjtsT83Qh2LX span{fill:#333;color:#333;}#mermaid-svg-hJetwjtsT83Qh2LX .node rect,#mermaid-svg-hJetwjtsT83Qh2LX .node circle,#mermaid-svg-hJetwjtsT83Qh2LX .node ellipse,#mermaid-svg-hJetwjtsT83Qh2LX .node polygon,#mermaid-svg-hJetwjtsT83Qh2LX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hJetwjtsT83Qh2LX .rough-node .label text,#mermaid-svg-hJetwjtsT83Qh2LX .node .label text,#mermaid-svg-hJetwjtsT83Qh2LX .image-shape .label,#mermaid-svg-hJetwjtsT83Qh2LX .icon-shape .label{text-anchor:middle;}#mermaid-svg-hJetwjtsT83Qh2LX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hJetwjtsT83Qh2LX .rough-node .label,#mermaid-svg-hJetwjtsT83Qh2LX .node .label,#mermaid-svg-hJetwjtsT83Qh2LX .image-shape .label,#mermaid-svg-hJetwjtsT83Qh2LX .icon-shape .label{text-align:center;}#mermaid-svg-hJetwjtsT83Qh2LX .node.clickable{cursor:pointer;}#mermaid-svg-hJetwjtsT83Qh2LX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hJetwjtsT83Qh2LX .arrowheadPath{fill:#333333;}#mermaid-svg-hJetwjtsT83Qh2LX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hJetwjtsT83Qh2LX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hJetwjtsT83Qh2LX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hJetwjtsT83Qh2LX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hJetwjtsT83Qh2LX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hJetwjtsT83Qh2LX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hJetwjtsT83Qh2LX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hJetwjtsT83Qh2LX .cluster text{fill:#333;}#mermaid-svg-hJetwjtsT83Qh2LX .cluster span{color:#333;}#mermaid-svg-hJetwjtsT83Qh2LX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hJetwjtsT83Qh2LX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hJetwjtsT83Qh2LX rect.text{fill:none;stroke-width:0;}#mermaid-svg-hJetwjtsT83Qh2LX .icon-shape,#mermaid-svg-hJetwjtsT83Qh2LX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hJetwjtsT83Qh2LX .icon-shape p,#mermaid-svg-hJetwjtsT83Qh2LX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hJetwjtsT83Qh2LX .icon-shape .label rect,#mermaid-svg-hJetwjtsT83Qh2LX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hJetwjtsT83Qh2LX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hJetwjtsT83Qh2LX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hJetwjtsT83Qh2LX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
GNSS接收机持续记录
按小时或按天关闭文件
站点程序检查文件完整
计算文件大小和SHA-256
上传临时文件名
中心校验文件
校验通过吗
重命名为正式文件
删除临时文件并重传
解压 转RINEX 质量检查和归档
21.4 临时文件与重命名
先上传:
text
BJ01_20260722_0000_01H.obs.part
校验完成后再重命名为:
text
BJ01_20260722_0000_01H.obs
在同一服务器、同一文件系统且服务器实现允许时,重命名通常可以避免业务程序读取未完成文件。不能无条件假设跨目录、跨磁盘重命名一定是原子操作。
21.5 文件级校验
TLS 保护网络传输,但工程系统仍应进行文件级校验。
#mermaid-svg-P6FAoMwmGyhdPOan{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-P6FAoMwmGyhdPOan .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-P6FAoMwmGyhdPOan .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-P6FAoMwmGyhdPOan .error-icon{fill:#552222;}#mermaid-svg-P6FAoMwmGyhdPOan .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-P6FAoMwmGyhdPOan .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-P6FAoMwmGyhdPOan .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-P6FAoMwmGyhdPOan .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-P6FAoMwmGyhdPOan .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-P6FAoMwmGyhdPOan .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-P6FAoMwmGyhdPOan .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-P6FAoMwmGyhdPOan .marker{fill:#333333;stroke:#333333;}#mermaid-svg-P6FAoMwmGyhdPOan .marker.cross{stroke:#333333;}#mermaid-svg-P6FAoMwmGyhdPOan svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-P6FAoMwmGyhdPOan p{margin:0;}#mermaid-svg-P6FAoMwmGyhdPOan .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-P6FAoMwmGyhdPOan .cluster-label text{fill:#333;}#mermaid-svg-P6FAoMwmGyhdPOan .cluster-label span{color:#333;}#mermaid-svg-P6FAoMwmGyhdPOan .cluster-label span p{background-color:transparent;}#mermaid-svg-P6FAoMwmGyhdPOan .label text,#mermaid-svg-P6FAoMwmGyhdPOan span{fill:#333;color:#333;}#mermaid-svg-P6FAoMwmGyhdPOan .node rect,#mermaid-svg-P6FAoMwmGyhdPOan .node circle,#mermaid-svg-P6FAoMwmGyhdPOan .node ellipse,#mermaid-svg-P6FAoMwmGyhdPOan .node polygon,#mermaid-svg-P6FAoMwmGyhdPOan .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-P6FAoMwmGyhdPOan .rough-node .label text,#mermaid-svg-P6FAoMwmGyhdPOan .node .label text,#mermaid-svg-P6FAoMwmGyhdPOan .image-shape .label,#mermaid-svg-P6FAoMwmGyhdPOan .icon-shape .label{text-anchor:middle;}#mermaid-svg-P6FAoMwmGyhdPOan .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-P6FAoMwmGyhdPOan .rough-node .label,#mermaid-svg-P6FAoMwmGyhdPOan .node .label,#mermaid-svg-P6FAoMwmGyhdPOan .image-shape .label,#mermaid-svg-P6FAoMwmGyhdPOan .icon-shape .label{text-align:center;}#mermaid-svg-P6FAoMwmGyhdPOan .node.clickable{cursor:pointer;}#mermaid-svg-P6FAoMwmGyhdPOan .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-P6FAoMwmGyhdPOan .arrowheadPath{fill:#333333;}#mermaid-svg-P6FAoMwmGyhdPOan .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-P6FAoMwmGyhdPOan .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-P6FAoMwmGyhdPOan .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-P6FAoMwmGyhdPOan .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-P6FAoMwmGyhdPOan .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-P6FAoMwmGyhdPOan .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-P6FAoMwmGyhdPOan .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-P6FAoMwmGyhdPOan .cluster text{fill:#333;}#mermaid-svg-P6FAoMwmGyhdPOan .cluster span{color:#333;}#mermaid-svg-P6FAoMwmGyhdPOan div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-P6FAoMwmGyhdPOan .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-P6FAoMwmGyhdPOan rect.text{fill:none;stroke-width:0;}#mermaid-svg-P6FAoMwmGyhdPOan .icon-shape,#mermaid-svg-P6FAoMwmGyhdPOan .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-P6FAoMwmGyhdPOan .icon-shape p,#mermaid-svg-P6FAoMwmGyhdPOan .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-P6FAoMwmGyhdPOan .icon-shape .label rect,#mermaid-svg-P6FAoMwmGyhdPOan .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-P6FAoMwmGyhdPOan .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-P6FAoMwmGyhdPOan .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-P6FAoMwmGyhdPOan :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
站点生成文件
计算本地SHA-256
上传文件
中心重新计算SHA-256
哈希一致吗
进入业务处理
标记失败并重新上传
FTP 没有一个所有服务器都支持的统一 SHA-256 校验命令。工程上可以:
- 上传
.sha256伴随文件; - 通过独立 API 上报哈希;
- 在中心端重新计算并与站点记录比较。
21.6 文件命名
推荐格式:
text
站点名_开始时间_时长_文件类型
例如:
text
BJ01_20260722_0000_01H.obs
BJ01_20260722_0000_01H.log
自动化系统尽量使用英文字母、数字、下划线和固定时间格式。
22. 传输时间估算
文件传输时间可近似表示为:
T=8SBηT= \frac{8S} {B\eta}T=Bη8S
式中:
T:传输时间,单位为秒;S:文件大小,单位为字节;B:实际可用链路带宽,单位为 bit/s;η:有效传输效率,其取值范围为:
0<η≤10<\eta\leq10<η≤1
- 常数
8:字节到比特的换算系数。
例如,文件大小为:
S=1 GB=109 byteS= 1\ \mathrm{GB} = 10^9\ \mathrm{byte}S=1 GB=109 byte
假设实际可用链路带宽为:
B=10 Mbit/s=107 bit/sB= 10\ \mathrm{Mbit/s} = 10^7\ \mathrm{bit/s}B=10 Mbit/s=107 bit/s
传输效率为:
η=0.8\eta=0.8η=0.8
则传输时间为:
T=8×109107×0.8=1000 s≈16.7 min\begin{aligned} T &= \frac{8\times10^9} {10^7\times0.8}\\ &= 1000\ \mathrm{s}\\ &\approx 16.7\ \mathrm{min} \end{aligned}T=107×0.88×109=1000 s≈16.7 min
实际时间还受以下因素影响:
- TCP 重传;
- TLS 握手与加密开销;
- 磁盘读写;
- 服务器并发;
- 文件数量;
- NAT 和防火墙;
- 链路波动。
大量小文件通常比相同总大小的单个大文件效率低。
23. 常见故障排查
23.1 能登录但无法列目录
检查:
- 被动端口范围;
- 服务器是否返回错误内网 IP;
- 是否可以改用
EPSV; - NAT 端口映射;
- FTPS 是否使用
PROT P; - 数据连接 TLS 握手;
- TLS 会话复用;
- 目录权限。
23.2 能列目录但无法上传
检查:
- 用户写权限;
- 目录权限;
- 磁盘空间和配额;
- 文件名字符;
- 同名文件策略;
- 防病毒软件;
- 服务器只读配置;
- 临时文件是否已经存在。
23.3 FTPS 证书错误
检查:
- 客户端系统时间;
- 证书有效期;
- 主机名;
- 证书链;
- 根证书;
- 证书指纹;
- TLS 版本。
23.4 小文件成功,大文件中断
检查:
- NAT 会话超时;
- 数据连接超时;
- TCP 重传;
- 磁盘空间;
- 文件大小限制;
- 防火墙;
- TLS 数据连接;
- 断点续传支持;
- 客户端超时;
- 服务器并发限制。
23.5 文件名乱码
检查:
- 服务器是否支持 UTF-8;
- 客户端是否启用 UTF-8;
- 是否支持
OPTS UTF8 ON; - 客户端和服务器编码是否一致。
GNSS 自动化系统更适合使用 ASCII 文件名。
23.6 上传完成但程序无法读取
检查:
- 是否使用二进制模式;
- 文件哈希是否一致;
- 文件是否仍在写入;
- 文件是否正常关闭;
- 压缩包是否损坏;
- RINEX 头是否完整;
- 时间范围是否正确;
- 文件权限是否正确。
24. 安全与选型建议
24.1 明文 FTP
仅在以下条件下考虑:
- 隔离局域网;
- 可信实验网络;
- 外层已有受控 VPN;
- 旧设备无法升级;
- 数据不敏感;
- 风险经过评估。
VPN 可以保护隧道覆盖的网络路径,但 FTP 应用本身仍不具备 TLS。离开 VPN 保护范围或在隧道端点内部抓取流量时,账号和文件仍可能是明文。
即使使用 VPN,也应:
- 使用独立账号;
- 最小化目录权限;
- 限制源 IP;
- 禁止匿名写入;
- 保留审计日志;
- 设置登录失败限制;
- 不直接暴露公网。
24.2 FTPS
建议:
- 新系统优先考虑显式 FTPS;
- 在登录前强制
AUTH TLS; - 禁用 SSLv2、SSLv3 和过旧 TLS;
- 校验证书主机名和证书链;
- 使用
PROT P; - 固定并缩小被动端口范围;
- 检查 TLS 会话复用要求;
- 使用强密码和最小权限;
- 对最终文件进行 SHA-256 校验。
24.3 协议选型
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 旧设备只支持 FTP | FTP + 隔离网络或 VPN | 保持兼容 |
| 必须兼容 FTP 且要求加密 | 显式 FTPS | 保留 FTP 体系 |
| 服务器已有 SSH | SFTP | 单端口、密钥认证方便 |
| 浏览器下载 | HTTPS | 兼容浏览器和 CDN |
| Windows 局域网文件共享 | SMB | 文件系统式访问 |
| 网络启动或简单固件下载 | TFTP | 实现简单,但安全性低 |
| GNSS 实时 RTCM | NTRIP | 面向连续数据流 |
| GNSS 历史文件归档 | SFTP、FTPS、HTTPS | 适合批量文件 |
| 海量文件与云端分发 | 对象存储 | 扩展和生命周期管理方便 |
25. 总结
FTP 的本质是:
一种基于 TCP、将控制连接和数据连接分开的远程文件传输与常用文件管理协议。
FTPS 的本质是:
在 FTP 上增加 TLS;显式 FTPS 在
AUTH TLS成功后保护控制连接,并通过PROT P保护数据连接。
WinSCP 的角色是:
使用 FTP、FTPS、SFTP 等协议连接远程服务器的 Windows 客户端软件。
工程上应遵循:
- 不在不可信公网直接使用明文 FTP;
- 不混淆 FTPS 与 SFTP;
- 主动或被动模式不代表上传或下载方向;
- FTPS 数据连接使用
PROT P; - 自动化程序优先使用
MLSD/MLST; - GNSS 文件统一使用二进制模式;
- 文件完成后校验大小和 SHA-256;
- 实时 GNSS 数据与历史文件回传使用不同协议;
- 存量 FTP 系统重在兼容,新系统应同时考虑安全性和运维复杂度。
参考资料
- RFC 959:File Transfer Protocol (FTP)。
- RFC 1579:Firewall-Friendly FTP。
- RFC 2389:Feature Negotiation Mechanism for the File Transfer Protocol。
- RFC 2428:FTP Extensions for IPv6 and NATs。
- RFC 2577:FTP Security Considerations。
- RFC 3659:Extensions to FTP。
- RFC 4217:Securing FTP with TLS。
- WinSCP 官方文档:FTP (File Transfer Protocol)。
- WinSCP 官方文档:FTPS。
- WinSCP 官方文档:Supported File Transfer Protocols。
- WinSCP 官方文档:Scripting and Task Automation。