我对网络层的理解

我对网络层的理解

Scroll Down

一、网络层

1、网络层提供的服务

互联网诞生之初,网络层应该向传输层提供怎样的服务(是面向连接,还是无连接?)引起了讨论。该问题的实质就是在计算机通信中,可靠交付应当由网络来负责还是端系统来负责?根据上述问题,不同思考面的人针对网络层提出了面向连接的服务无连接的服务虚电路服务(面向连接)、数据报服务(无连接)

一部分人认为网络应当提供虚电路服务,为上层的通信提供可靠交付能力。一部分人认为网络应当提供数据报服务,将可靠交付能力上移至传输层,网络层提供的服务应当是简单的,不可靠的交付,有利于网络的传输效率。首先先认识下虚电路服务和数据报服务的特点。

数据报、IP数据报、分组是同义词

1)虚电路服务

虚电路服务的特点就是:可靠通信由网络来保证、需要先建立连接

虚电路服务过程:

  1. 通信双方先建立连接(一条虚电路):已预留双方通信所需的一切网络资源
  2. 通过该虚电路发送分组:分组头部无需填写完整的目的主机地址,而只需填写该虚电路的编号,这样减少了分组的开销
  3. 通过可靠传输网络层协议:使得分组无差错按序到达终点,当然也不丢失、重复
  4. 通信结束后释放虚电路

虚电路应用范围:虚电路服务对于电话业务很合适,因为电话机(即终端)非常简单,没有智能也没有差错处理能力。但是计算机网络的终端非常智能,拥有着差错处理能力。所以提出了数据报服务这个崭新的网络设计思路。

OSI七层模型支持网络层采用虚电路服务,也制定了标准X.25,不过已成为历史!

2)数据报服务

数据报服务的特点:可靠通信由终端来保证、无需建立连接

数据报服务的设计思路:网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务

通信双方无需先建立连接,每一个分组独立发送,不进行编号,所以这些分组可能出错、丢失、重复、失序(即网络层不提供可靠交付)。因为传输网络不提供端到端的可靠传输服务,所以网络中的路由器比较简单,且价格低廉。如果终端中的进程之间需要可靠的通信,那么就由上层的传输层负责差错处理、流量控制。

所以采用数据报服务的网络设计,使得网络造价大大降低,灵活性提高,适用多种应用。网络发展至今,说明数据报服务是相当符合网络层设计的需求!

2、网络层协议的特点

二层网络其实已经可以通信了,但是由于不同的用户对二层网络的要求不同,所以出现了很多针对不同需求的二层网络,这些二层网络使用不同的协议去通信,就会产生不同的寻址方案、最大分组长度规定、超时控制、差错恢复方法、路由选择技术、服务等。如何将不同二层网络架构打通?通过网络层/IP层来解决这个问题。由于IP是用来使互连起来的许多计算机网络能够进行通信,因此TCP/IP体系中的网络层常常被称为网际层/IP层/虚拟互联网络。

二层网络可不止ethernet协议这一种,PPP、HDLC都是,不过目前常见的就是ethernet啦

网络层使用数据链路层的服务的基础上,为上层传输层提供服务。数据链路层主要解决了处于同一个二层网络的通信,但未解决数据经过通信子网中多个转接节点的通信问题。因此为了实现两个端系统之间的数据透明传输,让源端的数据能够以最佳路径透明地通过通信子网的多个转接节点到达目的端,使得传输层不需要关心网络的拓扑结构和所使用的通信介质和交换技术,网络层必须具备以下特点:

  • 分组和分组交换:将从传输层接收到的数据段封装成Packet(即包),再送到数据链路层
  • 路由:通过路由选择算法为分组提供通过通信子网的最优路径
  • 网络连接复用:为分组在通信子网中节点之间的传输创建逻辑链路,在一条数据链路上复用多条网络连接(时分复用技术
  • 差错检测和恢复:分组中具备首部校验和字段用于差错校验,使用确认和重传机制来进行差错恢复(TCP负责可靠传输)
  • 服务选择:网络层为传输层提供数据报和虚电路两种服务,但是TCP/IP的网络层仅为传输层提供数据报一种服务
  • 网络管理:管理网络中的数据通信过程,将数据从源端经过若干节点传送到目的端,为传输层提供最基本的端到端的数据传输服务
  • 流量控制:通过Qos技术来实现流量控制,以防止通信量过大造成通信子网的性能下降
  • 拥塞控制:当网络的数据流量超过额定容量时,会引发网络拥塞,致使网络的吞吐能力急剧下降,所以需要适当的控制措施来进行疏导
  • 网络互联:通信子网之间能够相互连接,实现跨网络通信
  • 分片和重组:如果要发送的分组超过了协议数据单元允许的长度,则源节点的网络层就会对该分组进行分片,分片到达目的主机后,有目的节点的网络层再重新组装成原分组
  • Packet=分组=包=数据报
  • 时分多路复用技术(TDM):以信道传输时间作为分割对象,通过为多个信道分配互不重叠的时间片段的方法来实现多路复用
    n1.png
  • 通信子网(communication subnet):子网,是指网络中实现网络通信功能的设备及其软件的集合,包括通信设备、通信协议、通信控制软件等,具体对应到交换机、路由器、网关等

使用网络层的好处:当IP网上的主机进行通信时,就好像在一个单个网络上通信一样。无需关注各个通信子网的异构细节(比如数据链路层协议、编址方案、路由选择协议、网络架构等),在IP网的上层传输层上使用TCP协议,就组成了TCP/IP协议栈。

数据链路层协议需要支持网络层协议,比如IP。

3、典型网络层协议

网际协议IP(internet protocol)是TCP/IP体系中两个最主要的协议之一,也是最重要的互联网协议。网际协议IP又称为Kahn-cerf协议,因为该协议由Robert Kahn和Vint Cerf共同开发的,两位学者在2005年获得了图灵奖!IP协议目前最主流的版本是V4,所以一般也叫IPV4协议。与IPV4配套使用的还有三个协议:

  • 地址解析协议ARP(address resolution protocol)
  • 网际报文控制协议ICMP(internet control message protocol)
  • 网际组管理协议IGMP(internet group management protocol)

其中ICMP和IGMP要使用IP协议,IP协议需要使用ARP协议,所以IP在网络层中间

二、IPV4

1、IP编址

既然在所有的主机/网元能在IP网上运行,如何快速查找到通信对象就显得尤其重要。将对象进行唯一性标识是IP网的重要特点之一。IP协议分配给IP网中的每个主机/网元的每个接口一个IP地址(IP Address)。IP地址是一个32bits的唯一标识符,标志着IP网上的唯一主机。有了IP地址,那么IP网上的任意两个节点就能快速进行通信。

网元:路由器、交换机、防火墙等执行数据报转发的设备

有了IP地址,我们能够在IP网上进行快速寻址,但是随着互联网的发展,IPV4原本定义的42亿个地址逐渐变得不够用起来。而管理全球IPV4地址分配的ICANN,很早就开始思考如何最大化利用IPV4地址,并且不断地利用新技术,使得IPV4在未来的一段时间内能够继续保证互联网的快速发展。IP编址经历了三个阶段:

  • 分类的IP地址:两级IP地址结构
  • 子网划分:三级IP地址结构
  • 构成超网:新型无分类编址方案,目前采用的编址方案

1)分类IP地址

