您的位置:首页 > 编程语言 > PHP开发

FTP交互流程与开发思考

2018-02-08 11:47 176 查看
分析的是被动模式。
打开8uftp,用wireshark抓包如下(图1):



根据卷1的第27章,
FTP客户和服务器有两个独立的连接:控制连接和数据连接
(1)控制连接由命令和应答构成。命令和应答成对出现。命令由3或4个字节的大写ASCII字符构成。应答由ASCII形式的3个数字构成,并根有报文选项。软件系统根据数字来决定如何应答,而报文选项时给人看的。
一些典型的应答,如下:



----------------------------------------------





这个卷1可能太久远了。只讲解了PORT模式,没有讲解被动模式。

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

这篇文章我觉得写得不错粘贴出来,http://blog.csdn.net/longyc2010/article/details/43113173,写到:
“为了解决服务器发起到客户的连接问题,有了另一种FTP连接方式,即被动方式。命令连接和数据连接都由客户端发起,这样就解决了从服务器到客户端的数据端口的连接被防火墙过滤的问题。被动模式下,当开启一个FTP连接时,客户端打开两个任意的本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,提交PASV命令。然后服务器会开启一个任意的端口(P > 1024),返回如227 entering passive mode (h1,h2,h3,h4,p1,p2)。它返回了227开头的信息,在括号中有以逗号隔开的六个数字,前四个指服务器的地址,最后两个,将倒数第二个乘 256再加上最后一个数字,这就是FTP服务器开放的用来进行数据传输的端口。
如得到227 entering passive mode(h1,h2,h3,h4,p1,p2),那么端口号是p1*256+p2,ip地址为h1.h2.h3.h4。这意味着在服务器上有一个端口被开放。客户端收到命令取得端口号之后,会通过N+1号端口连接服 务器的端口P,然后在两个端口之间进行数据传输。”
博主推测一下这段话的意思:
客户端的两个端口N和N+1分别用来控制连接和数据连接。
服务器的两个端口21和P分别用来控制连接和数据连接。
先看一下命令PASV,如下:



再看一下应答227,如下:



有了上面的知识储备,基本就能看懂图1了。不过LIST指令感觉有点复杂。因为上文提到连接管理的第3条就是目录列表。因此LIST需要打开数据连接,就需要三次握手和四次挥手。

图1的NO17和NO19是控制连接。NO17是命令,NO19是应答。
NO18.20.21是打开数据连接的三次握手。
根据http://blog.csdn.net/yanxi252515237/article/details/51955675得知“
NO25.26.27.28是四次挥手。
NO22看了一下里面,应该是目录的名字权限日期等信息。
NO23和NO24看起来是从控制和连接两个角度对NO22做出回应(这个是估计的,因为我现在对seq、ACK理解的还是糊涂状态)。
============================================================
然后把seq和ACK的绝对数值贴出来如下:





既然对SEQ和ACK不大懂,那么就了解一下,根据酷壳文章:

Sequence Number是包的序号,用来解决网络包乱序(reordering)问题。
Acknowledgement Number就是ACK——用于确认收到,用来解决不丢包的问题
SeqNum的增加是和传输的字节数相关的。

TCP重传机制

TCP要保证所有的数据包都可以到达,所以,必需要有重传机制。注意,接收端给发送端的Ack确认只会确认最后一个连续的包,比如,发送端发了1,2,3,4,5一共五份数据,接收端收到了1,2,于是回ack 3,然后收到了4(注意此时3没收到),此时的TCP会怎么办?我们要知道,因为正如前面所说的,SeqNum和Ack是以字节数为单位,所以ack的时候,不能跳着确认,只能确认最大的连续收到的包,不然,发送端就以为之前的都收到了。
看了上面这几段话,再把这个图复制一遍,如下:



可以看出有两个连接
Client<------->Server
7684<-------->21
7685<-------->4099
而seq和ack是针对单个连接来说的。
就拿7685<-------->4099这个连接来说吧,从图中单独提取出来,如下图:



仔仔细细看看上图,
这是个数据连接,其中
1、2、3是握手,由Client发起
4是传送目录列表,方向:Client<----Server 
5是确认,方向:Client---->Server 
6、7、8、9是挥手,由Server发起

嗯。到这里了,感觉SEQ和ACK的值还是没太弄明白,再贴个图:



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

FTP开发思考:分而治之。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: