☰
两台PC之间FTP通讯搭建:从原理到排错全攻略
2026/10/5 3:13:47 网站建设 项目流程

简介:这是一份面向工业自动化与网络运维工程师的FTP通讯配置指南,解决两台PC间通过FTP协议完成文件传输与共享的问题。文档以Windows 7系统为背景,依次梳理了创建FTP用户、启用IIS FTP服务、配置IIS管理器及添加FTP站点的完整流程;同时给出TwinCAT FTP客户端连接服务器并上传/下载文件的实现方法,包括FB_FTP_FileUpload、FB_FTP_FileDownload功能块的变量声明与调用示例,以及TcFTPClient等库的依赖说明。文档末尾还补充了Windows 7自带FTP服务器传输大文件可能掉线、建议按需设置写入权限等实用注意点。全包共1个docx文档,约439KB,内容紧凑、结构完整,便于现场实施人员随查随用。目前已有193人学习下载,是搭建工控环境文件交换功能的有效参考资料。

1. FTP通讯:为什么两台PC互传文件还是绕不开它

两台PC之间传文件,听起来是最基础的操作,但真到了要每天同步一批数据、给同事开一个上传入口、或者跑批处理脚本的时候,U盘和网盘都不顺手。FTP通讯是四十多年前的协议,却依然是局域网和服务器场景里最通用的文件传输方案——不依赖第三方网盘,不受文件大小限制,命令行和图形界面都能操作。这篇文章从实战角度讲清楚两台PC之间FTP通讯的完整落地路径:两种连接模式怎么选、服务端用什么搭、防火墙开放哪些端口、客户端怎么连,以及那些让人“翻车”的报错到底错在哪。适合正在搭内网文件服务、做数据交换,或者单纯想把手头两台电脑打通的读者。

2. FTP通讯的原理:先分清主动与被动模式,再动手搭

2.1 两条连接:21端口是门面,数据通道才是真正的坑

FTP协议全称“文件传输协议”,它最容易被新手忽略的设定是:一次FTP会话不是一条TCP连接,而是两条。

控制连接由客户端主动发起,目的地是服务器的21端口。登录、切换目录、发LIST和RETR这些指令、以及接收220/230/550这类状态码,全走这条连接。数据连接则是传文件时另起的一条连接,用来传目录列表或文件内容,传完就关闭。所以你在Wireshark里抓FTP包,会发现同一会话里出现了好几条TCP流。

问题就出在这条数据连接上:它的通信端口和发起方向,决定了你的FTP能不能在“带着防火墙和路由器”的环境里跑通。很多人在两台PC之间搭FTP,第一步就败在搞不清这条数据连接。现象是:能登录、能敲命令,但一执行ls或者传文件就卡死。这不是密码错,也不是IP不通,是客户端和服务端对数据连接的模式没谈拢。

2.2 主动模式:服务器回头连客户端,NAT环境下的老毛病

主动模式的完整流程,可以拆成三步看。

第一步,客户端连服务器的21端口,发送USER、PASS完成登录。第二步,客户端在发送LIST或RETR之前,先发PORT命令,告诉服务器一条消息:“我的数据端口是192.168.1.100,端口号是50000,请连这个”。第三步,服务器收到PORT后,从自己的20端口发起一条新的TCP连接,去连客户端报上来的IP和端口。数据连接建立后,目录列表或文件内容从这条连接传输。

这套流程在没有NAT的早期局域网里是没问题的,但在今天的网络环境里有三个拦路虎。第一,客户端在路由器后面的话,它报给服务器的IP大多是内网地址,比如192.168.1.100,服务器收到的PORT命令里是内网地址,出NAT后根本不可达。第二,即便IP可达,客户端Windows防火墙默认拦截所有入站连接,服务器回连的那个端口被防火墙静默丢弃。第三,某些路由器会拦截来自WAN侧的入站连接,即使做了端口转发只放行21,20到客户端的回连也不一定被允许。

