计算机系统(八):网络层(上篇)

目录

引言

8.1 转发和路由选择

8.1.1 连接建立

8.1.2 网络服务模型

8.2 虚电路和数据报网络

8.2.1 虚电路网络

8.2.2 数据报网络

8.3 路由器工作原理

8.3.1 输入端口

8.3.2 交换结构

8.3.3 输出端口

8.3.4 路由选择控制平面

8.3.5 多协议标签交换系统

8.3.6 Quality of Service

8.4 网际协议:因特网中的转发和编址

8.4.1 数据报格式

8.4.1.1 IP数据报分片

8.4.1.2 分片和IP Headers

8.4.2 IPv4编址

8.4.2.1 IPv4地址的稀缺性

8.4.2.2 网络地址转换(NAT)

8.4.3 IPv6


引言

在接下来的网络层的相关博客里,我们将学习网络层实际是怎样实现主机到主机的通信服务的。我们将看到,与运输层和应用层不同的是,在网络中的每一台主机和路由器中都有一个网络层部分。正因如此,网络层协议是协议栈中最具挑战性的部分和最复杂的层次之一。

  • 作用:从源头一路获取数据到目的地,可能不在一个单跳(点对点链接)。   
  • 流量必须被有效地路由,这是由称为路由器的网络设备完成的    
  • 节点必须被赋予名称(地址)。

8.1 转发和路由选择

网络层的作用:将分组从一台发送主机移动到一台接收主机。

为此,需要两种重要的网络层功能:

转发。当一个分组到达路由器的一条输入链路时,路由器必须将该分组移动到适当的输出链路。例如,来自主机H1到路由器R1的一个分组,必须向在H2路径上的下一台路由器转发。

路由选择。当分组从发送方流向接收方时,网络层必须决定这些分组所采用的路由或路径。计算这些路径的算法被称为路由选择算法(routing algorithm)。例如,一个路由选择算法将决定分组从H1到H2流动所遵循的路径。

强调一下:转发是指将分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作。路由选择是指网络范围的过程,以决定分组从源到目的地所采取的端到端路径。


转发表(forwarding table)

每台路由器具有一张转发表。

路由器通过检查到达分组首部字段的值来转发分组。

然后使用该值在该路由器的转发表中索引查询。

存储在转发表项中的该首部的值指出了该分组将被转发的路由器的输出链路接口。

分组首部中的该值可能是该分组的目的地址或该分组所属连接的指示,这取决于网络层协议。

上图的例子中,一个首部字段值为0111的分组到达路由器。路由器在它的转发表中索引,决
定该分组的输出链路接口是接口2。然后路由器在内部将该分组转发到接口2。

路由器中的转发表是如何配置的?

路由选择算法决定了插入路由器的转发表中的值。路由选择算法可能是集中式的(例如,算法在某个中心场点执行,并向每台路由器下载路由选择信息),或是分布式的(即,使用运行在每台路由器上的分布式路由选择算法的一部分)。但是在任何一种情况下,都是路由器接收路由选择协议报文,该信息被用于配置其转发表。

分组交换机

  • 术语分组交换机是指一台通用分组交换设备,它根据分组首部字段中的值,从输入链路接口到输出链路接口转移分组。
  • 某些分组交换机称为链路层交换机(link-layer switches)。
  • 其他分组交换机称为路由器(router),基于网络层字段中的值做转发决定。

8.1.1 连接建立

上面说网络层有两个重要的功能,转发和路由选择。但实际上有第三种重要的网络功能,即连接建立(connection setup)。

类似于TCP连接的三次握手,某些网络层体系结构如ATM、帧中继、MPLS,要求从源到目的地沿着所选择的路径彼此握手,以便在给定源到目的地连接中的网络层数据分组能够开始流动之前建立起状态。在网络层,该过程被称为连接建立。

8.1.2 网络服务模型

运输层能够指望网络层将该分组交付给目的地吗?

当发送多个分组时,它们会按发送顺序按序交付给接收主机的运输层吗?

发送两个连续分组的时间间隔与接收到这两个分组的时间间隔相同吗?

网络层会提供关于网络中拥塞的反馈信息吗?

在发送主机与接收主机中连接运输层的通道的抽象视图(特性)是什么?

网络服务模型(network service model)

定义了分组在发送与接收端系统之间的端到端运输特性。


在发送主机中,当运输层向网络层传递一个分组时,能由网络层提供的特定服务包括:

  • 确保交付。该服务确保分组将最终到达其目的地。
  • 具有时延上界的确保交付。该服务不仅确保分组的交付,而且在特定的主机到主机时延上界内(例如在100ms内)交付。

此外,能够为给定的源和目的地之间的分组流提供下列服务:

  • 有序分组交付。该服务确保分组以它们发送的顺序到达目的地。
  • 确保最小带宽。这种网络层服务模仿在发送和接收主机之间的一条特定比特率(例如1Mbps)的传输链路的行为。只要发送主机以低于特定比特率的速率传输比特(作为分组的组成部分),则分组不会丢失,且每个分组会在预定的主机到主机时延内到达(例如在40ms内)。
  • 确保最大时延抖动。该服务确保位于发送方的两个相继分组之间的时间量等于在目的地接收到它们之间的时间量(或这种间隔的变化不超过某些特定的值)。
  • 安全性服务。使用仅由源和目的主机所知晓的一个秘密会话密钥,在源主机中的网络层能够加密向目的主机发送的所有数据报负载。在目的主机中的网络层则能够负责解密该负载。使用这种服务,能够向源和目的主机之间的所有运输层报文段(TCP和UDP)提供机密性。除了机密性以外,网络层能够提供数据完整性和源鉴别服务。

以上只是网络层能够提供的部分服务的列表,有无数种可能的服务变种。

因特网的网络层提供了单一的服务,称为尽力而为服务(best-effort service)。使用尽力而为服务,分组间的定时是不能确保被保证的,分组接收的顺序也不能保证与发送的顺序一致,传送的分组也不能保证最终交付。给出这样的定义,一个没有向目的地交付分组的网络也符合尽力而为交付服务的定义。然而,这样一种极为简化的网络层服务模型,是有其正当的存在理由的。

8.2 虚电路和数据报网络

运输层能够为应用程序提供无连接服务(UDP)或面向连接服务(TCP)。网络层也能够在两台主机之间提供无连接服务或连接服务。网络层的连接和无连接服务在许多方面与运输层的面向连接和无连接服务类似。例如,网络层连接服务以源和目的主机间的握手开始;网络层无连接服务则没有任何握手预备步骤。

