IPv4
即IP协议版本4(IP version 4)。
目录
IPV4分组
IPv4分组格式
一个IP分组由首部和数据部分组成,首部前一部分的长度固定,一共20B,是所有首部必须具有的东西。在这些固定的部分后头可以增加一些额外的信息,也就是说IP分组的首部长度是可变的,而在固定部分后头加的东西一般都拿来提供错误检测等安全机制。IP数据报格式如下:

首部最后的长度一定是4B的倍数(可选字段如果不满足是4B的倍数,后面会有一段填充字段)。
IP首部的重要字段含义如下:
-
版本:占4位,指IP协议的版本(分为IPv4和IPv6),目前用的最多的是IPv4
-
首部长度:占4位,单位为4B,可表示最大值为60B(15*4B),一般的时候首部长度的字段值都为5(0101),即20B,也就是首部的固定长度。
-
总长度:占16位,单位为1B,可表示最大长度为65535B(0xFFFF*1B),但是注意,以太网的最大数据帧长为1500B,也就是说当一个IP数据报封装成帧时,数据报的总长度一共不能超过下面的数据链路层的最大数据帧长(MTU),如果超过了,就只能分片了
-
标识:占16位,是一个计数器,用来数人头的。接收方可以借此判断接受的内容是否完整,如果不完整,少的是哪一块
-
标志:占3位,但是只有低两位,最低的那一位是MF(more fragment),当MF=1的时候就表示后面还有分片,当MF=0的时候就表示当前分片是最后一个分片了。中间的那一位是DF(don't fragment)当DF=1时表示这个数据报是完整的,没有分片,此时MF不起作用,DF=0时表示这个数据包被分片了,那就看MF是不是最后一个分片
-
片偏移:占13位,单位为8B,用来指示较长的分组在分片后,某个分片在原来分组中的相对位置,片偏移以8B为偏移单位,除了最后一个分片以外,每个分片的长度都一定是8B的倍数
-
生存时间:占8位,表示该数据报的存活时间,在每个接收方处都先减一,如果存活时间为0了,而接收方地址不是目的地址的话,接收方就丢弃这个数据报并发送一个报错信息。
-
协议:占8位,表示这个分组携带的数据使用什么协议,即分组上的数据部分要上交给哪个协议处理。其中值为6表示TCP,值为17表示UDP
-
首部校验和:占16位,首部校验只校验分组的首部,而不管数据部分
-
源地址字段:占32位(4B),标识发送方的IP地址
-
目的地址字段:占32位(4B),标识接收方的IP地址
IP数据报分片
链路层数据报能承受的最大的数据量称为最大传送单元(MTU)。IP数据报被封装在链路层的数据报中(帧),因此链路层的MTU严格限制着IP数据报的长度。当IP数据报的长度大于MTU时,就得对这个数据报进行分片,把IP数据报中的数据部分分装在多个较小的IP数据报中,这些较小的数据报称为分片。
分片的重组要使用到IP数据报首部的标识,标识和片偏移三个字段来完成。只有当DF=0时,MF才有意义。同时IP数据报分片涉及一定的计算。

如图所示,我们把数据部分长为3800B的数据报给分片,分成三个小的数据报,大小分别为(1400B,1400B,1000B,首部占了20B,MTU为1420B)
IPv4地址和NAT
IPv4地址
连接到因特网的每台主机或路由器都会分配一个32比特的全球唯一的一个标识符,我们称之为IP地址。早期的IP地址是分类的,分成5类,如图所示

无论哪类IP地址,都由网络号和主机号两部分组成。即IP地址={<网络号>,<主机号>}。其中网络号标志主机(或路由器)所连接的网络。一个网络号在整个因特网范围内必须是唯一的。主机号标志该主机或路由器。一台主机号在他网络号所指明的范围内必须是唯一的。由此可见,一个IP地址在整个因特网范围内是唯一的。

各类IP地址中有些IP地址有特殊用途,不用做主机的IP地址:
-
主机号全为0表示网络本身
-
主机号全为1表示本网络的广播地址(当主机号全为1时,这个数据报就是广播数据报),又称直接广播地址
-
127.x.x.x是环回自检地址,这个地址表示主机本身,同时这个IP数据报永远不会出现在网络上,是用来检测主机自身的功能的(这也是为啥A类网络最大可用网络数要比B和C类少一个的原因)
-
32位全为0,即0.0.0.0表示的是网络上的本主机(一般这个时候本主机还没被赋予IP地址,就用0.0.0.0代表自己)
-
32位全为1,即255.255.255.255表示的是整个TCP/IP的广播地址,又称广播受限地址(用的比较少,没怎么见过,一般用来表示本网络的广播地址)
-

网络地址转换(NAT)
工作在传输层
NAT用于将专用网络地址转换为公用网络地址,从而对外隐藏内部管理的IP地址。它使得整个专用网络只需要一个全球IP就可以与因特网联通。NAT节省了IP地址的消耗,同时隐藏了内部网络结构,降低了内部网络被攻击的风险。
为了网络安全,我们把A,B,C三类IP地址划分为私有地址,这些私有地址可以被不同的局域网重复使用(也就是说局域网A内有一个192.168.1.1,而局域网B里头也能有一个192.168.1.1的IP地址),但是如此一来,局域网内的主机要和别的局域网内的主机交流的话,就必须要先把自己的局域网的IP地址转换为广域网的IP地址,这样才能进行交流通信。而这个时候就轮到NAT出场了
NAT路由器至少有一个有效的外部全球IP地址。当局域网内的主机和外界通信时,NAT路由器使用NAT转换表进行本地IP地址和全球IP地址的转换。NAT转换表存放着{本地IP地址:端口}到{全球IP地址:端口}的映射。通过这种映射方式,可以让多个私有IP地址映射到一个全球IP地址

如图是一个NAT转换表,我们可以看到,WAN端只有一个IP地址,但是它用不同的端口来映射了不同LAN端的不同的IP地址,这样一来就做到了在广域网内节省了IP地址(毕竟广域网内只用了一个IP地址就表示了一堆主机)

假设左端(LAN端)的IP地址为192.168.0.3(随机端口为30000)的主机向IP地址为213.18.2.4的主机发送信息,NAT路由器收到IP分组后,为该IP分组生成一个新的端口号40001,同时把IP分组的源地址改为172.38.1.5,之后进行转发并把这个映射关系写到NAT转换表内。响应分组到达NAT转换器之后,通过NAT转换表将IP分组的目的地址改成192.168.0.3(端口改为30000),如此一来就完成了局域网内的主机与广域网上的主机的一次通信。
注意:普通路由器在转发IP数据报时,不改变其源IP地址和目的IP地址。而NAT路由器会改变。普通路由器仅工作在网络层,而NAT路由器转发数据报时需要查看和转换传输层的端口号。
子网划分与子网掩码、无分类编址CIDR
子网划分
两级IP地址(上文所提到的A,B,C,D,E五类IP地址,它们都只有网络号和主机号,一共两级,我们称之为两级IP地址)有很多缺点:IP地址的空间利用率很低,给每个物理网络分配一个网络号会使路由表变得太大而使网络性能变坏,两级IP地址不够灵活。因此,我们给IP地址里头再增加一个子网号字段,把两级IP地址变成三级IP地址。这种做法称为子网划分。
子网划分的基本思路如下:
-
子网划分纯属一个单位内部的事情,单位对外仍然表现为没有划分子网的网络
-
从主机号借用若干比特作为子网号字段,当然主机号也就相应减少了相同的比特。三级IP地址的结构如下:IP地址={<网络号>, <子网号>, <主机号>}
-
凡是从其他网络发送给本单位的主机的IP数据报,仍然是首先按照网络号找到相应的路由器,再通过网络号和子网号找到目的子网,最后通过主机号找到主机
注意:
-
划分子网只是把IP地址的主机号这一字段进行再划分,而不改变IP地址原来的网络号。因此,从一个IP地址本身或IP数据报的首部,我们看不出来有没有进行子网划分
-
不论是分类IPv4还是CIDR,其子网中的主机号为全0或全1的地址都不能使用,全0的地址表示为子网的网络号,而全1表示为广播地址。
子网掩码
为了告诉主机或路由器对一个A类,B类,C类网络进行了子网划分,使用子网掩码来表达对原网络中主机号的错位
子网掩码由一串1和跟随的0组成。其中,1对应的是IP地址中的网络号和子网号,而0对应的是主机号,计算机只需将子网掩码和IP地址进行与运算就能得出相应子网的网络地址(此时主机位全为0,得到的就是网络地址而不是主机地址)
在路由器进行通信时,必须把自己所在网络(子网)的子网掩码告诉对方。路由表中的每个条目,除了要给出目的网络地址和下一跳地址之外,还要同时给出目的网络地址的子网掩码。
注意:
-
一台主机在设置IP地址信息的同时,必须设置子网掩码
-
同属于一个子网的所有主机以及路由器的相应端口,必须设置相同的子网掩码
-
路由器的路由表中,包含信息的主要内容有:目的网络地址,子网掩码,下一跳地址三样
无分类编制CIDR
是在变长子网掩码的基础上提出的一种消除传统A,B,C类网络划分,并且可以在软件的支持下实现超网构造的一种IP地址的划分方法。
CIDR可以大幅度提高IP地址的空间利用率,减小路由器的路由表大小,提高路由转发能力。
CIDR消除了传统ABC类地址以及划分子网的概念,因而可以更有效地分配IPv4的地址空间,CIDR使用"网络前缀"的概念代替子网络的概念,与传统分类IP地址最大的区别是:前缀的长度不是固定不变的,可以任意选取。CIDR的IP地址构造={<网络前缀>, <主机号>}
CIDR的一大特征是斜线记法,也就是IP地址后面会跟一个斜线,斜线后会写明网络前缀所占的位数,例如128.14.32.5/20,这一个IP地址的前20个比特就是网络前缀,那么这个IP地址相对应的子网掩码的格式就是前20位是1,后面的12位都是0
CIDR虽然不使用子网,但是它一样需要子网掩码来区分网络前缀和主机号。
将网络前缀相同的连续IP地址组成一个"CIDR地址块"。一个CIDR地址块可以表示很多地址,这种地址的聚合我们称之为路由聚合,又称构成超网。
例如:

如图所示,如果不使用构成超网,R1路由器的路由表中就得存两个表项,一个是206.1.0.0/17,另一个是206.1.128.0/17,但是我们发现,这两个表项的下一跳地址都是R2路由器,那么我们可以把网络前缀减少1,也就是斜线后面的17变为16,我们就能把这两个不同的网络合成一个网络了,至于这两个网络要如何划分,交给R2路由器就好,如此一来,R1路由器中的路由表就变小了,变小后的那个目的网络地址,子网掩码,下一跳地址如下表所示
| 目的网络地址 | 子网掩码 | 下一跳地址 |
|---|---|---|
| 206.1.0.0 | 0xffff 0000 | R2路由器地址 |
CIDR地址块中的地址数一定是2的整数次幂,但是实际可指派的地址数通常要减去2,全0表示网络号,全1表示广播地址。
CIDR的优点在于网络前缀长度的灵活性,由于上层网络的前缀长度较短,因此相应的路由表的项目较少,而内部又可采用延长网络前缀的方法来灵活的划分子网。
最长前缀匹配(最佳匹配),即使用CIDR时,路由表中的每个项目由"网络前缀"和"下一跳地址"组成,在查找路由表时可能会得到不止一个匹配结果。此时,我们从所有匹配结果中选出具有最长网络前缀的路由,因为网络前缀越长,所描述的路由就越具体。那么我们可以从网络前缀最长的项开始逐个匹配,直到匹配到相同的网络前缀为止。
网络层转发分组的过程
当分组到达路由器后,路由器根据目的IP地址的网络前缀来查找转发表,确定下一跳应当到哪个路由器。因此,再转发表中,每条路由必须具有以下两条信息:目的网络地址,下一跳地址。
如此一来,IP数据报最终一定可以找到目的主机所在目的网络上的路由器(可能中间要经过多次间接交付),当到达最后一个路由器时才试图向目的主机进行直接交付。
采用CIDR编址的时候,如果一个分组在转发表中可以找到多个匹配的前缀,那么就选前缀最长的那一项。
转发表中还会增加两种特殊的路由:
-
主机路由:对特定主机的IP地址专门指定一个路由,以方便管理员控制和调试网络。假设这个IP地址是a.b.c.d,那么在路由表的转发表里头相对应的网络是a.b.c.d/32,/32所表示的网络没有意义(毕竟连主机号都没有),但是可以被用在转发表中
-
默认路由:用特殊前缀0.0.0.0/0表示默认路由。全0掩码和任何目的地址进行与运算,得出来的结果必然全是0,也就是必然和转发表中的0.0.0.0/0相匹配。所以只要目的网络是别的网络,就一律选择默认路由
路由器执行分组转发的算法如下:
-
从收到的IP分组的首部提取出IP地址
-
若查找到特定主机路由,就按照这条路由的下一跳转发分组。否则从转发表中的下一条开始检查
-
将这一行的子网掩码与目的地址相与,,如果运算结果和本行的前缀匹配,那么查找结束,按照下一跳指出的路由进行处理。否则,如果转发表还有下一行,那么对下一行进行检查
-
如果所有行数都检查过了,但是还是没有找到相匹配的前缀的话,还有一个默认路由,我们这个时候把分组传送给默认路由。但是如果连默认路由都没有的话,就只能丢弃这个IP数据报,然后发送一个报错。
注意:得到下一跳路由器的IP地址后,并不是直接将该地址填入待发送的数据报,而是将该IP地址转换成MAC地址(通过ARP),将这个MAC地址填入MAC帧的首部中,然后根据这个MAC地址找到下一跳路由器。在不同的网络中传送时,MAC帧中的源地址和目的地址要发生变化,但是网桥在转发帧时,不改变帧的源地址,注意区分(真正拿来传输的还是数据链路层,IP数据报被包装在MAC帧中,传输的时候还是得知道MAC帧的下一跳的位置)
ARP、DHCP和ICMP
IP地址与硬件地址
首先,数据链路层是看不见数据包分组里的IP地址的,整个IP数据报对于数据链路层来说都是帧的数据部分
由于路由器的隔离,IP网络中无法通过广播MAC地址来完成跨网络寻址,因此在网络层只使用IP地址来完成寻址。寻址时,每个路由器依据其路由表,选择到目标网络需要转发到的下一跳,而IP分组通过多次路由转发,到达目标网络之后,改为在目标LAN中通过数据链路层的MAC地址以广播的方式寻址。这样可以提高路由选择的效率。
-
在IP层抽象的互联网上只能看到IP数据报
-
虽然在IP数据报的首部中有源IP地址,但是路由器只看目的IP地址,根据目的IP地址进行转发
-
在局域网的链路层只能看见MAC帧。IP数据报作为MAC帧的数据内容被封装起来了。所以IP数据报通过路由器转发的时候,都会被解封转和重新封装成MAC帧,而这个MAC帧的源地址和目的地址都会不断地改变,只有里边的IP目的地址不会改变,这也是为啥MAC地址无法被用来跨网络通信
-
尽管互联在一起的网络的硬件体系不一样,但是网络层把这些都抽象掉了,形成一个逻辑上统一的IP地址来研究不同主机之间的通信。
注意:路由器由于互联多个网络,所以路由器不仅有多个IP地址,它还拥有多个硬件地址(MAC地址)
地址解析协议(ARP)
无论网络层用什么协议,在实际的链路上传送数据的时候,还得是用硬件地址(MAC地址),所以我们需要一个IP地址到MAC地址的映射。如此一来就诞生了ARP。每台主机都有一个ARP高速缓存,用来存放本局域网上的各个主机和路由器的IP地址到MAC地址的映射表,我们称为ARP表。而ARP不是一成不变的,所以我们需要用ARP来维护ARP表。
ARP工作在网络层,工作原理如下:
主机A想要向本局域网上的某台主机B发送IP数据报时,现在ARP高速缓存中看看有没有主机B的IP地址。如果有,就可以查出来对应的硬件地址,那么就可以把它填入MAC帧里头,然后通过局域网将MAC帧发送到这个硬件地址。如果没有,那么就通过使用目的的MAC地址为FF-FF-FF-FF-FF-FF的帧来封装并广播ARP请求分组(广播发送),使同一个局域网里头的所有主机都接受到这个ARP请求。主机B收到请求后,向主机A发送相应分组(单播发送),分组中包含主机B的IP地址与MAC地址之间的映射关系。主机A收到分组之后就把这个映射写道ARP缓存里面,然后按查询到的硬件地址转发MAC帧。ARP由于看到了IP地址,所以它工作在网络层,而NAT路由器由于看到的是端口,所以它工作在传输层。
注意:
ARP通常用来解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题。如果所要找的主机和源主机不在同一个局域网上,那么就要通过ARP找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工作就交给下一个网络来做就ok。ARP请求是广播分组,而响应是单播分组。
动态主机配置协议(DHCP)
动态主机配置协议常用于给主机动态的分配IP地址,它提供了即插即用的联网机制,这种机制允许一台计算机加入新的网络和获取IP地址而不用手工参与。DHCP是应用层协议,它是基于UDP的。
DHCP工作原理如下: 使用客户/服务器模式。需要IP地址的主机在启动时就向DHCP服务器广播一个发现报文,这个时候这个主机就成了客户。服务器收到这个报文之后,它现在它的数据库里头查找这个计算机的配置信息,如果找到了,就返回刚才找到的信息作为回答报文。如果找不到,那就从服务器的IP地址池中拿一个IP地址分配给这个计算机,然后发送回答报文。我们又把回答报文称为提供报文。
DHCP服务器和DHCP客户端之间的交换过程一共有4步,具体过程如下:
-
DHCP客户机广播"DHCP发现"消息,试图找到网络中的DHCP服务器,以便从DHCP服务器中获得一个IP地址。这个IP数据报的源地址为0.0.0.0,目的网络地址为255.255.255.255
-
DHCP服务器收到"DHCP发现"消息后,广播"DHCP提供"消息,其中包括提供给DHCP客户机的IP地址。这个IP数据报的源地址为DHCP服务器的地址,目的地址为255.255.255.255
-
DHCP客户机收到"DHCP提供"消息后,如果接受这个IP地址,就广播"DHCP请求"消息,用来向DHCP服务器请求提供的IP地址。这个IP数据报的源地址为0.0.0.0,目的地址是255.255.255.255
-
DHCP服务器收到"DHCP请求"消息之后,广播"DHCP确认消息",把这个IP地址分配给这个DHCP客户机。这个IP数据报的源地址为DHCP服务器的地址,目的地址为255.255.255.255

DHCP的客户端和服务器需要通过广播方式来进行交互,原因是在DHCP执行初期,客户端不知道服务器端的IP地址,而在执行中间,客户端没有被分配IP地址,从而导致两者之间的通信必须采用广播方式。采用UDP而不用TCP的原因也很明显,TCP需要先建立连接,如果连对方的IP地址都不知道,那就不可能通过双方的套接字建立连接。
网际控制报文协议(ICMP)
为了提高IP数据报交付成功的机会,在网络层使用了网际控制报文协议来让主机或路由器报告差错和异常情况。ICMP报问作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。ICMP是IP层协议(网络层协议)。
ICMP报文的种类有两种,一种是ICMP差错报文,另一种是ICMP询问报文
ICMP差错报文运用于目标主机或到目标主机路径上的路由器向源主机报告差错和异常情况。一共有一下5个类型:
-
终点不可达。当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。
-
源点抑制。当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。
-
时间超过。当路由器收到生存时间为0(TTL=0)的报文时,除了丢弃这个数据报之外,还要向源点发送时间超过报文。当终点在一定的时间内不能收到一个数据报的全部数据报片时,就丢弃已经收到的全部数据报,同时向源点发送一个时间超过报文。
-
参数问题。当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃这个数据报,同时向源点发送参数问题报文。
-
改变路由(重定向)。路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)
不应发送ICMP差错报告报文的几种情况如下:
-
对ICMP差错报告报文不在发送ICMP差错报告报文
-
对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文
-
对具有组播地址的数据报都不发送ICMP差错报告报文
-
对具有特殊地址(如127.0.0.0和0.0.0.0)的数据报不发送ICMP差错报告报文
ICMP询问报文有4种类型:回送请求和回答报文、时间戳请求和回答报文、地址掩码请求和回答报文、路由器询问和回答报文。最常用的是前两类。
ICMP两个常见的应用是分组网间探测PING(用来测试两台主机之间的连通性)和Traceroute(Win里头是Tracert,可以用来跟踪分组经过的路由)。PING使用了ICMP回送请求和回答报文,Tracerout使用的是ICMP时间超过报文。
PING工作在应用层,它直接使用网络层的ICMP,而未使用TCP或UDP。Traceroute工作在网络层。
本文详细介绍了IPv4协议的各项特性,包括IPv4分组格式、IP数据报分片、IPv4地址和NAT、子网划分与CIDR等核心概念。此外还讲解了ARP、DHCP和ICMP等网络层协议的工作原理。
5657

被折叠的 条评论
为什么被折叠?



