
简介面向计算机网络初学者的文件传输协议FTP讲解文档聚焦 RFC 959 标准及其在 TCP/IP 应用中的核心地位重点说明如何在不同操作系统、文件结构和字符集环境下完成可靠文件复制并与 TELNET 的异构性处理思路作对比。文档内容完整覆盖 FTP 模型、基于端口 21 的传输流程、控制连接与数据连接的双链接机制以及文件类型、格式控制、结构、传输方式等四方面数据表示选项同时列出常用 FTP 命令与应答码含义。针对 FTP 较复杂的特点还补充了简单文件传输协议 TFTP 的规则基于 UDP、固定 512 字节块传输、超时重传及无盘工作站自举场景便于读者对比理解。资源为单个 doc 文档共 1 个文件大小约 142KB已有 207 人学习适合计算机网络课程复习、考研基础巩固或自学入门使用。1. 文件传输协议这份课程笔记为什么考完试还值得你复盘一遍文件传输协议File Transfer ProtocolFTP几乎是计算机网络基础课程里最“劝退”又最“接地气”的一章。说它劝退是因为它打破了“一个服务对应一个端口”的直觉——控制连接和数据连接两个通道并存主动模式、被动模式两个术语绕晕大半人说它接地气是因为你随便打开一台 Linux 服务器vsftpd一装就能跑起来抓包软件里能一条一条看到真实报文。这篇笔记不只是给你梳理期末考点更是把 FTP 从“背概念”拉到“能复现、能排错”的位置上覆盖计算机网络基础课程里应用层协议的学习路径。适合正在复习 408 或期末考的学生也适合刚接触网络抓包的运维新人。2. 文件传输协议的双连接骨架控制连接与数据连接怎么配合2.1 为什么 FTP 要开两个连接控制信道“带外”设计与 21/20 端口分工绝大多数应用层协议只需要一个连接比如 HTTP 默认 80 端口一条 TCP 流走完全部请求和响应。FTP 特殊在它把“说指令”和“传文件”彻底分开。控制连接走 TCP 21 端口承载 USER、PASS、CWD 这类命令和对应应答码数据连接则承载实际的目录列表或文件内容使用的端口取决于当前是主动模式还是被动模式。这种设计叫“带外控制”out-of-band control好处是控制连接可以保持长时间打开而每条数据连接用完就关不长期占用资源。考虑一个实际场景客户端登录后停留在目录里浏览五分钟这五分钟控制连接一直开着但没有任何数据传输连接。如果只有一条连接服务器就得靠超时判断客户端是否还活着频繁断开会让用户体验很差。FTP 把控制与数据拆开相当于把“人的对话”和“快递运输”分到两条路上互不阻塞。另一个角度看控制连接是文本协议应答码也是人能读懂的字符比如 220 表示服务就绪331 表示需要密码。从计算机网络课程角度看FTP 是最适合用来讲解“协议状态机”的样例——每个命令都有与之对应的应答码序列比如登录过程严格遵循“220 → USER → 331 → PASS → 230”的顺序。复习谢希仁《计算机网络》或王道考研书时把这条交互序列画成时序图比死记端口号有用得多。2.2 主动模式与被动模式的真实差异NAT 环境下为什么被动模式更稳主动模式PORT 模式的流程是客户端在控制连接上发送 PORT 命令告诉服务器“我这边开了一个端口等你连过来”服务器随后从自己的 20 端口主动向该端口发起数据连接。注意“主动”指的是服务器主动连客户端。这在公网环境没问题但客户端处于 NAT 后面时服务器无法直接访问客户端的私网地址数据连接就会建立失败。被动模式PASV 模式则把“谁发起数据连接”颠倒过来。客户端发送 PASV 命令服务器回应一个 IP 和端口客户端主动向这个端口建立数据连接。这样 NAT 设备只需要放行客户端向外发起的连接无需额外配置入站规则。这就是为什么现代 FTP 客户端默认都会勾选被动模式。对比两个模式可以从参数角度记住区别对比项主动模式 PORT被动模式 PASV数据连接发起方服务器从 20 端口发起客户端向服务器指定端口发起服务器防火墙要求需放行 20 端口入站需放行一段高位端口范围客户端 NAT 场景几乎必失败可正常工作考试常考表述服务器主动连接客户端客户端主动连接服务器实际做题时经常有个陷阱题目说“客户端开启了防火墙服务器在公网”问应该用什么模式。答案是被动模式因为主动模式下服务器连客户端会被客户端防火墙拦掉。把这两个模式和 NAT 场景挂钩理解比单纯背结论稳妥。2.3 数据连接的两种传输形态主动建连与端口协商细节在 FTP 课程笔记里另一个容易忽略的点是数据连接不仅仅用于传文件LIST、NLST这些列目录命令同样走数据连接。也就是说当你执行ls看服务器上有什么文件时在抓包里能看到一条额外的 TCP 连接目录列表的文本内容是在数据连接上传送的控制连接上只收到 150 和 226 这类应答。我一般会建议初学者抓一次包看这个过程登录后输入ls再用 Wireshark 过滤ftp和ftp-data能清晰看到控制连接上的指令与应答以及数据连接上的列表内容。这个观察能一次性解决两个困惑一是“控制连接里为什么看不到文件内容”二是“为什么会有两个 TCP 流”。参数上的选择也值得留意。数据连接什么时候关闭、用不用 TLS、传输模式是 ASCII 还是 Binary都不是在命令里随意指定的。ASCII 模式会把换行符做转换Windows 与 Linux 差异二进制模式不做任何转换。传脚本或文本用 ASCII 没大问题传压缩包、图片、可执行文件必须切到二进制模式否则文件大小和校验值都会对不上。很多“下载下来的文件打不开”的翻车现场根源就在这里。3. 文件传输协议的命令体系与应答码考前必须能吃透的细节3.1 最常考的 10 条 FTP 命令格式、含义与典型交互FTP 的命令都是纯文本以回车换行结尾命令和参数之间用空格分隔。把最常考的十条命令拉出来格式统一记一遍命令参数含义典型应答场景说明USER用户名331 需要密码登录第一步PASS密码230 登录成功明文传输课程常考安全隐患CWD切换目录路径250 成功对应cdPWD无257 返回当前路径对应pwdTYPEA 或 I200 成功A 表示 ASCIII 表示二进制PORTIP 和端口200 成功主动模式告知地址PASV无227 返回地址端口被动模式获取地址LIST可选路径150 打开数据连接列目录内容走数据连接RETR文件名226 传输结束下载文件STOR文件名226 传输结束上传文件记忆这些命令有个技巧RETR 和 STOR 的拼写和“下载、上传”方向容易混淆我记法是 RETR 是 retrieve取回所以是下载STOR 是 store存放所以是上传。还有LIST之后必须有一个数据连接建立的过程如果数据连接打不开客户端会卡在 150 应答之后这是考试和实际排错里非常典型的故障点。3.2 三位应答码的语义分层1xx/2xx/3xx/4xx/5xx 到底怎么记FTP 应答码是三位数字第一位数字决定大类后两位提供细分信息。计算机网络基础课程里不要求记全量编号但分层的逻辑必须会。1xx 表示“已收到请求正在处理”典型如 150 表示“文件状态正常正在打开数据连接”2xx 表示“成功”220 服务就绪、230 登录成功、226 传输完成都属于这一类3xx 表示“需要更多信息”最常见的 331 就是要密码4xx 是临时失败比如 425 无法建立数据连接、450 文件不可用5xx 是永久失败比如 530 未登录、550 文件不存在或没有权限。考试里喜欢挖的坑是把 4xx 和 5xx 混在一起问。区分办法是看“重试有没有意义”4xx 过一会儿再试可能就成功了比如服务器资源暂时不足5xx 再试多少次都一样比如路径根本不存在。把“450 理解为暂时性问题、550 理解为永久性问题”这个判断标准放进答题逻辑里选择题基本不会错。3.3 从应答码倒推故障位置一个 421 和 425 的排查案例实际用 FTP 时应答码可以直接帮你定位是服务器的问题还是客户端的问题。有一次我在内网服务器上调试客户端输入ls后一直卡着不动控制连接上收到了425 Failed to establish connection。这个 425 说明服务器已经准备好了数据连接但连接没有建立成功。因为是主动模式我立刻怀疑客户端所在 NAT 没放行服务器回调端口切换成被动模式后立刻恢复。还有一种常见情况是收到421 Too many connections这不是数据连接的问题而是服务器限制了同一 IP 的最大连接数。很多 FTP 客户端默认开多线程下载瞬间建多个连接就触发这个限制。这时候要么在客户端限制并发数要么去服务器配置里调max_per_ip参数。应答码的排查价值就在这——它不是让你背的是让你拿着它去判断该查哪一端配置。4. 用 Python 和 Wireshark 复现 FTP 完整会话从理论到能跑通的最小实验4.1 用 ftplib 实现最小客户端连接、登录、列目录、下载的完整代码如果本机没有现成的 FTP 服务器可以用 Python 的pyftpdlib快速起一个匿名服务器再用标准库ftplib写客户端。下面这段代码可以在本机跑通“连接 → 登录 → 列目录 → 下载”全流程适合复习时验证协议行为。from ftplib import FTP # 连接 FTP 服务器host 和 port 对应控制连接的地址 ftp FTP() ftp.connect(host127.0.0.1, port2121, timeout10) # 匿名登录user 传 anonymous密码传邮箱或空字符串 ftp.login(useranonymous, passwdtestexample.com) # 切换工作目录对应 CWD 命令 ftp.cwd(pub/files) # 列出当前目录内容对应 LIST 命令返回的是控制连接上的应答结果 names ftp.nlst() print(目录列表:, names) # 下载文件注意使用二进制模式避免文本模式转换破坏文件 ftp.voidcmd(TYPE I) with open(local_copy.pdf, wb) as f: # retrbinary 内部会建立数据连接并接收数据 ftp.retrbinary(RETR report.pdf, f.write) # 显式关闭连接发送 QUIT 命令 ftp.quit()这段代码里三个细节值得解释。ftp.connect只建立控制连接此时服务器会返回 220 就绪应答ftp.login内部依次发送 USER 和 PASS并校验应答码是否为 230ftp.retrbinary是整个流程中最能体现“双连接”设计的一步——它会发送RETR命令等待 150 应答然后从数据连接读取文件内容结束后通过控制连接收到 226。如果中途数据连接失败ftplib 会抛出socket.error或ftplib.error_temp对应协议层反馈的 425 或 426。想观察更底层的行为可以在每个方法前后加打印把ftp.sendcmd的返回值打出来这样你能看到每一步对应的原始应答码。课程复习时不建议封装得太高级直接调用sendcmd看文本交互反而更有学习价值。4.2 Wireshark 抓包验证双连接过滤表达式与封包判读方法跑通上面的 Python 脚本后打开 Wireshark 抓回环接口过滤表达式输入ftp || ftp-data就能看到完整的控制流和数据流。控制连接上的封包是命令文本比如USER anonymous\r\n数据连接上的封包标记为FTP-DATA里面是被传输文件的原始字节。区分主动和被动模式在抓包里也很简单。被动模式下服务器在227应答中会附带一个 IP 和端口比如227 Entering Passive Mode (127,0,0,1,8,45)最后的两个数字8,45表示端口号8 * 256 45 2093。客户端接下来会主动连接这个 2093 端口。主动模式下客户端发送的PORT命令同样用六个数表示 IP 和端口。抓包里如果能同时看到控制连接上的227和紧接着发往对应端口的数据连接就说明被动模式交互完整成立。这个验证实验对你的考试复习有个额外好处它把“应用层协议”和“传输层端口”的关系变得可见。你不再需要死记“FTP 使用 21 端口”而是直观看到控制连接确实固定走 21而数据连接的端口是每次协商出来的。计算机网络自顶向下那本教材里强调的“应用层不关心传输层细节”在这里有了直观反例——FTP 的 PORT 命令恰恰把 IP 和端口写进了应用层报文这是它后来被诟病的地方。4.3 命令行 FTP 客户端跑通手动交互交互式命令与脚本化两种姿势如果不想写 Python直接使用系统自带的命令行 FTP 客户端也能完成实验。在 Linux 或 macOS 终端输入ftp 127.0.0.1 2121连接后依次输入user anonymous、pass testexample.com、ls、binary、get report.pdf。每一步你都能看到对应的应答码。命令行方式的价值在于“慢”。你能清楚看到控制连接上的每次一来一回不会被编程接口隐藏细节。把下面这段脚本化写法保存为ftp_test.txt再用ftp -s:ftp_test.txt执行可以重复验证open 127.0.0.1 2121 user anonymous testexample.com binary ls get report.pdf bye脚本方式适合批量实验手动交互适合第一次理解协议。无论哪种方式做完后都可以登录服务器检查日志确认登录来源 IP、传输的文件大小和耗时。如果你用的是pyftpdlib起服务器控制台里直接会打印每条命令和应答几乎一个抓包工具都不需要。我还建议在实验里故意做一次错误操作输入一个不存在的路径cwd /no_such_dir然后记录服务器返回的 550 应答。这个 550 是永久性错误和之前说的 4xx 临时错误正好形成对比一次实验把两类错误都看到比只背文字定义扎实。5. FTP 连接与传输避坑指南四个高频故障的现象、原因与处理5.1 连接成功却取不到目录列表被动模式端口范围没放行现象客户端能成功登录输入ls后卡住直到超时。控制连接上的命令有去无回抓包看到 TCP 重传。原因被动模式下服务器在 227 应答里给客户端一个高位端口客户端接着去连这个端口但服务器的防火墙只放行了 21 端口高位端口范围未放行数据连接被丢弃。解决在服务器防火墙放行被动端口范围。以常见的 vsftpd 配置为例在/etc/vsftpd.conf里设置pasv_min_port30000和pasv_max_port31000然后在防火墙规则中允许 TCP 30000 到 31000 的入站连接。客户端侧不用额外设置。如果你用的是云服务器还需要在安全组规则里同步放行。这个坑非常典型因为很多人只记得放行 21 端口忘了数据连接端口范围。5.2 主动模式连接外网服务器失败NAT 环境下的 PORT 命令缺陷现象内网客户端连接外网 FTP 服务器登录正常一执行ls就报425 Failed to establish connection或Network error。原因客户端处于 NAT 后面PORT 命令发给服务器的是私有 IP 地址比如192.168.1.100,4,10。服务器尝试连接这个私有地址自然无法路由。解决客户端切换为被动模式让服务器返回公网地址由客户端主动发起数据连接。绝大多数图形 FTP 工具都提供“主动/被动”切换选项命令行客户端可以输入passive开启。这里有个需要注意的细节部分被动模式应答返回的是服务器的内网地址服务器也在 NAT 后面这时需要在服务器配置pasv_address参数指定公网 IP否则客户端拿到内网地址一样连不上。5.3 下载文件后本地文件打不开或内容错乱ASCII 与二进制模式混用现象下载的压缩包能完整下载但本地解压时报 CRC 错误或者文本文件里的换行全部消失。原因客户端使用了 ASCII 模式传输非文本文件。ASCII 模式下服务器和客户端之间会做换行符转换\r\n与\n相互转换文件字节因此发生变化。解决上传或下载非文本文件前执行binary命令或TYPE I指定二进制模式。在 ftplib 中使用retrbinary而不是retrlines也能规避这个问题。这一条是血泪经验许多人在处理 CSV 数据时图省事用 ASCII 模式结果解析全错定位问题时还以为是数据源问题。文件传完后对比一下字节数和校验值能第一时间发现问题。5.4 登录成功但上传报 553 Permission denied写权限与目录所有权现象客户端能登录、能列目录但执行STOR上传文件时收到553 Could not create file。原因登录用户对目标目录没有写权限。如果使用匿名用户服务器通常只允许向pub/incoming这类目录上传根目录和pub目录只读。如果使用系统用户则可能是目录的属主和权限位不对。解决先确认当前工作目录和用户身份用pwd和id检查。将上传目录属主改为运行 FTP 服务的用户并给予写权限。命令参考chown ftpuser:ftpgroup /srv/ftp/upload chmod 755 /srv/ftp/upload # 属主可写其他只读这里还要注意chmod 755只让属主可写如果 FTP 登录用户就是目录属主那没问题如果登录的是匿名用户则可能需要chmod 777但这样安全风险高更稳妥的是匿名用户映射到某个固定系统账号。检查权限用ls -ld先看目录属主再结合服务端日志确认实际身份比盲目改权限更高效。6. 把抓包验证与课程考点串起来FTP 实验的进阶检查清单学完上面的内容再看一遍自己抓到的包重点检查三点控制连接命令与应答的时序是否严格符合协议规定数据连接发起的端口是否与 PORT 或 PASV 应答一致传输完成的 226 应答是否在数据连接关闭之后出现。把这个检查清单过一遍比反复读概念有用。计算机网络基础课程里对 FTP 的考法通常集中在三个变形一是判断控制连接和数据连接分别使用什么端口二是判断主动模式下服务器端需要开放哪些端口三是给出一个故障现象让考生选择排查方向。对照文中的命令表和应答码表这三类题都可以直接定位。我自己的学习习惯是把这一套实验和书上的“文件传输协议”章节对照看。谢希仁《计算机网络》里对 FTP 的描述偏重原理自顶向下教材则更强调应用层与传输层的关系两者互补。如果时间有限优先做被动模式的抓包验证因为现代网络环境中绝大多数客户端默认使用被动模式这是面试和工作中最高频的场景。有一句话是我长期排障总结下来的FTP 的问题八成出在数据连接上而不是控制连接上。控制连接只要端口通、账号对基本就能建立而数据连接要面对 NAT、防火墙端口范围、模式选择等一堆变量。遇到任何 FTP 异常先判断故障发生在登录阶段还是传输阶段再决定查哪一个连接。这个思路会让你少走很多弯路。希望这份围绕文件传输协议的课程笔记复现指南能帮你把教材上的知识点变成可动手验证的实验也祝你在期末复习和日常排障中都能少踩几个坑。本文还有配套的精品资源点击获取