所以主动模式最典型的失败症状是:登录正常,ls或get命令发出后一直转圈,最终报“数据连接超时”。

2.3 被动模式:把发起权交给客户端,跨网段的首选

被动模式的三步走是另一种顺序。

第一步,客户端连接服务器21端口并登录,这一步和主动模式完全一样。第二步,客户端发PASV命令,意思就是“我不想让你连回来,告诉我该连哪个端口”。第三步,服务器返回227响应,格式大概是227 Entering Passive Mode (192,168,1,10,195,90)。括号里前4个数是IP地址,后两个数组合起来算出端口号:195×256+90=50010。客户端拿到这个地址后,主动发起数据连接。

被动模式把数据连接的发起方换成了客户端,服务器只需要保证21端口和数据端口段在防火墙上放行,客户端无论在哪里,只要能访问到达服务器的这些端口就能传文件。所以跨网段、客户端在NAT后面、服务器在路由器后做了端口映射,这些场景下被动模式几乎是唯一省心的选择。

被动模式也有一个容易被忽略的暗礁:服务器在227响应里回复的IP地址。如果服务器配置里绑定的是内网地址,而客户端从公网访问,它拿到192.168.1.10这样的地址是连不通的。FileZilla Server的被动模式设置里有External Server IP选项,如果你把21端口映射到了路由器上,这里要么填公网IP,要么勾选“从控制连接的来源IP中自动获取”,让客户端实际能连到当前这条通路。

2.4 模式选择速查表与端口规划

两种模式选哪个,归结起来就一句话:服务端能不能主动访问到客户端的端口。选型参考下表:

场景推荐模式原因
同一局域网、防火墙未拦入站主动/被动皆可双向直连,争议少
客户端在NAT后被动数据连接由客户端发起,无需入站放行
服务器在NAT后且映射了公网端口被动服务器只需开放固定端口段
公网远程管理服务器被动+固定端口段便于防火墙严谨管控数据通道

不管用哪种模式,我都建议服务器端把被动模式的数据端口范围固定成一段连续端口,比如50000-50100。原因很实际:防火墙永远只能按端口段去放行,如果服务端随机挑选高端口,你只能在防火墙上整段放行1024-65535,这在生产环境不可接受。想确认当前走的到底是哪种模式,在客户端抓包看最直接:发PASV命令的是被动模式,发PORT命令的是主动模式,227响应里的端口就是服务器数据端口。

动手搭建之前,也值得对比一下是否真的需要用FTP。Windows的共享文件夹在同一局域网内体验更好,拖拽和权限都直观,但跨路由器时要开放445端口,安全性风险大;FTP通过被动模式加固定端口段可以精确控制暴露面。网盘虽然简单,但文件要绕道云端,带宽和隐私都不受控。FTP在可控性和跨平台兼容性上适合作为两台PC之间做数据交换的基础方案。

3. 用FileZilla Server搭服务端:安装、建用户、放行防火墙

3.1 为什么首选FileZilla Server而不是Windows自带的IIS FTP

第2章把模式讲清了,现在进入动手环节。服务端的选择,常见有三种:Windows自带的IIS FTP、FileZilla Server、以及Linux下的vsftpd。既然标题是两台PC,默认都是Windows,那就在前两者里选。

Windows专业版和企业版确实自带IIS,可以启用“FTP服务器”功能。但我一般不用它来做两台PC之间的传输,原因有三个。

第一,IIS FTP的配置入口藏得深。要在“启用或关闭Windows功能”里勾选IIS管理控制台和FTP服务,再通过IIS管理器建站点、绑IP、设身份验证,流程是为Web服务器准备的,为了传几个文件把IIS整个打开,属实杀鸡用牛刀。

第二,IIS FTP的被动模式端口范围虽然可以在配置里指定,但设置项分散,默认对匿名登录和被动模式的处理比较隐晦,出了问题日志不够直白。

