# 网络层

# 网络层提供的服务

早期工程师认为,应该参考电信网络(电话、电报服务)来设计网络,让网络层提供可靠的传输服务,即面向连接的通信方式。两台计算机进行通信时,应当首先建立虚电路(Virtual Circuit)预留通信资源,后续数据都通过这条电路来发送。这样数据报首部不需要填写完整的目标地址,只需要一个简单的虚电路编号。这种通信方式可以使发送的数据报无差错按顺序到达终点。

但是网络设计并没有采用这种方式,主要是因为计算机网络和传统电信网络的区别在于终端设备,计算机是具有智能的,具备容错能力,这和传统的电话和电报设备有本质区别。因此互联网的设计思路是:网络层向上只提供简单灵活的、无连接的、尽力交付的数据报传输服务。网络发送分组(数据报)时不需要建立连接,每个数据报各自寻址,通过的节点路径也可能不同。网络层不提供服务质量保证,也就是说发送的分组可能丢失、乱序、出错和重复,抵达的时间也没有保证。如果主机需要可靠的通信,则由网络层之上的运输层来负责(差错校验、丢失重传、拥塞控制等)。这种设计的好处是:

  1. 造价低
  2. 运行方式灵活
  3. 适应多种应用

# 虚电路服务与数据报服务的对比

虚电路服务 数据报服务
思路 可靠通信由网络层保证 可靠通信由主机保证
连接 需要建立 不需要
终点地址 虚电路编号 每个数据报都由完整都目标地址
分组转发 由同一虚电路发送都数据报路由都一样 每个分组独立选择路由
当节点出故障 整个虚电路不能工作 经过故障节点的数据报可能会丢失,路由可能发生变化
顺序 有序 不保证有序
差错处理和流量控制 由网络或主机负责 由主机负责

# 网际协议IP

IP协议是TCP/IP体系中最重要的协议之一,也是最重要的互联网标准协议之一。IP协议又称为Kahn-Cerf协议,因为这个协议由Robert kahn和Vint Cerf两人研发。我们目前广泛使用的是第四个版本的IP协议,即IPv4。

与IP协议配套的还有三个协议:

  1. 地址解析协议ARP(Address Resolution Protocol)
  2. 网际控制报文协议ICMP(Internet Control Message Protocol)
  3. 网际组管理协议IGMP(Internet Group Management Protocol)

RARP

本来还有一个逆地址解析协议RARP(Reverse Address Resolution Protocol)与ARP协议配合使用,但目前已经淘汰。

# 虚拟互联网络

全球千万上亿的计算机能够互相连接通信,其中会遇到需要解决的问题,包括且不限于:

  • 不同的寻址方案
  • 不同的最大分组
  • 不同的网络接入机制
  • 不同的超时控制
  • 不同的差错恢复方式
  • 不同的状态报告方式
  • 不同的路由选择技术
  • 不同的用户接入控制
  • 不同的服务(无连接和面向连接)
  • ...

由于用户的需求是多样的,没有一种网络可以满足所有用户的需求。一般来讲,网络互相连接需要使用一些中间设备。根据中间设备所在的层次,可以有以下设备:

  1. 物理层——转发器(repeater)
  2. 数据链路层——网桥(bridge)
  3. 网络层——路由器(router)
  4. 网络层以上——网关(gateway)

转发器和网桥只是扩大了网络的范围,从网络层的角度来看,并没有进行多个网络之间的连接,仍处于同一个网络。因此我们讨论的网络互联,是指网络层路由器之间的互连。路由器就是一台专用计算机,用来提供路由选择服务。如果将使用IP协议的计算机互相连接组成网络,这个网络就称为IP虚拟网。虚拟互连也即逻辑互连,意思是物理网络之间存在异构性,但是通过IP协议,将这些差异屏蔽,就如同黑匣子一样,IP网上的设备进行通信时,不必知道各网络之间的具体细节(路由选择协议、编址方案等)。如果在IP协议上层使用TCP协议,就是如今的互联网(Internet)。

# IP地址分类

有关IP最重要的文档就是互联网正式标准RFC 791

# IP地址以及表示法

