/*
* blackboy [email protected]
* QQ群: 135202158
* 转载请注明作者及出处
*/
声明: 本书版权归原作者与出版社所有,本人对其进行翻译、标注、扩充或修改只为学习和研究目的,不会用于商业目的。
// 2013.1.22
在每一天都会出现成千上万个计算机网络问题——从简单的间谍软件注入到复杂的路由器配置错误——而且立即解决每一个问题是不可能的。我们能期望的最好的事情是,为应对这些问题做好知识和工具的万全准备。
所有的网络问题都根源于数据包层(packet level),在那里最漂亮的应用程序都会显露其恐怖的实现,看上去可信的协议也会证明是有敌意的。为了更好地理解网络问题,我们来到数据包层。这里,对我们来说没什么会被隐藏——没什么会被误导人的菜单结构、夺人眼球的图形界面,或者不值得信任的员工所隐藏。在这一层,不存在真实的秘密(仅除了加密的以外)。我们在这一层做的越多,我们就越能够控制网络和解决问题。这就是数据包分析的世界。
本书一头扎入了数据包分析的世界。你可以学到如何处理慢速网络通信,确定应用程序瓶颈,甚至通过一些现实场景跟踪黑客。在你读完这本书之后,你可以实现高级的数据包分析技术,用来帮助你解决最困难的网络问题。
在这一章,我们从基础开始,关注于网络通信,你会学到一些基础的背景知识,用来考察不同场景(examine different scenarios)。
数据包分析,常称为数据包嗅探或协议分析,描述了捕获和解释流动于网络上的实时数据、以便更好地理解网络上发生了什么的过程。数据包分析一般通过数据包嗅探器来完成,它是一种用于在线路上捕获原始网络数据的工具。
数据包分析可以帮助我们:
存在不同类型的数据包嗅探程序,包括免费和商业的。每种程序用于不同的目的。一些流行的数据包分析程序是tcpdump, OmniPeek,以及Wireshark(本书中我们仅使用它)。tcpdump是一种命令行程序。OmniPeek和Wireshark带有图形用户界面。
当选择数据包嗅探器时,你需要考虑很多个因素,包括:
数据包嗅探过程涉及到软件和硬件之间的协作。此过程可以被分为以下3步:
为了完全理解数据包解析,你必须精确理解计算机彼此之间如何通信。在这一节,我们来考察(examine)网络协议基础,开放系统互联(OSI)模型,网络数据帧,以及支持这些的硬件。
现代网络由运行于多种不同平台的多种多样的系统所组成。为了帮助这种通信,我们使用名为协议的通用语言(common languages)集。常见协议包括TCP,IP,ARP和DHCP。协议栈(protocol stack)是一起工作的协议的逻辑组合。
理解协议的最好方式之一是,把它们当成控制人类的口头或书面语言的规则一样来思考。每种语言都有规则,例如如何连接动词,如何向人问好,如何合适地表达感谢。协议有着很相似的方式,允许我们定义数据包如何路由,如何发起连接,以及如何对数据的接收应答。
协议可能是非常简单的,也可以是高度复杂的,这取决于它的功能。尽管多种协议常常是大为不同的,许多协议一般解决以下问题:
基于工业标准OSI参考模型,协议根据它们的功能被分层。OSI模型把网络通信过程分为7个不同的层,如图所示。
这种分层模型使理解网络通信变得更容易。最顶上的应用层表示用于访问网络资源的实际程序。实际网络数据在最下面的物理层移动。每层的协议协同工作,以确保数据被其上层和下层的协议合适地处理。
注意:OSI模型最早由国际标准化组织(ISO)以ISO 7498文档发表于1983年。OSI模型仅是一个工业推荐标准。协议开发者不必完全遵循它。而且OSI模型并不是唯一的网络模型,一些人更倾向于DoD(Department of Defense)模型,也就是TCP/IP模型。
每个OSI模型层都有特定的功能,如下所述:
Table 1-1 列出了OSI模型各层所用的常用协议:
尽管OSI模型仅是一个推荐标准,你还是应该记住它。当进行本书时,你会发现不同层协议的交互会塑造你解决网络问题的方法。路由问题将变成“第3层问题”,软件问题会被认为是“第7层问题”。
注意:在谈论我们的工作时,一位同事告诉我:一个用户抱怨他不能访问网络资源。问题是这个用户输入了错误的密码。我的同事把这称为“第8层问题”。第8层是非正式的用户层。这个术语一般用于数据包级。
数据是怎样在OSI模型中流动的?网络上的初始数据传输开始于传输系统的应用层。数据沿着OSI模型的7层向下走,直到物理层。这时,传输系统的物理层把数据发送到接收系统。接收系统在它的物理层收取数据,数据沿着接收系统的其余分层往上,直到最顶上的应用层。
OSI模型给定层(level)的多个协议提供的服务是不重复的。例如,如果某层的一个协议提供了某个特定服务,那么其他层不会再有协议会提供相同的服务。不同层(level)的协议的特性可能目标相似,但它们的功能还是有所不同。
发送端和接收端上对应层的协议是互补的(complementary)。例如,如果发送端第7层的某个协议负责加密要传输的数据,那么接收端第7层的对应协议则可以预料是负责解密这些数据的。
Figure 1-2 以图形方式展示了与两个通信端有关的OSI模型。可以看到在一端通信[数据]从上往下,然后到另一端时顺序相反。
OSI模型中的每一层都只能与紧挨着它的上面和下面那2层通信。例如,第2层仅可以发送和接收来自第1层和第3层的数据。
OSI模型不同层的协议的通信需要数据封装的协助。[协议]栈的每一层负责添加头部或尾部——额外的信息比特,允许层与层通信——到通信数据中。例如,当传输层从会话层接收到数据时,在把数据传送到下一层之前,传输层会把它的头信息加到数据中。
封装过程创建一个协议单元(PDU),它包括要发送的数据,以及添加到数据的所有头部和尾部信息。当数据从OSI模型从上到下移动时,因为多个协议会向它添加头部和尾部信息,PDU会变化和增大。一旦到达物理层,PDU就成为其最终形式,此时,它被发送到目的端。在接收端 ,随着数据从下往上经过OSI各层,PDU中的头部和尾部会被剥去。一旦PDU到达OSI模型的顶层,就只剩下原始数据了。
注意:术语“数据包”是指完整的PDU,它包括来自OSI模型所有层的头和尾信息。
要理解数据的封装是如何工作的可能会让人有些迷惑,因此我们来看一个与OSI模型相关的数据包创建、传输及接收的实际例子。记住做为分析人员,我们不经常讨论会话或表示层,因此它们不会出现在这个例子(以及本书的其余部分)中。
这个过程发生时,我们必须产生一个请求数据包,它从我们的源客户端发送到目标服务器端。此场景假定已创建了一条TCP/IP通信会话。Figure 1-3 展示了这个例子中的数据封装。
我们从客户机上的应用层开始。我们正在浏览一个网站,因此应用层协议用的是HTTP,它将发出一个命令来从google.com下载index.html文件。
一旦应用层协议命令(dictated)了要完成什么,我们就关心如何把数据包送到目的地。我们数据包中的数据在协议栈向下传递到传输层。 HTTP是使用TCP的应用层协议。因此,TCP做为传输层协议,用来确保数据包的可靠传递。最后,产生TCP头部。此TCP头部包括序列号和其他要添加到数据包的数据,并确保数据包能被合适的传送。
注意: 我们经常说一个协议在另一个协议“之上”,这是因为OSI模型的自上而下(top-down)的设计。一个应用协议,如HTTP提供特定的服务,并依赖TCP来确保服务的送达。正如你所学的,DNS在UDP“之上”,TCP在IP“之上”。
做完自己的工作后,TCP把数据包交给IP,它是第3层协议,负责数据包的逻辑寻址。IP创建包含有逻辑寻址信息的头部,并把数据包传递给数据链路层的Ethernet。Ethernet物理地址存储在Ethernet头部中。现在,数据包已经完全装配好,并传递到物理层,然后它将会以0和1的形式发送到网络上。
完整的数据包穿越网络线路系统,最终到达Google Web服务器。Web服务器开始从底部读取数据包,即它先读取数据链路层,该层包含物理Ethernet寻址信息。网卡用此信息来确定数据包要送到哪个具体的服务器。一旦这些信息被处理,第2层信息就被剥去,然后开始处理第3层。
IP寻址信息也像第2层信息那样被读取,确保合适寻址以及数据包没有被分片。这些数据也被剥去,以使处理下一层。
现在开始读取第4层TCP信息,确保到达的数据包有序。然后第4层头部信息被剥去,只剩下应用层数据,被送到网站寄宿的的web服务器应用程序。做为对来自客户端的数据包的回应,服务器应该传送一个TCP应答数据包,以使客户端知道它的请求已被接收,后面跟着index.html文件。
不管何种协议,所有的数据包都会以这个例子中所描述的方式创建和处理。但同时要记住不是网络上的每一个数据包都产生自应用层协议,因此我们会看到只包含第2,3,4层协议信息的数据包。
现在是时候来介绍那些干脏活的网络硬件了。我们只关注一些觉的网络硬件:集线器(hub)、交换机(switcher),以及路由器(router).
它一般是有多个RJ-45接口的盒子,像图中所示的NETGEAR集线器一样。集线器从4口到48口不等。
因为集线器会产生大量非必需的网络流量,而且只能在半双工模式(它们不能同时发送和接收数据)下工作,你通常看不到它们用在最现代或高密度的网络中(而是用交换器)。然而,你应该知道集线器是怎么工作的,因为当使用第2章中讨论的“hubbing out”技术进行数据包分析时,它是非常重要的。
集线器仅是工作在OSI模型的物理层上的一个转发设备(repeating device)。它把某个端口发来的数据包传递(repeats)到设备上的所有其他端口。例如,如果一个主机连接到4口集线器上的端口#1,它需要把数据发送到端口#2上的主机。集线器把那些数据包发送到端口#1,#2,#3和#4。连接到#3和#4的主机检查数据包的Ethernet头部中的目标MAC地址字段,然后它们发现这个数据包不是发给它们的,因此它们丢弃这个数据包。 Figure 1-5展示了一个示例,主机A向主机B传递数据。当主机A发送数据时,所有连接到集线器的主机都会收到它。仅有主机B实际接受数据,其他的主机丢弃它。
做为模拟,假定你向你公司里的每个员工发送一封主题为“所有销售人员请注意”的邮件,而不是仅发送给销售部门的人。销售部门的员工知道这是发给他们的,他们可能打开邮件。其他员工看到这不是发给他们的,他们可能会丢弃它。我们可以看到,这会造成大量的非必需流量,并浪费时间,然而这就是集线器的功能。
在生产环境和高密度网络中,集线器的最佳替代者是交换机,它是全双工设备,可以同时发送和接收数据。
像集线器一样,交换机也用来转换数据包。然而,和集线器不同,交换机仅把数据发送给真正的接收方,而不是把数据广播到每个商品。交换机和集线器看起来差不多,如Figure 1-6所示。
市面上一些大型的交换机,像Cisco牌的,可以通过特殊的软件或web接口来管理。这种交换机一般称为可管理的(managed)交换机。可管理的交换机提供对一些网络管理有用的特性,包括开启或禁用特定端口,查看端口细节,改变配置,以及远程重启。
当交换机用来处理传输的数据包时,它还提供高级的功能。为了与特定设备直接通信,交换机必须可以基于它们的MAC地址来唯一识别设备,这意味着它们必须工作在OSI模型的数据链路层。
交换机在CAM表中存放连接到它的每个设备的第2层地址,这个表成为一种流量警察(traffic cop)。当数据包传递时,交换机读取它的第2层头部信息,并使用CAM表做为参考,确定向哪个端口发送该数据包。交换机只向特定端口发送数据包,因此大幅减少了网络流量。
Figure 1-7 展示了流经交换机的流量。图中,主机A仅向主机B发送数据。在同一时刻网络上可以有多个会话(conversation),但信息只在交换机和预期的接收者之间直接传递,而不是交换机与所连接的所有主机之间。
路由器是一种高级网络设备,它比交换机和集线器具有更高的功能级别。路由器可能有多种形状和构成,但大多数会在前面有一些LED指示灯,在后面有一些网络端口,这取决于网络的大小。Figure 1-8展示了一种路由器。
路由器工作在OSI模型的第3层,负责在两个或更多的网络之间转发(forwarding)数据包。路由器用来在网络之间引导数据流(flow of traffic)的过程称为路由。一些路由协议控制不同类型的数据包怎样路由到其他网络。路由器一般使用第3层地址(即IP地址)来唯一识别网络上的设备。
演示路由概念的方式之一,是用几条街上的邻居来模拟。把房子和他们的地址看成是主机,把每条街看成是网段,如Figure 1-9所示。从你的房子开始,你可以容易地和同一条街上的其他房子中的邻居通信。这和交换机的操作相似,它允许同一网段上的所有计算机进行通信。然而,与其他街上的邻居进行通信就好比与不在同一网段上的主机进行通信。
参考Figure 1-9,我们假定你在Vine Street 503号,需要同Dogwood Lane 202号联系。你必须首先先到Oak Street,然后到Dogwood Lane。这就相当于跨网段。如果192.168.0.3上的设备需要与192.168.0.54上的设备通信,它必须跨过路由器到达网络10.100.1.1,然后穿过目标网段的路由器,最后才能到目标网段。
一个网络上的路由器的大小和数量一般取决于该网络的大小和功能。个人和家庭办公室网络可能只有一个小路由器布置在网络中央。一个大公司网络可能有多个路由器散布在多个部门中,所有这些路由器连接到一个大的中央路由器或第3层交换机(高级交换器也会内置路由器功能)。
随着看过越来越多的网络图,你会理解数据是怎样流过这些不同的端点的。Figure 1-10展示了一个常见的路由网络的布局。此例中,两个分隔的网络通过一个路由器相连。如果网络A中的主机想要与网络B中的主机通信,传输数据必须经过路由器。
网络通信量主要可以分为3类:广播、多播和单播。每一类都有不同的特性,它决定了该分类中的数据包如何被网络硬件所处理。
广播数据包被发送到一个网段的所有商品,不管那个端口是集线器还是交换机。
然而,所有的播放流量不是平等地创建的,它分为第2层和第3层形式。例如,在第2层,MAC地址FF:FF:FF:FF:FF:FF是保留的广播地址,所有发送到此地址的流量被广播到整个网段。第3层也有特定的广播地址。
IP网络范围中可能的最高IP地址被保留用于广播地址。例如,如果一个网络的IP范围为192.168.0.xxx,子网掩码为255.255.255.0,那么地址192.168.0.255就是广播地址。
I在有着通过不同媒介连接的多个集线器或交换机的大型网络中,随着从一个交换机转发到另一个交换机,从一个交换机传递的广播数据包会一直到达网络上其他交换机上的端口。广播数据包所到达的范围称为广播域(broadcast domain),它就是任意主机可以不经路由器与其他主机直接通信的网段。Figure 1-11展示了一个小网络上的两个广播域。因为每个广播域扩展到路由器,广播数据包仅在特定的为广播域中传送。
我们之前描述路由器和邻居联系的例子,也有助于领悟广播域如何工作。你可以把广播域当作邻居街道。如果你站在你家门口大声喊,只有你家那条街上的邻居会听到你。如果你想要和不同街道上的某人交谈,你需要找到一种和他直接说话的方式,而不是站在你家门口广播(大声喊)。
多播是从一个源同时向多个目标传送数据包的一种方法。多播的目的是使用尽可能小的带宽来简化这个过程。这种流量的优化在于数据流为了到达目的地而被复制的次数。多播流量的具体处理高度依赖于各个协议自己的实现。
实现多播的主要方法是通过一种寻址方案,它把数据包的接收者加入到多播组,这就是IP多播的工作原理。此寻址方案确保数据包不会被传递到不该被送达的主机。事实上,IP把一整个地址范围用于多播。如果你看到224.0.0.0到239.255.255.255范围内的IP地址,那么它很有可能是多播流量。
单播数据包直接从一台主机传递到另一主机。单播的功能细节取决于使用它的协议。
例如,考虑一台想要与一台web服务器通信的设备。这是一个一对一的连接,因此这个连接过程开始于客户设备仅向web服务器传递一个数据包。这种通信形式是单播流量的一个例子。
本章覆盖了对于数据包分析你所需的基础知识。在开始发现和排除网络故障之前,你必须理解在网络通信的这一级别发生了什么。在下一章,我们将基于这些概念,讨论更高级的网络通信原理。