FTP工作过程的抓包分析
其实这个是我在写C#FTP编程时,总感觉写的时候模棱两可的,就姑且抓包看看,到底什么情况。
第一次使用抓包工具,暂且做简单的分析吧
我在本机登陆ftp,输入用户名,密码进行登录。对该过程,使用 CommView获得抓包数据如下。(点击图片查看大图)
看来整个过程还是比较复杂的,进行了这么多次通信。那么就逐条来看吧
第一条,下边是给出的数据包数据分析,这次连接应该是由客户端发出的,一次TCp请求,外层先经过了MAC层的包封装,然后IP层封装,TCP层封装。各个层中包含不同的数据,这里就不细说了。不过发现,点这个树状数据时,左边的二进制数据有对应的高亮显示,挺好。
第二条,看来是从服务器端传来的信息,。想到了TCP的连接不是三次握手么,这应该就是第二次握手了。那么第三条数据就毫无疑问就是客户端高速服务器端已经建立好了连接,可以传送数据了。
第三条,依然是三层封装
客户端应该已经将发起了的3716端口与服务器端的21的控制连接。
第四条
从图上看出来,这是从服务器端发送过来的,右边的树状数据分析栏 也有了基于FTP层协议数据的封装(大概是这么说吧。。。)。从状态号220看出,这次通信是说,服务器端高速客户端,对新用户的服务已经建立完毕了。而且还给出了服务器端的服务类型。
客户端的3716端口与服务器端的21端口连接建立成功。
第五条
大家可能看到,端口编程了3716 原来是3715,应该是因为我进行了两次操作?因为从数据包上看,3716端口也进行了以上的四次通信,那么就从3716这分析(3715数据包没有3716的全。。。)。
这一条可以看出来是客户端向服务器端发送了USER命令,这个命令是高速服务器,我要发送用户名了。书上说这是机那里控制连接后发出的第一个命令。如果以后要改变登录的用户,会重新发送该命令,原来设置的参数不会改变。命令后边紧跟着我输入的ftp用户名称。
第六条
这一条是服务器端发送来的,响应码为331,可知,服务端告诉客户端用户名正确,需要口令。从这里可以看出,当焦点离开用户名输入框时,客户端已经于服务器端建立了一次通信。那么,此时就能够判断该用户是否合法。响应码后边直接跟着该响应码所表达的意义(我原来以为相应码表示的意义并不传送)。
第九条
这条是客户端向服务器端发送PASS命令,后边紧跟着传送密码(居然是明码,汗。。。。。)那么服务端肯定会根据前后传送的用户名和密码,进行验证。
第十条
响应码230,说明用户凭据有效,登录成功。
第十一条,第十二条
客户端发送了一个opt命令,结果服务器端告诉客户端,该命令不识别。不知道这是什么情况。。。
第十二条,十三
客户端发出sys命令,因该是询问操作系统类型,书上说是询问名字系统类型。。。服务器反馈Windows_NT。
第十四,十五
客户端发送site命令,服务器端反馈一大堆信息,从comment上看,是帮助信息。
第十六,十七
客户端端发送命令 PWD,服务器端反馈257(书上解释:创建PATHNAME。。。)comment上写着“/”is curent directory 说明的是根目录。
第18,19
客户端发送TYPE命令,Represention type写着A,服务器端 返回200 Type set to A. A指的是Ascall编码模式。可以使用tye命令实现ASCALL和二进制模式之间的变换。
第20,21
客户端发送命令PASV,服务器端响应为227.表示进入被动模式。
服务端收到该命令后会开一个新的端口P进行监听,同时将该端口告诉客户端。客户端收到响应后,通过新的端口3617与P建立连接,进行文件传输。该3717会告诉服务端。
关于被动模式与主动模式书上这么解释来着。
客户端与服务器建立控制连接后,要告诉服务器采用哪种文件传输模式。FTP提供了两种传输模式,一种是Port(主动模式),一种是Passive被动模式。这个主被动指的是服务器端。
主动,是指服务器端主动向客户端发起数据连接请求,那么此时服务器端要用自己的一个固有端口一般是20去监听客户端。整个过程是这样的,客户端在最初 会用一个端口3716向服务器端的21发起控制连接请求(应该是在握手后中确定的吧),连接成功后,在发送port 3716+1,告诉服务服务器端坚定3717,那么服务器端就会用数据端口,一般是20与3717建立连接(这就是主动进行数据连接)。服务器端利用自己的20与客户端 3717来文件的数据传送通信,利用21和客户端最初的端口3616进行用户验证和管理。
而被动模式,是服务器端被动的接受客户端的数据连接请求,这个端口号是由客户端告知服务器端的,在本地随机生成(1025-65535)。
那么现在的情况就是,客户端已经告诉服务端进入被动模式了,客户端应该启动新端口,建立数据连接了。
第22,23,24
可以看出3717应该就是数据连接了。不过,暂时还不知道,客户端如何利用 该端口与服务端P建立连接的,这个内容封装在 哪里边??
25
客户端发出list命令,告知服务端列出路径下目录和文件。
26,27
接下来有两次数据端口的通信,此时都没有ftp数据信息,传送的数据信息应该在tcp数据段中。可如何转给3617呢??
28
服务端告知,数据开始传送。
29,30,31
接下来有三次数据端口的通信,两次是由客户端发出的,一次是服务端返回的信息。
32,33
客户端控制端口与服务端控制端口通信,服务端返回,数据传输完毕。
这就是整个过程。
不清楚的是如何才能看到中间数据端口通信时的数据呢??