分类IP地址是将IP地址划分为若干个固定类(A、B、C、D、E类),其中A、B、C类地址都是单播地址,D类地址用于组播,E类地址保留后用。

  • 单播地址:一对一通信IP
  • 组播地址:一对多通信IP
  • 广播地址:一对全部通信IP

n2.png

分类的IP地址是由于当初的考虑:从前各种网络的主机数量 差异很大,有的网络拥有很多主机,有的网络主机很少,这样分类的IP地址可以更好的满足不同用户的需求。当某个单位申请到一个IP地址时,实际上是获得了具有相同网络号的一块地址。具体的各台主机号由该单位自行分配,只要做到在该单位网络内无重复的主机号即可。

  • 网络号=网络位=网络地址
  • 同一个局域网中的主机和路由器的IP地址中的网络地址是一致的

分类IP地址结构:网络位 + 主机位

每一个IP地址都有网络地址和主机地址两部分组成。实际上IP地址是标志一台主机或路由器和一条链路的接口。当一台主机同时连接到两个网络上时,该主机就必须同时具有两个相应的IP地址,其网络地址必须是不同,这种主机称为多归属主机。这就好比一个建筑位于合肥路和芜湖路交叉口上,该建筑就可以拥有两个门牌号码。分类IP地址的优点就是:

  • ICANN只分配网络地址,主机地址由申请的组织自行分配
  • 路由器仅根据目的主机所连接的网络地址来转发分组,使得路由表中的路由表项大大减少,提高查找和转发效率

IP地址是32bits的二进制数,但是写32bits的IP地址对于人类来说太过麻烦。于是采用了一种简化方式来表示32bits的IP地址——点分十进制。点分十进制是将32bits的二进制数根据一定规则转换成十位数,提高可读性。规则是以8位为一组,分为4组。比如10000000 00001011 00000011 00011111用点分十进制表示成128.11.3.31。

A类单播IP地址

分类IP地址规定A类网络位8位,主机位24位;其中网络地址第一位已被固定为0,所以A类网络有2^7-2=126。减少2个原因:

  • 网络地址全0的IP地址是保留地址,标识“本网络”
  • 网络地址为01111111(即127)保留作为环回测试地址

环回测试地址用处:主机发送一个目的地址为环回测试地址的IP数据报,本机的协议软件就处理数据报中的数据,而不会把数据报发送到任何网络上,目的地址为环回测试地址的IP数据报永远不会出现在任何网络上,因为网络地址为127的地址根本不是一个网络地址

由于A类主机地址24位,所以每个A类网络的主机数是2^24-2=16777214。减少2个原因:

  • 主机地址全0的IP地址表示所属的单个网络地址
  • 主机地址全1的IP地址表示所属的网络的所有主机(即广播地址)

整个A类拥有地址2(24+7) =231,占整体IPV4地址的50%

B类单播IP地址

分类IP地址规定B类网络地址16位,主机地址16位;其中网络地址第一、二位已被固定为10,所以B类网络有2^14-1=16383,这里不存在网络地址全为0或全为1,减少1个原因:

  • 128.0.0.0网络是不指派的

由于B类主机地址16位,所以每个B类网络的主机数是2^16-2=65534。减少2个原因:

  • 主机地址全0的IP地址
  • 主机地址全1的IP地址

整个B类拥有地址2(14+16) =230,占整体IP地址的25%

C类单播IP地址