尽管网络层连接和无连接服务与运输层面向连接和无连接服务有类似之处,但也存在重大差异:

  • 在网络层中,这些服务是由网络层向运输层提供的主机到主机的服务。在运输层中,这些服务则是运输层向应用层提供的进程到进程的服务。
  • 网络层或者提供了主机到主机的无连接服务,或者提供了主机到主机的连接服务,而不同时提供这两种服务。
  • 虚电路网络(Virtual-Circuit,VC)

    仅在网络层提供连接服务的计算机网络称为虚电路网络。

  • 数据报网络(datagram network)

    仅在网络层提供无连接服务的计算机网络称为数据报网络。

运输层面向连接服务是在位于网络边缘的端系统中实现的;网络层连接服务除了在端系统中,也在位于网络核心的路由器中实现。

8.2.1 虚电路网络

虽然因特网是一个数据报网络,但许多其他网络体系结构(包括ATM、帧中继的体系结构)却是虚电路网络,因此在网络层使用连接。这些网络层连接被称为虚电路。

一条虚电路的组成如下:

  • 源和目的主机之间的路径(即一系列链路和路由器)。
  • VC号,沿着该路径的每段链路的一个号码。
  • 沿着该路径的每台路由器中的转发表表项。

属于一条虚电路的分组将在它的首部携带一个VC号。因为一条虚电路在每条链路上可能具有不同的VC号,每台中间路由器必须用一个新的VC号替代每个传输分组的VC号。该新的VC号从转发表获得。

为了举例说明这个概念,考虑在图中的网络:

在图中靠近R1链路的号码是该链路接口的编号。现在假定主机A请求该网络在它自己与主机B之间创建一条虚电路。同时假定该网络为该虚电路选择路径 A-R1-R2-B 并为这条路径上的这3条链路分配VC号12、22和32在这种情况下,当在这条虚电路中的分组离开主机A时,在该分组首部中的VC字段的值是12;当它离开R1时,该值是22,而当它离开R2时,该值是32。


对于通过某路由器的分组,该路由器怎样决定更换其VC号呢?

对于虚电路网络,每台路由器的转发表包括了VC号的转换;例如,在R1中的转发表可能像下表:

无论何时跨越一台路由器创建一条新的虚电路,转发表就增加了一个新表项。类似地,无论何时终止一条虚电路,沿着该路径每个表中的相应项将被删除。

一个分组沿着其路由在每条链路上不简单地保持相同的VC号的原因:

  • 逐链路代替该号码减少了在分组首部中VC字段的长度。
  • 通过允许沿着该虚电路路径每条链路有一个不同的VC号,大大简化了虚电路的建立。特别是,在具有多个VC号的路径,其上的每条链路能够独立于沿着该路径的其他链路所选的号码选择一个VC号。

相反,如果沿着某路径的所有链路要求一个共同的VC号的话,路由器将不得不交换并处理相当大量的报文,以约定一个共同的VC号(例如,一个并未由这些路由器的任何其他现有虚电路使用的号码)用于一次连接。


在虚电路网络中,该网络的路由器必须为进行中的连接维持连接状态信息(connec-tionstate information)。特别是:

  • 每当跨越一台路由器创建一个新连接,必须在该路由器的转发表中增加一个新的连接项;
  • 每当释放一个连接,必须从该表中删除该项。

注意:即使没有VC号转换,仍有必要维持连接状态信息,该信息将VC号与输出接口号联系起来。


在虚电路中有3个明显不同的阶段:

  • 虚电路建立。在建立阶段,发送运输层与网络层联系,指定接收方地址,等待网络建立虚电路。网络层决定发送方与接收方之间的路径,即该虚电路的所有分组要通过的一系列链路与路由器。网络层也为沿着该路径的每条链路决定一个VC号。最后,网络层在沿着路径的每台路由器的转发表中增加一个表项。在虚电路建立期间,网络层还可以预留该虚电路路径上的资源(如带宽)。
  • 数据传送。如下图所示,一旦创建了虚电路,分组就可以开始沿该虚电路流动了。

  • 虚电路拆除。当发送方(或接收方)通知网络层它希望终止该虚电路时,就启动这个阶段。然后网络层通常将通知网络另一侧的端系统结束呼叫,并更新路径上每台分组路由器中的转发表以表明该虚电路已不存在了。

在网络层的虚电路建立与运输层的连接建立之间有一个细微但很重要的区别:

运输层的连接建立仅涉及两个端系统。在运输层的连接建立期间,两个端系统独自决定运输层连接的参数(如初始序号与流量控制窗口长度)。虽然这两个端系统已经知道该运输层连接,但网络中的路由器则对这些完全不知情。在另一方面,对于一个虚电路网络层,沿两个端系统之间路径上的路由器都要参与虚电路的建立,且每台路由器都完全知道经过它的所有虚电路。

端系统向网络发送指示虚电路启动与终止的报文,以及路由器之间传递的用于建立虚电路(即修改路由器表中的连接状态)的报文,它们被称为信令报文(signaling message),用来交换这些报文的协议常称为信令协议(signaling protocol)。 

8.2.2 数据报网络

在数据报网络中,每当一个端系统要发送分组,它就为该分组加上目的端系统的地址,然后将分组推进网络中。如下图所示:

无需建立任何虚电路,路由器不维护任何虚电路的状态信息(因为没有虚电路!)。 

当分组从源到目的地传输,它通过一系列路由器传递。这些路由器中的每台都使用分组的目的地址来转发该分组。特别是,每台路由器有一个将目的地址映射到链路接口的转发表;当分组到达路由器时,路由器使用该分组的目的地址在转发表中查找适当的输出链路接口。然后路由器有意将分组向该输出链路接口转发。

为了进一步深入理解查找操作,我们看一个特定的例子。假定所有的目的地地址均是32比特(这恰好就是在IP数据报中目的地址的长度)。转发表的蛮力实现将对每个可能的目的地址有一个表项。因为有超过40亿个可能的地址,这种选择完全是不可能的。

现在我们进一步假设路由器有4条链路,编号0~3,分组以如下方式转发到链路接口:

显然,对于这个例子,在路由器的转发表中就没有必要有40亿表项。例如,我们能够有仅包括4个表项的下列转发表:

使用这种风格的转发表,路由器用分组的目的地址的前缀(prefix)与该表中的表项进行匹配;如果存在一个匹配项,则路由器向与该匹配项相联系的链路转发分组。

分组的目的地址是11001000 00010111 00010110 10100001;因为该地址的21比特前缀匹配该表的第一项, 所以路由器向链路接口0转发该分组。

如果一个前缀不匹配前3项中的任何一项,则路由器向链路接口3转发该分组。

一个目的地址可能与不止一个表项相匹配。例如,地址11001000 00010111 00010000 10101010 的前24比特与表中的第二项匹配,而该地址的前21比特与表中的第三项匹配。当有多个匹配时,该路由器使用最长前缀匹配规则(longest prefix matching rule);即在该表中寻找最长的匹配项,并向与最长前缀匹配相关联的链路接口转发分组。


  • 数据报网络中的路由器不维持连接状态信息,但必需在转发表中维持了转发状态信息。
  • 然而,转发状态信息表变化的时间尺度相对要慢