整个互联网是抽象单一的网络,IP地址就是给互联网中的每一台设备的每一个接口分配一个全球唯一的32位编号。IP地址由互联网名字和数字分配机构ICANN(Internet Corporation for Assigned Names and Numbers)分配。IP地址的编址方式共经历三个阶段:

  1. 分类IP地址。这是最基本的编址方法,1981年提出。
  2. 子网划分。这是对基本方法的改进,其标准为RFC 950,1985年通过。
  3. 组成超网。这是比较新的无分类编址方法,1993年提出。

所谓IP地址分类就是将IP地址划分为若干个固定类,每一类地址都由两个固定长度的字段组成,其中第一个字段是网络号,它标志主机所连接的网络。一个网络号在整个互联网范围内必须是唯一的。第二个字段是主机号,它标志当前主机。一台主机号在它前面的网络号所指明的网络范围是唯一的。由此可见,IP地址在全球范围内是唯一的。两级IP地址可以记为:

IP地址 ::= {<网络号>,<主机号>}

这里A、B、C类地址都是单播(一对一通信),是最常用的。

从上图可以看出

  • A、B、C类地址的网络号,分别是1、2、3个字节长度。网络号字段最前面有1~3位的类识别位,其数值是规定好的。
  • A、B、C类地址的主机号,分别是3、2、1个字节长度。
  • D类地址用于多播
  • E类地址保留使用

关于IP分类

由于近年来以及广泛使用无分类的IP地址进行路由选择,A、B、C类地址区分已经成为历史(RFC 1812)。

从IP地址的结构来看,IP地址不仅指明一台主机,还指明类它所在的网络。IP分类的原因是因为,各种网络的差异很大,有的网络主机多,有的网络主机很少。把IP地址氛围三类为了更好的满足不同的需求。当某个组织分配到一个IP地址时,实际上是获得了一组网络号相同的地址,具体的主机地址自行分配,只要保证主机号不重复即可。

对于机器来说,IP地址是32位的二进制串。而为了读起来对人类友好,每八位之间加入一个空格,并且用等效的十进制数代替,将空格改为点号。这个记法叫做点分十进制记法(dotted decimal notation)。

# 常用的三类IP地址

A类地址的网络号占1个字节,有7位可以使用(第一位固定分类识别),可指派的网络号是126个(2^7 - 2)。减2的原因是:

  1. IP地址中全0是保留地址,意思是this,代表本网络。
  2. 网络号127保留,作为本地软件环回测试(loopback test)本主机的进程之间的通信。

A类地址的主机号占3个字节,因此每一个A类网络中的最大主机数是2^24 - 2,记16777214个。减2的原因是:

  1. 全0的主机号表示该IP地址是本主机所连接到的单个网络地址
  2. 全1的主机号表示该网络上的所有主机

IP地址空间共有2^32个地址。其中A类就有2^31个,占整个IP地址空间的5成。

B类地址的网络号有2个字节,有14位可用(前两位固定分类识别)。网络号字段后面的14位无论取什么值也不会出现全0,所以不存在减2的问题。但是B类网络的128.0.0.0是不可被指派的,所以B类网络的网络号共有2^14 - 1共16383个。B类网络的最大主机数是2^16 - 2,原因和A类地址一样,全0代表当前网络,全1代表全部主机。B类地址占IP地址空间的25%。

C类地址的网络号有3个字节,有21位可以使用(前三位固定分类识别)。C类地址中192.0.0.0也是不可指派的,因此C类地址共有2^21 - 1共2097151个网络地址。每个C类网络的最大主机数是2^8 - 2即254个。C类地址占网络空间的12.5%。

这样就得出了三类地址的指派范围:

IP地址的特点:

  1. IP地址由网络号和主机号组成。即IP地址是分级的,地址分级的好处:
    1. IP地址管理机构只需要负责分发网络号
    2. 路由器仅根据目的主机的网络号来转发分组
  2. IP地址标志的是一台主机和一条链路的接口。当一台主机连到多个网络,它的IP就必须同时具有两个与之对应。这称为多归属主机。由于路由器至少连接了两个网络,所以路由器起码具有两个IP地址。
  3. 一个网络是指具有相同网络号的主机集合,因此,用转发器或者网桥连接的局域网同属于一个网络。
  4. 所有IP地址是平等的。

# IP地址与硬件地址

硬件地址是链路层和物理层使用的,IP地址是网络层以上使用的逻辑地址(IP地址是软件实现的)。

