一 简述
命令行协议是一种使用比较多的协议,其优点在于使用简单易于扩展性,同时也利于解析和使用。FTP,POP,SMTP等均采用命令行协议,其中FTP在早起互联网时期成为网络资源共享的主要方式,可见FTP协议之重要性。我想正是由于命令行协议的优势所以ss的默认协议就是它。
对于FTP的详细介绍这里可以参考:http://www.cnblogs.com/luoxn28/p/5585458.html,或者其他博文。不管什么博文还是来看代码最能理解其工作机制和原理。
另外FTP也常在计算机软件系统架构中担任文件服务器一职,提供文件上传下载服务,如图片
二 FTP服务器
2.1 功能需求
FTPServer作为服务器,首先应该提供用户管理功能,文件资源管理(类似于windows资源管理器),FTP命令以及文件传输,协议封装等主要职能
2.2 用户管理
这里可以连接windows系统用户也可以预定义相关用户并以配置文件或者其他方式存储,FTP有匿名和非匿名用户登录认证,这取决于FTP服务的安全性和共享性,对于匿名用户来说该用户是共享且开放的,对于非匿名用户可以通过权限来控制文件的访问与管理。
2.3 资源管理
文件资源管理类似于windows资源管理器,只是这里管理的对象是文件而已,所谓文件管理主要包括,查询,查看,创建,删除,修改,其中查询文件列表链接到递归知识。
2.4 FTP命令
SS已封装好命令基类,所以这里只需按照FTP协议的命令进行相应命令类定义
2.5 文件传输
FTP文件传输有主被动之分,所谓的主被动针对客户端来说,主动模式下,用户发送上传或者下载文件服务命令,同时在发送的命令参数中携带客户端主动打开的端口告诉给服务器,在服务器接收到该信息并尝试与该端口建立连接并传输文件流,反之亦然。FTP提供文件传输通道的建立与关闭。
2.6 协议封装
FTP命令均是字符串,且确定,所以SS采用字符串资源管理器来封装FTP命令,对于服务器来说直接使用相关字符串资源命令收发消息即可
三 通信过程
3.1 登陆
登陆过程:客户端会发送PASS命令,携带用户名密码等验证信息给服务端,当然这是针对非匿名的FTP,在接收到的参数中进行用户授权验证,将验证结果返回客户端;
3.2 执行命令
命令的执行贯穿整个客户端服务端会话周期,如LIST命令,ABORT等等。
3.3 文件传输
3.3.1 主动模式
首先客户端发起文件传输命令如下载,上传,PORT,STOR、命令,携带客户端主动打开的客户端断开默认为20端口,此断开默认在防火墙内部不被过滤掉,服务器收到该命令向客户端发送接收ok命令,且尝试向客户端地址和断开发起连接,建立二进制文件流传输通道,代码详看PORT命令和STOR命令
3.3.2 被动模式
首先还是客户端向服务器发起上传或者下载命令请求,服务端开启随机端口名发送给客户端,客户端与服务器建立数据传输通道,开启文件传输
DataConnection:数据连接通道类,该类主要负责传输通道维护工作,提供通道建立,文件传输,关闭等方法
3.3.3 通道关闭
通道关闭的原因有3:会话关闭,传输完成,传输异常,通道的关闭实为关闭Socket,当然这是在被动模式下由服务端开启的端口,这样也就起到回收的作用。
1 public virtual void Close() 2 { 3 StopListener(); 4 5 if (Client != null && !m_IsClosed) 6 { 7 try 8 { 9 Client.Shutdown(SocketShutdown.Both); 10 } 11 catch (Exception e) 12 { 13 m_Session.Logger.Error(e); 14 } 15 16 try 17 { 18 Client.Close(); 19 } 20 catch (Exception e) 21 { 22 m_Session.Logger.Error(e); 23 } 24 finally 25 { 26 Client = null; 27 m_Session = null; 28 m_IsClosed = true; 29 OnClose(); 30 } 31 } 32 }