分类IP地址规定C类网络地址24位,主机地址8位;其中网络地址第一、二、三位已被固定为110,所以C类的网络有2^21-1=2097151,这里也不存在网络地址全为0或全为1,减少1个原因:

  • 192.0.0.0网络是不指派的

由于C类主机地址8位,所以每个C类网络的主机数是2^8-2=254。减少2个原因:

  • 主机地址全0的IP地址
  • 主机地址全1的IP地址

整个C类拥有地址2(21+8) =229,占整体IP地址的12.5%

2)子网划分 & VLSM

由于分类IP地址设计的不够合理,存在以下一些问题:

  • IPV4地址空间的利用率低:有的单位主机数并不多但需求只超过C类地址的一两个,只能申请一个B类地址,使得IP资源被大量浪费。
  • 网络数量太多:A类、B类、C类的网络一共有211万个。如果IP网上的路由器存放这些网络,那么路由条目非常多,路由表会变得非常臃肿,查询效率也会变低。这样就算有足够的IPV4地址使用,也会增加路由器的成本、路由信息交换增加、查询效率变低会影响整个互联网的性能。
  • 两级IP地址不够灵活:一个单位需要在新的地点马上开通一个新的网络,但是在申请到一个新的IP地址之前,新增加的网络是不可能连接到互联网上工作的。所以我们希望有一种方法灵活的增加本单位的网络,不必事先到互联网管理机构去申请新的网络号,原来的两级IP地址无法做到这一点。

为了解决分类IP地址结构不够灵活的问题,子网划分/子网寻址/VLSM技术被提了出来,子网划分是将一个大网络划分成多个小网络,子网划分在分类IP地址结构中新增了一个子网号字段,增加了灵活性,并提高IPV4地址空间的利用率。网络地址使用单位可以根据自己的业务的变通,灵活的将大网络划分为多个小的子网。子网划分分隔了同一个网络号,使得每个子网支持相同数量的主机。那么路由器如何区分采用的是二级IP地址结构还是三级IP地址结构呢?这就需要子网掩码来搭配子网划分使用。划分子网后,通过子网掩码,将子网隐藏起来,使得外部看公司内部网络没有变化。

三级IP地址结构:IP地址 = 网络号 + 子网号 + 主机号

如果划分子网,那么需要公司内部的路由器和主机都必须采用子网掩码

n3.png

比如将原有的16bits的主机号缩减到了8bits,另外的8bits都交给了子网位,为了使R1能够方便的从数据报中的目的IP地址识别出子网地址,就需要使用子网掩码来帮助识别。R1将数据报首部的dst IP提取出来和子网掩码相与得到子网地址。

子网掩码是连续的1

在不划分子网时,既然没有子网,那为什么还要子网掩码?这是为了更方便查找路由表,现代互联网标准规定“所有的网络都必须使用子网掩码”,同时在路由器的路由表中也必须有子网掩码这一栏。如果一个网络不划分子网,那么该网络的子网掩码使用默认子网掩码。

RFC950 正式定义子网掩码为因特网标准。子网掩码是一个32bits的二进制数,网络地址所有位置都是1,主机地址所有位置都是0。由此可知,A/B/C的子网掩码点分十进制表示:

  • A:255.0.0.0
  • B:255.255.0.0
  • C:255.255.255.0

子网掩码是一个网络/子网的重要属性,在成为正式标准后,路由器之间交换路由信息时,必须把自己的所在的网络(或子网)的子网掩码告诉相邻路由器。路由器的路由表中每条路由表项除了给出目的网络地址,还得给出对应的子网掩码。子网掩码只存在以下几种情况:128、192、224、240、248、252、254、255。

划分子网基本步骤:
1st. 某公司存在B类网络172.16.0.0,现在想要划分不同的子网给不同的部门使用。
2nd. 根据部门的人数和增长趋势,计算出主机数≤2^n,n就是子网主机位,那么拿B类的主机位16-n,得出的就是子网位。
3rd. 从其他网络发送给本公司某台主机的IP数据报,仍然是根据IP数据报的目的网络号找到连接在本公司网络上的路由器。但此路由器在收到IP数据报后,按照目的IP地址和网络号+子网号相与得到子网的下一跳。

  • 划分子网的行为是公司内部的行为,内部可以看到不同的子网,对外仍表现为一个B类网络
  • 网络号是通过目的IP地址和子网掩码相与得到的

n4.png

R1是公司边界路由器,其他通信子网通过IP网传递分组到145.13.21.8。根据二级地址结构,将dst IP 145.13.21.8和255.255.0.0相与,得到网络地址为145.13.0.0。IP网上的路由器根据路由表匹配中路由表项后,一路扔到了R1。R1接收到分组后,因为公司内部做了子网划分,子网掩码是255.255.255.0,使用dst IP 145.13.21.8和255.255.255.0相与,得到子网地址是145.13.21.0,就扔给了内部的下级路由器,下级路由器一看,是自己的某个接口下的网络地址,就扔到了这个接口,分组到达了所有主机,但是只有145.13.21.8进行了响应。

RFC 1009规定一个划分了子网的网络,可以同时使用多个不同长度的子网掩码。这种技术叫VLSM(Variable length subnet mask,可变长子网掩码)规定了如何在一个进行子网划分的网络中的不同部分使用不同的子网掩码。VLSM技术可以进一步提高IP地址的利用率。

3)CIDR & 构造超网

