在windows下,linux
图1 Wireshark界面展现(基于1.99.1)windows
Wireshark是经过底层的winpcap来实现抓包的。winpcap是用于网络封包抓取的一套工具,可适用于32/64位的操做平台上解析网络封包,包含了数据包截获驱动程序,一个底层动态连接库,和一个高层静态连接库,winpcap在内核中把全部网卡收到的报文复制一份。服务器
Display Filter(显示过滤器), 用于过滤网络
Packet List Pane(封包列表),显示捕获到的封包,包括编号,时间戳,源地址,目标地址,协议,长度,以及封包信息。不一样的协议用了不一样的颜色显示。多线程
Packet Details Pane(封包详细信息),显示封包中的字段工具
Dissector Pane(16进制数据)学习
Miscellaneous(状态栏)大数据
文件传输协议(FTP)做为网络共享文件的传输协议,在网络应用软件中具备普遍的应用。FTP的目标是提升文件的共享性和可靠高效地传送数据。在传输文件时,FTP客户端程序先与服务器创建链接,而后向服务器发送命令。服务器收到命令后给予响应,并执行命令。FTP协议与操做系统无关,任何操做系统上的程序只要符合FTP协议,就能够相互传输数据。编码
1. FTP协议简介url
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协议
二、TCP包的具体内容
三、命令端口和数据端口
通常来讲,客户端有一个 Socket 用来链接 FTP 服务器的相关端口,它负责 FTP 命令的发送和接收返回的响应信息。一些操做如“登陆”、“改变目录”、“删除文件”,依靠这个链接发送命令就可完成。服务器的命令端口号通常是21。
对于有数据传输的操做,主要是显示目录列表,上传、下载文件,咱们须要依靠另外一个Socket来完成。 若是使用被动模式,一般服务器端会返回一个端口号。客户端须要用另开一个Socket来链接这个端口,而后咱们可根据操做来发送命令,数据会经过新开的一个端口传输。
若是使用主动模式,一般客户端会发送一个端口号给服务器端,并在这个端口监听。服务器须要链接到客户端开启的这个数据端口,并进行数据的传输。主动模式下,服务器的数据端口号通常是20。
四、主动模式(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,而后在两个端口之间进行数据传输。
五、主要的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: 关闭与服务器的链接。
六、FTP 响应码
客户端发送FTP命令后,服务器返回响应码,响应码用三位数字编码表示:
第一个数字给出了命令状态的通常性指示,好比响应成功、失败或不完整。
第二个数字是响应类型的分类,如 2 表明跟链接有关的响应,3 表明用户认证。
第三个数字提供了更加详细的信息。
第一个数字的含义以下:
1 表示服务器正确接收信息,还未处理。
2 表示服务器已经正确处理信息。
3 表示服务器正确接收信息,正在处理。
4 表示信息暂时错误。
5 表示信息永久错误。
第二个数字的含义以下:
0 表示语法。
1 表示系统状态和信息。
2 表示链接状态。
3 表示与用户认证有关的信息。
4 表示未定义。
5 表示与文件系统有关的信息。
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字节。
第59七、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流程