《TCP/IP网络协议栈:以太网数据包结构、802.3》
《TCP/IP网络协议栈:ARP协议详解》
《TCP / IP攻击:ARP缓存中毒的基本原理、TCP序列号预测和TCP重置攻击》
《TCP/IP网络协议栈:IP协议》
目录
01 IP地址
1.1、简介
1.2、IP地址的组成
1.3、IP地址分类
1.4、特殊IP地址
1.5、子网掩码
02 IP数据包组成
03 IP分片解析
04 IP分片攻击
之前的文章《以太网数据包结构》《TCP/IP网络协议栈:以太网数据包结构、802.3》可以看出图表示IP协议的数据结构
IP协议(Internet Protocol)又称之为网际协议,IP协议处于IP层工作,它是整个TCP/IP协议栈的核心协议之一,上层协议都要依赖IP协议提供的服务,IP协议负责将数据报从源主机发送到目标主机,通过IP地址作为唯一识别码。所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。它的特点如下:
不可靠(unreliable):它不能保证IP数据包能成功地到达目的地。IP仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端。任何要求的可靠性必须由上层来提供(如TCP) 。无连接(connectionless):IP并不维护任何关于后续数据报的状态信息。每个数据包的处理是相互独立的。这也说明,IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。
01 IP地址
1.1、简介
IP协议在生活中最常见的方式就是IP地址,如果下图
IP地址(InternetProtocol Address),缩写为IPAdress,是一种在Internet上的给主机统一编址的地址格式,也称为网络协议(IP协议)地址。它为互联网上的每一个网络和每一台主机分配一个逻辑地址,常见的IP地址,分为IPv4与IPv6两大类,当前广泛应用的是IPv4,目前IPv4几乎耗尽,下一阶段必然会进行版本升级到IPv6;如无特别注明,一般我们讲的的IP地址所指的是IPv4。
1.2、IP地址的组成
IP地址由两部分组成:
网络部分(NETWORK)主机部分(HOST)
网络标识:标明具体的网段相同是同一网段,可ping通。
主机标识:标明具体的某个节点,也就是某个网络中的特定的计算机号码。
根据网络部分占用的位数,IP地址按照下面规则进行分类。
1.3、IP地址分类
IP地址分A、B、C、D、E五类,其中A、B、C这三类是比较常用的IP地址,D、E类为特殊地址。
A类:(1.0.0.0-126.0.0.0)(默认子网掩码:255.0.0.0或0xFF000000)第一个字节为网络号,后三个字节为主机号。该类IP地址的最前面为“0”,所以地址的网络号取值于1~126之间。一般用于大型网络。B类:(128.0.0.0-191.255.0.0)(默认子网掩码:255.255.0.0或0xFFFF0000)前两个字节为网络号,后两个字节为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。一般用于中等规模网络。C类:(192.0.0.0-223.255.255.0)(子网掩码:255.255.255.0或0xFFFFFF00)前三个字节为网络号,最后一个字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。一般用于小型网络。D类:是多播地址。该类IP地址的最前面为“1110”,所以地址的网络号取值于224~239之间。一般用于多路广播用户。E类:是保留地址。该类IP地址的最前面为“1111”,所以地址的网络号取值于240~255之间。
1.4、特殊IP地址
1、环回地址
127.x.X.X这样的网络地址,称之为环回地址(通常使用127.0.0.1),环回地址为本机网络软件测试和进程通信提供了方便。发送到这个地址的数据包不会输出到实体的网络上,而是送给系统的环回接口,使用环回地址作为目的地址的数据包不应该出现在网络中。环回地址使得A类地址少了一个网络号。
2、网络地址
主要是用于标识不同的网络,它不指向具体的哪一个主机或设备,而是标识属于同一个网络的主机或网络设备的集合。对任意一个P地址来说,将其地址结构中的主机号全部取0,就得到了主机所处的网络地址。例如,某主机IP地址为134.89.32.33,它属于B类地址,将其后两个主机号字节全部取0,则得到这个主机所处的网络地址为134.89.0.0。当一个数据包到达一个网络时,该网络的路由器首先判断数据包的目的网络是否与本地网络号相匹配,如果两个地址不匹配,那么路由器将根据合适的算法对数据包进行转发;只有两个地址相互匹配,路由器才会查找相应的主机号进行主机的匹配,最后将数据包发送给指定的主机。网络地址占用了A、B、C三类地址中的每个网络号下的一个主机号。
3、直接广播地址
在一个网络内,直接广播地址是指对应主机号全部取1而得到的IP地址,广播地址代表本网络内的所有网络设备,使用该地址可以向属于同一个网段内的所有网络设备传送数据。例如:一个标准C类地址202.197.15.44,由于它的网络号由前面3个字节组成,主机号仅是最后一个字节,将主机号位全部取1得到的地址是202.197.15.255,这个地址即是这个网络的广播地址。直接广播地址和上面说的网络地址一样,也使得某网络中的1个主机号不能被分配给具体主机。
A、B、C三类网络的网络地址和广播地址结构如下所示:A类:网络地址为:x.0.0.0,广播地址为:X.255.255.255;B类:网络地址为:x.x.0.0,广播地址为:X.X.255.255;C类:网络地址为:x.x.x.0,广播地址为:X.X.X.255。
4、受限广播地址
IP地址32位全部为1,即“255.255.255.255",代表本地受限广播。该地址用于向本地网络中的所有主机发送广播信息。广播地址本质上是个E类地址。
5、本网络上的特定主机
当用户想与本网络内部特定主机通信时,可以将网络号对应字节全部设置为0进行简化。如当具有B类地址的某个主机发送数据包时,数据包中的目标IP地址为0.0.11.32,则表示数据包要发送到网络中主机号为11.32的主机处。该地址本质上是个A类地址。
6、本网络本主机
IP地址32位全部为0,即“0.0.0.0”,表示本网络上的本主机。这个地址用某个主机启动时需要通信,但暂时不知道自己的IP地址,此时主机为了获得一个有效IP地址,将发送一个数据包给有限广播地址,并用全0地址来标识自己。接收方知道发送方还没有IP地址,就会采用一种特殊的方式来发送回答,此地址不应该作为目的地址使用。该地址本质上是个A类地址。
以上6中特殊的IP地址不能分配给任何主机,下面的专用地址却可以被分配给多个主机,当然,这些主机之间互不关联,他们处于不同的局域网内。
1.5、子网掩码
标准IP地址使用网络号和主机码两层地址结构,这样当大量的个人用户和小型局域网用户接入互联网时,即使为其分配一个C类网络也会造成IP地址的大量浪费,况且,随着目前Internet用户数量的剧烈增长,IP地址的分配变得格外紧张,为每个物理网络分配一个网络号的做法变得很不现实。
因此,现在流行一种扩展的分组编址方案来节省网络号的使用,这种方法称为子网编址,子网掩码将网络进一步划分为若干子网,以避免主机过多而拥堵或过少而IP浪费。子网掩码和IP地址做“与”运算,分离出IP地址中的网络地址和主机地址,用于判断该IP地址是在本地网络上,还是在远程网络网上。目前互联网内的主机基本都已支持子网编址。
子网掩码的组成
同IP地址一样,子网掩码是由长度为32位二进制数组成的一个地址,子网掩码32位与IP地址32位相对应,IP地址如果某位是网络地址,则子网掩码为1,否则为0。
注意:
左边连续的1的个数代表网络号的长度,右边连续的0的个数代表主机号的长度。
子网掩码的表示方法
1、点分十进制表示法。
二进制转换十进制,每8位用点号隔开。
例如:子网掩码二进制11111111.11111111.11111111.00000000,表示为255.255.255.0。
2、CIDR斜线记法。
IP地址/n。
例1:192.168.1.100/24,其子网掩码表示为255.255.255.0,二进制表示为11111111.11111111.11111111.00000000。
子网掩码和IP地址的关系
根据IP地址和子网掩码,计算网络地址:
①、将IP地址与子网掩码转换成二进制数。
②、将二进制形式的IP 地址与子网掩码做“与”运算。
③、将得出的结果转化为十进制,便得到网络地址。
举个栗子:
IP地址:192.168.10.215
子网掩码:255.255.255.0
子网划分
注意,这部分有点绕,不用仔细研究,有工具帮助我们计算,我们知道原理,可以熟练使用工具即可。
以C类子网划分为例
将192.168.0.0255.255.255.0 这个网络等分成4个子网。
分析:要想分成4个子网,需要将子网掩码往右移动两位,这样第1位和第2位就变为网络位,就可以分成4个子网。
因为二进制数0和1按两位排列组合,只有这4种,分别为:00,01,10,11,如下图所示。
00是A子网01是B子网10是C子网11是D子网
借用主机2位,所以子网掩码+2位,由原来的255.255.255.0(/24)变为255.255.255.192(/26)。
结论:C类网络等分成4个子网,子网掩码往右移动2位,就能等分成4个子网,即2^2。
子网划分结果
最终结果:
A子网的网络地址:192.168.0.0/26,可用地址(192.168.0.1~192.168.0.62),广播地址:192.168.0.63/26。B子网的网络地址:192.168.0.64/26,可用地址(192.168.65~192.168.0.126),广播地址:192.168.0.127。C子网的网络地址:192.168.0.128/26,可用地址(192.168.129~192.168.0.190),广播地址:192.168.0.191。D子网的网络地址:192.168.0.192/26,可用地址(192.168.193/26~192.168.0.254),广播地址:192.168.0.255。
这部分只是需要好好理解,日常并不需要我们手动计算这些,了解原理即可,有工具可以帮我们计算。
/convert/subnetmask.html
(提示:公众号不支持外链接,请复制链接到浏览器下载)
和上面计算是一样的。
02 IP数据包组成
由上面可知IP协议类型是0800
IP数据包组成结构如下图,
(1)版本:占4位,指IP协议的版本。通信双方使用的IP协议版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。关于IPv6,本文不讲解。(2)首部长度:占4位,可表示的最大十进制数值是15。请注意,这个字段所表示数的单位是32位字长(1个32位字长是4字节),首部长度包括选项字节,因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。首部长度限制为60字节的缺点是有时可能不够用。但这样做是希望用户尽量减少开销。最常用的首部长度就是20字节(即首部长度为0101),这时不使用任何选项。由于以太网MTU是1500,常用IP头20字节,所以IP数据最大1480字节。(3)区分服务:占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务DS(Differentiated Services)。只有在使用区分服务时,这个字段才起作用。该字段主要用于描述当前IP数据报急需的服务类型,如最小延时、最大吞吐量、最高可靠性、最小费用等。路由器在转发数据报时,可以根据这个字段的值来为数据报选择最合理的路由路径。(4)总长度:总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为216-1=65535字节。在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU(Maximum Transfer Unit)。当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。数据长度46~1500字节,至于最小为什么是46,在上一篇文章《以太网头数据》讲解了,以太网,则要求最少要有46字节。(5)标识(identification)占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。(6)标志(flag):占3位,但目前只有2位有意义。 ●标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个●标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。(7)片偏移:占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。
(8)生存时间:占8位,生存时间字段常用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。最初的设计是以秒作为TTL的单位。每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,就把TTL值减1。当TTL值为0时,就丢弃这个数据报。这个字段规定该数据包在穿过多少个路由之后才会被抛弃(这里就体现出来IP协议包的不可靠性,它不保证数据被送达),某个ip数据包每穿过一个路由器,该数据包的TTL数值就会减少1,当该数据包的TTL成为零,它就会被自动抛弃。这个字段的最大值也就是255,也就是说一个协议包也就在路由器里面穿行255次就会被抛弃了,根据系统的不同,这个数字也不一样,一般是32或者是64,Tracerouter这个工具就是用这个原理工作的,tranceroute的-m选项要求最大值是255,也就是因为这个TTL在IP协议里面只有8bit。(9)协议:占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。(10)首部检验和:占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。(11)源IP地址:占32位,即IP地址。(12)目的IP地址:占32位,即IP地址。注意:标识、标志和片偏移在IP数据分片时使用,在后面IP分片会详细讲解。
在wireshark软件解析IP数据结构如下:
03 IP分片解析
分片指的是需要传送的数据大于最大传输单元(MTU)的时候,就需要分成多个包,然后一个个发送给对方。我们在重温下图。
上图告诉我们以太网IP数据一帧最大承载1500字节。
所以我们需要IP分片,上文说到,IP头信息的标识,标志,片偏移会在IP分片时详细讲解。
标识(Identification):确认这几个分片包是否来源于同一个数据包标志(Flag):1bit保留,2bit意思是“不能分片”。只有当DF=0时才允许分片。3bit意思是MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个片偏移(FragmentOffset):数据包分片地址偏移
例子:
一般情况下会有20个字节的头数据,疑惑的同学可以向上翻,上文有解释。
IP在从上层接到数据以后,要根据IP地址来判断从那个接口发送数据(通过选路),并进行MTU的查询,如果数据大小超过MTU就进行数据分片。数据的分片是对上层和下层透明,而数据也只是到达目的地还会被重新组装,不过不用担心,IP层提供了足够的信息进行数据的再组装。
在IP头里面,16bit识别号唯一记录了一个IP包的ID,具有同一个ID的IP片将会被重新组装;而13位片偏移则记录了某IP片相对整个包的位置;而这两个表示中间的3bit标志则标示着该分片后面是否还有新的分片。这三个标示就组成了IP分片的所有信息,接受方就可以利用这些信息对IP数据进行重新组织(就算是后面的分片比前面的分片先到,这些信息也是足够了)。
对于上面的例子我们可以使用wieshark软件抓包看一下,使用下列命令:
ping -n 1 192.168.0.102 -l 4000
-n 1表示只ping1次-l 4000表示发送4000个字节
三个数据包分析:
可以看到,但数据提交到网络层的时候,由于数据超过了最大传输单元,就分片了,上述图片验证了DF和MF的功能,并且验证了IP分片的数据包标识(Identification)是一致的。每个数据包最大的字节为MTU- IP头= 1500 - 20 = 1480。
这里把wireshark的抓包文件分享出来,大家可以自行分析下,
链接:/s/1PddAuTU97066dA027jyclA提取码:tm9i
(提示:公众号不支持外链接,请复制链接到浏览器下载)
04 IP分片攻击
黑客构造的分片报文,但是不向接收方发送最后一个分片报文,导致接收方要为所有的分片报文分配内存空间,可由于最后一个分片报文永远不会达到,接收方的内存得不到及时的释放(接收方会启动一个分片重组的定时器,在一定时间内如果无法完成重组,将向发送方发送ICMP重组超时差错报文,,只要这种攻击的分片报文发送的足够多、足够快,很容易占满接收方内存,让接收方无内存资源处理正常的业务,从而达到DOS的攻击效果。