VLSM在一定程度上缓解了互联网在发展中遇到的困难。但是1992年互联网仍然面临三个需要尽快解决的问题:

  • B类地址在1992年已经分配了近一半:尽管VLSM延缓了B类的分配速度,但是B类地址空间仍然消耗过快,原因就是人们在申请地址空间时,倾向于申请B类,然后在其上面使用VLSM技术划分子网,以避免使用C类地址给网络配置和管理带来诸多不便。
  • 互联网主干网上的路由表中的项目数急剧增长
  • 整个IPV4的地址空间最终将全部耗尽

第三个问题只有加快制定IPV6寻址技术来解决,而前两个问题只能采用CIDR来解决

CIDR(class inter-domain-routing,无类域间路由选择),也叫超网,CIDR为了解决地址空间分配不平衡问题以及路由表条目过多这两个问题的。地址空间分配不平衡是因为B类分配速度过快,C类地址分配速度缓慢这个问题,CIDR解决这个问题的重点就是充分利用C类地址空间。超网是将多个连续的C类的网络地址聚合起来映射到一个物理网络上,这样物理网络就可以使用聚合起来的C类地址的共同地址前缀作为其网络号。比如一个4000节点的物理网络,分配一个B类地址简直是浪费,C类地址又太小,那么可以为该物理网络分配一个由16个连续C类的网络构成的地址空间块。那么第二个问题就是路由表中的条目过多,如何减少条目?CIDR地址空间块可以表示很多地址,所以在路由表中就利用CIDR地址块来查找目的网络,这种将多个网络地址的聚合称为路由聚合/构成超网,使得多个路由项聚合成一个。路由聚合有利于减少路由器之间的路由信息交换,从而提高整个internet性能。

所以总结就是CIDR消除了传统分类IP地址、VLSM的概念,提高IPV4地址空间的分配效率,从而允许互联网的规模继续增长。

目前BGP、OSPF等路由协议支持CDIR技术

CIDR编址结构

CIDR将IP地址分为前后两个部分:网络前缀(network-prefix)+ 主机位。网络前缀用来指明网络,主机位用来指明主机。因此CIDR使用IP地址从三级编址回到了两级编址,但这是无分类的两级编址。

CIDR地址块是指把网络前缀都相同的连续的IP地址称为地址块;只要知道地址块中的任意一个地址,就能知道整个地址块的网络前缀、最小地址、最大地址、地址块中的地址数。

其表示方法为:网络前缀+主机位/子网掩码

CIDR的地址掩码也可以叫做子网掩码,用来表示网络前缀所占位数

例如128.14.35.7/20某CIDR地址块中的一个地址,二进制就是10000000 00001110 00100011 00000111/20

最小地址   128.14.32.0    10000000 00001110 00100000 00000000
最大地址   128.14.47.255  10000000 00001110 00101111 11111111

主机号全0和全1的地址,一般不使用。通常只用在两者之间的地址。该地址块拥有2^12个地址。我们可以用地址块中最小的地址和网络前缀的位数来指明该地址块,比如128.14.32.0/20。

为了更方便进行路由选择,CIDR编址结构由网络前缀+主机位构成,同时引入CIDR地址块的概念,方便进行路由聚合。关于路由聚合,如果不采用CIDR,那么在94-95年,因特网中的任意一个路由器就会超过7万条路由,而使用CIDR后,96年一个路由表的路由数量只有3万条。路由聚合有利于减少路由器之间的路由选择信息交换,提高整个网络性能。值得注意的是CIDR并没有指明多少位用于子网字段,但是拿到CIDE地址块的单位,仍然可以根据自己的需要,划分出子网,子网的掩码比整个网络的掩码要长。例如某单位分配到了掩码/20,可以划分8个子网,子网的掩码就是/23。

n5.png

上图分配CIDR地址块的例子。假如某个ISP已拥有地址块206.0.64.0/18(64个C类网络)。现在某大学需要800个IP地址。ISP可以给该大学分配一个地址块206.0.68.0/22,该地址块包含了1024个IP地址,相当于4个连续的C类/24地址块,占该ISP拥有的地址空间的1/16。大学下属的四个系可以在/22地址块的基础上继续分配地址块。

如果不采用CIDR技术,则与该ISP的路由器交换路由信息的每一个路由器的路由表,就需要有64个项目。但采用地址聚合后,就只需要路由聚合后的一个项目206.0.64.0/18就能找到该ISP。大学的地址块被包含在了/18的地址块中。当有发往四系的数据报时,是直接发往大学的边界路由器中,由边界路由器再次根据目的地址来进行与运算得出更加详细的地址块信息。

公网和私网地址段

向运营商申请IPV4地址,获得的地址都是一个CIDR块,而不是传统的分类地址。IETF将整个IPV4地址空间中的一部分CIDR块保留用于专用网络,即私网地址。私有地址不会被internet地址管理机构分配给internet中的网络和节点。因此私网地址和公网地址是隔离的,需要通过NAT或者代理技术进行私网地址和公网地址的转换。设置私网地址的目的就是提高地址利用率和隐藏内部网络。私网地址段:

  • A类:10.0.0.0-10.255.255.255
  • B类:172.16.0.0-172.31.255.255
  • C类:192.168.0.0-192.168.255.255

公网地址可以被路由器路由,私网地址不能被路由器路由

VLSM&CIDR区别

超网(CIDR)类似子网划分(VLSM)的概念,子网划分是将网络划分成更小的网络,而超网则是将多个网络组合成一个更大的网络。相应的子网掩码也需要改变,子网划分是增加默认子网掩码长度,而超网则是减少子网掩码长度。