第三,权限设计的精细度不够。IIS FTP更多依赖NTFS权限做控制,想给不同用户不同的目录和读写范围,要在系统层建用户、设ACL,维护成本高。

FileZilla Server则把用户管理、目录挂载、被动模式端口、TLS加密全部收敛到一个图形界面里。免费、轻量、支持作为Windows服务开机自启,非常适合两台PC之间的FTP通讯这种小规模但要求可靠的场景。

3.2 安装与初始配置的三个要点

安装过程基本是下一步,但三个选项需要停下来看一眼。

第一个是管理密码。新版FileZilla Server安装时会要求设置一个Administration password,这个密码只用于登录管理界面,和FTP用户无关。如果忘记,只能通过重新安装或查配置文件找回,体验不算友好,所以建议用密码管理器记录。

第二个是监听端口号。默认21。如果这台机器上还跑着别的服务占用了21端口,或者你不想在防火墙上开默认端口,可以把FTP端口改成2121之类的其他值。改完之后,客户端填地址时要写成192.168.1.10:2121或192.168.1.10 2121,容易漏,所以内网场景下我不折腾端口。

第三个是服务启动方式。FileZilla Server默认作为Windows服务安装,开机自动启动,无需登录桌面。这一点很重要,因为如果作为普通应用启动,服务器重启后没人登录,FTP服务就不在了。

安装完成后打开管理界面,连接本机服务,会看到一个当前状态面板,里面显示监听端口、当前连接数和最近日志。刚装完默认没有任何用户。

3.3 创建用户与目录权限

现在建立第一个FTP用户。在管理界面左侧导航点Users,右侧点击Add,输入用户名。如果需要密码,勾选Password栏并输入。如果不勾选,这个用户就是匿名FTP用户,任何客户端都能登录,除非你想做完全开放的传文件目录,否则必须勾选。

创建完用户后,必须给它挂载一个目录,否则登录成功也看不到任何内容。在Shared folders区域点击Add,选择本地的一个文件夹,比如D:\ftpshare。右侧Permissions列表里,默认权限一般是不可读也不可写的,需要按实际用途勾选。

如果只让对方下载,勾File read即可。如果对方要上传,勾File write。如果对方还需要覆盖或删除已有文件,勾File delete。如果对方要能在FTP目录里新建子文件夹,勾Directory create。

不同用户挂不同目录的做法也值得养成习惯:与其给所有人一个共享目录,不如按用户建目录,比如D:\ftpshare\user_a和D:\ftpshare\user_b,然后在每个用户的Shared folders里分别添加。这样即使用错账号或误删,影响范围也被隔离。

3.4 被动模式端口范围与Windows防火墙放行

用户建完,目录挂好,先别急着连,还有一个重要设置:被动模式端口段。

进Settings里的Passive mode settings,勾选Use custom port range,填50000到50100。范围越小,防火墙规则越精准,但端口如果并发传输多可能不够;内网两台PC之间用,200到500个完全够。

然后打开Windows防火墙。以管理员身份运行PowerShell,执行两条命令:

New-NetFirewallRule -DisplayName "FTP Control 21" -Direction Inbound -Protocol TCP -LocalPort 21 -Action Allow New-NetFirewallRule -DisplayName "FTP Passive 50000-50100" -Direction Inbound -Protocol TCP -LocalPort 50000-50100 -Action Allow

第一条放行控制端口21,第二条放行被动模式的数据端口段50000-50100。参数说明:-Direction Inbound是指入站方向,FTP是客户端连服务器,所以必须开入站;-Protocol TCP表示只给TCP协议放行,不给UDP开洞;-LocalPort支持单个值和范围,是这条规则的命门;-Action Allow表示允许通过。

执行完以后用这条命令验证规则状态:

Get-NetFirewallRule -DisplayName "FTP*" | Format-List DisplayName, Enabled, Profile

