网络协议分析(3):FTP

FTP是应用层的文件传输协议,用于在客户端和服务器之间可靠地传输文件。它有两种传输模式:主动模式和被动模式,其中被动模式更适合穿越防火墙。Python的ftplib模块提供了FTP客户端的功能,支持文件的上传和下载。然而,FTP协议存在安全性差、管控不足和不可靠等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件传输协议-FTP

FTP(File Transfer Protocol)是应用层的一个文件传输协议。其主要作用是在服务器和客户端之间实现文件的传输和共享。

FTP协议运行在TCP连接上,保证了文件传输的可靠性。默认情况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息。但是,是否使用20作为传输数据的端口与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定



前言

FTP控制连接在整个会话期间都保持打开,只用来发送连接/传送请求。当客户进程向服务器发送连接请求时,寻找连接服务器进程的熟知端口21,同时还要告诉服务器进程自己的另一个端口号码,用于建立数据传送连接。接着,服务器进程用自己传送数据的熟知端口20与客户进程所提供的端口号码建立数据传送连接,FTP使用了2个不同的端口号,所以数据连接和控制连接不会混乱。


提示:ftp的传输模式至关重要

一、传输模式

主动模式 (Port):

FTP客户端首先和FTP服务器的TCP21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP20端口连接至客户端的指定端口发送数据。FTPserver必须和客户端建立一个新的连接用来传送数据

FTP 的客户端只是告诉服务器自己的端口号,让服务器来连接客户端指定的端口。对于客户端的防火墙来说,这是从外部到内部的连接,可能会被阻塞。

被动模式 (Passive):

被动连接的核心是控制连接请求和数据连接请求都是由客户端发起

被动方式的步骤如下:

  • 客户端任意打开大于1024的两个本地端口(P1和P1+1)
  • P1端口发送请求连接服务器的21端口(控制连接端口)同时提交PASV命令。
  • 服务器收到请求后,会开启任意一个大于1024的端口P2
  • 客户端收到服务端返回的内容后,计算出服务端开放的数据连接端口
  • 客户端通过P1+1端口向服务端的发送连接请求。进行数据传输

FTP支持两种方式的传输:文本(ASCII)方式和二进制(Binary)方式。

通常文本文件的传输采用ASCII方式,而图象、声音文件等非文本文件采用二进制方式传输

FTP以ASCII方式作为默认的文件传输方式。

二、FTP协议流程模拟

FTP数据表示:

FTP协议规定了控制协议传送与存储的多种选择,在以下4个方面必须做出一个选择。

  • 文件类型:
    ASCII码文件(默认的)
    图像文件类型(二进制的)
    本地文件类型(用于在具有不同字节大小主机间传送二进制数据)
  • 格式控制:
    该选项针对ASCII类型文件适用,非打印(默认选择,文件中不包含垂直格式信息)
    远程登录格式控制
  • 结构:
    文件结构(默认选择,文件被认为是一个连续的字节流,不存在内部的文件结构)
    记录结构(用于文本文件)
  • 传输方式:
    流方式(模式选择,文件以字节流方式传输,对于文件结构,发方在文件尾提示关闭数据连接,对于记录结构,有专用的两字节序列码记录结束和文件结束)/
    块方式(文件以一系列块来传送,每块前面有一个或多个首部字节)/ 压缩方式

1.python

Python中默认安装的ftplib模块定义了FTP类,可用来实现简单的FTP客户端,用于上传或下载文件,函数列举如下:

from ftplib import FTP #加载ftp模块

#FTP登陆连接
ftp=FTP() #设置变量
ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
ftp.connect(“IP”,“port”) #连接的ftp sever和端口
ftp.login(“user”,“password”) #连接的用户名,密码
print(ftp.getwelcome()) #打印出欢迎信息
ftp.cmd(“xxx/xxx”) #进入远程目录
bufsize=1024 #设置的缓冲区大小
filename=“filename.txt” #需要下载的文件
file_handle=open(filename,“wb”).write #以写模式在本地打开文件
ftp.retrbinaly(“RETR filename.txt”,file_handle,bufsize) #接收服务器上文件并写入本地文件
ftp.set_debuglevel(0) #关闭调试模式
ftp.quit() #退出ftp

#FTP相关命令操作
ftp.cwd(pathname) #设置FTP当前操作的路径
ftp.dir() #显示目录下所有目录信息
ftp.nlst() #获取目录下的文件
ftp.mkd(pathname) #新建远程目录
ftp.pwd() #返回当前所在位置
ftp.rmd(dirname) #删除远程目录
ftp.delete(filename) #删除远程文件
ftp.rename(fromname, toname)#将fromname修改名称为toname。
ftp.storbinaly(“STOR filename.txt”,file_handel,bufsize) #上传目标文件
ftp.retrbinary(“RETR filename.txt”,file_handel,bufsize) #下载FTP文件

本来自己写了一段模拟ftp协议上传和下载功能的代码,但是感觉一般,所以就不嫌丑了,给大家推荐一下我当时学习FTP协议所看的博客,不但写的精炼简洁,而且还给出了深入了解FTP命令的文档链接,强烈推荐大家!!

大佬的博客(不想打扰大佬,所以没有转载)

2.FTP协议的弊端

  1. FTP安全性差:普通的FTP没有针对数据传输中或存储时的本地加密,也不加密发送的用户和密码
  2. FTP缺少足够的管控功能:不能保障发送的数据是否合规,数据流向不可控
  3. FTP不可靠:在传输过程中,尤其是传输大规模文件时,容易出现传输错误、文件丢失的情况。而且发送者无法确认收件人是否成功地收到或者下载文件,没有双方都没有任何的通知。
  4. FTP使用困难:要将文件发送到一个新的联系人,需要设置一个新的FTP。

总结

本篇粗略讲解了FTP的工作原理,传输模式,弊端,分享了一下python模拟FTP协议时可能用到的库和函数,并推荐了一篇大佬写的关于python模拟FTP协议的文章。本来还想用Golang模拟FTP协议,但是水平和时间都有限,没能成功~让友友们失望了
我将会在本专题结束后补上缺失的golang代码,敬请期待
最后,还望大家多多点赞,多多评论,多多分享,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值