先来看看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.主动模式(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
二.NAT
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维护的映射表,可以连接到外网客户端。