确认Enabled值为True,并且Profile覆盖当前正在使用的网络类型。Windows防火墙将网络分为域、专用、公用三种,FTP服务如果位于“公用”网络下,规则只在专用网络生效是没用的,需要补一个Public的Profile,或直接用上面命令再跑一遍并指定Profile。需要撤销规则时,执行Remove-NetFirewallRule -DisplayName "FTP Control 21"即可,这算是给未来的后悔药。

到这里服务端配置完毕。顺手在服务端本机执行Test-NetConnection -ComputerName 127.0.0.1 -Port 21,返回TcpTestSucceeded为True,就说明服务正常。

4. 客户端连接与网络准备:从ping通到传第一个文件

4.1 先让两台PC的网络互相能到达

服务端就绪,客户端的事从网络开始。如果两台PC接入的是同一个路由器,默认DHCP分配的地址在同一网段,什么都不用改,路由器会让它们互通。但我还是建议给服务器那台PC设一个固定IP,原因很实际:DHCP地址有租期,重启路由器后服务器IP可能变了,所有用IP做连接的客户端立即抓瞎。

设置静态IP的路径是“设置 -> 网络和Internet -> 高级网络设置 -> 更改适配器选项”,右键网卡属性,双击IPv4,改成手动填写。IP填192.168.1.10,子网掩码255.255.255.0,网关填路由器的LAN口地址,DNS可以照抄路由器地址或填公共DNS。如果两台PC完全没有路由器、直接用网线相连,也必须手工给两块网卡设同网段的静态IP,比如一台192.168.1.10、一台192.168.1.20,否则网络起不来。

设置完成后在客户端PC上做两层测试。第一层是ICMP:

ping 192.168.1.10 -t

看到“来自192.168.1.10的回复”而不是“请求超时”,表示二层链路和IP配置都没问题。这里有个迷惑点:Windows防火墙默认拦截ICMP,所以ping不通不代表TCP不通,先确认防火墙的“文件和打印机共享”规则里ICMP回显是否放行,再判断。

第二层测TCP端口,这一步能彻底区分“网络不通”和“FTP服务没起”:

Test-NetConnection 192.168.1.10 -Port 21

输出里的TcpTestSucceeded为True,说明21端口通路正常。没有PowerShell的旧系统,可以用telnet 192.168.1.10 21,能出现220开头的FTP欢迎语即为成功。我习惯把Test-NetConnection当作排错第一命令用,比直接连FileZilla Client省时间。

4.2 图形界面客户端:FileZilla Client

客户端图形界面推荐FileZilla Client,和服务端的键位、术语完全一致。安装后打开,顶部一行是主机、端口、用户名、密码,快速填写即可连接。

几个关键的传输设置值得说。在“编辑 -> 设置 -> 传输”里,默认并发传输数可以保持2,不要一味调大——FTP的多路传输会加大数据通道端口的占用,小带宽下反而互相阻塞。在传输失败重试次数上,建议从默认的1次改为3次,针对大文件临时断网的情况比较实用。FileZilla Client默认走被动模式,这点不用改,保持即可。

中文文件名的显示,在站点管理器里选中站点,“字符集”标签下选择强制UTF-8。这能解决大多数Windows环境下中文乱码问题。

FileZilla Client的队列窗口很有价值。传输大文件时,队列里能看到每个任务的进度、速度和剩余时间,还有失败任务的错误码。脚本化之后如果出问题,我都是先从队列日志里复制错误行,再去对应排查,比猜原因有效率得多。

4.3 Windows资源管理器:应急查看可以,批量传输别用

Windows资源管理器自带FTP客户端能力,地址栏输入ftp://192.168.1.10,回车后会弹登录框。它的省事之处是不用装任何软件,看完目录甚至可以直接把文件从FTP拖到本地文件夹。

