《Wireshark数据包分析实战(第2版)》—第6章6.2节互联网协议

  1. 云栖社区>
  2. 博客>
  3. 正文

《Wireshark数据包分析实战(第2版)》—第6章6.2节互联网协议

异步社区 2017-05-02 15:50:00 浏览1054
展开阅读全文

本节书摘来自异步社区《Wireshark数据包分析实战(第2版)》一书中的第6章6.2节互联网协议,作者【美】Chris Sanders,更多章节内容可以访问云栖社区“异步社区”公众号查看。

6.2 互联网协议
位于OSI模型中第3层的协议的主要目的就是使得网络间能够互联通信。正如你所知道的,MAC地址被用来在第2层处理单一网络中的通信。与其类似,第3层则负责跨网络通信的地址。在这层上工作的不止一个协议,但最普遍的还是互联网协议(IP)。在此,我们将介绍在RFC 791中所定义的IP协议版本4(IPv4)。

如果网络中的所有设备仅使用集线器或者交换机进行连接,那么这个网络称为局域网。如果你想将两个局域网连接起来,你可以使用路由器办到这一点。在复杂的网络中,可能会包含成千上万的局域网,而这些局域网是由世界各地成千上万的路由器连接起来的。互联网本身就是由无数局域网和路由器所组成的一个集合。

6.2.1 IP地址
IP地址是一个32位的地址,用来唯一标识连接到网络的设备。由于让人记住一串32位长的01字符确实比较困难,所以IP地址采用点分四组的表示法。

在点分四组表示法中,以A.B.C.D的形式,构成IP地址的四组1和0分别转换为十进制0到255之间的数(如图6-7所示)。我们拿这样一个IP地址11000000 10101000 00000000 00000001举例来说,这个值显然不容易记忆或者表示,但如果采用点分四组的表示法,我们就可以将其表示为192.168.0.1。


e271419b6764dbd87a8c174c4dfd4ce0b47de1e6

IP地址之所以会被分成4个单独的部分,是因为每个IP地址都包含着两个部分:网络地址和主机地址。网络地址用来标识设备所连接到的局域网,而主机地址则标识这个网络中的设备本身。用来决定究竟IP地址哪部分属于网络或者主机的划分通常并不唯一。这实际上是由另一组名为网络掩码(netmask, network mask)的地址信息所决定的,有时它也会被称为子网掩码(subnet mask)。

网络掩码用来标识IP地址中究竟哪一部分属于网络地址而哪一部分属于主机地址。网络掩码也是32位长,并且被设为1的每一位都标识着IP地址的对应部分是属于网络地址的,而剩下设为0的部分则标识着主机地址。

我们以IP地址10.10.1.22为例,其二进制形式为00001010 00001010 00000001 00010110。为了能够区分出IP地址的每一个部分,我们将使用网络掩码。在这个例子中,我们的网络掩码是11111111 11111111 00000000 00000000。这意味着IP地址的前一半(10.10或者00001010 00001010)是网络地址,而后一半(1.22或者00000001 00010110)标识着这个网络上的主机,如图6-8所示。


3945e8976de3314b81a045ecdf38f0d5076703fd

网络掩码也可以写成点分四组的形式。比如网络掩码11111111 11111111 00000000 00000000可以被写成255.255.0.0。

IP地址和网络掩码为简便起见,通常会被写成无类型域间选路(Classless Inter-Domain Routing, CIDR)的形式。在这个形式下,一个完整的IP地址后面会有一个左斜杠(/),以及一个用来表示IP地址中网络部分位数的数字。举例来说,IP地址10.10.1.22和网络掩码255.255.0.0,在CIDR表示法下就会被写成10.10.1.22/16的形式。

6.2.2 IPv4头
源IP地址和目的IP地址都是IPv4数据包头中的重要组成部分,但它们并不是你在数据包中能够找到的IP信息的全部。IP头比起我们刚刚介绍过的ARP数据包复杂得多。这其中包含很多额外的信息,以便IP完成其工作。

如图6-9所示,IPv4头有着下列几个域。

版本号(Version):IP所使用的版本。

首部长度(Header Length):IP头的长度。

服务类型(Type of Service):优先级标志位和服务类型标志位,被路由器用来进行流量的优先排序。

总长度(Total Length):IP头与数据包中数据的长度。

标识符(Identification):一个唯一的标识数字,用来识别一个数据包或者被分片数据包的次序。


8c6327affd2f4a330c5f61ff90ac2ee610b702ee

标记(Flags):用来标记一个数据包是否是一组分片数据包的一部分。

分片偏移(Fragment Offset):一个数据包是一个分片,这个域中的值就会被用来将数据包以正确的顺序重新组装。

存活时间(Time to Live):用来定义数据包的生存周期,以经过路由器的跳数/秒数进行描述。

协议(Protocol):用来识别在数据包序列中上层协议数据包的类型。

首部校验和(Header Checksum):一个错误检测机制,用来确认IP头的内容没有被损坏或者篡改。

源IP地址(Source IP Address):发出数据包的主机的IP地址。

目的IP地址(Destination IP Address):数据包目的地的IP地址。

选项(Options):保留作额外的IP选项。它包含着源站选路和时间戳的一些选项。

数据(Data):使用IP传递的实际数据。