对比:

数据报网络中的转发表是通过路由选择算法进行修改的,这通常每1~5分钟左右更新一次转发表。

在虚电路网络中,无论何时通过路由器建立一条新的连接,或无论何时通过路由器拆除一条现有的连接,路由器中的转发表就被更新。对一台第一层主干路由器而言,这很容易以微秒的时间尺度进行更新。

因为在数据报网络中的转发表能够在任何时刻修改,从一个端系统到另一个端系统发送一系列分组可能在通过网络时走不同的路径,并可能无序到达。

8.3 路由器工作原理

网络层的转发功能(forwarding function):

即实际将分组从一台路由器的入链路传送到适当的出链路。

上图显示了一个通用路由器体系结构的总体视图。其中标识了一台路由器的4个组成部分:

输入端口

输入端口执行几项关键功能:

  • 它要执行将一条输入的物理链路与路由器相连接的物理层功能,这显示在图中输入端口部分最左侧的方框与输出端口部分最右侧的方框中。
  • 它还要执行需要与位于入链路远端的数据链路层交互的数据链路层功能,这表示在输入与输出端口部分的中间方框中。
  • 也许更为重要的是,在输入端口还要完成查找功能,这显示在输入端口最右侧的方框中。正是在这里,通过查询转发表决定路由器的输出端口,到达的分组通过路由器的交换结构将转发到输出端口。控制分组(如携带路由选择协议信息的分组)从输入端口转发到路由选择处理器。

交换结构

交换结构将路由器的输入端口与输出端口相连接。这种交换结构完全包含在路由器中,即它是一个网络路由器中的网络!

存储和转发数据包交换

互联网是一个包交换网络    

  1. 主机H1想发送一个数据包给H2  
  2. 将其传送到最近的路由器(A)。 
  3. 该数据包在到达时被缓冲,并验证校验和  
  4. 如果有效,该数据包将被存储,直到出站接口空闲。 
  5. 路由器将数据包转发给路径中的下一个路由器  
  6. 重复2-4

数据包转发——无连接

数据包转发——面向连接

连接的优点和缺点

输出端口

输出端口存储从交换结构接收的分组,并通过执行必要的链路层和物理层功能在输入链路上传输这些分组。当一条链路是双向的(即承载两个方向的流量)时,输出端口通常是与该链路的输入端口在同一线路卡(一个包含一个或多个输入端口的印刷电路,它与交换结构相连)上成对出现的。

路由选择处理器

路由选择处理器执行路由选择协议,维护路由选择表以及连接的链路状态信息,并为路由器计算转发表。它还执行网络管理功能。

我们对路由器的转发功能和路由选择功能加以区分。一台路由器的输入端口、输出端口和交换结构共同实现了这种转发功能,并且总是用硬件实现,如上图所示。这些转发功能有时总称为路由器转发平面(router forwarding plane)。

为何需要硬件实现呢?

考虑具有10Gbps带宽的输入链路和64字节的IP数据报,其输入端口在另一个数据报到达前仅有51.2ns来处理数据报。如果N个端口结合在一块线路卡上(因为实践中常常这样做),数据报处理流水线必须以N倍速率运行,这远快过软件实现的速率。


类比:分组转发好比汽车进入和离开立交桥。假定立交桥是环状交叉路,在汽车进入该环状交叉路前,需要做一点处理,即汽车停在一个入口站上并指示它的最终目的地(并非在本地环状交叉路,而是其旅途的最终目的地)。入口站的一名服务人员查找最终目的地,决定通向最后目的地的环状交叉路的出口,并告诉驾驶员要走哪个出口。该汽车进入环状交叉路(该环状交叉路可能挤满了从其他输入道路进入的其他汽车,朝着其他环状交叉路出口前进),并且最终离开预定的环状交叉路出口斜道,在这里可能遇到了在该出口离开环状交叉路的其他汽车。

  • 入口路和入口站对应于输入端口(具有查找功能以决定本地输出端口);
  • 环状交叉路对应于交换结构;
  • 环状交叉路出口路对应于输出端口。

根据类比考虑瓶颈可能出现的地方:

  • 如果汽车以极快的速率到达而车站服务人员很慢,将发生什么情况?
  • 这些服务人员必须工作得多快,以确保在入口路上没有车辆拥堵?
  • 甚至对于极快的服务人员,如果汽车在环状交叉路上开得很慢,将发生什么情况?拥堵仍会出现吗?
  • 如果大多数进人的汽车都要在相同的出口斜道离开环状交叉路,将发生什么情况?
  • 在出口斜道或别的什么地方会出现拥堵吗?
  • 如果我们要为不同的汽车分配优先权,或先行阻挡某些汽车进入环状交叉路,环状交叉路将如何运行?

8.3.1 输入端口

  • 上图给出一个更详细的输入处理的视图。输入端口的线路端接功能与链路层处理实现了用于各个输入链路的物理层和链路层。
  • 在输入端口中执行的查找对于路由器的运行是至关重要的。正是在这个地方,路由器使用转发表来查找输出端口,使得到达的分组将能经过交换结构转发到该输出端口。
  • 转发表是由路由选择处理器计算和更新的,但转发表的一份影子副本通常会被存放在每个输入端口。
  • 转发表从路由选择处理器经过独立总线(例如一个PCI总线)复制到线路卡,在下图中该总线由从路由选择处理器到输入线路卡的虚线所指示。

  • 有了影子副本,转发决策能在每个输入端口本地做出,无须调用中央路由选择处理器,因此避免了集中式处理的瓶颈。

假定转发表已经存在,从概念上讲表查找是简单的,即我们只是搜索转发表查找最长前缀匹配。但在吉比特速率下,这种查找必须在纳秒级执行。因此,不仅必须要用硬件执行查找,而且需要对大型转发表使用超出简单线性搜索的技术。同时必须对内存访问时间给予特别关注,这导致用嵌入式片。

一旦通过查找确定了某分组的输出端口,则该分组就能够发送进入交换结构。在某些设计中,如果来自其他输入端口的分组当前正在使用该交换结构,一个分组可能会在进入交换结构时被暂时阻塞。因此,一个被阻塞的分组必须要在输入端口处排队,并等待稍后被及时调度以通过交换结构。

尽管“查找”在输入端口处理中可以说是最为重要的动作,但必须采取许多其他动作:

  • 必须出现物理层和链路层处理,如前面所讨论的那样;
  • 必须检查分组的版本号、检验和以及寿命字段,并且重写后两个字段;
  • 必须更新用于网络管理的计数器(如接收到的IP数据报的数目)。

