FTP协议的粗浅学习--利用wireshark抓包分析相关tcp连接
一、为什么写这个
昨天遇到个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中就是回车、换行的意思。
六、一些参考资料
FTP协议的粗浅学习--利用wireshark抓包分析相关tcp连接的更多相关文章
- Wireshark抓包实例诊断TCP连接问题
		
转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese 介绍 前文论述了TCP基础知识,从本节开始,通过TCP抓包实例来诊断TCP常见问 ...
 - 利用tcpdump抓包工具监控TCP连接的三次握手和断开连接的四次挥手
		
TCP传输控制协议是面向连接的可靠的传输层协议,在进行数据传输之前,需要在传输数据的两端(客户端和服务器端)创建一个连接,这个连接由一对插口地址唯一标识,即是在IP报文首部的源IP地址.目的IP地址, ...
 - wireshark 抓包分析 TCPIP协议的握手
		
wireshark 抓包分析 TCPIP协议的握手 原网址:http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html 之前写过一篇 ...
 - wireshark抓包分析——TCP/IP协议
		
本文来自网易云社区 当我们需要跟踪网络有关的信息时,经常会说"抓包".这里抓包究竟是什么?抓到的包又能分析出什么?在本文中以TCP/IP协议为例,简单介绍TCP/IP协议以及如何通 ...
 - TCP\IP协议实践:wireshark抓包分析之链路层与网络层
		
目录 TCP\IP协议实践:wireshark抓包分析之链路层与网络层 从ping开始 链路层之以太网封装 ip首部 开启ping程序,开始抓包 由一个ping的结果引出来的两个协议ARP ICMP ...
 - Wireshark抓包分析/TCP/Http/Https及代理IP的识别
		
前言 坦白讲,没想好怎样的开头.辗转三年过去了.一切已经变化了许多,一切似乎从没有改变. 前段时间调研了一次代理相关的知识,简单整理一下分享之.如有错误,欢迎指正. 涉及 Proxy IP应用 原理/ ...
 - http2 技术整理 nginx 搭建 http2 wireshark 抓包分析 server push 服务端推送
		
使用 nginx 搭建一个 http2 的站点,准备所需: 1,域名 .com .net 均可(国内域名需要 icp 备案) 2,云主机一个,可以自由的安装配置软件的服务器 3,https 证书 ht ...
 - Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析
		
Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析 一.介绍计算机网络体系结构 1.计算机的网络体系结构 在抓包分析TCP建立链接之前首先了解下计算机的网络通信的模型,我相信学习过计 ...
 - 【计算机网络】wireshark抓包分析1
		
学习计算机网络很久了,但总是局限于书本知识,感觉get不到重点.经师兄建议用wireshark抓包分析看看. 我自己以前并没有做过抓包分析,所以这篇博文可能会有很多错误,只是我自己的一个记录,路过的亲 ...
 
随机推荐
- utf8   ucs4
			
这个问题不好回答,首先UTF-8编码只不过是一种Unicode的转换,兼容ASCII.所以,UTF-8编码支持的最大字符编码应该是Unicode支持的最大字符编码. 理论上,UTF-8编码可以支持最大 ...
 - appium的xpath定位问题及常用方法
			
关于类似的帖子好像很多,但是没有找到具体能帮我解决问题的办法.还是自己深究了好久才基本知道app上面的xpath定位和web上的不同点: 先放一个图: A,先说说不用xpath的场景,一般是用于存在i ...
 - 小程序navigator跳转路径url写法
			
小程序navigator跳转路径url要写 要跳转的的页面文件夹相对于当前页面的页面文件夹的位置,即相对路径. 比如我当前页面跳转到同级目录下的另一个页面如下: <navigator url= ...
 - js准确获取当前页面url网址信息
			
这篇文章主要为大家介绍了js准确获取当前页面url网址信息的多种方法,包括正则法.split拆分法等,需要的朋友可以参考下 在WEB开发中,时常会用到javascript来获取当前页面的url网址 ...
 - QT编译错误:member access into incomplete type 'QMouseEvent'
			
想在QT程序中使用鼠标事件,添加重载的响应函数,并实现后,一直提示 member access into incomplete type 'QMouseEvent' 既然使用了QMouseEvent类 ...
 - [原]unity3D bug记录
			
1.u3d 发出的xcode工程 崩溃出现这种信息 Display::DisplayLinkItem::dispatch() 到AppController.mm 修改成这样 - (void) Repa ...
 - TIMEOUT HANDLING WITH HTTPCLIENT
			
https://www.thomaslevesque.com/2018/02/25/better-timeout-handling-with-httpclient/ The problem If yo ...
 - Android和IOS开发学习路线
			
图片看上去太小,直接另存为吧 图片来自:http://www.finalshares.com/
 - android studio 使用 SVN
			
通过android studio来进行版本控制,先前已经安装了TortoiseSVN-1.9.2,但是在打开android studio的时候会出现 Can't use Subversion comm ...
 - Splash runjs() 方法
			
runjs() 方法可以执行 JavaScript 代码,它与 evaljs() 功能类似,但是更偏向于执行某些动作或声明某些方法 function main(splash, args) splash ...