你用过FTP软件传文件,比如FileZilla、WinSCP,或者浏览器直接输 ftp://192.168.1.100 访问公司NAS?看到连接成功、进度条跑起来,可能压根没想过:这背后到底走的是啥协议?
FTP不是单一协议,而是一套“双通道”组合
很多人一看到“FTP”,就默认它走的是TCP 21端口——没错,控制连接确实走21端口,但那只是发指令的“嘴”。真正搬文件的“手”,走的是另一条路:动态开启的TCP数据连接,端口不固定(通常是20端口或随机高端口),而且协议类型还分两种模式。
主动模式(Active Mode):服务器反向连你
客户端告诉服务器:“我开了20号端口等你来传数据”,然后服务器从自己的20端口主动连回你的20端口。听起来简单,但现实里常被家庭路由器、防火墙拦住——因为“外部设备主动连你内网电脑”,默认被当成可疑行为。
被动模式(Passive Mode):你主动连服务器
更常见。客户端先连服务器21端口发命令,服务器回复一串数字,比如 227 Entering Passive Mode (192,168,5,100,197,142),意思是“我在192.168.5.100上开了个临时端口,高位字节是197×256+142=50590,你来连我这个50590端口传文件”。这时候,数据连接是你自己发起的,穿墙成功率高得多。
所以,FTP传输实际依赖两个TCP连接:一个固定21端口的控制通道(明文发USER/PASS/RETR等命令),一个动态的数据通道(端口可变,负责实际读写文件流)。
那它走HTTP吗?HTTPS呢?
不走。FTP和HTTP是完全独立的协议族,端口、报文格式、状态机都不同。有人把FTP地址写成 http://ftp.example.com,那是浏览器在“假装”——实际底层还是走FTP协议,只是界面美化了。真要用HTTPS传文件?得换SFTP(基于SSH)或FTPS(FTP over SSL/TLS),它们加密机制、端口、底层依赖全都不一样。
一个小验证技巧
打开命令行,输入:
ftp -d example.com加 -d 参数后,你会看到每一步控制指令和响应原文,比如 227 Entering Passive Mode 后紧跟着的IP和端口拆解,比看软件界面直观多了。下次上传网站备份卡在“等待数据连接”时,别急着重装软件——先确认是主动模式被墙,还是被动模式下路由器没放行高位端口段。协议没选错,只是通道没打通而已。