输入端口查找IP地址然后发送该分组进入交换结构(“动作”)的步骤是一种更为一般的“匹配加动作”抽象的特定情况,这种抽象执行在许多网络设备中,而不仅在路由器中。

8.3.2 交换结构

交换结构位于一台路由器的核心部位。正是通过这种交换结构,分组才能实际地从一个输入端口交换(即转发)到一个输出端口中。交换可以用许多方式完成,如图所示:

经内存交换

最简单、最早的路由器是传统的计算机,在输入端口与输出端口之间的交换是在CPU (路由选择处理器)的直接控制下完成的。

许多现代路由器通过内存进行交换。然而,与早期路由器的一个主要差别是,目的地址的查找和将分组存储(交换)进适当的内存存储位置是由输入线路卡来处理的。在某些方面,经内存交换的路由器看起来很像共享内存的多处理机,用一个线路卡上的处理将分组交换(写)进适当的输出端口的内存中。

经总线交换

在这种方法中,输入端口经一根共享总线将分组直接传送到输出端口,不需要路由选择处理器的干预。

经互联网络交换

克服单一、共享式总线带宽限制的一种方法是,使用一个更复杂的互联网络,例如过去在多处理器计算机体系结构中用来互联多个处理器的网络。

8.3.3 输出端口

如下图所示,输出端口处理取出存放在输出端口内存中的分组并将其发送到输出链路上。这包括选择和取出排队的分组进行传输,执行所需的链路层和物理层传输功能。

8.3.4 路由选择控制平面

我们隐含地假设路由选择控制平面全部驻留并运行在路由器中的路由选择处理器上。网络范围的路由选择控制平面因此是分布式的,即不同部分(例如路由选择算法)执行在不同的路由器上并且通过彼此发送控制报文进行交互。

8.3.5 多协议标签交换系统

多协议标签交换系统(MultiProtocol Label Switching,MPLS)

广泛部署的虚拟电路(面向连接)网络层协议(低于互联网子层),MPLS网络是一个IP hop。

主要目的是提高服务质量:

  • 对流量进行优先排序    
  • 网络性能的服务水平协议    
  • 以已知参数进行可靠的连接    

受希望连接多个站点的企业和携带语音流量的电话公司欢迎。

价格昂贵,每Mbps的价格大约是标准互联网连接的20-100倍(成本更相似)。

8.3.6 Quality of Service

为什么服务质量(QoS)很重要?

不是所有的服务都同样重要,也不是所有的服务都对网络延迟有很强的吸引力。

  • VoIP与文件下载。
  • VPN连接与网页浏览。

在你自己的网络内,或在单一管理的网络(ISP)内,可以对服务进行优先排序。

  • 自己的网络——通常是明确的
  • 共享网络——通常是隐性的(ISP流量整形)。

在显性优先的情况下,差异化服务标题可用于定义流量类别。

在办公大楼的网络同时承载互联网和电话流量的情况下非常有用。

8.4 网际协议:因特网中的转发和编址

我们将注意力转向在因特网中是如何完成编址和转发的。我们将看到因特网编址和转发是网际协议(IP)的重要组件。目前有两个版本的IP在使用。我们首先研究广泛部署的IP协议版本4,这通常简称为IPv4。然后研究IP版本6,已经提议用它替代IPv4。

在我们尝试研究IP之前,先来考虑构成因特网的网络层的一些组件。如图中所示:

因特网的网络层有三个主要组件:

第一个组件是IP协议。

第二个主要组件是路由选择部分,它决定了数据报从源到目的地所流经的路径。我们前面讲过路

由选择协议计算出用于在网络中转发分组的转发表。我们将在后面研究因特网的路由选择协议。

网络层的最后一个组件是报告数据报中的差错和对某些网络层信息请求进行响应的设施。

我们将在后面涉及因特网的网络层差错和信息报告的协议,即互联网控制报文协议( ICMP)。

地址的类型

单播:一个目的地(正常地址) 。被认为是唯一的类型

广播:发送给所有人。

多播:发送到一个特定的节点集,用于现场活动的流媒体视频。

任意广播:发送给一组地址中的任何一个,用于数据库查询,如DNS、NTP。

Geocast:发送给某个地理区域的所有用户,位置感知服务,向商店里的人发送广告,向靠近危险的人发送警告。

8.4.1 数据报格式

IPv4 数据报格式如图所示:

IPv4数据报中的关键字段如下:

版本(号)

4比特规定了数据报的IP协议版本。通过查看版本号,路由器能够确定如何解释IP数据报的剩余部分。不同的IP版本使用不同的数据报格式。

首部长度

因为一个IPv4数据报可包含一些可变数量的选项(这些选项包括在IPv4数据报首部中),故需要用这4比特来确定IP数据报中数据部分实际从哪里开始。大多数IP数据报不包含选项,所以一般的IP数据报具有20字节的首部。

服务类型

服务类型(TOS)比特包含在IPv4首部中,以便使不同类型的IP数据报(例如,一些特别要求低时延、高吞吐量或可靠性的数据报)能相互区别开来。例如,将实时数据报(如用于IP电话应用)与非实时流量( 如FTP)区分开也许是有用的。提供特定等级的服务是一个由路由器管理员决定的策略问题。

数据报长度

这是IP数据报的总长度(首部加上数据),以字节计。因为该字段长为16比特,所以IP数据报的理论最大长度为65 535字节。然而,数据报很少有超过1500字节的。

标识、标志、片偏移

这三个字段与所谓IP分片有关,这是一个我们将很快要深入考虑的一个问题。有趣的是,新版本的IP ( 即IPv6)不允许在路由器上对分组分片。

寿命

寿命(Time-To-Live,TTL)字段用来确保数据报不会永远(如由于长时间的路由选择环路)在网络中循环。每当数据报由一台路由器处理时,该字段的值减1。若TTL字段减为0,则该数据报必须丢弃。

协议

该字段仅在一个IP数据报到达其最终目的地才会有用。该字段值指示了IP数据报的数据部分应交给哪个特定的运输层协议。例如,值为6表明数据部分要交给TCP,而值为17表明数据要交给UDP。对于所有可能值的列表。

注意在IP数据报中的协议号所起的作用,类似于运输层报文段中端口号字段所起的作用。

协议号是将网络层与运输层绑定到一起的粘合剂;

端口号是将运输层和应用层绑定到一起的粘合剂;

链路层帧也有一个特殊字段用于将链路层与网络层绑定到一起。

首部检验和

首部检验和用于帮助路由器检测收到的IP数据报中的比特错误。