6.2.3 存活时间
存活时间(TTL)值定义了在该数据包被丢弃之前,所能经历的时间,或者能够经过的最大路由数目。TTL在数据包被创建时就会被定义,而且通常在每次被发往一个路由器的时候减1。举例来说,如果一个数据包的存活时间是2,那么当它到达第一个路由器的时候,其TTL会被减为1,并会被发向第二个路由。这个路由接着会将TTL减为0,这时如果这个数据包的最终目的地不在这个网络中,那么这个数据包就会被丢弃,如图6-10所示。由于TTL的值在技术上还是基于时间的,一个非常繁忙的路由器可能会将TTL的值减去不止1,但通常情况下,我们还是可以认为一个路由设备在多数情况下只会将TTL的值减去1。


13ff8e412c1a8a47be1481d54d411c59debf25ff

为什么TTL的值会这样重要?我们通常所关心的一个数据包的生存周期,只是其从源前往目的地所花去的时间。但是考虑到一个数据包想要通过互联网发往一台主机需要经过数十个路由器。在这个数据包的路径上,它可能会碰到被错误配置的路由器,而失去其到达最终目的地的路径。在这种情况下,这个路由器可能会做很多事情,其中一件就是将数据包发向一个网络,而产生一个死循环。

如果你有任何编程背景,那么你就会知道死循环会导致各种问题,一般来说会导致一个程序或者整个操作系统的崩溃。理论上,同样的事情也会以数据包的形式发生在网络上。数据包可能会在路由器之间持续循环。随着循环数据包的增多,网络中可用的带宽就会减少,直至拒绝服务(DoS)的情况出现。IP头中的TTL域就为了防止出现这个潜在的问题。

让我们看一下Wireshark中的示例。文件ip_ttl_source.pcap包含着两个ICMP数据包。ICMP(我们会在这章之后介绍到)利用IP传递数据包,我们可以通过在Packet Details面板中展开IP头区段看到。

你可以看到IP的版本号为4图标1,IP头的长度是20字节图标2,首部和载荷的总长度是60字节图标3并且TTL域的值是128图标4。


d08670eb6209387d5926310a78fe1b0fe67ba1b4

ICMP ping的主要目的就是测试设备之间的通信。数据从一台主机发往另一台作为请求,而后接收主机会将那个数据发回作为响应。这个文件中,我们一台IP地址为10.10.0.3图标5的设备将一个ICMP请求发向了地址为192.168.0.128图标6的设备。这个原始的捕获文件是在源主机10.10.0.3上被创建的。

现在打开文件ip_ttl_dest.pcap。在这个文件中,数据在目的主机192.168.0.128处被捕获。展开这个捕获中第一个数据包的IP头,来检查它的TTL值(如图6-12所示)。


e7d8140d8a5b52ab89236750b4c182766cf5ff9e

你可以立刻注意到TTL的值变为127了,比原先的TTL减少了1。即使不知道网络的结构,我们也可以知道这两台设备是由一台路由器隔开,并且经过这台路由器的路径会将TTL值减1。

6.2.4 IP分片
数据包分片是将一个数据流分为更小的片段,是IP用于解决跨越不同类型网络时可靠传输的一个特性。

一个数据包的分片主要基于第2层数据链路协议所使用的最大传输单元(Maximum Transmission Unit, MTU)的大小,以及使用这些第2层协议的设备配置情况。在多数情况下,第2层所使用的数据链路协议是以太网。以太网的默认MTU是1500,也就是说,以太网的网络上所能传输的最大数据包大小是1500字节(并不包括14字节的以太网头本身)。

注意
 尽管存在着标准的MTU设定,但是一个设备的MTU通常可以手工设定。MTU是基于接口进行设定,其可以在Windows或者Linux系统上修改,或者在管理路由器的界面上修改。
当一个设备准备传输一个IP数据包时,它将会比较这个数据包的大小,以及将要把这个数据包传送出去的网络接口MTU,用于决定是否需要将这个数据包分片。如果数据包的大小大于MTU,那么这个数据包就会被分片。将一个数据包分片包括下列的步骤。

1.设备将数据分为若干个可成功进行传输的数据包。

2.每个IP头的总长度域会被设置为每个分片的片段长度。

3. 更多分片标志将会在数据流的所有数据包中设置为1,除了最后一个数据包。

4.IP头中分片部分的分片偏移将会被设置。

5.数据包被发送出去。

文件ip_frag_source.pcap从地址为10.10.0.3的计算机上捕获而来。它向一个地址为192.168.0.128的设备发送ping请求。注意在ICMP(ping)请求之后,Packet List面板的Info列中列出了两个被分段的IP数据包。

先检查数据包1的IP头(如图6-13所示)。

根据更多分片和分片偏移域,你可以断定这个数据包是分片数据包的一部分。被分片的数据包要么有一个大于0的分片偏移,要么设定了更多分片的标志位。在第一个数据包中,更多分片标志位被设定图标1,意味着接收设备应该等待接收序列中的另一个数据包。分片偏移被设为0图标2,意味着这个数据包是这一系列分片中的第一个。


e516993b60f8dcb361f1f81dd7d4b620f69dd8d9

第二个数据包的IP头(如图6-14所示),同样被设定了更多分片的标志位,但在这里分片偏移的值是1480。这里明显意味着1500字节的MTU,减去IP头的20字节。


9b75e10e8e0df97b75d20fd64bb47e09b8960ce7

第三个数据包(如图6-15所示),并没有设定更多分片标志位图标1,也就标志着整个数据流中的最后一个分片。并且其分片偏移被设定为2960图标2,也就是1480+(1500-20)的结果。这些分片可以被认为是同一个数据序列的一部分,是因为它们IP头中的标志位域拥有相同的值。

e04e4060643a72b841626d4c2b020fd85323e643

网友评论

登录后评论
0/500
评论
异步社区
+ 关注