FTP是客户端-服务器协议,客户端将请求文件,而本地或远程服务器将提供该文件。我们熟知的FTP客户端:WinSCP、WS FTP、FileZilla等都是使用文件传输协议,它是一种标准的Internet 协议。用于通过TCP / IP 连接在Internet上的计算机之间传输文件 。
文件传输协议如何工作?
FTP是客户端-服务器协议,它依赖于客户端和服务器之间的两个通信通道。一个用于控制对话的命令通道和一个用于传输文件内容的数据通道。客户端通过请求下载文件来启动与服务器的对话。
客户端可以使用FTP上传、下载、删除、重命名、移动和复制服务器上的文件。用户通常需要登录FTP服务器,而某些服务器无需输入ID或密码即可使部分或全部内容可用。我们称为匿名FTP。
FTP服务一般运行在20和21两个端口。端口20用于在客户端和服务器之间传输数据流,而端口21用于传输控制流。并且是命令通向ftp服务器的进口。
- 控制连接(TCP 21端口)主要用于实现FTP协议控制信令传送,服务器端打开TCP 21端口被动等待客户端发起连接命令。一旦建立连接,数据就会通过这些客户端和服务器端口进行传输。
- 数据连接(TCP 20端口)主要用于实现应用数据传送,服务器的数据连接端使用端口20。一旦建立连接,数据就会通过这些客户端和服务器端口进行传输。
FTP是否安全?
FTP不是一项安全的协议,并且具有许多安全漏洞,这跟历史定义有关,FTP最初是在1971年定义的,之前没有定义TCP和IP。而且,FTP不会对流量进行加密,个人可以通过(Wireshark)捕获数据包以读取用户名,密码和其他数据。
还有可能容易受到暴力攻击,数据包捕获,欺骗,FTP反弹和其他攻击。
常见的FTP命令和应答
- SYST命令
Response:服务器返回系统类型。
- LIST命令
.客户端开始发送LIST命令查询文件列表信息,服务器回复了相应文件信息,并开始准备从数据连接发送文件。
- RETR命令
RETR请求要求服务器通过客户端已经建立的数据连接发送文件的内容。
- TYPE命令
TYPE说明文件类型:A表示ASCLL,I表示图像。
FTP支持两种方式的传输:文本(ASCII)方式和二进制(Binary)方式。通常文本文件的传输采用ASCII方式,而图象、声音文件、加密和压缩文件等非文本文件采用二进制方式传输。
- USER和PASS命令
TCP三次握手建立成功后,服务器也知道了客户端需要请求FTP服务,于是要求客户端提供相应的用户名。
客户端收到服务器的验证需求后,立即发送用户名 user = ftp_test
服务器收到后,确认用户名OK,此时需要客户端提供password=12345
- QUIT命令
由客户端发起端开请求命令 QUIT,服务器收到请求后同意断开 向客户端发送goodbye。表示从服务器上注销。
- PORT命令
PORT请求要求服务器使用不同的机制来创建数据连接:服务器与客户端建立TCP连接。
PORT请求具有以下形式的参数:
h1,h2,h3,h4,p1,p2
这意味着客户端正 在侦听IP地址h1上TCP端口p1 * 256 + p2上的 连接 。h2。h3。h4。(RFC 959形式语法不允许这些数字中的任何一个都为0。形式语法是错误的。)
服务器通常接受代码为200的PORT。如果服务器正在侦听连接,它将停止并丢弃所有已建立的连接。
服务器不会立即连接到客户端的端口。客户端发送RETR并在服务器发送其初始标记后,服务器将尝试连接。如果连接尝试失败,它将拒绝代码为425的RETR请求。否则,它将正常进行。
出于安全原因,客户端永远不要使用PORT。但是,某些客户端仍然依赖PORT,如果拒绝PORT,则将放弃文件传输。我当前的建议是服务器继续支持PORT。
FTP协议解析
int main(int argc, char* argv[])
{
char errbuf[1024];
pcap_t *desc = 0;
char *filename = argv[1];
if (argc != 2)
{
printf("usage: ./dissect_ftp [pcap file]\n");
return -1;
}
return 0;
}
编译运行:
总结
使用FTP有以下优点:
- 它允许您传输多个文件和文件夹。
- 当连接断开时,它具有恢复传输的能力。
- 对要传输的文件大小没有限制。浏览器大概允许最大2 GB的传输。
- 许多FTP客户端(例如FileZilla)都可以进行传输。
- 数据传输比HTTP快。
使用FTP有以下缺点:
- FTP不会对流量进行加密
- 容易受到数据包捕获和其他攻击的攻击
参考:
- 《TCP/IP协议详解》
- http://cr.yp.to/ftp/retr.html
欢迎关注微信公众号【程序猿编码】,需要完整FTP源码和报文的添加本人微信号(17865354792)