文件传输协议File Transfer Protocol,缩写:FTP FTP服务器使用21号端口来监听连接,客户端用随机端口来发送和接收数据,21端口用来建立信令通道,20端口用来建立数据通道(被动模式PASV用不上20端口)。 客户端使用两种模式来和服务器通信:被动模式,主动模式。现在许多设备默认采用被动模式。 (使用FTP数据都是以明文方式传输的,用户名,密码也能直接看到。也有很多加密信道的高级协议,例如SFTP,SSH File Transfer Protocol的缩写,安全文件传送协议。)

被动模式下抓包 解析: 被动模式中控制连接和被动连接都是由客户端主动发起。 (No.1)客户端使用随机端口65068主动向服务器的21端口发送TCP请求(No.1,2,3)控制通道TCP连接建立。 (No.4--10)服务器会发给客户端一条标语,同时让客户端输入用户名,密码,交互后发送一条用户已登录标语。 (No11--13)登录成功后客户端会自动发送PWD命令查询当前所处的绝对路径,服务器回应在根目录。客户端每60秒自动执行一次PWD 注:以上主动模式和被动模式都相同。

例如每次客户端执行dir,都需要服务器使用数据连接回复给客户端结果的时候。会先触发客户端向服务器发送PASV命令(No.14),现在基本默认都是被动模式。(设置binary和ASCII传输模式时,并不会触发主,被模式协商,因为修改传输模式是使用控制通道完成的)。(No.14,15)是默认的PASV模式。客户端发送PASA命令给服务器,服务器回应给客户端连接我随机生成的这个50799端口。 有点拗口,是客户端先输入dir,get,put等需要建立数据通道的命令,来触发客户端向服务器发送pasv命令(No.14),等数据通道TCP建立完成之后,客户端才会把(No.19)dir,get,put等命令通过控制通道发送给服务器。 注:本地默认passive打开,在敲一下passive,就关闭了。这时候会使用port主模式建立数据通道。开关passive模式并不会触发服务器和客户端之间的报文交互,只是打开关闭本地passive模式。

(No.16--18)客户端主动向服务器发起数据TCP连接,建立数据通道。 (No.19--29)客户端发送dir查看目录,服务器返回结果(这里wireshark自动把dir解析成了list)。

客户端先执行的dir命令,才触发的(No.14--18)主动模式的协商,数据通道建立完成之后,客户端再把dir(No.19)命令发送给服务器,服务器发回显信息(No.20)125 ASCII mode data connection already open, transfer starting for *.给客户端。(默认是ASCII传输模式,可以手动改成BINARY)

(No.21-25)使用数据通道传输数据 (No.21,22)里面的数据就是客户端执行dir,服务器返回的结果,\r是回车Carriage Return,\n是换行newline

(No.26)客户端使用控制通道回复给服务器ack(No.26的ack229是No.20的Seq:158+Len:71)。(No.27)服务器发送标语226 Transfer complete.给客户端,告诉客户端传输完成,关闭数据通道。(No.28)客户端回复给服务器Ack。传输通道每传输完一次数据,都会关闭。需要再次传输数据的时候,服务器和客户端会使用新的随机端口号,来建立数据通道。过程和(No.14--28)一样。 (No.29-34)每隔9秒,服务器使用控制通道向客户发送一次keep-alive保持控制通道的TCP连接。客户端回应ack。 (No.35)客户端向服务器发送quit命令,(No.36)服务器回应客户端221 Server closing.标语,告诉客户端,service closing control connection。(No.37)释放连接。

========================================================

主动模式的数据通道建立: 被动模式的数据通道建立: 主动模式和被动模式的区别: 主动模式和被动模式建立控制通道相同,维护控制通道,拆除控制通道也相同。只有数据通道的建立不同。主动模式建立数据通道是客户端把随机端口发给服务器,由服务器来发起TCP连接。被动模式建立数据通道是服务器把随机端口发给客户端,由客户端来发起TCP连接。 主动模式--1.客户端把自己随机产生的端口号通过控制通道发送给服务器。2.服务器回复确认。3.客户端把dir,get,put等命令发送给服务器。4.服务器用自己的20号端口和客户端发来的随机端口,建立数据通道。 被动模式--1.客户端用控制通道发送PASV命令告诉服务器,我用被动模式。2.服务器用控制通道把自己的随机端口号发给客户端。3.客户端自己又产生一个新的随机端口号来和服务器发来的这个随机端口号进行TCP数据通道的建立。4.数据通道建立完成之后才把LIST命令发送给服务器。