从TCP/IP模型全面认识FTP

来源:互联网 发布:mac air可以玩dnf吗 编辑:程序博客网 时间:2024/05/20 22:30

从TCP/IP模型全面认识FTP

 

TCP模型的第四层上,即应用层,使用TCP传输而不是UDP,FTP连接是可靠的,而且是面向连接,为数据的传输提供了可靠 的保证。

  FTP工作模式与客户/服务器模式相似。与大多数的其他TCP应用不相同的是,FTP在客户与服务器之间使用两个个TCP连接―――控制连接和数据连接,控制连接在客户与服务器交互的整个过程中一直存在,而数据连接只在有文件或目录传输的时候才被创建,用完了后就被关闭了。控制连接用于发送指令给服务器以及等待服务器响应;数据连接是用来建立数据传输通道的。

  2.FTP的两种连接模式―――Port模式和Passive模式

  根据是使用Port模式还是Passive模式,FTP使用不同的TCP端口号。

  2.1 FTP Port模式

  Port模式的FTP步骤如下:

  1、 客户端发送一个TCP SYN(TCP同步)包给服务器段众所周知的FTP控制端口21,客户端使用暂时的端口作为它的源端口;

  2、 服务器端发送SYN ACK(同步确认)包给客户端,源端口为21,目的端口为客户端上使用的暂时端口;

  3、 客户端发送一个ACK(确认)包;客户端使用这个连接来发送FTP命令,服务器端使用这个连接来发送FTP应答;

  4、 当用户请求一个列表(List)请求或者发起一个要求发送或者接受文件的请求,客户端软件使用PORT命令,这个命令包含了一个暂时的端口,客户端希望服 务器在打开一个数据连接时候使用这个暂时端口;PORT命令也包含了一个IP地址,这个IP地址通常是客户自己的IP地址,而且FTP也支持第三方 (third-party)模式,第三方模式是客户端告诉服务器端打开与另台主机的连接;

  5、 服务器端发送一个SYN包给客户端的暂时端口,源端口为20,暂时端口为客户端在PORT命令中发送给服务器端的暂时端口号;

  6、 客户端以源端口为暂时端口,目的端口为20发送一个SYN ACK包;

  7、 服务器端发送一个ACK包;

  8、 发送数据的主机以这个连接来发送数据,数据以TCP段(注:segment,第4层的PDU)形式发送(一些命令,如STOR表示客户端要发送数据,RETR表示服务器端发送数据),这些TCP段都需要对方进行ACK确认(注:因为TCP协议是一个面向连接的协议);

  9、 当数据传输完成以后,发送数据的主机以一个FIN命令来结束数据连接,这个FIN命令需要另一台主机以ACK确认,另一台主机也发送一个FIN命令,这个FIN命令同样需要发送数据的主机以ACK确认;

  10、 客户端结束后,客户端以FIN命令来关闭一个控制连接,服务器端以ACK包来确认客户端的FIN,服务器同样也发送它的FIN,客户端用ACK来确认。

  下面是FTP PORT模式前几步步骤:

以下是引用片段:
  /==================================/
  | |
  | [ ftp Client ] [ ftp Server ] |
  | |
  | (TCP:21 连接初始化,控制端口) |
  | SYN |
  | Port xxxx ----------------------> Port 21 [TCP] |
  | SYN+ACK |
  | Port xxxx <---------------------- Port 21 |
  | ACK |
  | Port xxxx ----------------------> Port 21 |
  | |
  | (控制操作: 用户列目录或传输文件) |
  | |
  | Port, IP, Port yyyy |
  | Port xxxx --------------------à Port 21 |
  | Port Seccussful |
  | Port xxxx <---------------------- Port 21 |
  | List, Retr or Stor |
  | Port xxxx ----------------------> Port 21 |
  | |
  | |
  | (TCP:20 连接初始化,数据端口) |
  | SYN |
  | Port yyyy <---------------------- Port 20 |
  | SYN+ACK |
  | Port yyyy ----------------------> Port 20 |
  | ACK |
  | Port yyyy <---------------------- Port 20 |
  | |
  | |
  | (数据操作: 数据传输) |
  | Data + ACK |
  | Port yyyy <---------------------> Port 20 |
  | . |
  | . |
  | . |
  | |
  /==================================/

 

