ftp服务器基础

先来看看tcp/ip协议栈:http://blog.csdn.net/linux_ever/article/details/51136723

class1

一.ftp基础

FTP支持有限数量的文件类型(ASCII,二进制)和文件结构(字节流)。

与telnet对比,在两端使用同一个标准:7比特的ASCII。

FTP命令通过控制连接交互;而当文件在客户和服务器之间传输时,就创建一个数据连接。如下图:

图1



FTP的两端提供了控制文件传送和存储的多种选择,4个方面必须在传输前确定:

1.文件类型:

1)ASCII,2)二进制

区别1:最高位

物理:一系列比特位组成

逻辑:ascii:ascii码字符构成,7个比特位,最高位是0     ;    而二进制最高位可能是1

 区别2: \r\n的解析,换行符

windows   \r\n

linux   \n

mac   \r

2.格式控制:

1)非打印 2)远程登录格式控制

3.结构:(结构影响传输方式)

1)文件结构(默认,连续字节流)   2)记录结构(只用于文本文件)

4.传输方式:

1)流(默认。文件以字节流传输)  2)块方式


通常的选择是:

文件类型:ASCII;  格式:非打印;  结构:文件结构;  传输方式:流


二. 使用vsftpd

linux下使用vsftpd服务器

1.查看vsftpd是否开启:ps -ef |grep vsftpd,若开启着,先使用命令service vstfpd stop关闭vsftpd

2.配置vsftpd: /etc/vsftpd.conf    

首先打开write_enable=YES(上传文件),接着打开ascii_upload_enable=YES和ascii_unload_enable=YES(默认关闭),

若不打开,用ascii和二进制上传文件没有区别,默认不使用ascii方式传输文件。

3.开启vsftpd:service vsftpd start(或者/etc.init.d/vsftpd start)


三.使用leapftp登录ftp

1.站点-》站点管理器-》添加站点:填写IP地址,端口21,用户,密码

2.构造一个带换行符的数据,有\r\n(0x0d,0x0a),用ASCII方式从windows传输到linux,

会将\r\n转换为\n,从linux到window,会将\n转换为\r\n。而如果以二进制传输,\r\n不会转换为\n

总结:以二进制方式传输,不做任何解析,而ASCII会将/r/n转换为/n

注:linux下以16进制查看文件:od -c test.txt


四. ftp工作原理

如上图1:

1.通过ftp命令通过控制连接,发送给ftp服务器,端口21,建立连接

(如用户发送,服务器接收到数据,验证密码是否正确,并返回给用户登录是否成功)

2.通过控制连接发送,传输命令,当服务器收到该命令时,建立一个数据连接用于传输文件。

3.上传;从本地文件系统读取数据,并发送到服务器,写入文件系统;下载,则相反

注1:当文件传输完毕,数据连接关闭,而当close时,控制连接才会断开。

注2:控制连接必须有客户端发送命令去建立连接;而数据连接有主动和被动之分(class2会对这两种工作模式进行对比)。


五.FTP对应命令和对应应答


class2:

一.FTP两种工作模式:(针对数据连接,例如:目录列表的传输,或者文件传输)

1.为什么要有主被动:
NAT或防火墙对主被动模式的影响

2.主动和被动都是由客户端发送的命令PORT和PASV决定的,所以在客户端可以配置主动或被动数据连接

1.主动模式(PORT模式)

数据连接阶段由服务器主动发起连接

    AA是客户端端口号,21是服务器端口号,首先建立控制连接

数据连接建立:1.首先PORT告知服务器,自己的数据连接通道的端口BB,

2.接着由服务器端口20向客户端BB发送一个数据连接请求,即虚线部分,此时数据连接建立,

3.当数据传输结束时,关闭该数据连接(20到BB),但三次握手的控制连接并不关闭(21到AA)


一个数据连接建立与关闭的实例:leapftp在与ftp服务器建立连接后,右键刷新

从图中可知:数据连接过程为:

1.客户端首先向服务器发送一个PORT命令,并包含直接的ip和数据连接端口号(客户端口号:106*256+32);

    客户端创建数据套接字|绑定临时端口号(bind(0))|客户端监听

    上述步骤用api表示为:socket|bind(0)|listen


2.然后服务器应答200,表示已经准备ok;

    服务器将客户端的ip和端口存储起来


3.紧接着客户端发送一个LIST命令

    服务器在收到LIST之后,先检查是否接收过PORT或PASV命令,如果没有,则服务器响应425 先发送PORT或PASV;否则

服务器蒋健数据套接字(bind(20)),调用connect主动连接客户端IP和端口。


4.服务器应答150,表示建立数据连接


5.传输目录数据,


6.服务器应答226,表示数据传输结束

    完成后服务器主动断开本次数据连接








2.被动模式(PASV)

客户端主动connect

客户端发起连接
1.客户端发送PASV

2.服务器应答自己的端口
服务器创建套接字 | 服务器绑定临时端口 | 服务器监听 | 将自己的IP和端口发送给客户端

3.客户端发送LIST
服务器检查,若之前接收到PASV
调用accept被动接受客户端的连接

4.服务器发送150,表示可以传输

5.开始传输目录

6.服务器发送226给客户端
客户端主动关闭数据套接字




二.NAT

网络地址转换,将局域网IP地址转换为公网IP,解决公网IP地址不足的问题。
如下图:本地主机要访问外网时,需要NAT将内网IP地址进行转换为公网IP,
129.168.1.100 :5678-》120.35.3.193 :5678,通过转换后的IP和端口与50.118.99.200服务器进行连接



NAT的特性:从内到外可以建立连接,但是从外到内不可能。

NAT会维护内外129.168.1.100 :5678-》公网120.35.3.193 :5678的映射条目,反向不维护

因为从内到外时,NAT将本地IP:A转换为公网IP:B,去跟公网IP:C建立连接;

而从外到内时,C去连接B,但是其实是A处于监听状态,故不能建立连接。


情况1:FTP客户端处于NAT之后的主动模式(数据连接不一定成功),如下图:

通过上面NAT的讲解,当FTP处于主动模式时,需要通过NAT服务器先将本地IP192.168.1.100 :5678

转换为公网IP地址和端口120.35.3.193 :5678,当服务器主动connect建立数据连接时,实际上是与120.35.3.193建立连接,

192.168.1.100的主机上的客户端在进行监听,而120.35.3.193并没有进行监听,这样就会导致数据连接失败。

(NAT之后,从外到内会失败,原因见上面解释)

要先成功需要将120的NAT服务器端口,手动映射到本地主机192的监听端口上。

注:很多情况下,ftp连接成功(控制连接成功),但是目录刷新不出来就很可能是防火墙的问题(数据连接失败)



情况2:FTP客户端处于NAT之后的被动模式(数据连接成功)

FTP客户端被动发送,即客户端connect,去主动连接服务器(NAT内到外),故可以建立数据连接。


情况3:FTP服务器处于NAT之后的被动模式(失败)(NAT外到内,没有映射条目)

控制连接建立成功(客户端跟NAT服务器建立连接),需要将NAT服务器端口映射至FTP的21端口

数据连接时,客户端发送connect去主动向NAT服务器建立连接,由于FTP服务器的xx端口在进行监听,而NAT服务器没有进行监听,

故数据连接会失败,要想成功需要手动将NAT端口映射到FTP端口xx。



情况4:FTP服务器处于NAT之后的主动模式(成功)

因为FTP服务器主动conncet,通过NAT维护的映射表,可以连接到外网客户端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值