但两个明显的坑让它只适合应急。第一个是它默认走被动模式,也不支持断点续传和并发,传大文件时中途断了就要从头再来;第二个是中文编码支持不好,在UTF-8编码的服务器上,资源管理器看到的文件名大概率乱码。所以结论是:应急看个目录、传个小文件可以,正经传输和自动化一律用FileZilla Client或命令行。

4.4 命令行客户端:ftp.exe的最小可运行姿势

Windows内置ftp.exe,脚本化运维时最好用的也是它。打开CMD,执行:

ftp 192.168.1.10

输入用户名、密码后进入ftp提示符。基本命令有:

ls get filename.txt put D:\data\backup.zip bye

get是下载,put是上传。ftp.exe在不加参数的情况下默认主动模式。主动模式在NAT下会卡数据连接,症状是ls命令发出去后迟迟没有返回。这时在ftp提示符下输入passive切换被动模式,部分Windows版本支持,但如果提示未知命令,说明这个版本的ftp.exe不支持切换,直接换FileZilla Client连。

4.5 脚本化:ftp.exe的-s参数跑批量任务

手动验证通过后,即可进入脚本阶段。把FTP操作写进一个文本文件,让ftp.exe逐行执行。比如创建一个ftp_script.txt:

open 192.168.1.10 testuser 123456 cd /upload put D:\data\backup.zip bye

然后执行:

ftp -s:C:\scripts\ftp_script.txt

-s参数指定脚本文件路径,ftp.exe会按顺序执行脚本内的指令。

脚本里最需要注意的是bye之前的每一条命令都可能失败,但ftp.exe不会因此中断,它会继续执行后面的命令。所以脚本里如果有先后依赖的步骤,要在每一步之间加预期校验,或者干脆不在一个脚本里混排。用户名密码是明文写在这个文件里的,所以脚本文件权限要收紧,至少不要让普通用户读取,内网用可以,公网传输得换成SFTP这类加密协议。

5. 避坑:两台PC FTP通讯最常见的5个翻车现场

5.1 连接超时

现象:客户端提示“连接超时”,服务端日志看不到任何连接记录。

原因分三类。第一,IP地址或端口填错,常见于改了端口后客户端没同步。第二,FTP服务没起来,或启动失败。第三,Windows防火墙拦了入站21端口,或服务器在路由器后没有做端口映射。

解决:按层排查。在服务器本机执行Test-NetConnection -ComputerName 127.0.0.1 -Port 21,如果本机就连不上,是服务问题,回看第3章的服务启动状态;本机能连、客户端不行,则继续ping,ping不通查防火墙ICMP和网段,ping得通查21端口防火墙规则。跨公网访问时,还要确认路由器把21端口和被动端口段都映射到服务器内网IP。超时类问题最磨人,但绝大多数都落在这些基础配置上。

5.2 530 Login incorrect

现象:用户名密码看着没问题,但服务端总是返回530 Login incorrect。

原因:FileZilla Server的用户是它自己维护的一套,和Windows系统用户完全无关。多数人在这里直接填了Windows的登录账号,自然进不去。另一种情况是客户端自动尝试匿名登录,而服务端没有启用匿名用户。

解决:到服务端管理界面打开Users页面,确认创建的用户名和密码,特别注意密码是否真的勾选并输入了。FileZilla Client登录时,用户名栏不要带@后缀或域名,单独填用户名即可。如果确实不记得密码,管理界面对该用户重新设置一次密码,客户端再登录。

5.3 登录成功但列目录卡住

现象:220欢迎信息正常,但点击目录刷新或执行ls命令时一直转圈,最后报“无法打开数据连接”。

原因:数据通道没建立起来。最典型的是客户端和服务端模式不匹配,比如服务端只开放了被动模式端口范围,而客户端用了主动模式;或者是服务端在NAT后,227响应回报的是内网IP,客户端拿内网IP去连当然不通。