FTP Port模式会给网络管理人员在许多方面带来很多问题,首先,在PORT命令消息中的IP地址和端口号的编码不是直白地显示。另外,应用层的协议命令理论 上不应该包含网络地址信息(注:IP地址),因为这打破了协议层的原则并且可能导致协同性和安全性方面的问题。

  下图解码了PORT命令的地址参数,地址参数后是端口号,见PORT  192,168,10,232,6,127;6,127部分的第一个阿拉伯数字乘以256,然后加上第2个阿拉伯数字就得到端口号,所以客户端指定了端口号为6*256+127=1663。

以下是引用片段:
  /========================================================/
  | IP Header - Internet Protocol Datagram |
  | Version: 4 |
  | Header Length: 20 bytes |
  | |
  | ............... |
  | |
  | Time To Live: 128 |
  | Protocol: 6 TCP - Transmission Control Protocol |
  | Header Checksum: 0xAA36 |
  | Source IP Address: 192.168.0.1 DEMO |
  | Dest. IP Address: 192.168.0.3 VI |
  | No IP Options |
  | |
  | TCP - Transport Control Protocol |
  | Source Port: 2342 manage-exec |
  | Destination Port: 21 ftp |
  | Sequence Number: 2435440100 |
  | Ack Number: 9822605 |
  | Offset: 20 bytes|
  | Reserved: %000000 |
  | Flags: %011000 |
  | 0. .... (No Urgent pointer) |
  | .1 .... Ack |
  | .. 1... Push |
  | .. .0.. (No Reset) |
  | .. ..0. (No SYN) |
  | .. ...0 (No FIN) |
  | |
  | Window: 65150 |
  | Checksum: 0x832A |
  | Urgent Pointer: 0 |
  | No TCP Options |
  | |
  | FTP Control - File Transfer Protocol |
  | Line 1: PORT 192,168,0,1,9,39 |
  | |
  | FCS - Frame Check Sequence |
  | FCS (Calculated): 0xF4C04A4F |
  /==================================================/  下面验证了服务器端的确从端口20打开到端口1663的TCP连接:

以下是引用片段:
  /===================================================/
  | TCP - Transport Control Protocol |
  | Source Port: 20 ftp-data |
  | Destination Port: 1663 |
  | Sequence Number: 2578824336 |
  | Ack Number: 0 |
  | Offset: 6 (24 bytes) |
  | Reserved: %000000 |
  | Flags: %000010 |
  | 0. .... (No Urgent pointer) |
  | .0 .... (No Ack) |
  | .. 0... (No Push) |
  | .. .0.. (No Reset) |
  | .. ..1. SYN |
  | .. ...0 (No FIN) |
  | |
  | Window: 3731 |
  | Checksum: 0x8A4C |
  | Urgent Pointer: 0 |
  | No TCP Options |
  | |
  | TCP Options |
  | Options Type: 2 Maxinum Segment Size |
  | Length: 4 |
  | MSS: 1460 |
  | |
  | FCS - Frame Check Sequence |
  | FCS (Calculated): 0x5A1BD023 |
  /================================================/

 

