【FTP】Wireshark学习FTP流程
一、Wireshark概述
在windows下,
图1 Wireshark界面展示(基于1.99.1)
Wireshark是通过底层的winpcap来实现抓包的。winpcap是用于网络封包抓取的一套工具,可适用于32/64位的操作平台上解析网络封包,包含了数据包截获驱动程序,一个底层动态链接库,和一个高层静态链接库,winpcap在内核中把所有网卡收到的报文复制一份。
Display Filter(显示过滤器), 用于过滤
Packet List Pane(封包列表),显示捕获到的封包,包括编号,时间戳,源地址,目标地址,协议,长度,以及封包信息。不同的协议用了不同的颜色显示。
Packet Details Pane(封包详细信息),显示封包中的字段
Dissector Pane(16进制数据)
Miscellaneous(状态栏)
二、FTP概述
文件传输协议(FTP)作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用。FTP的目标是提高文件的共享性和可靠高效地传送数据。在传输文件时,FTP客户端程序先与服务器建立连接,然后向服务器发送命令。服务器收到命令后给予响应,并执行命令。FTP协议与操作系统无关,任何操作系统上的程序只要符合FTP协议,就可以相互传输数据。
1. FTP协议简介
FTP是仅基于TCP的服务,不支持UDP,相比其他协议(如 HTTP协议),FTP协议要复杂一些。与一般的C/S应用不同点在于一般的C/S应用程序一般只会建立一个Socket连接,这个连接同时处理服务器端和客户端的连接命令和数据传输。而FTP协议中将命令与数据分开传送的方法提高了效率。
FTP使用2个端口,一个数据端口和一个命令端口(也叫做控制端口)。控制Socket用来传送命令,数据Socket是用于传送数据。每一个 FTP命令发送之后,FTP服务器都会返回一个字符串,其中包括一个响应代码和一些说明信息。其中的返回码主要是用于判断命令是否被成功执行了。
图2 Wireshark与对应的OSI七层模型
Frame: 物理层的数据帧概况
Ethernet II: 数据链路层以太网帧头部信息
Internet Protocol Version 4: 互联网层IP包头部信息
Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP
File Transfer Protocol: 应用层的信息,此处是FTP协议
2、TCP包的具体内容
3、命令端口和数据端口
一般来说,客户端有一个 Socket 用来连接 FTP 服务器的相关端口,它负责 FTP 命令的发送和接收返回的响应信息。一些操作如“登录”、“改变目录”、“删除文件”,依靠这个连接发送命令就可完成。服务器的命令端口号一般是21。
对于有数据传输的操作,主要是显示目录列表,上传、下载文件,我们需要依靠另一个Socket来完成。 如果使用被动模式,通常服务器端会返回一个端口号。客户端需要用另开一个Socket来连接这个端口,然后我们可根据操作来发送命令,数据会通过新开的一个端口传输。
如果使用主动模式,通常客户端会发送一个端口号给服务器端,并在这个端口监听。服务器需要连接到客户端开启的这个数据端口,并进行数据的传输。主动模式下,服务器的数据端口号一般是20。
4、主动模式(PORT)和被动模式(PASV)
主动模式下,客户端随机打开一个大于1024的端口向服务器的命令端口P(即21端口),发起连接,同时开放N +1端口监听,并向服务器发出“port N+1”命令,由服务器从它自己的数据端口(即20端口)主动连接到客户端指定的数据端口(N+1)。FTP的客户端只是告诉服务器自己的端口号,让服务器来连接客户端指定的端口。对于客户端的防火墙来说,这是从外部到内部的连接,可能会被阻塞。
为了解决服务器发起到客户的连接问题,有了另一种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,然后在两个端口之间进行数据传输。
5、主要的FTP命令
FTP 每个命令都有 3 到 4 个字母组成,命令后面跟参数,用空格分开。每个命令都以"\r\n"结束。 要下载或上传一个文件,首先要登入 FTP 服务器,然后发送命令,最后退出。
这个过程中,主要用到的命令有 USER、PASS、SIZE、REST、CWD、RETR、PASV、PORT、QUIT。
USER: 指定用户名。通常是控制连接后第一个发出的命令。“USER ftp_test\r\n”: 用户名为ftp_test 登录。 PASS: 指定用户密码。该命令紧跟 USER 命令后。“PASS ftptest\r\n”:密码为 ftptest。
SIZE: 从服务器上返回指定文件的大小。“SIZE file.txt\r\n”:如果 file.txt 文件存在,则返回该文件的大小。 CWD: 改变工作目录。如:“CWD bankafile\r\n”。
PASV: 让服务器在数据端口监听,进入被动模式。如:“PASV\r\n”。
PORT: 告诉 FTP 服务器客户端监听的端口号,让 FTP 服务器采用主动模式连接客户端。如:“PORT h1,h2,h3,h4,p1,p2”。
RETR: 下载文件。“RETR LIST 4.4BSD-Lite.tar.gz \r\n”:下载文件LIST 4.4BSD-Lite.tar.gz。
APPE: 上传文件。“STOR LIST 4.4BSD-Lite.tar.gz\r\n”:上传文件LIST 4.4BSD-Lite.tar.gz,如果文件存在,那么就增加上传。
STOR: 上传文件。“STOR LIST 4.4BSD-Lite.tar.gz\r\n”:上传文件LIST 4.4BSD-Lite.tar.gz。
REST: 该命令并不传送文件,而是略过指定点后的数据。此命令后应该跟其它要求文件传输的 FTP 命令。“REST 100\r\n” : 重新指定文件传送的偏移量为 100 字节。
QUIT: 关闭与服务器的连接。
6、FTP 响应码
客户端发送FTP命令后,服务器返回响应码,响应码用三位数字编码表示:
第一个数字给出了命令状态的一般性指示,比如响应成功、失败或不完整。
第二个数字是响应类型的分类,如 2 代表跟连接有关的响应,3 代表用户认证。
第三个数字提供了更加详细的信息。
第一个数字的含义如下:
1 表示服务器正确接收信息,还未处理。
2 表示服务器已经正确处理信息。
3 表示服务器正确接收信息,正在处理。
4 表示信息暂时错误。
5 表示信息永久错误。
第二个数字的含义如下:
0 表示语法。
1 表示系统状态和信息。
2 表示连接状态。
3 表示与用户认证有关的信息。
4 表示未定义。
5 表示与文件系统有关的信息。
三、FTP流程实例
1)建立命令通道
客户端192.168.0.101首先经由端口37280与FTP服务器192.168.1.170端口21经过TCP三次握手建立连接,建立连接成 功后,FTP服务器返回状态码220,表示服务就绪。登陆过程首先由终端向FTP服务器发送登陆用户名”ftp_test”并等待验证。用户名验证通过后,FTP 服务器返回状态码331,表示用户名验证已通过并需要输入密码。终端将登陆密码”ftptest”发送给FTP服务器,FTP服务器验证后返回状态码 230,表示用户已经登陆。终端向FTP服务器发送命令“TYPE I”,表示设置文件传输类型为二进制流,FTP服务器返回状态码 200,表示命令执行成功。
2)建立数据通道
客户端请求被动模式,FTP服务器通过21端口返回227 Entering Passive Mode (192,168,1,170,162,240),服务器将开放端口41712(162*256+240)接受来自客户端的数据连接,客户端则将使用端口38436进行数据连接。然后客户端向FTP服务器发送命令“APPE 4.4BSD-Lite.tar.gz”,表示要上传文件4.4BSD-Lite.tar.gz。指定要上传的文件后,客户端由端口38436主动去连接 FTP服务器端口41712,通过TCP三次握手建立数据连接”FTP-DATA”,用于传输数据。建立数据连接后,FTP服务器通过端口21返回状态码 150,表示文件状态正确,正在打开数据连接。
3)数据传输
通过TCP三次握手建立数据连接时,客户端和服务器协商双方的MSS值(即TCP数据包每次能够传输的最大数据分段)为1460个字节。客户端通过端口58436不断服务器端口41712,发送大小为1024字节(小于1460)的TCP数据包,服务端每收到1个或2个数据包后返回ACK确认收到了数据包。可以看到Wireshark每次抓到的FTP数据大小为1506字节,而不是以太网帧最大的1518字节,这是因为在物理层网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合就将帧交“设备驱动程序”做进一步处理。这时抓包软件才能抓到数据,因此Wireshark抓到的是去掉前导同步码、帧 开始分界符、FCS之外的数据,少了12字节。
第597、599和600三个数据包,客户端向服务器连续发送两个大小为1448, 7240字节的TCP数据包,其中第597个包的Seq为318481,第599个包的Seq为319929。服务器收到这两个数据包后,在第600个包回ACK确认,携带的ACK值为327169,表示已收到Seq318481和Seq319929,需要客户端下次发送Seq为327169(318481+1448+7240)的数据包。
4)多线程数据传输
上面只是单线程的数据传输,数据只在41712和8146这对端口之间传输。如果再通过TCP三次握手建立一个或多个数据连接用于传输,那就是多线程的数据传输。
客户端向FTP服务器发送命令请求上传文件4.4BSD-Lite.tar.gz5,和4.4BSD-Lite.tar.gz80.
右键点击TCP包,选择Follow TCP Stream,可以查看两个线程的应用层数据,分别显示了4.4BSD-Lite.tar.gz5和4.4BSD-Lite.tar.gz80的整个下载过程。
下载两个文件4.4BSD-Lite.tar.gz5和4.4BSD-Lite.tar.gz80一共建立了4个TCP连接:两个命令通道和两个数据通道。Wireshark菜单中选择Statistics->Conversation List->TCP(IPv4 & IPv6),可以列出每个TCP连接的一些概要信息
传输4.4BSD-Lite.tar.gz80的数据使用的是端口48430,控制通道的客户端端口为34023
传输4.4BSD-Lite.tar.gz5的数据使用的是端口54564,控制通道的客户端端口为54983
5)数据分析
Wireshark菜单中选择Statistics->IO Graphs,可以输出对当前抓取的数据的速率概况分析,对于图中给出的速率降下来的小坑的地方可以用鼠标双击进入查看是否有大量的丢包或者延迟等异常。
Wireshark菜单中选择Analyze->Expert Info Composite,(该功能windows版本是没有的,linux版本是有的)可以输出对当前抓取的数据的分析信息,里面有
对各类异常的统计,比如TCP接收窗口为0的统计,丢包和重传的统计,重复ACK的统计,TCP包乱序的统计等等,根据这些统计信息可以大体估计当前网络的一些状况。
四、总结
本文只对上传部分的内容进行说明,与ftp下载的内容的基本相似,参考文章就是基于下载部分写的。之所以本文是基于上传,原因仅仅是在分析了好久,才发现打开的数据包竟然是上传的。不过也没有什么,通过wireshark工具,最好在linux下使用,功能会更加强大,这里最开始使用的最新版本的window 64bit的wireshark,但是到最后发现,原作者使用的是linux下的wireshark。幸亏我还有linux,嘿嘿。
工具都只是次要的,关键还得对TCP协议有更加深入的理解,这在读《TCP/IP详解卷一》关于ftp协议的部分的时候,发现的。一直以为自己对TCP协议有了解,到此时才知道,TCP也是博大精深的,“圣经”是要多读才行啊。
五、常用术语
MTU:Maximum Transmission Unit 最大传输单元
MTU就是IP数据包每次能够传输的最大长度,即以太网帧的最大净载荷payload,大部分网络设备的MTU都是1500。由于以太网 EthernetII最大的数据帧是1518Bytes,刨去以太网帧的帧头(DMAC目的地址MAC48bit=6Bytes+SMAC源MAC地址 48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes(有时候也叫做FCS),那么剩下承载上层协议的地 方也就是Data域最大就只能有1500Bytes,这个值称之为MTU。MTU过大或者过小都会产生IP层分片,导致速率不稳,最大速率也上不去。
MSS:Maximum Segment Size 最大分段大小
MSS就是TCP数据包的最大净载荷payload,默认值为1460,MTU的值1500Bytes减去IP数据包头20Bytes和TCP数据包头20Bytes得到1460Bytes。为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,通讯双方会根据各自提供的 MSS最小值确定为这次连接的最大MSS值。
TCP滑动窗口
当网络连接的两端速度不匹配时,发送端的发送速度快于接收端的处理能力,便会出现快速的发送端将慢速的接收端淹没的现象,导致数据丢失。为了防止由于发送端与接收端之间的不匹配而导致的数据丢失,TCP采用滑动口进行流量控制。
滑动窗口机制通过设定的数据发送区间即窗口(单位byte)进行流控制,该窗口是接收方允许发送方发送的字节流的数据范围,发送方只能发送位于窗口内的字节流中的字节。发送方可在不超过窗口大小范围的条件下连续发送若干个分组,而不必每次发送都要在前一个分组的ACK确认信息收到后进行。该窗口随着 发送方的出站字节流和接收方的入站字节流而滑动,发送方只有收到了接收方的ACK确认,窗口才可以向前移动。TCP传输过程中的滑动窗口并不是固定不变的,在传输过程中会动态调整,接收方会不断的在ACK中将自己的接收窗口大小(window size)通告发送方,发送方将此作为发送窗口的大小。
发送方在两种情况下会停止发送数据:一是网络传输延迟导致发送窗口中全是已发送未确认的数据,二是接收方进程处理太慢导致接收方的接收窗口大小为0(Zero window)。
TCP滑动窗口的大小会影响单线程FTP下载的速率,因为在时延RTT一定的情况下,单线程下只有一个窗口可以接收数据,这时需要修改电脑的注册表来调整窗口大小。但是当FTP下载的线程足够多时,窗口大小的影响可以忽略。
参考文档:通过Wireshark学习FTP流程