解决:两端都统一到被动模式。服务端设置固定端口段并在防火墙放行;客户端在FileZilla Client传输设置里确保使用被动模式。需要特别强调,放行21端口不等于放行数据端口。主动模式下数据连接从服务器20端口向客户端发起,被客户端防火墙拦是常事;被动模式下服务器回227时会暴露内网地址,如果客户端从公网来,要在被动模式设置里指定外部IP。这两个细节是“连上但列不了目录”这口锅的主要来头。

5.4 传大文件传一半断掉

现象:几百MB的文件传到一半突然没动静,日志里没有明确报错。

原因:一个是断点续传没开,网络抖动导致连接断开就得从头再来;一个是超时设置过短,传输静默超过阈值被服务端掐断;还有一个是笔记本Wi-Fi省电策略导致网卡休眠,传输中断。

解决:FileZilla Client在传输菜单里勾选“如果文件已存在则覆盖/续传”,传输失败后重新拖一次即可续传。服务端把超时时间从默认120秒调大到900秒以上。笔记本用户把电源设置里的无线网卡省电模式改成“最高性能”,这个和FTP参数无关,却是在实际排错里最常被忽略的一个,和协议没关系但比协议本身更坑。

5.5 中文文件名乱码

现象:客户端看到的文件名是一串问号或乱码,下载后文件名也不正确。

原因:FTP协议本身不考虑字符集,文件名就当作字节流传输。服务器端用UTF-8编码,客户端用GBK解析,或者反过来,都会乱码。Windows资源管理器尤其明显,它默认按本机区域设置解析FTP文件名,在中文Windows下按GBK处理,而新版FileZilla Server默认UTF-8。

解决:让两端统一编码。FileZilla Client的站点管理器里把字符集设为强制UTF-8;Windows资源管理器没有这个选项,所以遇到UTF-8的服务器,直接改用FileZilla Client。反过来,如果服务器是老的GBK环境,就在客户端站点里把字符集改成自定义并填GBK,不要让它自动探测。编码类问题在FTP排错里属于成本最高的一类,因为不报错、只给乱码,确定编码统一后才能继续传数据。

6. 进阶:把FTP通讯固化成定时同步任务

6.1 用批处理、计划任务与抓包,让FTP通讯变成可靠的日常工作

FTP通讯跑通之后,接下来的高频需求是把传输自动化。Windows自带的任务计划程序配合一条批处理,就能实现两台PC之间的定时同步。

先准备传输脚本ftp_script.txt,内容同第4.5节。再准备一个批处理ftp_sync.bat:

@echo off ftp -s:C:\scripts\ftp_script.txt 192.168.1.10

然后注册计划任务:

schtasks /create /tn "FTPDailySync" /tr "C:\scripts\ftp_sync.bat" /sc daily /st 02:00

/sc daily /st 02:00表示每天凌晨两点执行。任务计划程序里可以进一步设置“如果错过运行时间则尽快运行”,对夜间关机白天开机的PC很有意义。

如果对传输可靠性要求更高,我一般会换WinSCP命令行,它支持FTP和SFTP,一条命令能完成上传并支持失败即退出:

winscp.com /command "open ftp://testuser:123456@192.168.1.10/" "put D:\data\*.zip /upload/" "exit"

验证链路健康,除了看客户端日志,我习惯在服务端网卡上开Wireshark抓包,过滤tcp.port==21,能清楚看到USER、PASS、PASV、227这些命令的时序,也能看到数据通道端口段的报文。传输完再校验文件是否一致,在客户端和服务端分别执行:

certutil -hashfile D:\data\backup.zip SHA256

两边哈希一致,才算这次FTP通讯真正成功。

最后说一个我踩过的坑:ftp.exe脚本里任何一行命令失败,脚本继续跑,但文件没传上去,日志也不会报错。后来我在脚本末尾增加了一个校验步骤,先对比文件大小,不一致就重传并告警。自动化任务不怕报错,怕的是静默失败。希望这个习惯能帮到你,也希望你的FTP通讯一次跑通。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询