2.2 FTP Passive模式

  下面的列表描述了Passive模式的FTP的步骤,步骤1到3和Port模式FTP相同,步骤9到11同样与Port模式FTP最后三步相同。

  1、客户端发送一个TCP SYN(TCP同步)包给服务器段众所周知的FTP控制端口21,客户端使用暂时的端口作为它的源端口;

  2、服务器端发送SYN ACK(同步确认)包给客户端,源端口为21,目的端口为客户端上使用的暂时端口;

  3、客户端发送一个ACK(确认)包;客户端使用这个连接来发送FTP命令,服务器端使用这个连接来发送FTP应答;

  4、当用户请求一个列表(List)或者发送或接收文件时候,客户端软件发送PASV命令给服务器端表明客户端希望进入Passive模式;

  5、服务器端进行应答,应答包括服务器的IP地址和一个暂时的端口,这个暂时的端口是客户端在打开数据传输连接时应该使用的端口;

  6、客户端发送一个SYN包,源端口为客户端自己选择的一个暂时端口,目的端口为服务器在PASV 应答命令中指定的暂时端口号;

  7、服务器端发送SYN ACK包给客户端,目的端口为客户端自己选择的暂时端口,源端口为PASV 应答中指定的暂时端口号;

  8、客户端发送一个ACK包;

  9、发送数据的主机以这个连接来发送数据,数据以TCP段(注:segment,第4层的PDU)形式发送( 一些命令,如STOR表示客户端要发送数据,RETR表示服务器段发送数据),这些TCP段都需要对方进行ACK确认;

  10、当数据传输完成以后,发送数据的主机以一个FIN命令来结束数据连接,这个FIN命令需要另一台主机以ACK确认,另一台主机也发送一个FIN命令,这个FIN命令同样需要发送数据的主机以ACK确认;

  11、客户端能在控制连接上发送更多的命令,这可以打开和关闭另外的数据连接;有时候客户端结束后,客户端以FIN命令来关闭一个控制连接,服务器端以ACK包来确认客户端的FIN,服务器同样也发送它的FIN,客户端用ACK来确认。

  下面是Passive模式FTP的开始几个步骤:

以下是引用片段:
  /=====================================================/
  | |
  | [ ftp Client ] [ ftp Server ] |
  | |
  | (TCP:21 连接初始化,控制端口) |
  | SYN |
  | Port xxxx ----------------------> Port 21 [TCP] |
  | SYN+ACK |
  | Port xxxx <---------------------- Port 21 |
  | ACK |
  | Port xxxx ----------------------> Port 21 |
  | |
  | (PASV操作: 被动连接数据端口初始化) |
  | |
  | PASV |
  | Port xxxx ----------------------> Port 21 |
  | PASV OK, IP, Port yyyy |
  | Port xxxx <---------------------- Port 21 |
  | SYN |
  | Port zzzz ----------------------> Port yyyy |
  | SYN+ACK |
  | Port zzzz <---------------------- Port yyyy |
  | ACK |
  | Port zzzz ----------------------> Port yyyy |
  | |
  | |
  | (数据操作: 数据传输) |
  | List, Retr or Stor |
  | Port xxxx ----------------------> Port 21 |
  | Data + ACK |
  | Port zzzz <---------------------> Port yyyy |
  | . |
  | . |
  | . |
  | |
  /======================================================/

 

 

 

 

 

一个PASV请求要求服务器在服务器选择的一个新的端口上接受数据连接,PASV命令没有任何参数,服务器端的回应只是一行显示服务器IP地址和服务器接受连接的TCP端口号。

  下面显示了服务器对PASV命令的回应,服务器告诉客户端它在端口5365(192,168,179,100,20 ,245)上进行监听,计算端口的方法是20*256+245=5365。

以下是引用片段:
  /================================================/
  | TCP - Transport Control Protocol |
  | Source Port: 21 ftp |
  | Destination Port: 1249 |
  | Sequence Number: 4239887193 |
  | Ack Number: 36925357 |
  | Offset: 5 (20 bytes) |
  | Reserved: %000000 |
  | Flags: %011000 |
  | 0. .... (No Urgent pointer) |
  | .1 .... Ack |
  | .. 1... Push |
  | .. .0.. (No Reset) |
  | .. ..0. (No SYN) |
  | .. ...0 (No FIN) |
  | |
  | Window: 8760 |
  | Checksum: 0x3EAB |
  | Urgent Pointer: 0 |
  | No TCP Options |
  | |
  | FTP Control - File Transfer Protocol |
  | Line 1: PASV 192,168,0,1,100,20,245 |
  | |
  | FCS - Frame Check Sequence |
  | FCS (Calculated): 0xBED4346D |
  /====================================================/  当收到PASV命令的回应后,客户端打开一个TCP连接,源端口为一个暂时的端口,目的端口为服务器提供的暂时端口。

  下面显示了客户端的TCP连接建立过程,正如上面所说,目的端口为5365。

