互联网协议地址(Internet Protocol Address,又译为网际协议地址),缩写为IP地址(IP Address)。在上一节课介绍了ARP协议,通过分析包可以发现它是依靠MAC地址发送数据的。但是,这样做有一个重大的缺点。当ARP以广播方式发送数据包时,需要确保所有设备都要接收到该数据包。这样,不仅传输效率低,而且局限在发送者所在的子网络。也就是说,如果两台计算机不在同一个子网络,广播是传不过去的。这种设计是合理的,否则互联网上每一台计算机都会收到所有包,将会导致网络受到危害。
互联网是无数子网共同组成的一个巨型网络,如果想要所有电脑都在同一个子网络内,这几乎是不可能的。所以,需要找一种方法来区分哪些MAC地址属于同一个子网络,哪些不是。如果是同一个子网络,就采用广播方式发送。否则就采用“路由”发送。这也是在OSI七层模型中“网络层”产生的原因。它的作用就是引进一套新的地址,使得用户能够区分不同的计算机是否属于同一个子网络。这套地址就叫做“网络地址”,简称“网址”。但是,人们一般叫做是IP地址。这样每台计算机就有了两种地址,一种是MAC地址,另一种是网络地址(IP地址)。但是,这两种地址之间没有任何联系,MAC地址是绑定在网卡上的,网络地址是管理员分配的,它们只是随机组合在一起。
IP地址是IP协议提供的一种统一的地址格式。它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。IP地址分为IPv4(IP协议的第四版)和IPv6(IP协议第六版)两大类。目前,最广泛使用的是IPv4。在该版本中规定,该地址是由32个二进制位组成,用来标识连接到网络的设备。由于让用户记住一串32位长的01字符确实比较困难,所以IP地址采用点分四组的表示法。下面以IPv4地址,来介绍点分四组表示法。
在点分四组表示法中,以A、B、C、D的形式构成IP地址的四组1和0。它们分别转换为十进制0到255之间的数,如下图所示:
上图显示了IPv4地址11000000.10101000.00000000.00000001,进行了点分四组的表示法。从图中,可以看到这样一串32位长的数字很不容易记住或者表示。但是采用点分四组的表示法,就可以将以上一个很长的字符串表示为192.168.0.1。这样,用户就比较容易记住。
IP地址之所以会被分成四个单独的部分,是因为每个IP地址都包含两个部分,分别是网络地址和主机地址。网络地址用来标识设备所连接到的局域网,而主机地址则标识这个网络中的设备本身。例如,IP地址192.168.254.1是一个32位的地址。假设它的网络部分是前24位(192.168.254),那么主机部分就是后8位(1)。处于同一个子网络的计算机,它们IP地址的网络部分必定是相同的。也就是说192.168.254.2应该与192.168.254.1处在同一个子网络。
但是,只查看IP地址是无法判断网络部分的。这时候就需要使用另一个参数“子网掩码”来判断。所谓的“子网掩码”就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字。它的网络部分全部为1,主机部分全部为0。
下面以IP地址10.10.1.22为例,其二进制形式为00001010.00001010.00000001.00010110。为了能够区分出IP地址的每一个部分,将使用子网掩码来表示。在本例中,10.10.1.22的子网掩码是11111111.11111111.00000000.00000000。这就意味着IP地址的前一半(10.10或者00001010.00001010)是网络地址,而后一半(1.22或者00000001.00010110)表示是该网络上的主机,如下图所示。
在该图中的子网掩码也可以写成点分四组的形式。比如子网掩码11111111.11111111.0000000.0000000,可以被写成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的形式。
TCP/IP协议定义了一个在因特网上传输的包,称为IP数据报(IP Datagram)。IP数据报是一个与硬件无关的虚拟包,由首部(header)和数据两部分组成。首部部分主要包括版本、长度、IP地址等信息。数据部分一般用来传送其它的协议,如TCP、UDP、ICMP等。
IP数据报的“首部”部分的长度为20到60个字节,整个数据报的总长度最大为65535字节。因此,理论上一个数据报的“数据”部分,最长为65515字节。由于以太网数据报的“数据”部分,最长只有1500字节。因此如果IP数据报超过了1500字节,就需要分割成几个以太网数据报分开发送了。
1.熟悉并掌握Wireshark的基本操作。
2.加深对常用网络协议的理解,提高就业机会。
3.培养学生理论联系实践的研究兴趣。
捕获IP协议包和其它包有点区别,因为在IP协议中涉及到一个TTL(time-to-live,生存时间)值问题。TTL值指定数据包被路由器丢弃之前允许通过的网段数量。当数据包每经过一个路由器,其TTL值将会减一。关于TTL的详细信息,在后面进行介绍。为了证明TTL值的变化,本例中选择使用两个路由器来捕获数据包。捕获IP协议数据包的实验环境,如下图所示。
从上图中,可以看到使用两个路由器,将三台主机分割成两个网段。这三台主机的IP地址,在上图中已经标出。在本例中,Wireshark可以在PC1和PC2任意一台主机上运行。
任务描述:使用Wireshark抓取IP数据包以及IP分片数据包。
启动Wireshark,Filter选择IP协议。用户可以通过很多种方法,来捕获IP协议包,如访问一个网页,执行ping命令等。如果用户不是很清楚一些协议时,最好通过执行ping命令来捕获数据包。以免捕获大量的包,使用户无法很好的分析。下面分别使用这两种方法,捕获两个IP协议包的捕获文件。为方便查看,截图中均使用IP的显示过滤器对数据包进行过滤。
打开浏览器,访问https://www.baidu.com网站,将捕获到如下图所示的界面。(只作介绍,实验环境内访问不了baidu)
从该界面的Protocol列,可以看到捕获到有TCP、HTTP等协议的包。在这些包中,都包含由IP头部的详细信息。但是,这样可能会影响对IP协议包的分析。这里将该捕获文件保存为ip-baidu.pcapng中,有兴趣的同学,可以在后面通过学习了解了IP协议之后,再来自己动手分析此文件。
为了不受很多协议的影响,这里通过执行ping命令仅捕获ICMP协议的数据包。此时在主机PC1上执行ping命令,分别pingPC2和PC3。执行命令后,捕获到的数据包如下图所示:
从该界面的Protocol列,可以看到都是ICMP协议的包,而且每个包的颜色也都是相同的。虽然从该界面看到捕获到的数据包很多,但是只需要分析其中两个包,就可以很清楚的理解IP协议包格式。
在上面提到说,如果一个数据包超过1500个字节时,就需要将该包进行分片发送。通常情况下,是不会出现这种情况的。但是为了帮助用户更清晰的理解IP协议,下面通过使用ICMP包,来产生IP分片数据包。本节将介绍如何捕获到IP分片数据包。使用ICMP包进行测试时,如果不指定包的大小可能无法查看到被分片的数据包。由于IP首部占用20个字节,ICMP首部占8个字节,所以捕获到ICMP包大小最大为1472字节。但是一般情况下,ping命令默认的大小都不会超过1472个字节。这样,发送的ICMP报文就可以顺利通过,不需要经过分片后再传输。如果想要捕获到IP分片包,需要指定发送的ICMP包必须大于1472字节。
启动Wireshark,Filter选择IP协议,此时在主机PC1上执行ping命令,以产生ICMP数据包。执行命令如下所示:在该命令中,使用-l选项指定捕获包的大小为3000字节。
从以上输出信息中,可以看到捕获到每个包的大小都为3000字节。这时候,返回到Wireshark界面停止捕获数据,如下所示的界面:
从该界面可以很清楚的看到,和前面捕获到的数据包不同。在该界面Protocol列,显示了IPv4协议的包。这是因为发送的数据包过大,所以经过了分片后发送的。关于IP分片数据包,在后面将进行介绍。
任务描述:了解IP数据报首部格式以及TTL等重要知识点,并分析实验一的数据包。
源IP地址和目的IP地址都是IPv4数据报首部最重要的组成部分。但是,在固定部分的后面还有一些可选字段,并且其长度是可变的。下面将详细介绍IP数据报首部格式,如下表所示。
IP数据报首部格式:
在上表中,每个字段代表的含义如下所示:
版本号:指IP协议所使用的版本。通信双方使用的IP协议版本必须一致。目前广泛使用的IP协议版本号为4,即IPv4。
首部长度:IP的首部长度,可表示的最大十进制数值是15。注意,该字段所表示的单位是32位字长(4个字节)。因此,当IP首部长度为1111(即十进制的15)时,首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。
服务类型:优先级标志位和服务类型标志位,被路由器用来进行流量的优先排序。
总长度:指IP首部和数据报中数据之后的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为216-1=65535字节。
标识符:一个唯一的标识数字,用来识别一个数据报或者被分片数据包的次序。
标识:用来标识一个数据报是否是一组分片数据报的一部分。标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据包分片中的最后一个。标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时,才允许分片。
分片偏移:一个数据报是一个分片,这个域中的值就会被用来将数据报以正确的顺序重新组装。
存活时间:用来定义数据报的生存周期,以经过路由器的条数/秒数进行描述。
协议:用来识别在数据包序列中上层协议数据报的类型。
首部校验和:一个错误检测机制,用来确认IP首部的内容有没有被损坏或者篡改。
源IP地址:发出数据报的主机的IP地址。
目的IP地址:数据报目的地的IP地址。
选项:保留作额外的IP选项。它包含着源站选路和时间戳的一些选项。
数据:使用IP传递的实际数据。
以上详细介绍了IP包首部格式的每个字段。这里先有个概念,需要在分析包之前了解一下。下面将详细介绍。
存活时间(TTL)值定义了在该数据报被丢弃之前,所能经历的时间,或者能够经过的最大路由数目。TTL在数据报被创建时就会被定义,而且通常在每次被发往一个路由器的时候减1。
例如,如果一个数据报的存活时间是2,那么当它到达第一个路由器的时候,其TTL会被减为1,并会被发向第二个路由。这个路由接着会将TTL减为0。这时,如果这个数据报的最终目的地不在这个网络中,那么这个数据报就会被丢弃,如下图所示。
上图就是数据报经过路由器后,TTL值的变化。由于TTL的值在技术上还是基于时间的,一个非常繁忙的路由器可能会将TTL的值减去不止1。但是通常情况下,还是可以认为一个路由器设备在多数情况下只会将TTL的值减去1。
了解TTL值的变化是非常重要的。一般用户通常所关心的一个数据报的生存周期,只是其从源前往目的地所花去的时间。但是考虑到一个数据报想要通过互联网发往一台主机需要经过数十个路由器。在这个数据报的路径上,它可能会碰到被错误配置的路由器,而失去其到达最终目的地的路径。在这种情况下,这个路由器可能会做很多事情,其中一件就是将数据报发向一个网络,而产生一个死循环。如果出现死循环这种情况,可能导致一个程序或者整个操作系统崩溃。同样的,如果数据报在网络上传输时,数据报可能会在路由器直接持续循环,随着循环数据报的增多,网络中可用的带宽将会减少,直至拒绝服务(DoS)的情况出现。IP首部中的TTL域,就是为了防止出现这种潜在的问题。
数据报分片是将一个数据流分为更小的片段,是IP用于解决跨越不同类型网络时可靠传输的一个特性。一个数据报的分片主要是基于第二层数据链路层所使用的最大传输单元(Maximum Transmission Unit,MTU)的大小,以及使用这些二层协议的设备配置情况。在多数情况下,第二层所使用的数据链路协议是以太网,以太网的MTU是1500。也就是说,以太网的网络上能传输的最大数据报大小是1500字节(不包括14字节的以太网头本身)。当一个设备准备传输一个IP数据报时,它将会比较这个数据报的大小,以及将要把这个数据报传送出去的网络接口MTU,用于决定是否需要将这个数据报分片。如果数据报的大小大于MTU,那么这个数据报就会被分片。将一个数据报分片包括下列几个步骤,如下所示:
(1)设备将数据分为若干个可成功进行传输的数据报。
(2)每个IP首部的总长度域会被设置为每个分片的片段长度。
(3)更多分片标志将会在数据流的所有数据报中设置为1,除了最后一个数据报。
(4)IP头中分片部分的分片偏移将会被设置。
(5)数据报被发送出去。
通过前面对IP协议的详细介绍及数据包的捕获,现在就可以来分析IP数据包了。
这里以pingPC2捕获文件(文件名为ip-ping166.pcapng)中的某一帧为例,介绍IP数据包首部:
在该图中从Packet Details面板中,可以看到有IPv4协议的包。这里就详细介绍在该包中的详细信息,如下所示:
以上信息表示是第44帧信息,其大小为74个字节。
以上信息表示是以太网帧头部信息。其中,源MAC地址为02:00:04:78:01:7b,目标MAC地址为02:00:03:56:00:cf。
以上信息表示IPv4包头部信息。其中源IP地址为10.1.1.142,目标IP地址为10.1.1.166。在该包首部中还有很多其它字段的信息,下面将介绍该包中展开的所有信息。如下所示:
Internet Protocol Version 4, Src: 10.1.1.142 (10.1.1.142), Dst: 10.1.1.166 (10.1.1.166)
Version: 4 #版本号
Header length: 20 bytes #首部长度
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not
ECN-Capable Transport)) #服务类型
0000 00.. = Differentiated Services Codepoint: Default (0x00)
.... ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)
Total Length: 60 #总长度
Identification: 0x49ad (18861) #标识符
Flags: 0x00 #标志
0... .... = Reserved bit: Not set #保留位
.0.. .... = Don't fragment: Not set #不进行分片
..0. .... = More fragments: Not set #更多分片,这里的值为0,标识这是若干数据包中的最后一个分片
Fragment offset: 0 #分段偏移
Time to live: 128 #存活时间
Protocol: ICMP (1) #协议
Header checksum: 0x0000 [validation disabled] #首部校验和
[Good: False]
[Bad: False]
Source: 10.1.1.142 (10.1.1.142) #源IP地址
Destination: 10.1.1.166 (10.1.1.166) #目标IP地址
[Source GeoIP: Unknown] #源IP地理位置
[Destination GeoIP: Unknown] #目标IP地理位置
以上信息包括IP包首部的所有字段,对应到包首部格式中,如下表所示:
在该包中最后一行信息如下所示:
Internet Control Message Protocol
以上信息表示ICMP协议包信息。关于该协议的分析,在后面实验进行介绍。
前面介绍过TTL值是经过路由器后才发送变化。也就是说如果在同一网段中传输数据包时,TTL值是不变的。只有与非同网段的主机进行通信时,该数据包的TTL值才会发生变化。下面通过分析捕获文件,来确定TTL值是否是这样变化的。
这里同样以ping PC2捕获文件为例,分析同网段TTL值的变化。在ip.pcapng捕获文件中,44~100帧都是主机PC1(10.1.1.142)和PC2(10.1.1.166)之间的通信。这八帧可以说是4个完整的数据包,也就是通过ICMP协议的发送和响应包。这里以捕获文件中的44、45帧为例,分析这两个包中的TTL值。其中44、45帧的信息如下图所示。
从上面的Wireshark界面的中的No.列可以看到44、45帧包信息分别是Echo(ping)request(请求)和Echo(ping)reply(响应)。也就是说10.1.1.142(PC1)发给10.1.1.166的包是一个请求包,10.1.1.166(PC2)的包是一个响应包。其中,这两台主机是在同一个网络中,所以这两个包的TTL值应该相同。下面分别来看这两个包中IP包首部的响应信息。
第44帧的IP包首部信息如下所示:
以上信息是第44帧中IPv4首部的详细信息。从中可以看到,该包中的TTL值是128。
第45帧的IP包首部信息如下所示:
从以上信息中,可以看到每个字段的信息都和第44帧IP包首部的信息都相同。这两个包中的生存期(TTL),没有发生变化。这是因为,主机PC1和PC2在同一个网段内,它们之间传输的数据不需要经过路由器。
下面以pingPC3(百度的域名)文件(文件名为ip-pingbaidu.pcapng)为例,分析不同网段TTL值的变化。在捕获文件中,66-107帧(帧数错乱是因为中间夹着这其他协议)是PC1和PC3不同网段主机之间通信的数据包,如下图所示:
在该界面显示的包同样是四个完整的ICMP包,一个是请求包,一个是响应包。这里分析66、68帧中IPv4首部的详细信息,如下所示。
第66帧IPv4首部信息,如下所示:
以上包信息,是主机PC1发送给PC3的IP包首部信息。其中,TTL值为128。第68帧IPv4首部信息,如下所示:
以上包信息,是主机PC3发送给PC1的IP包首部信息。从以上信息中,可以看到该IPv4首部中TTL值为54。由此可以说明,PC3发送回PC1的数据包经过了很多路由器,具体数目,请同学根据之前的知识点推算。
我们以ping PC2(10.1.1.166)机器加-l 3000,捕获文件(文件名为ip-ping-fragments.pcapng)为例,详细分析IP分片。打开捕获文件,显示界面如下图所示。
在该捕获文件中,也是捕获了四个ping包。200~207帧是一个完整的ping包,其中200~202帧是ping请求包,205~207帧是ping响应包。也就是说,将一个ping请求包,分成了200-202的数据包。下面将详细分析200~203帧的详细信息。
第200帧数据包详细信息如下图所示:
IP协议之前的信息,请同学参照上面的讲解,这里不重复。
下面信息表示IPv4头部信息。在该头部包括了具体的详细信息。展开该行信息,内容如下所示:
以上信息是第200帧IPv4首部的详细信息。从以上更多分片和分片偏移域部分,可以判定该数据包是分片数据包的一部分。这是后被分片的数据包,就会有一个大于0的分片偏移或者就是设定了更多标志位。从以上信息,可以看到更多分片标志位被设定(见上图第一个红框),也就是接收设备应该等待接收序列中的另一个数据包。分片偏移为0(见上图第二个红框),表示这个数据包是这一系列分片中的第一个包。所以,后面至少还有一个包以上信息对应的IPv4首部格式中,显示结果如下表所示:
接下来,分析第二条信息,第201帧数据包详细信息如下图所示。
IP协议之前的信息,请同学参照上面的讲解,这里不重复。
下面信息表示IPv4头部信息。在该头部包括了具体的详细信息。展开该行信息,内容如下所示以上信息表示IPv4首部的详细信息。下面将详细分析该包中每个字段的值,如下所示:
根据以上信息介绍,可以看到在该包的IPv4首部也设定了更多分片的标位(见上图第一个红框)。而且可以看到,这里的分片偏移值为1480(见上图第二个红框)。该值是由最大传输单元(MTU)1500,减去IP首部的20个字节得到的。以上信息对应到IPv4首部格式中,显示信息如下表所示:
第202帧数据包详细信息如下图所示。
IP协议之前的信息,请同学参照上面的讲解,这里不重复。
下面信息表示IPv4头部信息。在该头部包括了具体的详细信息。展开该行信息,内容如下所示。以上信息表示IPv4首部的详细信息。下面将详细分析该包中每个字段的值,如下所示:
以上信息表示IPv4首部信息,这里着重分析该部分的详细信息。如下所示:
根据以上信息的描述,可以看到该数据包没有设定更多分片标志位(见上图第一个红框),也就表示该数据包是整个数据流中的最后一个分片。并且其分片偏移设定为2960(见上图第二个红框),是由1480+(1500-20)得出的结果。这些分片可以被认为是同一个数据序列的一部分,因为它们IP首部中的标志位(0x72b7)于拥有相同的值。并且在协议末尾,Wireshark分析出此三个分片,组成一个完成的请求。以上信息对应到IP首部格式,如下表所示。