子网掩码长度也叫做子网掩码位数

2、IP数据报格式

IP数据报的格式能够说明IP协议具有什么功能。IP数据报简单格式:

n6.png

IP数据报详细格式:

n7.png

IP数据报 = 首部(固定部分20字节 + 可变部分) + 数据部分

  • version(4bits):IP协议版本;通信双方使用的版本必须一致
  • header length(4bits):首部长度;表示IP报文首部长度,该字段表示的单位是4bytes,比如首部长度为1111,那么换算成十进制就是15,15*4bytes=60bytes,首部长度因为是固定部分+可变部分,所以首部长度二进制表示范围是0101-1111,也就是首部长度在20-60bytes
  • differentiated services field(8bits):只有在区分服务时,才使用该字段,一般不使用
  • total length(16bits):表示首部+数据部分长度(单位字节),因此IP数据报的理论最大长度为2^16-1=65535字节,但是一般很少传送这么大数据报,因为数据链路层规定了一个数据帧的最大传送单元MTU的值,比如ethernet规定的MTU值为1500字节。当一个IP数据报封装成帧的数据部分时,如果超过MTU,就必须进行分片处理。因此该值一般≤MTU。

虽然使用尽可能长的IP数据报会使传输效率得到提高,但是数据报短也有好处,每一个数据报越短,路由器转发的速度就越快。为此IP协议规定,互联网上所有的主机和路由器,必须能够接收长度不超过576字节的数据报,这是假如上层交下来的数据长度为512字节,加上最长的IP首部60字节,再加上4字节的富余量,得到的576字节。当主机需要发送长度超过576字节的数据报时,应当先了解下,目的主机能否接受所要发送的数据报长度。否则需要进行分片!在进行分片时,数据报首部中的total length是指分片后的每一个分片的首部长度与该分片的数据长度的总和。

  • identification(16bits):IP协议在存储器中维持一个计数器,每产生一个数据报,计数器就+1,并将此值赋值给identification字段。但是这个标识字段并不是序号,因为IP是无连接服务,IP数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就会被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来地数据报

  • flags(3bits):标志字段中只有后2位起作用

    • 中间位记DF,DF = 1即表示不能分片;DF = 0表示允许分片
    • 最低位记MF,MF = 1即表示还有分片的数据报;MF = 0表示没有分片,该数据报为最后一个

所以flags只有010、001、000三种情况

  • fragement offset(13bits):片偏移指出,较长的分组在分片后,某片在原分组中的相对位置

一个数据报的total length为3820字节,其数据部分为3800字节(使用固定首部),需要分片为长度不超过1420字节的数据报片。因固定首部长度为20字节,所以每个分片的数据部分不超过1400字节,于是分为3个分片,数据部分分别为:1400、1400、1000。每个分片拥有独立的固定首部,所以三个数据报片总长度就是1420、1420、1020。因为分片,所以首部中的部分字段需要修改。
n8.png
三个数据报片的的片偏移分别是:0/8=0、1400/8=175、2800/8=350

  • time to live(8bits):生存时间TTL,表示数据报在网络中的寿命,为了避免数据报在网络中形成环路,从而无限制的循环下去,浪费网络资源。由发出数据报的计算机设置该字段,每经过一个路由器,TTL-1,当路由器收到TTL值为0时,丢弃该数据报。
  • protocol(8bits):协议字段指出此数据报携带的数据是使用何种协议封装,以使目的主机的IP层知道应将数据部分提交给上层的哪个协议进行处理(或者交给哪个上层协议进行解封装),常见protocol值:
    • ICMP:1
    • IGMP:2
    • IP:4
    • TCP:6
    • UDP:17
    • EIGRP:88
    • OSPF:89
    • IPV6:41
  • header checksum(16bits):首部校验和,该字段只检验数据报的首部,不包括数据部分。因为数据报每经过一个路由器,首部的TTL和flag都会变化,所以需要重新计算下首部校验和
  • source(32bits):源IP地址
  • destination(32bits):目的IP地址

此时,上面的IP编址在IP数据报中的source和destination字段中体现出来

  • 可选字段:用来支持排错、测量以及安全措施,内容丰富。从1-40字节不等,取决于所选择的项目。可选字段的目的就是增加IP数据报的功能,但这同时也使得IP数据报的首部长度是可变的,这同时增加了路由器处理数据报的开销。实际上可选字段很少使用,所以很多路由器不考虑IP首部的可选字段,新的IPV6就把IP数据报的首部做成了固定首部。
  • 填充:因为可选字段的长度不固定,所以使用若干0填充该字段,使得整个首部的长度是32bits的整数倍

3、ARP

1)IP地址与MAC地址

IP地址和MAC地址存在何种联系以及区别,区别就是:

  • 从分层来看:MAC地址是数据链路层和物理层使用的地址,IP地址是网络层和网络层以上使用的地址,是一种逻辑地址
  • 从数据报来看:数据从应用层到网络层,到数据链路层,再到通信链路上传输。使用IP地址的IP数据报一旦交给了数据链路层就会被封装成MAC帧,MAC帧在传送时使用的源地址和目的地址都是MAC地址,MAC地址写在帧的头部中。连接在通信链路上的设备收到帧时,根据帧头部的MAC地址,决定收下还是丢弃。收下剥离数据链路层头部给网络层后,在头部中找到源IP地址和目的IP地址。总结就是IP地址放在IP数据报的头部,MAC地址放在帧的头部。