IP数据报和MAC帧的区别:

  1. IP层只能看到IP报文。IP数据报在转发过程中,报文首部的源地址和目的地址不会改变。
  2. 路由器只根据目标地址进行路由选择。
  3. 在链路层,只能看见MAC帧。而且物理地址的源地址和目的地址会在每一次转发被修改,修改为当前物理地址和下一跳的物理地址。这跟IP地址不同。

同时又引出问题:

  • 主机和路由器怎么知道下一跳的物理地址
  • 路由器中的路由表是怎么来的

# 地址解析协议ARP

ARP协议就是用来通过IP地址找出物理地址的。IP协议调用了ARP协议,因此ARP被划到网络层,但是ARP协议的作用是找出物理地址,因此也可被划到链路层。之前提到废弃的RARP协议则提供相反的功能,目前的DHCP协议已经包含了RARP协议的功能,所以它也就被淘汰了。

ARP协议在主机ARP高速缓存中存放一个从IP地址到硬件地址的映射表,并且这个映射表时常更新。每一台主机都有一个ARP高速缓存(ARP cache),里面有本局域网上个主机和路由器的IP地址和物理地址的映射关系。主机如何知道这些映射关系的?

ARP协议在本地缓存查不到局域网内其他主机的IP——MAC映射关系时,会在局域网内广播ARP请求分组,里面带有自己的IP地址和MAC地址,目的主机接收到这个ARP氢气分组之后,会将自己的MAC地址告知源主机,其余主机会丢弃这个ARP请求。源主机收到ARP响应后,就将目的主机的物理地址写入本地缓存。同时目的主机可能会和源主机角色互换(主动通信),所以当目的主机收到ARP请求广播时,也会将源主机的IP地址和物理地址写入自己的缓存,方便自己下次主动通信,同时减少报文的发送次数。

# IP报文格式

IP报文由首部和数据组成,首部分为20字节固定长度和长度可变的一段可选字段。

# 固定部分的各字段:
  • 版本

    占4位,代表IP协议的版本。通信双方版本号必须一直。

  • 首部长度

    占4位,单位是4字节。所以首部最大长度是15 * 4 = 60字节。最小长度是20字节,如果首部长度不是4字节的整数倍,必须使用填充字段填满。因此数据部分总是4字节的整数倍开始的。

  • 服务类型

    占8位,一般情况下不会用到。

  • 总长度

    占16位,指报文的总长(首部 + 数据)。单位为字节,因此数据报的最大长度是2^16 - 1 = 65535字节。实际应用中这么大的报文不常见。IP报文的长度不能超过链路层各协议规定的数据帧的数据字段最大长度,这称为最大传送单元MTU(Maximum Transfer Unit)。比如以太网规定这个长度是1500字节,如果IP报文长度超出,就需要进行分片。IP数据报尽可能长,可以减少发送次数;但是IP报文较短的情况下,路由器的转发效率会提高。所以IP协议规定,互联网中所有路由器和主机要能够接受最大576字节的数据报(上层512字节 + 最大首部60字节 + 4字节余量)。

  • 标识

    占16位。IP程序中的计数器生成,每产生一个IP数据报,这个计数器就+1,并把数字分配给这个字段。这个字段用来在IP报文较大(超过链路层MTU)需要分片时,所有分片都分配同一个标示,发送到目标主机后, 通过这个标示进行数据报组装。

  • 标志

    占3位,目前仅两位有意义。

    • 最低位记为MF(More Fragment)。MF = 1表示后面还有分片,MF = 0表示是最后一个数据报。
    • 中间位记为DF(Don‘t Fragment)。DF = 0时才能进行分片
  • 片位移

    占13位,片偏移指出,较长的数据报分片后,该分片在数据报中的相对位置。因为IP是不保证时序的,因此需要指定偏移量进行分片组装。

  • 生存时间

    占8位。即TTL(Time To Live)。表明数据报在网络传输中的寿命。由发出数据报的源头设置此字段,目的是为了避免无法交付的数据报造成网络资源浪费。最初这个字段代表的含义是秒,每经过一个节点,就减去一些时间。当这个字段为0,就丢弃这个数据报。后来TTL代表的含义改为跳数,即可经过的路由器节点数。路由器每次转发都把TTL减1,直到0。如果这个字段被设置为1,代表这个数据报只能在局域网内传输,因为只要经过路由器,它就会被丢弃。

  • 协议

    占8位,代表上层是什么协议。一些常用协议的字段值:

    ICMP IGMP IP TCP EGP IGP UDP IPv6 ESP OSPF
    1 2 4 6 8 9 17 41 50 89
  • 首部校验和

    占16位,这个字段只检验数据报的首部。这里的计算方法是,发送方把数据报首部的所有字段划分为多个16位片段,并且把校验和置为0,并且将这些字段反码求和,将结果取反码写入校验和字段。接收方拿到数据报之后,将所有字段反码求和,然后将结果取反,如果最终结果为0,则代表这个数据报正常,否则就视为出错。

  • 源地址

    占32位。

  • 目的地址

    占32位。