首部检验和是这样计算的:将首部中的每2个字节当作一个数,用反码运算对这些数求和。该和的反码(被称为因特网检验和存放在检验和字段中。路由器要对每个收到的IP数据报计算其首部检验和,如果数据报首部中携带的检验和与计算得到的检验和不一致,则检测出是个差错。

路由器一般会丟弃检测出错误的数据报。

注意到在每台路由器上必须重新计算检验和并再次存放到原处,因为TTL字段以及可能的选项字段会改变。

为什么TCP/IP在运输层与网络层都执行差错检测?

这种重复检测有几种原因。首先,注意到在IP层只对IP首部计算了检验和,而TCP/UDP检验和是对整个TCP/UDP报文段进行的。其次,TCP/UDP与IP不一定都必须属于同一个协议栈。原则上TCP能运行在一个不同的协议(如ATM)上,而IP能够携带不一定要传递给TCP/UDP的数据。

源和目的IP地址

当某源生成一个数据报时,它在源IP字段中插入它的IP地址,在目的IP地址字段中插入其最终目的地的地址。通常源主机通过DNS查找来决定目的地址。

选项

选项字段允许IP首部被扩展。首部选项意味着很少使用,因此决定对每个数据报首部不包括选项字段中的信息,这样能够节约开销。然而,选项的可能存在的确是件复杂的事,因为数据报头长度可变,故不能预先确定数据字段从何处开始。而且还因为有些数据报要求处理选项,而有些数据报则不要求,故导致一台路由器处理一个IP数据报所需的时间变化很大。这些考虑对于高性能路由器和主机上的IP处理来说特别重要。由于这样或那样的原因,在IPv6首部中已去掉了IP选项。

数据(有效载荷)

我们来看看最后的也是最重要的字段,这是数据报存在的首要理由!在大多数情况下,IP数据报中的数据字段包含要交付给目的地的运输层报文段(TCP或UDP)。然而,该数据字段也可承载其他类型的数据,如ICMP报文。
注意到一个IP数据报有总长为20字节的首部(假设无选项)。如果数据报承载一个TCP报文段,则每个(无分片的)数据报共承载了总长40字节的首部(20 字节的IP首部加上20字节的TCP首部)以及应用层报文。

8.4.1.1 IP数据报分片

并不是所有链路层协议都能承载相同长度的网络层分组。有的协议能承载大数据报,而有的协议只能承载小分组。例如,以太网帧能够承载不超过1500字节的数据,而某些广域网链路的帧可承载不超过576字节的数据。一个链路层帧能承载的最大数据量叫做最大传送单元( Maximum Transmission Unit,MTU)。因为每个IP数据报封装在链路层帧中从一台路由器传输到下一台路由器,故链路层协议的MTU严格地限制着IP数据报的长度。对IP数据报长度具有严格限制并不是主要问题。问题在于在发送方与目的地路径上的每段链路可能使用不同的链路层协议,且每种协议可能具有不同的MTU。

MTU——最大传输单位:该网络或协议的最大尺寸

Path MTU:通过网络的路径的最大尺寸= 链接MTU的最小值

为什么不直接在发送方设置路径MTU?

无连接网络,有动态路由

路由和链路MTU在数据包发送后都可以改变

根据TCP/IP的设计目标(保持简单),最简单的解决方案似乎是允许路由器将大数据包分解成片段,沿着网络单独发送。

问题:将一个大的数据包分解成较小的碎片很容易,但将它们重新组合起来就难多了。
两种方法
透明分片(Transparent)——在下一个路由器上重新组合;后来的路由器不知道已经发生了分片。
非透明分片(Nontransparent (used by IP))——在目标主机上重新组合

为了更好地理解这一转发问题,想象你是一台互联几条链路的路由器,且每条链路运行具有不同MTU的链路层协议。假定你从某条链路收到一个IP数据报,通过检查转发表确定出链路,并且该出链路的MTU比该IP数据报的长度要小。此时你会感到慌乱,如何将这个过大的IP分组压缩进链路层帧的有效载荷字段呢?解决该问题的方法是将IP数据报中的数据分片成两个或更多个较小的IP数据报,用单独的链路层帧封装这些较小的IP数据报;然后向输出链路上发送这些帧。每个这些较小的数据报都称为fragment)。

片在其到达目的地运输层以前需要重新组装。实际上,TCP与UDP都希望从网络层收到完整的未分片的报文。IPv4的设计者感到在路由器中重新组装数据报会给协议带来相当大的复杂性并且影响路由器性能。为坚持网络内核保持简单的原则,IPv4的设计者决定将数据报的重新组装工作放到端系统中,而不是放到网络路由器中。

当一台目的主机从相同源收到一系列数据报时,它需要确定这些数据报中的某些是否是一些原来较大的数据报的片。如果某些数据报是片的话,则它必须进一步确定何时收到了最后一片,并且如何将这些接收到的片拼接到一起以形成初始的数据报。为了让目的主机执行这些重新组装任务,IPv4 的设计者将标识、标志和片偏移字段放在IP数据报首部中。当生成一个数据报时,发送主机在为该数据报设置源和目的地址的同时再贴上标识号。

发送主机通常将为它发送的每个数据报的标识号加1。当某路由器需要对一个数据报分片时,形成的每个数据报(即片)具有初始数据报的源地址、目的地址与标识号。当目的地从同一发送主机收到一系列数据报时,它能够检查数据报的标识号以确定哪些数据报实际上是同一较大数据报的片。

由于IP是一种不可靠的服务,一个或多个片可能永远到达不了目的地。因为这种原因,为了让目的主机绝对地相信它已收到了初始数据报的最后一个片,最后一个片的标志比特被设为0,而所有其他片的标志比特被设为1。另外,为了让目的主机确定是否丢失了一个片(且能按正确的顺序重新组装片),使用偏移字段指定该片应放在初始IP数据报的哪个位置。

下图图示了一个例子。一个4000字节的数据报(20 字节IP首部加上3980字节IP有效载荷)到达一台路由器,且必须被转发到一条MTU为1500字节的链路上。这就意味着初始数据报中3980字节数据必须被分配为3个独立的片(其中的每个片也是一个IP数据报)。假定初始数据报贴,上的标识号为777。三个片的特点如表所示。表中的值反映了除了最后一片的所有初始有效载荷数据的数量应当是8字节的倍数,并且偏移值应当被规定以8字节块为单位。
 

8.4.1.2 分片和IP Headers

回顾一下IP Headers

识别——用于识别一个数据包

Flags 标志(DF=不要碎片(Don’t Fragment),MF=更多碎片(More Fragments))

片段偏移量——以8个字节为单位的偏移量

  • 13位——最大偏移量(2^13-1)*8=65,528

如果一个数据包被分割成片

  • 识别对所有片段保持不变
  • MF = 1,适用于所有片段,最后一个除外
  • 片段偏移——为每个片段适当地设置

