FTP协议的粗浅学习--利用wireshark抓包分析相关tcp连接
FTP相关文章:
Linux上的ftp服务器 vsftpd 之配置满天飞--设置匿名用户访问(不弹出用户名密码框)以及其他用户可正常上传
一、为什么写这个
昨天遇到个ftp相关的问题,关于ftp匿名访问的。花费了大量的脑细胞后,终于搞定了服务端的配置,现在客户端可以像下图一样,直接在浏览器输入url,即可直接访问。
期间不会弹出输入用户名密码来登录的窗口。
今天我主要是有点好奇,在此过程中,究竟是否是用匿名账户“anonymous”该账户登录了,还是根本不需要登录呢?
于是用wireshark抓包了一下。
二、抓包过程
我这边直接用了捕获过滤器抓本机和ftp之间的包。抓包后直接ctrl+F进行文本查找。
果然发现是发送了USER anonymous命令的。
三、ftp的基础知识
来源于:https://blog.csdn.net/iloli/article/details/5805262
FTP是File Transfer Protocol(文件传输协议)的缩写,用来在两台计算机之间互相传送文件。相比于HTTP,FTP协议要复杂得多。复杂的原因,是因为FTP协议要用到两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令;另一个是数据链路,用来上传或下载数据。
FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。
PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。
PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。
总结来说,主动模式时,由客户端提供数据传输端口。。被动时,由服务器端提供数据传输的端口。
四、ftp基础的几个命令进行抓包分析
1、操作记录
在windows的cmd里面,一般默认就是有ftp命令的。
操作步骤很简单,只是匿名用户登录,查看目录下文件,然后退出登录。
2、抓包分析
2.1建立连接
前面几个抓包为建立连接。
然后是服务端发回的响应:(请求的包没看到,不知道是不是对应我上面的ftp 10.10.20.2操作)
2.2登录操作:
然后是登录成功的响应:
2.3 ls命令请求包
接下来是ls命令触发的一个包:
该包主要是客户端向服务端发起的一个请求。
当 PORT 命令被提交时,它指定了客户端(10.15.4.46)上的一个端口而不是服务器的。
该端口号的计算规则就是:211*256 + 220 = 54236,211与220也就是下面红框标识出来的数字的最后两位.
下面是服务器端的响应,表示连接已建立。再下面一条是客户端发送的ls命令,查看目录下的文档。
2.4 服务端建立单独连接来发送ls的返回数据
再下来是服务端要返回数据了,于是主动向客户端的54236端口请求建立tcp连接。(就是上面计算出来的那个)
见下图,这期间,夹杂了原有的21端口与客户端的连接的响应消息。
2.5 ls的数据传输及连接断开
连接断开分了两部分,一部分是ftp层面的。一部分是tcp层面的连接断开。
其中tcp连接断开由服务器端发起。
五、个人一点感悟
以前面试腾讯时,被问过tcp粘包相关的问题。问到说ftp是怎么解决粘包的。
当时没答上来。后来才知,ftp的每个包都在包的结尾用了\r\n进行标识。
如下:
其中的0d、0a在asicc中就是回车、换行的意思。