以下是引用片段:
  /=================================================/
  | TCP - Transport Control Protocol |
  | Source Port: 1250 |
  | Destination Port: 5365 |
  | Sequence Number: 36931503 |
  | Ack Number: 0 |
  | Offset: 7 (28 bytes) |
  | Reserved: %000000 |
  | Flags: %000010 |
  | 0. .... (No Urgent pointer) |
  | .0 .... (No Ack) |
  | .. 0... (No Push) |
  | .. .0.. (No Reset) |
  | .. ..1. SYN |
  | .. ...0 (No FIN) |
  | |
  | Window: 8192 |
  | Checksum: 0x1A57 |
  | Urgent Pointer: 0 |
  | No TCP Options |
  | |
  | TCP Options |
  | Options Type: 2 Maxinum Segment Size |
  | Length: 4 |
  | MSS: 1460 |
  | |
  | FCS - Frame Check Sequence |
  | FCS (Calculated): 0x5A1BD023 |
  /=====================================/

 

 

3. 用户名和口令的明文传输

  FTP另一个声名狼藉的问题是它以明文方式发送用户名和口令,也就是不加密地发送。任何人只要在网络中合适的位置放置一个协议分析仪就可以看到用户名和 口令;FTP发送的数据也是以明文方式传输,通过对ftp连接的监控和数据收集就可以收集和重现ftp的数据传输并实现协议连接回放。事实上很多用户把相 同的用户名和口令用在不同的应用中,这样这个问题可能看起来更为糟糕;如果黑客收集到FTP口令,他们也可能就得到了你在线帐号或者其他一些机密数据的口令。

  4.TCP层的工作

  ftp是基于tcp,要保证ftp的可靠传输,tcp就要做到建立有连接的比特流,把用户数据分成数据段,在发送数据时设置计时器(用来超时重传),还要对对方传来的数据进行确认(确认信息可以携带在数据包上),并把收到的数据重新排序,丢弃重复的数据包,提供端到端的流量控制(tcp的滑动窗口协议以有效的传输批量数据),计算并检验端到端的校验和。

  5.IP层的工作

  IP层确定路径(三种路径:主机路径,网络路径和缺省路径),在确定路径的同时由ICMP来报告错误信息和其他应注意的情况。

  6.数据链路层的工作

  通过查找ARP表找出目的主机的MAC地址。如未找到,通过ARP请求/应答报文学到目的主机MAC地址。

  7.物理层的工作

  在通信信道上传输原始的比特流。

  下面用一个具体例子说明这一过程。

  

FTP

  上图为由三个以太网(SUN,MOON,WATER)和一台路由器(ROUTE)相连.他们的IP地址前两位都为10.0。

假设E为FTP服务器,A作为FTP客户端访问E。

  

  9、在IP层从A发送到E的IP包分析

  当要发送的IP包进入IP,IP模块必须要决定是直接选路还是间接选路。该例中是间接选路。IP包中源IP地址是A(10.0.1.1)的,目的IP地址是E(10.0.2.2)的。IP模块查找路由表:

  

  在路由表的 第二个条目中找到,说明在网络号为10.0.2.0上的计算机通过路由器ROUTE到达。

  A的IP模块通过ARP表把ROUTE的IP(10.0.2.1)地址翻译成物理地址。然后通过A的底层接口把IP包发给ROUTE。IP包中仍然包括E的IP 地址。

  IP包到达RIUTE路由器,然后被送到IP模块。目的IP被检查,因为他和ROUTE的任何地址都不相同,所以被转发。

  ROUTE寻找路由表找到E的对应项,并在ARP中找到E的MAC地址。这里是直接路径。将报文发到E。