n9.png

从主机H1到H2发生了什么:

  1. 在IP层抽象的互联网只能看到IP数据报,虽然IP数据报要经过路由器R1和R2的两次转发,但在它的首部中的源地址和目的地址始终分别是IP1和IP2。
  2. 虽然在IP数据报首部有源IP地址,但路由器只根据目的IP地址的网络进行路由选择
  3. 在局域网的链路层,只能看见MAC帧
  4. 尽管互联在一起的网络的硬件地址体系各不相同,但IP层抽象的互联网却屏蔽了下层这些复杂的细节。只要我们在网络层上讨论问题,就能够使用统一、抽象的IP地址研究主机和主机或路由器之间的通信

我们知道IP网屏蔽了下层网络,使得任意两个IP地址都能够通过IP网进行通信,但是实际上数据报会被封装成帧,而帧的通信需要依靠数据链路层协议和MAC地址才能完成通信,且是在局域网内。以目前最流行的以太网为例,主机H1知道H2的IP地址,但是没用,必须依靠帧去通信,而帧是如何去通信的?H1会将H2的IP进行比较,如果不是同网段的,就会发送给网关,一开始是不知道网关的MAC的,那么就无法通信,通过泛洪知道网关的MAC,然后发送给网关,网关一看IP,去往H2的前缀下一跳是R2的IP5,IP5所对应的MAC同理能拿到,发送给R2后,R2一看自己下联的一个接口就是H2的网段,于是扔给了H2。 那么如何将IP地址和MAC地址进行绑定呢?需要用到ARP协议。

2)ARP协议

总结上述问题就是IP数据报在二层进行传递的时候,需要关联IP和MAC地址。ARP协议就是用来解决这个问题,值得注意的是ARP协议是配合IPV4协议来使用的,在IPV6中并不存在ARP协议。还有一个叫RARP协议的东西,RARP就是通过硬件地址来查找IP地址,只不过DHCP协议已经包含了RARP的功能。

网络层使用的是IP地址,但是实际网络的链路上传送数据帧时,最终还是必须使用该网络的硬件地址。但是IP地址和MAC地址由于格式的不同并不存在简单的映射关系,同时更换网络适配器也会导致MAC地址改变,无法做到使得IP地址和MAC地址存在简单的转换关系,这时就需要使用ARP协议来解决这个问题。

ARP协议会在主机中建立一张ARP映射表,表的内容就是存放一个IP地址到MAC地址的ARP映射表,这样主机通过ARP映射表根据IP查找所对应的MAC地址并将其填入MAC帧的首部中,并且ARP映射表会定时更新。ARP是解决同一局域网上的主机的IP地址和硬件地址的映射问题。那么主机是如何学习到这些映射条目的呢?

永远记住,MAC地址不可能出二层。有些产品说跨三层取MAC,只是通过了SNMP等技术取值,如果没有机制,是很难做到跨三层取到MAC地址的。

3)ARP查询原理

当需要发送IP数据报时,先完成三层的寻址(dst IP根据路由表进行最长掩码匹配):

  • 扔给局域网;则开始查询本机ARP映射表,是否有无dst IP对应的MAC地址:
    • 有;将MAC地址写入帧中的目的MAC字段,然后发送出去
    • 无;运行ARP协议
  • 扔给网关;则开始查询本机ARP映射表,是否有无网关对应的MAC地址:
    • 有;将MAC地址写入帧中的目的MAC字段,然后发送给网关
    • 无;运行ARP协议

ARP协议交互概要

  1. A运行ARP,向局域网发送一个ARP请求分组(广播)
  2. B根据分组中的dst IP比对自己的IP,然后回复一个ARP响应分组(单播),写入ARP映射表
  3. A收到ARP响应分组后,写入ARP映射表
  4. 开始通信

ARP协议交互详细

n10.png

同局域网发送IP数据报:

  1. ARP进程在同局域网上广播一个ARP请求分组。分组内容为:我的IP是209.0.0.5,MAC地址是 00-00-C0-15-AD-18,我想知道209.0.0.6的硬件地址。
  2. 同局域网上的所有主机上运行的ARP进程都收到此ARP请求分组
  3. B发现自己的IP地址与ARP请求分组中要查询的IP一致,就收下这个ARP请求分组,并向A单播发送ARP响应分组,分组内容为:我的IP是209.0.0.6,MAC地址是08-00-2B-00-EE-0A。并将A的MAC写入到ARP映射表中。
  4. A收到B的ARP响应分组后,就在其ARP映射表中写入B的IP到MAC的映射

注意广播的帧,dst MAC为ff:ff:ff:ff:ff:ff

不同局域网发送IP数据报:

  1. ARP进程在同局域网上广播一个ARP请求分组。分组内容为:我的IP是209.0.0.5,MAC地址是 00-00-C0-15-AD-18,我想知道209.0.0.1(网关)的硬件地址。
  2. 同局域网上的所有主机上运行的ARP进程都收到此ARP请求分组
  3. 网关发现自己的IP地址与ARP请求分组中要查询的IP一致,就收下这个ARP请求分组,并向A单播发送ARP响应分组,分组内容为:我的IP是209.0.0.1,MAC地址是08-00-2B-00-EE-0C。并将A的MAC写入到ARP映射表中。
  4. A收到网关的ARP响应分组后,就在其ARP映射表中写入网关的IP到MAC的映射