片段偏移允许接收主机在缓冲区内重建无序的片段——类似于TCP段

片段偏移量,也就是片段大小,必须是在8字节的边界上。
不能发送单字节的片段(除了最后一个)。

  • 如果我们有一个1700字节的有效载荷。 MTU=1500字节,ID=1。
  • 第1个片段:ID=1,DF=0,MF=1,FO=0
  • 第2个片段。ID=1, DF=0, MF=0 , FO=185 (185*8 = 1480 = 1500 - 20字节的头)

简单的方法,但也有一些缺点

  • 分片的开销(每个片断有20个字节的头),从片断点一直到主机都会产生。
  • 如果一个片段丢失,整个数据包必须重新发送。
  • 主机在执行重新组合时的开销比预期的要高。

替代方法是Path MTU discovery:

  • 每个数据包在发送时都设置了DF位——不进行分片
  • 如果路由器不能处理数据包的大小,它会向发送者主机发送一个ICMP(互联网控制消息协议),告诉它将数据包分割成一个较小的尺寸。

可能会导致最初的数据包被丢弃,但主机可以迅速了解最佳尺寸,并减少后续的分片。
除非上层能被告知大小限制,否则主机之间可能仍要进行分片。

  • 这就是为什么TCP/IP通常一起实现的原因之一,以便它们可以共享这种信息。
  • UDP依赖于TCP所发现的PMTU

在目的地,数据报的有效载荷仅当在IP层已完全重构为初始IP数据报时,才被传递给目的地运输层。如果一个或多个片没有到达目的地,则该不完整的数据报被丟弃且不会交给运输层。但是,如果在运输层正使用着TCP,则TCP将通过让源以初始数据报来重传数据,以恢复这次丢包。

IP分片在将许多完全不同的链路层技术粘合起来的过程中起到了重要作用。但是分片也是有开销的。首先,它使路由器和端系统更为复杂。其次,分片能够被用于生成致命的DoS攻击。

IPv4与IPv6分片:

IPv4允许Nontransparent 分片,或Path MTU discovery

  • IPv4最小接受大小为576字节

IPv6希望主机能够发现最佳Path MTU

  • 路由器在IPv6中不进行分片处理
  • IPv6的最小接受大小为1280字节

注意事项:

  • ICMP消息有时会被网络丢弃,导致Path MTU discovery失败。
  • 在这种情况下,连接将在低流量时工作,在高流量时失败——如果有疑问,就按最小接受大小发送。

如果忽略header,直接切分成fragement,那么这些小的fragement的标识设置应该如下:

  • 但真实情况下,我们的 MTU 中也要包含 header 的长度,因此 MTU=1500 的时候 header=20 那么数据只能最大长度为 1480
  • 同时 fragement 的最小单元是 8 个 byte,offset 是按照最小单元来设置的,而不是按照单纯的 byte 数量

注意:之前的5000字节包含20字节的头,真实数据字节是4980,然后被分成四片,意味着每一片都要有20字节的头,所以切分后总数据大小变为4980+4*20=5600。!!!!

将一个 5000 byte 的数据切分成 MTU = 1500 的 fragement,首先每个 header 的长度是 20,因此最大的数据长度应该是 1480。

第一个 fragement 的各个参数分别是:

  • ID=77
  • DF=0
  • MF=1
  • Offset=0

第二个 fragement 的数据部分是从原始数据中的第 1480 byte开始的,因此其 offset=1480 / 8 = 185

第三个 fragement 的数据部分是从第 1480 + 1480 个字节开始的,因此 offset = 1480 * 2 / 8 = 375

第四个 fragement 的数据部分是从第 1480 + 1480 + 1480 个字节开始的,因此 offset = 1480 * 3 / 8 = 555

第四个 fragement 的长度只有 4980 - (1480)*3=540

8.4.2 IPv4编址

我们需要简述一下主机与路由器连入网络的方法。一台主机通常只有一条链路连接到网络;当主机中的IP想发送一个数据报时,它就在该链路上发送。

主机与物理链路之间的边界叫做接口( interface)。

因为路由器的任务是从链路上接收数据报并从某些其他链路转发出去,路由器必须拥有两条或更多条链路与它连接。路由器与它的任意一条链路之间的边界也叫做接口。

一台路由器因此有多个接口,每个接口有其链路。

IP要求每台主机和路由器接口拥有自己的IP地址。

一个IP地址技术上是与一个接口相关联的,而不是与包括该接口的主机或路由器相关联的。


最初,IP地址是根据类来分配的;

路由是根据类来执行的,可以从地址的第一部分衍生出来。


每个IP地址长度为32比特(等价为4字节),因此总共有2^{32}个可能的IP地址。由于2^{10}近似地表示10^{3},故容易看出约有40亿个可能的IP地址。这些地址一般按所谓点分十进制记法(dotted- decimal notation) 书写,即地址中的每个字节用它的十进制形式书写,各字节间以句号(点)隔开。例如,考虑IP地址193.32.216.9, 193是该地址第一个8比特的十进制等价数,32是该地址第二个8比特的十进制等价数,依次类推。因此,地址193.32.216.9的二进制记法是:

11000001 \: \: 00100000 \: \: 1101 1000 \: \: 00001001

在全球因特网中的每台主机和路由器上的每个接口,必须有一个全球唯一的IP地址(在NAT后面的接口除外,本节结尾将讨论)。然而,这些地址不能随意地自由选择。一个接口的IP地址的一部分需要由其连接的子网来决定。

下图提供了一个IP编址与接口的例子。在该图中,一台路由器(具有3个接口)用于互联7台主机。仔细观察分配给主机和路由器接口的IP地址,有几点需要注意。

图中左上侧部分的3台主机以及它们连接的路由器接口,都有一个形如223.1.1.xxx的IP地址。这就是说,在它们的IP地址中,最左侧的24比特是相同的。这4个接口也通过一个并不包含路由器的网络互联起来。例如,该网络能够是一个以太网LAN,在此情况下,这些接口将通过一台以太网交换机互联,或者通过一个无线接入点互联。我们此时将这种无路由器连接这些主机的网络表示为一朵云。

用IP的术语来说,互联这3个主机接口与1个路由器接口的网络形成一个子网(sub-net)。在因特网文献中,子网也称为IP网络或直接称为网络,IP 编址为这个子网分配一个地址:223.1.1.0/24,其中的/24记法,有时称为子网掩码(network mask),指示了32比特中的最左侧24比特定义了子网地址。因此子网223.1.1.0/24是由3台主机接口(223.1.1.1、223.1.1.2和223.1.1.3)和1个路由器接口(223. 1.1.4)组成。任何其他要连到223.1.1.0/24网络的主机都要求其地址具有223.1. 1.xxx的形式。

例如:数据包进入128.208.2.151,10000000.11010000.00000010.10010111