# 首部可变部分

作为选项字段,增加IP协议的功能。但是用处比较少,新版IPv6已经将头部定为固定。

# IP转发分组

  1. 从数据报首部提取目的主机的IP地址D,得出目的网络地址N。
  2. 如果N就是本网络,则直接交付(包含ARP查询,MAC帧封装等)。否则进行第三步。
  3. 如果路由表中有目的地址为D的特定主机路由,则把数据报传送给指定的下一跳路由器。否则执行第四步。
  4. 如果路由表中有到达网络N的路由,则把数据报传送给该路由器。否则执行第五步。
  5. 如果路由表中有默认路由,则把数据报交给默认路由指定的下一跳路由器。否则执行第六步。
  6. 转发出错。

# 子网划分、超网构造

# 子网划分

# 从二级IP到三级IP

目前来看,IP地址的设计不太合理:

  1. IP地址空间利用率低。

    比如有的组织申请到B类地址,但主机数却很少,这样就造成IP地址的浪费。

  2. 给每个物理网络分配网络号导致路由表过大。

    网络号越多,路由器查询路由表就越慢。

  3. 两级IP灵活度不够

为了解决这些问题,1985年在IP地址中新增了子网号,使两级IP变成三级。这种做法叫子网划分(subneting)RFC 950。子网划分目前已经是标准协议。子网划分的思路如下:

  • 拥有许多物理网络的单位,可以将所属的物理网络划分为若干子网。本单位以外是看不到这些子网的。

  • 划分方法是从主机号借用若干位作为子网号,于是本单位内部就变成了三级IP地址。

    IP 地址 :== {<网络号>,<子网号>,<主机号>}

  • 凡是从其他网络发送给本网络某台主机的数据报,仍然是根据IP数据报的目的地址找到本网络的路由器。此路由器收到IP数据报后,再通过子网号找主机。

# 子网掩码

路由器如何知道子网号占了多少位呢?或者说,从IP报文来看,是看不出网络是否进行了子网划分的。子网掩码解决了这个问题。

子网掩码是32位的,每一位与IP地址一一对应,代表网络号的位是1,主机号的位是0。这样,路由器只需要使用IP与子网掩码做与运算,就可以得到网络号。

不划分子网时,也要有子网掩码,这是为了方便查找路由表。互联网标准规定:所有网络都必须有子网掩码,路由表中也要有这一栏内容。如果网络不划分子网,那么该网络就使用默认子网掩码。子网掩码是网络的重要属性。

# 使用子网时分组的转发

子网划分后,路由表必须包含三项内容:目的网络地址、子网掩码、下一跳地址。使用子网后,分组转发逻辑如下:

  1. 从收到的数据报首部提取IP地址D。
  2. 判断是否直接交付。对路由器直连的网络进行检查:用各网络的子网掩码和D做与运算,看结果是否匹配。匹配则直接交付,不匹配则进行第三步。
  3. 如果路由表有目的地址为D的特定路由,则转发给该路由指定的下一跳。否则执行第四步。
  4. 用路由表中的每一条记录的子网掩码与D做与运算,得出结果N。如果N与改行的目的网络地址匹配,则把数据报传送给该行指定的下一条路由。否则执行第五步。
  5. 若有默认路由,转发到默认路由指定的下一跳。
  6. 转发出错。

# 无分类编址CIDR(构造超网)

# 网络前缀

子网划分一定程度缓解了之前的困难。1992年,互联网又面临3个必须解决的问题:

  1. B类地址在1992年已经分配掉接近一半
  2. 互联网主干网上的路由表项目急剧增长
  3. 整个IPv4的地址空间最终将全部耗尽。2011年2月3日,IANA宣布IPv4地址已经耗尽。