ARP映射表

ARP映射表是记录MAC地址和IP地址映射关系的表项。其中的表项称为映射项,映射项存在老化时间,如果在固定时间内(老化计时器)没有被再次触发,就会自动删除。为什么需要ARP映射表呢?因为可以减少局域网内的ARP查询和响应请求,A在请求B的MAC地址时,在帧中带有自己的MAC,那这样B就不需要再次发起ARP请求了,直接将A的MAC地址和IP地址的映射写入到自己的ARP映射表中。如果一段时间不需要和B通信,那么过了老化时间后,就会自动删除映射项。

16344733381.png

二层既然能够通过MAC地址通信,那么为什么还需要IP地址这种三层的编址结构呢?因为不同的数据链路层协议使用不同的编址结构,也就造成了异构网络的存在。如果想要异构网络之间能够通信,就需要解决复杂的硬件地址转换工作。你可能想说,为什么不统一采用一种数据链路层的编址结构呢?这是因为从来没有一种二层网络结构能够满足不同用户的需求,不同的二层网络满足了不同的客户需求。所以在多种多样的二层网络架构上,开辟一种统一编址的三层网络是非常有必要的,IP编址屏蔽了不同的数据链路层协议的编址结构。所以在单个局域网中,采用二层硬件地址寻址,而多个局域网之间通信,则需要采用统一的三层地址寻址。

对于目前最常用局域网协议的ethernet,采用的就是MAC地址寻址

4、ICMP

1)ICMP

ICMP(internet control message protocol,网际控制报文协议)用于主机/路由器报告差错情况和提供相关异常情况的报告。ICMP在RFC 792中作为正式互联网标准发布,ICMP也是需要使用IP协议来进行传输的,目的是为了更有效的转发IP数据报和提高交付成功的几率。

2)ICMP报文格式

由于ICMP是基于IP协议的,换句话说ICMP是作为IP数据报的数据部分。

n12.png

ICMP首部共8bytes,前4bytes是固定的,后4bytes和ICMP类型有关,ICMP的数据部分,长度取决于ICMP的类型:

  • 前4字节:
  • 类型(8bits):表示ICMP报文是询问还是差错报告报文
  • 代码(8bits):区分某种具体类型的不同情况
  • 校验和(16bits):校验整个ICMP报文

因为IP首部的校验和只校验IP首部,而不校验IP数据部分。ICMP校验和是保证ICMP整个首部+数据部分的校验,也就是相当于校验IP数据部分。校验和是为了防止ICMP报文出现差错

3)ICMP报文类型

ICMP报文类型是指ping某个网站不通,那么不通的原因就是由ICMP负责告知。ICMP报文类型定义了各种报文的含义。ICMP报文类型分为两大类:差错报告报文、询问报文。

询问报文

n13.png

  • 回显应答和请求:就是主机/路由器向一个特定的dst IP发送一个回显请求报文。dst IP收到后发送一个回显应答报文。用来测试dst IP是否可达。
  • 时间戳应答和请求:就是主机或路由器请求目的主机回答当前的日期和时间。同理上面的请求和回答报文。一般用来进行时钟同步和时间检查。

差错报告报文

n14.png

  • 目的不可达:当主机或路由器不能交付数据报时就向源发送目的不可达报文,代码字段能够区分具体的原因。
  • 超时:当路由器收到的数据报TTL=0时,需要做两件事,第一丢弃该数据报;第二发送差错报告报文(类型5)。
  • 参数问题:当目的主机/路由器收到数据报的首部中部分字段的值不正确时,需要做两件事,第一丢弃该数据报;第二发送差错报告报文(类型11)
  • 重定向(改变路由):路由器将重定向报文发回给源主机(类型12),让主机知道下次将数据报发送给另一个路由器

所有的ICMP差错报告报文中的数据字段都具有相同的格式:把收到的需要差错报告的IP数据报的首部+数据部分的ICMP首部提取出来,作为新的ICMP数据报的数据字段。新的ICMP首部+刚刚的数据字段形成了IP数据报的数据部分,这就是ICMP差错报告报文。

不应该发送ICMP差错报告报文的几种情况:

  • 对ICMP差错报告报文,不在发送ICMP差错报告报文
  • 对第一个分片的数据报片的所有后续数据报片,都不发送ICMP差错报告报文
  • 对具有组播地址的数据报,都不发送ICMP差错报告报文
  • 对具有特殊地址(127.0.0.0或0.0.0.0)的数据报,不发送ICMP差错报告报文

4)ICMP应用

ping

Ping命令用于测试两台主机之间的连通性、根据域名得到服务器IP。ping使用ICMP回显请求和回显响应报文。Ping程序是应用层直接使用网络层ICMP的一个例子,没有使用传输层的TCP或UDP协议。

Ping在windows上默认发送四个ICMP回送请求报文,如果目的主机响应,则会收到四个ICMP回显响应报文。但是有的服务器为了防止恶意攻击不会理睬ICMP回显请求报文。

ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-4] [-6] target_name
- -t:Ping 指定的主机,直到停止
- -a:将地址解析为主机名
- -n count:指定要发送的ICMP包数量
- -l size:指定发送ICMP数据部分大小
- -f:在数据包中设置“不分段”标记(仅适用于 IPv4)
- -4:强制使用 IPv4
- -6:强制使用 IPv6
- -i TTL:设置生存时间

traceroute