Subnets

未来的变化可以不受任何外部影响:

  • 不需要申请额外的IP地址分配
  • 互联网上的路由不会改变,只在内部改变 

互联网不仅仅是一个网络的网络,它是一个由网络的网络组成的层次结构。


图中显示了另外两个网络:223.1.2.0/24网络与223.1.3.0/24子网:

一个子网的IP定义并不局限于连接多台主机到一个路由器接口的以太网段。为了搞清其中的道理,可考虑下图:

图中显示了3台通过点对点链路彼此互联的路由器。每台路由器有3个接口,每条点对点链路使用一个,一个用于直接将路由器连接到一对主机的广播链路。这里出现了几个子网呢? 3个子网223. 1.1.0/24、 223.1.2.0/24和223.1.3.0/24 

但注意到在本例中还有其他3个子网:一个子网是223.1.9.0/24,用于连接路由器R1与R2的接口;另外一个子网是223.1.8.0/24,用于连接路由器R2与R3的接口;第三个子网是223.1.7.0/24,用于连接路由器R3与R1的接口。对于一个路由器和主机的通用互联系统,我们能够使用下列有效方法定义系统中的子网:

为了确定子网,分开主机和路由器的每个接口,产生几个隔离的网络岛,使用接口端接这些隔离的网络的端点。这些隔离的网络中的每一个都叫做一个子网(subnet)

如果我们将该过程用于图中的互联系统上,我们会得到6个岛或子网。从上述讨论可见,一个具有多个以太网段和点对点链路的组织(如一个公司或学术机构)将具有多个子网,在给定子网上的所有设备都具有相同的子网地址。原则上,不同的子网能够具有完全不同的子网地址。然而,在实践中,它们的子网地址经常有许多共同之处。为了理解其中的道理,我们来关注在全球因特网中是如何处理编址的。

因特网的地址分配策略被称为无类别域间路由选择(Classless Interdomain Routing,CIDR)。CIDR将子网寻址的概念一般化了。因为对于子网寻址,32比特的IP地址被划分为两部分,并且也具有点分十进制数形式a.b.c.d/x,其中x指示了地址的第一部分中的比特数。

CIDR

类简化路由;

网络字段的大小在地址中是隐含的;

浪费: 网络往往比需要的大得多,有260个节点的网络必须是B类,有65,536个地址

无等级的域间路由:

  • 每个接口/路由明确指定哪些位是 "网络 "字段
  • 有260个节点的网络只需要9比特的主机字段:
  • 512个地址,
  • 可以有128倍于B类网络的此类网络。

分层的:编码网络和主机号

  • 网络在顶部位
  • 主机在底部位

以块为单位分配给网络,网络部分对该网络的所有主机都是一样的:

  • 一个网络对应于一个连续的IP地址空间块,称为前缀。
  • 前缀写成最低的IP地址,后面是斜线和网络部分的大小——192.0.2.0/24。

形式为a.b.c.d/x的地址的x最高比特构成了IP地址的网络部分,并且经常被称为该地址的前缀(prefix)(或网络前缀)。一个组织通常被分配一块连续的地址,即具有相同前缀的一段地址。在这种情况下,该组织内部的设备的IP地址将共享共同的前缀。该组织网络外部的路由器仅考虑前面的前缀比特x。这相当大地减少了在这些路由器中转发表的长度,因为形式为a.b.c.d/x单一表项足以将数据报转发到该组织内的任何目的地。

一个地址的剩余32-x比特可认为是用于区分该组织内部设备的,其中的所有设备具有相同的网络前缀。当该组织内部的路由器转发分组时,才会考虑这些比特。这些较低阶比特可能(或可能不)具有另外的子网结构,如前面所讨论的那样。例如,假设某CIDR化的地址a.b.c.d/21的前21比特定义了该组织的网络前缀,它对该组织中的所有主机的IP地址来说是共同的。其余的11比特标识了该组织内的主机。该组织的内部结构可以采用这样的方式,使用这最右边的11比特在该组织中划分子网,就像前面所讨论的那样。例如,a.b.c.d/24可能表示该组织内的特定子网。

在CIDR被采用之前,IP地址的网络部分被限制为长度为8、16或24比特,这是一种称为分类编址(classful addressing)的编址方案,这是因为具有8、16和24比特子网地址的子网分别被称为A、B和C类网络。一个IP地址的网络部分正好为1、2或3字节的要求,已经在支持数量迅速增加的具有小规模或中等规模子网的组织方面出现了问题。一个C类(/24) 子网仅能容纳多达2^8-2=254台主机(2^8 =256,其中的两个地址预留用于特殊用途),这对于许多组织来说太小了。然而一个B类(/16)子网可支持多达65 534台主机,又太大了。在分类编址方法下,比方说一个有2000台主机的组织通常被分给一个B类(/16)地址。这就导致了B类地址空间的迅速损耗以及所分配的地址空间的利用率低。例如,为具有2000台主机的组织分配了一个B类地址,就具有足以支持多达65534个接口的地址空间,剩下的超过63000个地址却不能被其他组织使用。

IP广播地址255.255.255.255。当一台主机发出一个目的地址为255.255.255.255的数据报时,该报文会交付给同一个网络中的所有主机。路由器也会有选择地向邻近的子网转发该报文。

IP Addresses - Blocks

以192.0.2.0/24为例:

24位用于网络192.0.2.0

留出8位给主机——最多256个地址

在10.0.0.0/8(保留的私有块)的情况下:

8位用于网络10.0.0.0

留出24位给主机——最多16,777,216个地址

也可以写成子网掩码,一个1的二进制掩码。在/24的情况下:子网掩码是255.255.255.0

IP Addresses – Prefixing

网络号码=网络掩码(比特-和)IP地址

这对互联网上的有效路由至关重要:

由于网络是按块分配的,中间的路由器只需要维护前缀的路由,而不是每个单独的主机。

只有当数据包到达目的地网络时,才需要读取主机部分。

IP Addresses – Route aggregation

聚合是自动进行的;
目前,它大约将路由表的大小减半。

前缀可以重叠,在这种情况下会选择最长的匹配前缀。

特殊IP地址

8.4.2.1 IPv4地址的稀缺性

随着IP地址的稀缺,处理更多客户的方法被开发出来。

虽然IPv6可以解决这个问题,但还是需要一个过渡期。

私人地址:

  • 一个公司的许多主机只需要内部访问
  • 私有子网192.168.0.0/16, 172.16.0.0/12, 10.0.0.8
  • 可以重复使用:在组织内是唯一的地址,而不是全球的

意图: 应用层代理来访问外部服务。

8.4.2.2 网络地址转换(NAT)