CIDR(Classless Inter-Domain Routing)无分类域间路由选择。它的主要特点有两个:

  1. 消除了传统A、B、C类地址和子网划分的概念,从而更有效的分配IP地址空间。它将IP地址划分为两部分,前面是网络前缀,后面是主机号。CIDR让IP地址从三级又回到二级编址,但它是无分类编址:

    IP地址 :=={<网络前缀>,<主机号>}

    CIDR仍使用斜线记法,在IP地址后加一条/,然后在后面指明网络前缀的位数。

  2. CIDR把网络前缀相同的连续IP组成一个CIDR地址块。只要知道地址快中的任何一个地址,就可以知道这个地址快的起始地址和最大地址。例如地址128.14.35.7/20。现在将它表示成二进制

    128.14.35.7/20 = 10000000 00001110 00100011 00000111

    可以很方便地得出它的最小地址:10000000 00001110 00100000 0000000,
    最大地址:10000000 00001110 00101111 11111111。当然全1和全0不会被分配,所以地址总数是这两个之间的地址。CIDR使用32位的地址掩码,这个和子网掩码是类似的。/后面的数字代表地址掩码中连续1的个数。CIDR的地址掩码可作为子网掩码使用。

# ICMP

网际控制报文协议ICMPICMP是为了更有效地转发IP数据报和提高交付成功率。ICMP装在IP报文的数据体中,但不属于上层协议,仍属于网络层协议。

# ICMP报文种类

报文分为两种。ICMP差错报告报文和ICMP询问报文。

  • 差错报告报文类型值
    • 3——终点不可达
    • 11——超时
    • 12——参数问题
    • 5——改变路由(redirect)
  • 询问报文类型值
    • 8或0——回送(echo)请求或回答
    • 13或14——时间戳(timestamp)请求或回答

# ICMP应用

  • ping

    用来测试两个节点的连通性。应用层直接使用网络层协议。

  • traceroute

    用来记录到某个节点的路径。原理:使用不可交付的UDP报文(使用错误端口号实现),每次将TTL增1,到目的主机之前,都会收到超时的ICMP错误报告;到达目的主机后,会收到终点不可达的ICMP错误报告。由这些ICMP的来源,就可以记录路由信息。

# 路由选择协议

协议的核心是路由算法,理想的算法应当具备以下特点:

  1. 必须完整且正确。沿着路由表的指引,一定可以到达目的主机。
  2. 计算应当简单。计算不应当给通信带来太多开销。
  3. 应该能适应通信量和网络拓扑的变化。算法能够自适应的改变路由从而均衡网络负载,当某个节点故障恢复,算法也能够及时更新路由。
  4. 稳定性。通信量稳定的情况下,路由的解应当收敛,而不是不停变化。
  5. 公平。网络所有节点平等,要考虑普适性。
  6. 最佳。算法应当能找出最佳路径,使延时最小且吞吐量最大。所谓最佳也是在某一特定要求下更为合理的选择。

# 分层路由选择协议

互联网主要采取的路由选择协议是自适应、分布式的。可以把互联网划分成多个较小的自治系统(autonomous system),记为AS。AS是单一技术管理下的一组路由器,一个AS对其他AS表现出的是一个单一的、一致的路由选择策略。这样互联网就把路由选择协议划为两类:

  1. 内部网关协议IGP(Interior Gateway Protocol)。自治系统内部使用的路由选择协议,与互联网中其他AS使用的路由选择协议无关。目前这类协议有RIP和OSPF。
  2. 外部网关协议EGP(External Gateway Prototol)。源主机和目的主机处于不同的AS中,当数据报到达一个AS的边界时,就需要使用一种协议将信息传递到另外一个AS中。目前使用最多的外部网关协议是BGP-4。

AS之间的路由选择也叫域间路由选择,AS之内的路由选择也叫域内路由选择。

# RIP协议

**RIP(Routing Information Protocol)**路由信息协议是IGP中最先得到广泛使用的协议。它是一种分布式的基于距离向量的路由选择协议,是互联网的标准协议,最大优点就是简单。RIP协议要求路由器都记录到达其他每一个目的网络的距离。RIP将“距离”定义如下:

从一路由器到直接连接的网络的距离定义为1。从一路由器到非直接连接的网络的距离定义为所经过路由器数加1。