traceroute用来跟踪一个分组从源主机到目的服务器的路径。Traceroute从源主机向目的服务器发送一连串的IP数据报,数据报中封装的是无法交付的UDP用户数据报。第一个数据报P1的TTL=1,当P1到达第一个路由器R1时,路由器将其丢弃并向源主机发送一个ICMP超时的差错报告报文,第二个数据报P2的TTL=2……当最后一个IP数据报到达目的服务器时TTL=1,服务器不会转发数据报,并且由于IP数据报中封装的是无法交付的传输层的UDP数据,因此目的服务器向源主机发送ICMP目的不可达的差错报告报文。

n15.png

windows下相关工具叫tracert,linux下相关工具叫traceroute

ICMP重定向

n16.png
当主机要发送数据报时,首先查找主机自己的路由表,一般路由表中设置一个默认路由器的IP地址。数据报如果需要发往非本地局域网时,就会全部先发给默认路由器,如果默认路由器发现去往某个目的地的最佳路径应该走本网络中的另一台路由器A时,就会将重定向报文发给主机,于是主机在自己的路由表中增加一个条目,去往某个目的地走A,而不是走默认路由。

R1配置如下#
ip route 2.2.2.0 255.255.255.0 192.168.123.2
ip redirects (接口下配置ICMP重定向)

R3配置如下#
ip route 0.0.0.0 0.0.0.0 192.168.123.1

R3的网关为R1,R1本身又有静态路由到2.2.2.0,下一跳为R2。注意这是局域网,三个接口属于同一个网段!R3去往2.2.2.2时,将数据丢给自己的网关192.168.123.1,经过R1路由表查找后,发现数据的下一跳是与本地入接口同一个网段的123.2,因此它认为123.2比自己距离目标更近,因此给源R3发送了一个ICMP重定向消息,告诉R3 192.168.123.2为更优的下一跳,那么R3后续的报文将直接发给R2,而无需走网关

通过抓包,抓取到了R1发送给R3的ICMP重定向消息,注意头部的gateway address字段,填写的就是比自己距离目的地更近的下一跳IP

n17.png

关闭ICMP重定向,需要在接口上使用no ip redirects

MTU

所谓路径MTU探索就是探索与通信对方之间不用分片IP数据报,就能交流MTU大小的功能。MTU是指帧中的最大传输单元(即帧中的最大数据部分),也就是IP数据报的总长度大小不能超过1500 bytes。

Windows和juniper在使用ping时,比如ping 1.1.1.1 size 1473 ,那么这个1473就是ICMP的数据部分,封装成IP数据报后,总长度为1473+20+8=1501字节,超过了MTU规定的能传输的最大MTU=1500,那么超过的部分将被IP层分片发送。如果加上-f,比如ping 1.1.1.1 size 1473 -f,那么就会出现丢包,因为-f表示不能分片,那么该包无法通过数据链路层发送出去。

Cisco在使用ping时,比如ping 1.1.1.1 size 1473,那么这个1473就是IP数据报的总长度,包含了IP首部和ICMP首部的28字节,即数据长度为1473-28=1445字节。

三、分组转发/最长掩码匹配

1、最长掩码匹配

在使用CIDR时,由于采用了网络前缀+主机位/子网掩码的这种记法。因此在路由表中的路由表项也要有相应的改变,由“网络前缀”和“下一跳地址”组成。但是在查找路由表时可能得到不止一个匹配结果。路由器会从匹配结果中选择具有最长网络前缀的路由。这叫做最长前缀匹配,这是因为网络前缀越长,其地址块就越小,因而路由就越具体。

假定大学下属的四系希望ISP把转发给四系的数据报直接发到四系,而不要经过大学的路由器,但又不愿意改变自己使用的IP地址块。因此在ISP的路由表中,至少要有以下两个项目,即206.0.68.0/22(大学)和206.0.71.128/25(四系)。

现在假定ISP收到一个数据报,其目的IP地址为D =206.0.71.130。把D分别和路由表中这两个项目相与。将所得的结果写在下面:

  • D和11111111 11111111 11111100 00000000 逐位相与得网络前缀206.0.0100 0100.0=206.0.68.0
  • D和11111111 11111111 11111111 10000000逐位相与得网络前缀206.0.0100 0111.1000 0000=206.0.71.128

不难看出,现在同一个IP地址D可以在路由表中找到两个目的网络(大学和四系)和该地址相匹配。根据最长前缀匹配的原理,应当选择后者,把收到的数据报转发到后一个目的网络(四系)

2、分组转发/路由

路由器在执行转发IP数据报的正常流程:

1st.路由器在接收到帧后,提取出IP数据报,交给网络层。提取出IP数据报首部中的dst IP,本网络中的子网掩码和dst IP相与,得到网络前缀,并判断是否为直接交付还是间接交付:

  • 直接交付:一致,说明dst IP在本网络中,将数据报直接交付
  • 间接交付:不一致,不在本网络中,执行间接交付,下一步2nd

本网络是指直连路由

2nd.得到的网络前缀执行最长掩码匹配,匹配中路由表项后,将IP数据报转发给对应的下一跳,具体如下:

  • 匹配主机路由,转发至对应下一跳
  • 匹配明细网络前缀,转发至对应下一跳
  • 必匹配中默认路由,转发至对应下一跳(前提是默认路由存在)

3rd.如果不存在默认路由,同时未匹配中任何一条路由表项,则丢弃IP数据报