每个客户/家庭被分配一个公共IP地址,企业可能会被分配几个。内部的主机/接口被分配私人IP地址,回顾一下10.0.0.0/8 -10.255.255.255(作为一个例子)。内部IP地址用于在局域网(LAN)的主机之间进行通信,它们决不能在公共互联网上使用,当一个数据包离开网络(到ISP)时,内部地址被翻译成公共IP地址。

NAT是如何工作的

假设是TCP/UDP(有些例外),特别是源和目的端口字段的位置。

  • NAT盒用公共IP地址替换IP源地址(10.x.y.z)。
  • TCP源端口被替换为NAT转换表中的条目索引,65,536个条目之一(16位与TCP端口字段相同)。
  • 每个条目包含原始IP地址(私有IP)和原始源端口号。
  • IP和TCP校验和被重新计算。
  • 当一个数据包从互联网到达NAT盒时,它从翻译表中的TCP头查找目的端口。
  • 检索原始源端口和源IP地址,更新头文件和校验和,并发送至内部主机。

对NAT的批评

  • 破坏了端到端的连接:私有网络中的接口只有在向外发送数据包并创建映射后才能接收数据包(有些例外)。
  • 违反了IP架构模型,即互联网上的每个接口都有一个唯一的IP地址(数百万连接到互联网的接口都有10.0.0.1)。
  • 假设有效载荷内容的性质,违反分层原则,最初只对TCP和UDP有效。 必须对FTP信息进行窥探。 
  • 将互联网从无连接变为面向伪连接。
  • NAT保持连接状态,如果它崩溃了,所有的连接都会丢失。
  • 限制出站连接的数量,因为端口号是16位。

尽管受到批评,但它被广泛部署,特别是在家庭和小型企业中。

  • 运营商级NAT:ISP只给客户私人地址

显著的安全优势

  • 由于只有在创建了外向连接后才能接收数据包,因此内部网络可以极大地避免来自传入的非请求数据包的攻击。
  • NAT不应取代防火墙

即使在IPv6被广泛部署,IP地址不再稀缺的情况下,也可能继续使用。

8.4.3 IPv6

20多年前,为解决IPv4地址空间耗尽的问题而设计。

在解决这个问题的同时,还做了一些其他的改变:

  • 更简单的报头——允许更快的处理
  • 提高了安全性——现在已经回传到IPv4了
  • 进一步支持服务质量

IPv6地址为128位

不太可能用完......除非使用新的浪费的分配方案。

IPv6 Header

IPv6中引入的最重要的变化显示在其数据报格式中:

扩大的地址容量

IPv6将IP地址长度从32比特增加到128比特。这就确保全世界将不会用尽IP地址。现在,地球上的每个沙砾都可以用IP地址寻址了。除了单播与多播地址以外,IPv6还引入了一种称为任播地址(anycast address)的新型地址,这种地址可以使数据报交付给一组主机中的任意一个。(例如,这种特性可用于向一组包含给定文档的镜像站点中的最近的一个发送一个HTTP GET报文。)

简化高效的40字节首部

许多IPv4字段已被舍弃或作为选项。因而所形成的40字节定长首部允许更快地处理IP数据报。一种新的选项编码允许进行更灵活的选项处理。

流标签与优先级

IPv6有一个难以捉摸的流(flow) 定义。该字段可用于“给属于特殊流的分组加上标签,这些特殊流是发送方要求进行特殊处理的流,如一种非默认服务质量或需要实时服务的流”。例如,音频与视频传输就可能被当作一个流。在另一方面,更为传统的应用( 如文件传输和电子邮件,就不可能被当作流。由高优先级用户(如某些为使其流量得到更好服务而付费的用户)承载的流量也有可能被当作一个流。然而,IPv6 的设计者们显然已预见到最终需要能够区分这些流,即使流的确切含义还未完全确定。IPv6首部中还有一个8比特的流量类型字段,该字段就像IPv4中的TOS字段,可用于给出一个流中某些数据报的优先级,以便指明某些应用的数据报(如ICMP分组)比其他应用的数据报( 如网络新闻)有更高的优先权。


以下是在IPv6中定义的字段:

版本

该4比特字段用于标识IP版本号。毫不奇怪,IPv6将该字段值设为6。注意到将该字段值置为4并不能创建一个合法的IPv4数据报。

流量类型

该8比特字段与我们在IPv4中看到的TOS字段的含义相似。

流标签

该20比特的字段用于标识一条数据报的流。

有效载荷长度

该16比特值作为一个无符号整数,给出了IPv6数据报中跟在定长的40字节数据报首部后面的字节数量。

下一个首部

该字段标识数据报中的内容(数据字段)需要交付给哪个协议(如TCP或UDP)。该字段使用与IPv4首部中协议字段相同的值。

跳限制

转发数据报的每台路由器将对该字段的内容减1。如果跳限制计数到达0时,则该数据报将被丢弃。

源地址和目的地址

IPv6128比特地址的各种格式在RFC4291中进行了描述。

数据

这是IPv6数据报的有效载荷部分。当数据报到达目的地时,该有效载荷就从IP数据报中移出,并交给在下一个首部字段中指定的协议处理。


在IPv4数据报中出现的几个字段在IPv6数据报中已不复存在:

分片/重新组装

IPv6不允许在中间路由器上进行分片与重新组装。这种操作只能在源与目的地上执行。如果路由器收到的IPv6数据报因太大而不能转发到出链路。上的话,则路由器只需丢掉该数据报,并向发送方发回一个“分组太大”的ICMP差错报文即可。于是发送方能够使用较小长度的IP数据报重发数据。分片与重新组装是一个耗时的操作,将该功能从路由器中删除并放到端系统中,大大加快了网络中的IP转发速度。

首部检验和

因为因特网层中的运输层(如TCP与UDP)和数据链路层(如以太网)协议执行了检验操作,IP设计者大概觉得在网络层中具有该项功能实属多余,可以将其去除。再次强调的是,快速处理IP分组是关注的重点。由于IPv4首部中包含有一个TTL字段(类似于IPv6中的跳限制字段),所以在每台路由器上都需要重新计算IPv4首部检验和。就像分片与重新组装一样,在IPv4中这也是一项耗时的操作。

选项

选项字段不再是标准IP首部的一部分了。但它并没有消失,而是可能出现在IPv6首部中由“下一个首部”指出的位置上。这就是说,就像TCP或UDP协议首部能够是IP分组中的“下一个首部”,选项字段也能是“下一个首部”。删除选项字段使得IP首部成为定长的40字节。

写成8组(最多)4个十六进制数字的形式:8000:0000:0000:0000:0123:4567:89AB:CDEF
可以通过去掉一组连续的0来进行优化:8000::123:4567:89ab:cdef
与IPv4的反向兼容是通过以下方式实现的:

::fff:192.31.2.46(注意十六进制和十进制的混合)。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值