以实际抓包来分析ftp协议,加深理解。
环境:
win7电脑+linux设备,linux设备为ftp服务端,win7电脑通过WinSCP的ftp主动方式(我得版本winscp默认是被动方式,需要从高级选项修改)来连接ftp服务端。
过程:
电脑(192.168.3.206)与设备建立ftp(192.168.3.100)连接,然后电脑向设备传输一个2084字节的文件。然后电脑主动关闭连接。
设备上进行抓包,只抓取tcp port 20和21的报文。
实际抓包报文如下(一个一个包来分析):
第1-3包为tcp的三次握手,服务端端口21,即ftp控制连接建立;
第4包为服务端应答客户端报文,220:服务就绪,附加参数为服务端ftp版本号;
第5包客户端发送请求认证用户名,命令USER,参数实际用户名;
第6包为服务端tcp ack回应包;
第7包为服务端对客户端USER命令的应答,331:要求密码;
第8包客户端像服务端传送密码,命令PASS,后跟明文密码;
第9包为服务端tcp ack回应包;
第10包为服务端对客户端PASS命令的应答,230:登录成功;
第11包为客户端像服务端请求系统版本,命令SYST;
第12包为服务端tcp ack回应包;
第13包为服务端对客户端SYST命令的应答,215:系统名;
第14包为客户端向服务端请求服务端采用的特性列表,命令FEAT;
第15包为服务端对客户端命令FEAT的应答,211:系统状态回复;
第16-24包为服务端应答回复;
第25、26包为客户端tcp ack包;
第27-38包为客户端指定UTF8格式、获取服务器目录并切换命令及服务端的应答,不再赘述;
第39包为客户端向服务端请求LIST命令;
第40-42为服务端与客户端的数据连接建立(注意:是服务端发起的连接请求),服务端端口为20,连接的客户端端口为192*256+13(根据第37包客户端PORT给服务端的端口,计算公式为256*倒数第二位+倒数第一位)
第43-44包为服务端开始向客户端发送文件列表,注意只有实际列表传送走的数据连接,即第44包,第43包还是控制连接;
第45-47包为tcp 四次挥手包(剩余两个挥手包为第49、50包),从这可以看出文件列表传送完毕,数据连接立马关闭;
第52-68包又是一次客户端获取服务端列表的通信过程,可以看到又经历了一次建立数据连接并关闭的过程,不在赘述;
第68-89包为客户端向服务端传送文件的过程,先是确定为二进制模式,传输文件为sysctl.conf文件,然后建立数据连接进行传输,实际传送数据大小为2084字节,然后关闭数据连接;
第86包服务端应答传输完成;
第88包客户端向服务端传入文件的修改时间,这里不清楚为啥是20171115,明明是2018年;
第89包服务端应答客户端文件时间已修改;
第90-106包又是一次文件列表的获取过程,不再赘述;
第107-109为客户端主动断开与服务端的ftp连接的四次挥手包(闹么为啥只抓到三个包。。。);
四次挥手注意的是,因为数据连接采用的是服务端主动连接的,而控制连接为客户端主动连接的,屡一下,ftp客户端与服务端是针对控制连接而言的。数据连接主动模式下,实际是服务端充当客户端,不讲了有点乱,睡觉~~~