引言

  • Internet网络层今天成功的原则在RFC 1958中有描述。这里简单总结一下10大原则(从最重要的到最不重要的)(RFC中应该不止10个,寒注):(1)保证工作(可以工作)(2)保持简单(3)明确选择(在完成同样事情中的多种方法中坚定一种方法)(4)模块开发(协议栈思想)(5)期望异构性(6)避免静态选项和参数(7)寻找好的设计而不是完美设计(8)严格发送,宽容接收(9)考虑可扩展性(10)考虑性能和成本。
  • 在网络层可以把Internet看做是一种相互关联的网络或自治域集合。没有真正的结构,但存在几个主要骨干网。这些都是由高带宽线路和快速路由器组成。这些骨干网络中最大的一个称为一级网络,每个骨干网都与它连接,进而到达其他骨干网。连接到骨干网上的是Internet服务提供商(ISP),它为家庭和企业、数据中心和服务器托管设施,以及区域(中级)网络提供Internet接入服务。数据中心提供了许多通过Internet发送的内容。连接到区域网络的是更多的ISP、许多大学和公司的局域网和其他边缘网络。图中给出了一个准分层组织的轮廓图。
  • 将整个Internet粘合在一起的正是网络层协议,即Internet协议(IP)。与大多数老式网络层协议不同的是,IP协议在设计之初就把网络互联作为目标。应该这样看待网络层:IP的任务是提供一种尽力而为地把数据包从源端传输到接收方的方法(即不提供任何保证),无须考虑这些机器是否在同一个网络,也不必关心它们之间是否还有其他网络。
  • Internet中的通信过程是这样的。传输层获得数据流,并且将数据流拆分成段,以便作为IP数据包发送。理论上,每个数据包最多可以容纳64KB,但实际上数据包通常不超过1500字节(因而它们可以被放到一个以太网帧中)。IP路由器转发每个数据包穿过Internet,沿着一条路径把数据包从一个路由器转发到下一个路由器,直到数据包到达目的地。在接收方,网络层将数据传输层,再由传输层交给接收进程。当所有的数据段都到达目标机器,它们被网络层重新组装还原成最初的数据报;然后该数据包被网络层传给传输层。(TCP/IP协议定义了一个在因特网上传输的包,称为IP数据包,而IP数据报(IP Datagram)是个比较抽象的内容,是对数据包的结构进行分析。也可根据协议层次理解,网络层的称为包,传输层的就是报文了)
  • 在图示例子中,家庭网络上的一个主机要穿越4个网络和大量IP路由器,才能到达位于公司网络上的目标主机。这种情况在实际中并不罕见,而且还有很多更长的路径。在Internet上存在许多冗余连接,骨干网和ISP在多个位置相互连接。这意味着两个主机之间存在着许多可能的路径。决定使用哪些路径正是IP路由协议的任务。

1、IPv4协议

  • 每个IP数据报包含两部分,一个头一个正文,正文部分也称之为有效净荷。头由一个20字节的定长部分和一个可选的变长部分组成。图中显示了IP数据报的头格式。IP数据报头的传输从左到右并从上到下,Version字段的高序字节最先被传送出去(这是big-endian网络字节序,在little-endian字节序机器上,比如Intel x86计算机,在传输和接收时需要进行字节顺序的软件转换)。现在回想起来,little-endian(小端模式)字节序是更好的选择,但在设计IP协议时没有人能预测到今天小端模式流行计算机世界。
  • 版本字段记录了数据报属于协议的那个版本。版本4主宰者今天的Internet。在每个数据报开始包含版本信息,使得版本之间的迁移过程可以持续很长一段时间。事实上,IPv6已经定义了十多年,但它的部署却还刚刚开始不久(2010著作)。IPv5是一个试验性的实时流协议,它一直没有被广泛使用。由于头的长度不固定,所以头的IHL字段指明了头到底有多长(以32bit为单位)。IHL的最小值为5,这表明头没有可选项(即20字节)。该4位字段的最大值为15,把头的限制为最大60字节,因此选项字段最多为40字节。对于某些选项,比如记录一个数据包路径的选项,40字节往往太小,这使得这样的选项其实没有什么用处。
  • 区分服务字段是少数几个在意义上随岁月轻微改变的字段之一。该字段最初称为服务类型。它曾经是用来区分不同的服务种类。可靠性和速度的各种组合都是可能的选择。对于数字化的话音数据,加速传递优先于精确传递;对于文件传输,正确传输比加速传输更重要。最初时,服务类型字段包含6位,其中3位表示优先级,3位表示主机最关心的是延迟、吞吐量或可靠性中的哪一个。然而,没人真正知道路由器用这些位做什么,因此这些位空着许多年没人用。在设计区分服务时,IETF承认自己的失败,并重新启用这个字段。现在,前6位用来标记数据包的服务类别,我们在本章描述过的加速服务和确保服务;后2位用来携带显式拥塞通知信息,比如数据包是否经历了拥塞,我们在本章的拥塞控制部分描述了显式拥塞通知。
  • 总长度字段包含了该数据报中的所有内容,即头和数据。最大长度是65535个字节。目前情况下,这样的上界还是可以容忍的,但在未来网络中,可能需要更大的数据报。标识字段的用途是让主机确定一个新到达的分段属于哪一个数据报。同一个数据报的所有段包含相同的标识值。接下来是一个未使用的位,这令人惊讶,因为IP头中可供使用的地方实在珍贵。接下来的两个1位字段与分段有关。DF代表“不分段”(don`t fragment)标志位,这是针对路由器的一个命令,它不允许路由器分割该数据报。最初该字段用来支持没有能力组装还原数据包的主机。现在该字段可用在发现路径MTU过程中,路径MTU是能经过路径而无须分段的最大数据包。通过在发出的数据包中设置DF位,发送方知道这个数据包要么完整到达目的地,要么有个错误信息返回。MF代表更多的段标志位。除了最后一个段以外,其他所有的段必须设置这一位。它的用途是接收方可以知道什么时候一个数据报的所有分段都已经达到了。
  • 分段偏移量字段指明了该段在当前数据报中的位置。除了数据报的最后一个段外,其他所有段的长度必须是8字节的倍数。由于该字段有13位,所以每个数据报最多有8192个段,由此支持总长度字段限制的最大数据报。标识字段(identification)、MF和字段偏移量(Fragment offset)这3个字段协同工作,可用来实现分段操作。生存期(time to live)字段是一个用于限制数据包生存期的计数器。这里的计数单位最初设置为妙,因此最大的生存期为255秒。在每一跳上该计数器必须被递减。实际上,它只是跳计数器,当它递减到0时,数据报就被丢弃,并且路由器给数据包的源主机发送一个报警包。此项特性可以避免数据包永远逗留在网络中,有时候当路由器表被破坏之后可能会发生这样的事情。
  • 当网络层组装完成一个完整的数据包之后,它需要知道该如何对它进行处理。协议字段指明了该将它交给那个传输进程。TCP是一种可能,但是UDP或者其他的协议也有可能。协议的编号在整个Internet是全球统一的。RFC 1700中列出了以前的协议和其他分配的编号,现在的协议编号包含在一个位于www.iana.org的在线数据库中。由于头携带了了诸如地址那样致命的信息,因此它用自己的校检和加以保护,即头校检和字段。校检算法的执行过程是这样的:当数据到达时,所有的16位(半字)累加起来,然后再取结果的补码。该算法的目的是到达数据包的头校检和计算结果为0。这样的校检和对于检测数据包穿过多少网络时是否发生错误非常有用。请注意,在每一跳必须重新计算校检和字段,因为至少有个字段总是不断在改变(即生存期字段),采用一些技巧可以加速计算。源地址和目标地址字段表示源网络接口和目标网络接口的IP地址。
  • 选项字段的设计意图是提供一种途径,允许后续版本协议包含一些原设计中没有出现的信息,以便实验人员尝试新的想法、避免为那些不常使用的信息分配头字段。选项具有可变长长度。每个选项的第一个字节是一个标识码,它标明了该选项类别。有的选项后面跟着一个1字节的选项长度字段,然后是一个或多个数据字节。选项字段用来将整个选项长度填充到4字节的倍数。最初设计时定义了5个选项,如图。
  • 安全选项指明了信息的秘密程度。理论上,军用路由器可能使用这个字段来指定路由时,不允许通过某些在军事上敌对的国家。实际上,所有的路由器都忽视该选项,所以它仅有的实际用途是帮助间谍们更加容易找到好的材料。严格源路由选项要求改数据包穿越所指定的路由器列表,并且要求按照列表中的顺序前进;但是,在途中也允许经过其他路由器。通常情况下,该选项往往只提供少数几个路由器,用来强迫数据包走一跳特殊的路径。当出于政治或者经济的考虑而要求经过或者避开某些国家的时候,这个选项最有用。
  • 记录路由选择了告诉沿途的路由器,将自己的IP地址附加到可选字段中。这样系统管理员就可以跟踪路由算法中的错误(比如“为什么从休斯顿到达拉斯的数据包要经过东京?”)。当ARPANET刚开始建立时,没有一个数据包会经过9个以上的路由器,所以40字节的选项足够了。正如前述,现在40字节显得太小了。最后时间戳选择了类似于记录路由选项,只不过每个路由器除了记录自己的32位IP地址以为,还要记录一个32位时间戳。对于网络测量,这个选项很有用。
  • 如今IP选项已经失宠。许多路由器忽略它们或者不能有效处理它们,它们作为一种罕见案例这搁置起来。也就是说,它们只是得到部分支持,但很少被使用。

2、IP地址

  • IPv4的一个明显特征是它的32位地址。Internet上的每台主机和每个路由器都有一个IP地址,可用在IP数据包的源地址和目标地址字段。重要的是要注意,一个IP地址并不是指向一台主机,而是指向一个网络接口,所以如果一台主机在两个网络上,它必须有两个IP地址。然而,大多数主机都连接在一个网络,因而只有一个IP地址。路由器有多个接口,从而有多个IP地址。

前缀

  • 与以太网地址不同的是IP地址具有层次性。每个32位地址由高位的可变长网络和低位的主机两部分数据组成。同一网络上(比如以太网局域网)的所有主机,其地址的网络值是相同的。这意味着一个网络对应一块连续的IP地址空间,这块地址空间就称为地址的前缀。
  • IP地址的书写方式是点分十进制。按此格式,4个字节中的每个写成十进制,取值范围从0~255。例如,32位十六进制地址80D00297写成128.208.2.151。前缀的书写给出了块的最低IP地址和块的大小。块大小由网络部分的位数决定;地址中主机部分的剩余位数可以有所变化。这意味着,块的大小必须是2的幂。按照惯例,网络地址的书写格式是前缀IP地址后面跟一个斜线,斜线后面是网络部分的位长度。在我们的例子中,如果前缀包含28个地址,所以留下了24位用于网络部分,写成128.208.0.0/24。
  • 因为前缀长度仅从IP地址无法推断出来,路由协议必须把前缀携带给路由器。有时候,前缀很简单地由长度描述,比如“/16”,读音为“slash 16”。前缀长度相当于网络部分中1的二进制掩码。以这种格式书写时称为子网掩码,它可以与一个IP地址进行AND操作,以便取出IP地址的网络部分。在我们的例子中,子网掩码为255.255.255.0。图中显示了一个前缀和一个子网掩码。
  • 层次化的地址具有显著的优点和缺点。前缀的优点是路由器仅仅根据网络部分即可转发数据包,这样可使得路由表远远小于按每个IP地址索引所需的大小,考虑到Internet的主机数量已不止十亿,这对于每个路由器需要维护的路由表来说实在太大。然而通过分层的方式路由器只需要保持约30万条前缀的路由。
  • 虽然使用路由层次使得Internet路由规模化,但它有两个缺点。首先,一个主机的IP地址取决于它位于网络上的位置。以太网地址可用于世界上任何地方,但每个IP地址属于一个特定的网络,路由器只能传递注定要到该网络上某个地址的数据包。比如移动IP这样的设计必须支持主机在网络之间移动,但保持相同的IP地址。第二个缺点在于层次浪费了地址,除非精心管理地址空间。如果给网络分配太大块的地址,将有很多被分配掉但不会使用。这种分配将没有多大意义,如果有大量的地址空间,这倒没什么关系。Internet的巨大增长正迅速消耗着自由地址空间,IPv6就是地址短缺问题的解决方案,但直到它被广泛部署,否则IP地址都将面临巨大的压力,所以必须有效地使用地址。

子网

  • 为了避免冲突,网络地址的管理由一个称为Internet域名和地址分配机构(ICANN)的非营利性公司负责。ICANN一次把部分地址空间授权给各区域机构,这些机构再把IP地址发给ISP和其他公司。这就是一家公司获得IP地址的过程。按前缀路由需要网络中的所有主机具有相同的网络号。随着网络的发展这个属性可能会产生问题。例如,/16分配给一所大学的计算机系;一年后电机工程系想上Internet,不久艺术系也需要上Internet。这些系如果另外申请一个地址块不仅原理学校,而且可能既昂贵又不方便。此外早已分配获得的/16足够60 000台主机的地址。这可能是为了将来有发展空间才申请的,但至少现在还没到那个规模,为同一所大学再分配另一块地址显然是一种浪费。因此需要一种不同的地址组织。
  • 问题的解决方案是,在内部将一个网络块分成几个部分供多个内部网络使用,但对外部网络仍然像单个网络一样。这就说所谓的子网划分,分割一个大型网络得到的一系列结果网络(比如以太网)称为子网。子网这个词的新用法和旧用法有冲突,子网的以前含义是指网络中的所有路由器和通信线路的集合。
  • 图中显示了子网如何帮助我们解决例子中的问题。一个/16地址空间被分割成几片。这种分割并不要求均匀,但每片必须对齐以便可以把较低的任何位用作地址的主机部分。在这种情况下,块的一半(一个/17)分配给了计算机系,四分之一给了电机工程系(一个/18),八分之一(一个/19)分配给了艺术系,剩余八分之一未分配。了解地址块如何分割的不同方式是看以二进制表示的结果前缀(竖线表示子网号和主机部分的边界):
院系 IP地址
计算机系 10000000 11010000 1|xxxxxxx xxxxxxxx
电机工程系 10000000 11010000 00|xxxxxx xxxxxxxx
艺术系 10000000 11010000 011|xxxxx xxxxxxxx

  • 当一个IP数据包到达主路由器,路由器如何知道应该将它转发到哪个子网?这里必须进行深入了解前缀的细节。一种方法是每个路由器有一张具有65536(2的16次方)个项的表,该表告诉它校园网络上每台主机对应的输出线路是哪条。但是这样会破坏层次路由带来的可扩展性。相反,路由器只需简单了解校园网络的子网掩码。
  • 当数据包到达时,路由器会查看该数据包的目标地址,并检查它属于哪一个子网。具体做法是:路由器把数据包的目标地址与每个子网的掩码进行AND操作,看结果是否对应某个前缀。例如,例如考虑一个发往IP地址128.208.2.151的数据包。为了看它是否属于计算机科学系,我们把该目标地址与2555.128.0进行AND操作,获得前17位(即128.208.0.0),并且检查它是否匹配计算机系的前缀地址(即128.208.128.0)。显然它们不匹配。然后再检查前18位,在与电机工程系的子网掩码进行AND操作后,我们得到128.208.0.0,这恰好匹配电机工程系的前缀地址,所以数据包被转发到通往电机工程系网络的接口。
  • 如果有必要,子网的划分还可以改变,只需要更新校园网内部路由器上的所有子网掩码即可。在网络外面,子网的划分是不可见的,因此分配一个新的子网不需要联系ICANN或者改变任何外部数据库。

CIDR——无类域间路由

  • 即使IP地址按块分配,因此地址空间得以有效利用,但有一个问题依然存在:路由表爆炸。一个组织中位于网络边缘的路由器必须为每个自己的子网设立一个表项,该表项告诉路由器使用哪条线路到达该子网。对于通往组织外部某个目的地的路由,这些路由器可以利用简单的默认路由器吧数据包发送到通往ISP的线路上,ISP把组织与Internet其余相连。其他目的地址必定在外面的某个地方。
  • ISP和骨干网络之间的路由没有这样奢侈,这些骨干路由器位于Internet中间。它们必须知道通过哪些方式可到达每个网络,这里没有简单的默认路由可以使用。这些核心路由器处在一个Internet默认自由区。没有人知道有多少网络连接到Internet,但它肯定是一个很庞大的数字,可能至少100万。这样的规模会产生一个巨大的路由表。用计算机标准来衡量这个数字可能并不大,但我们要意识到路由器转发每个数据包都要查询这张表,而大型的ISP的一个路由器可能每秒要转发几百万个数据包。必须用专门的硬件和快速内存才能以如此高的速率处理数据包,一般的通用计算机是无法胜任的。
  • 此外路由算法要求每个路由器与其他路由器交换有关它能到达的地址信息。表越大,需要通信和处理的信息量也越大,并且处理时间至少随表的大小呈线性增长。更多的通信增加了丢失部分路由表的可能性,至少有暂时丢失的可能,这又可能导致路由的不稳定。
  • 路由表的问题本来可以通过一个更深的层次来解决,类似电话网那样的的多层结构。例如,让每个IP地址包含一个国家、州\省、市、网络和主机字段这可能会奏效。然后,每个路由器只需要知道如何去往哪个国家、本国的州省、本州的的城市以及本州的网络。不幸的是,这种解决方案需要比32位多得多的IP地址,而地址的使用缺乏效率。
  • 幸运的是,我们可以做一些事情来减小路由表的长度。我们可以运用与子网划分相同的观点:不同地点的路由器可以知道一个给定IP地址的不同大小前缀。然而,不是将一块地址分割成子网,相反,在这里我们把多个小前缀的地址块合并成一个大前缀的地址块。这个合并过程称为路由聚合,由此产生的较大前缀地址块优势称为超网,以便有别于地址块的分割。
  • 有了地址聚合,IP地址可包含大小不等的前缀。同样一个IP地址,一台路由器把它当做/22的一部分对待,而另一台路由器把它当做一个更大的/20一部分对待。这是因为每个路由器有相应的前缀信息。这个设计和子网划分协同工作,统称为无类域间路由(CIDR)。举个例子,有一块地址从194.24.0.0开始,可用的IP地址由8129个。假设剑桥大学需要2048个地址,它分配获得的地址范围从194.24.0.0到194.24.7.255,掩码为255.255.248.0,这是一个/21前缀。接下来,牛津大学申请4096个地址。由于4096个地址必须位于4096的字节边界上,所以牛津大学申请的地址不可能从194.24.8.0开始。它们获得了从1924.24.16.0至194.24.31.255的地址块,子网掩码为255.255.240.0。最后爱丁堡大学申请了1024个地址,它获得了从194.24.8.0和194.24.11.255的地址块,掩码为255.255.252.0。
  • 在默认自由区的所有路由器现在都被告知这3个网络的IP地址。靠近大学的路由器针对每个前缀可能需要发送到不同的出境路线,所以它们需要在自己的路由表中为每个前缀设立相应的表项。作为例子,图中给出了伦敦路由器示意图。
  • 现在让我们从位于纽约的一个远程路由器角度来看这3所大学。3个前缀的所有IP地址都从纽约发送到伦敦。伦敦的路由器进程注意到这个,并将3个前缀合成一个聚合表项,即前缀194.24.0.0/19,然后传送给纽约路由器。这个前缀包含了8K个地址,并涵盖了3所大学和其他未分配的1024个地址。通过聚合,3个前缀已经减少为1个,由此减少了必须告诉纽约路由器的前缀和路由表表项。当聚合功能启用后,这个过程完全自动。这依赖于给Internet分配什么样的前缀,而不是给网络分配地址的管理员行为。聚合技术在Internet中被大量使用,已经把路由器表的大小较少到目前的越200 000万前缀。
  • 更为扭曲的是前缀允许重叠。规则是数据包按最具路由的方向发送,即具有最少IP地址的最长匹配前缀。最长匹配前缀路由提供了有益的灵活性,如下图中的纽约路由器。该路由器仍使用单一聚合前缀把三所大学的流量发送到伦敦。然而,前缀中的先前那块未用地址现在已经分配给了旧金山网络。一种可能是纽约路由器保持4个前缀,其中3个前缀的数据包发送到伦敦,第4个前缀的数据包发送到旧金山。相反,最长匹配前缀路由可以用图中显示的两个前缀来转发。一个总的前缀只是把整个地址块的流量发到伦敦;一个更具体的前缀用来指示该大前缀的一部分流量发往旧金山。有了最长匹配前缀规则,到旧金山网络的IP地址的流量将被发送到通往旧金山的出境路线,并且发往大前缀中所有其他IP地址的流量将被发往伦敦。
  • 从概念上讲,CIER的工作原理如下所述。当一个数据包到达时,路由器扫描路由表以便确定目的地是否在前缀的地址块内。有可能多个具有不同前缀的表项得到匹配,在这种情况下,使用具有最长前缀的表项。因此,如果有一个匹配/20掩码的表项,同时还有一个匹配/24掩码的表项,则使用/24表项来查询数据包的出境线路。然而,如果真正一个表项一个表项地扫描表,这个过程将非常冗长乏味。相反,人们设计了复杂的算法来加快地址匹配过程。商用的路由器使用了定制的VLSI,这些算法被嵌入到了硬件中。

分类和特殊寻址

  • 在1993年之前,IP地址被分为图示的5个类别,这种分配称为分类寻址。
  • A、B、C类地址格式分别允许多达128个网络,每个网络1600万台主机;16384个网络,每个网络65536台主机;以及200万个网络(比如LAN),每个网络多达256台主机(不过有些地址是特殊的)。IP地址分类同时支持组播(D类地址),即数据包被直接发送给多态主机。以1111开头的是保留地址,以备将来使用。在IPv4地址空间已经耗尽的情况下,使用它们将是有价值的。不幸的是,许多主机将不再把它们视为有效地址而接受,因为它们已经被禁锢了那么久,很难教会旧主机一些新花样。
  • 这是一个层次化的设计,但与CIDR不同于,这里的地址块大小是固定的。超过20亿个地址,通过类别划分来组织地址空间会浪费几百万的地址,尤其是真正的罪魁祸首是B类网络。对于大多数组织,具有1600万个地址的A类网络太大,而具有256个地址的C类网络又太小。一个具有65536个地址的B类网络恰到好处。在Internet民间传说中,这种情况称为3只熊问题。
  • 在现实中,一个B类地址对大多数组织而言还是过于庞大。研究表明,超过半数的B类网络少于50台主机,一个C类网络就可以应付。但每个组织都会申请一个B雷地址,它们想到总有一天自己的网络规模将超过8位主机地址空间的范围。现在回想起来,给C类网络分配10位的主机号而不是8位的主机号或许更好,因为这样的分配使得每个网络可以拥有1022台主机。如果真是这样,大多数组织可能用一个C类网络就能解决问题,而且差不多有50万个C类网络。很难指责Internet的设计者没有提供更多或更小的B类地址。在当时决定创建这三个类别的地址时,Internet还只是一个连接美国主要研究性大学的研究网络(加上极少数公司和从事网络研究的军事基地)。
  • 为了处理这些问题,引入了子网这个概念,以便在一个组织内部灵活分配地址块。后来,又引入了CIDR技术来减小全局路由表的大小。今天表明一个IP地址是否属于A、B和C类网络标志位已不再使用,但在文献中对这些类的引用仍然很普遍。为了看清楚地址分类如何使得转发更为复杂,先考虑在旧的分类系统中它有多简单。当一个数据包到达路由器,IP地址的一个副本被右移28位,产生一个4位的类别号;然后16路分支把数据包归纳到A、B、C(以及D和E)类,A类有8中情况,B类有4种情况,C类有两种情况;然后每个类别用掩码取出8、16或24位的网络号,并且右对齐成32位的字。然后用该网络号查询A、B或C表,通常查询A和B类网络采用索引方式,而查询C类网络则采用哈希算法。一旦找到对应的表项,即可查到相应的出境线路,进而转发数据包。这种查询操作比最长匹配前缀操作简单,因为最长匹配前缀面对的IP地址不是固定前缀长度,因而不能使用一个简单的查表操作。
  • D类地址可继续用于Internet组播。实际上,或许可以更准确地说它们开始被用于组播,因为Internet还没有广泛部署过组播。还有几个其他地址有特殊的含义,如图。IP地址0.0.0.0,这是最低的地址,由主机在启动时使用。这个地址意味着这个网络或者这个主机。全0的IP地址作为网络号指的是当前网络。这些地址允许机器在不知道网络号的情况下访问自己所在的网络(但它们必须知道网络掩码包括多少个0)。由全1或255.255.255.255组成的地址,是最高的地址,用来标识网络中的所有主机。它允许在本地网络上广播,通常是局域网。具有正确的网络号和主机字段全1的地址允许机器向在Internet任何地方的遥远局域网发送广播数据包。然而,许多网络管理员禁用了此功能,主要原因在于这是一个安全隐患。最后,所有127.xx.yy.zz形式的地址保留给回环测试用。发送到该地址的数据包并没有被真正放到线路上,它们如同入境数据包一样在本地处理。这样在发送方不知道网络号的情况下,可以给主机发送数据包,这对测试网络软件很有用。

NAT——网络地址转换

  • IP地址非常缺乏。一个ISP或许有一个/16地址块,给它的65534个可用主机编号。如果有比这更多的客户,那就有问题了。这种匮乏导致了一些保守使用IP地址的技术。其中一种方法是为一台连在网上并使用网络的计算机动态分配一个IP地址,而且在该主机不活跃时收回分配给它的IP地址;然后该IP可以被分配给另一台活跃的计算机。以这种方式,一个/16地址可以处理多达65534个活跃用户。(NAT的实现方式有三种,即静态转换Static Nat、动态转换Dynamic Nat和端口多路复用OverLoad,本节描述的是最后一种NAPT端口多路复用,也最常用)
  • 这种动态分配策略在某些情况下运行良好,例如那些可能暂时缺席或断电的拨号上网、移动和其他计算机。但是,它并不能很好地为企业客户工作,企业中的许多PC是要持续打开的,有些员工的机器在晚上需要做备份,而有些服务器可能需要在顷刻间服务于远程客户的请求。这些企业总是有一条总是提供与其他Internet连通的接入线路。
  • IP地址短缺问题的解决问题是迁移到IPv6,它有128位地址。这个迁移过程正缓慢进行,可能需要很多年才能完成。为了在这期间解决地址短缺问题,需要一个速战速决的方案。今天普遍使用的快速方案就是网络地址转换(NAT)形式,RFC 3022描述了NAT。NAT的基本思想是ISP为每个家庭或公司分配一个IP地址(或者少量),用这个地址来传输Internet流量。在客户网络内部,每台计算机有唯一的IP地址,该地址主要用来路由内部流量。然而,当一个数据包需要离开客户网络,发向其他ISP时,它必须执行一个地址转换,把唯一的内部IP地址转换成那个公共IP地址。这种地址转换使用了IP地址的三个范围,这些地址已经被声明私有化。任何网络可以在内部随意使用这些地址。仅有的规则是不允许包含这些地址的数据包出现在Internet。这3个保留地址的范围是:
10.0.0.0 ~ 10.255.255.255 / 8 16 777 216个主机
172.16.0.0 ~ 172.31.255.255 / 12 1 048 576个主机
192.168.0.0 ~ 192.168.255.255 / 16 65 536个主机
  • 第一段地址提供了16777216个地址(按常规,去掉全0和全1的地址),即使网络不那么大,通常大家都喜欢选择这个地址。NAT操作过程如图。在客户办公室内,每台机器都要一个形如10.x.y.z的地址。然而,当一个数据包离开客户驻地时,它首先要通过一个NAT盒子,此NAT盒子将内部的IP源地址(图中为10.0.0.1)转换成该客户所拥有的真实IP地址,在本例子中为192.60.42.12。NAT盒子通常与防火墙组成一个单一设备,防火墙提供了一种安全机制,它仔细控制着进出客户网络的流量。另外还有一种可能,将NAT盒子集成到路由器或者ADSL调制解调器中。
  • 当应答数据包返回,本质上它的目标地址是198.60.42.12,那么NAT盒子如何知道该用哪一个地址来代替呢?这就是NAT需要解决的问题。如果在IP头有一个备用的字段,那么NAT盒子就可以用该字段记录真正的发送方是谁,但是在IP头仅仅只有1位还没有用。从原理上来说,我们还可以创建一个新的IP头选项来存放真正的源地址,但是,这么做显然要求改变整个Internet上所有机器的IP代码,使得这些机器能够处理新的选项,这显然也不是一种有效的快速解决方案。
  • NAT的实际做法如下。NAT设计者们注意到大多数IP数据包携带的要么是TCP有效载荷,要么是UDP有效载荷。当我们在传输层学习TCP和UDP时,将会看到这两个协议的头部都包含了一个源端口和目标端口字段。下面我们只讨论TCP端口,但是所讨论的内容同样适用于UDP端口。这里的端口是16位整数,它指示了TCP连接从哪里开始以及到哪里结束。正是这些端口字段为NAT提供了工作所需的字段。
  • 当一个进程希望与另一个进程建立TCP连接时,它把自己绑定到一个本地机器尚未使用的TCP端口上。该端口称为源端口,它告诉TCP代码凡是属于该连接的入境数据包都发送给该端口。这个进程还要提供一个目标端口,以指明数据包传输到远程服务器上之后应该交给谁处理。0~1023之间的端口都是保留端口,用于一些知名的服务。例如,端口80是Web服务使用的端口,所以远程客户端能够找到Web服务器进程。每个出境TCP消息都包含了一个源端口和目标端口。这两个端口合起来标识了客户机和服务器两端正在使用该连接的一对进程。
  • 打个比方也许能更清楚地说明端口的用途。假设一家公司只有一个主电话号码。当人们拨打该号码,他们的呼叫到达接线员那里,接线员问他们要哪个分机,然后为他们接通所需的分机。这里的主号码就好比公司的IP地址,两端的分机号就好比是端口。端口实际上是另一个16位的地址值,它标识了哪个进程接收入境数据包。
  • 利用源端口字段,我们可以解决前面的映射问题。任何时候当出境数据包进入NAT盒子,器源地址10.x.y.z被客户的真实IP地址所取代,而且TCP的源端口字段被一个索引值取代,该索引值指向NAT盒子的地址转换表中65536个表项之一。该表项包含了原来的IP地址和原来的源端口(一个索引值对应内网的IP地址和端口号,由于内网IP地址唯一,因此也保证了一个索引值对应一个主机,寒注)。最后NAT盒子重新计算IP头和TCP头的校检和并将校检和插入到数据包中。这里之所以要替换源端口域,是因为来自机器10.0.0.1和10.0.0.2连接可能碰巧使用了同一端口,所以仅仅使用源端口还不足以唯一标识发送进程。
  • 当一个数据包从ISP到达NAT盒子时,源端口(指之前的源端口,从服务器发回的已经变成目标端口,寒注)从TCP头中取出,并被用作索引值(本来就是索引值,寒注)查找NAT盒子的映射表。找到对应项之后,就从该表项提取出内部IP和原来的TCP源端口,并将它们插入到数据包中。然后重新计算IP和TCP校检和,并插入到数据包中。最后将该数据包传递给客户内部的路由器,它使用10.x.y.z地址进行正常的路由。
  • 虽然这种方案从某种程度上解决了问题,但是IP团体中的网络纯粹主义者认为它不伦不类。简单地概括,这里列出一些反对意见。第一,NAT违反了IP的结构模型,IP的结构模型声明每个IP地址均标识了世界上的一台机器。第二,NAT打破了Internet端到端的连接模型。因为NAT盒子上的映射是由出境数据包建立的,只能在出境数据包之后到达的入境数据包才能被接收。实际上这意味着,家庭网络用户可以通过NAT与一台远程Web服务器建立TCP/IP连接,但远程用户无法与家庭网络内的一台游戏服务器建立连接,这种情况需要特殊的配置技术或者NAT穿越技术。第三,NAT将Internet从一个无线网络改变成一个面向连接网络特有的形式。问题在于NAT盒子必须为每一个从它这里经过的连接维护必要的信息(即映射关系)。让网络维护连接状态是面向连接网络的一种特性,而不是无连接网络的特性。如果NAT盒子崩溃,并且它的映射表丢失,那么它的所有TCP连接都将被摧毁。在没有NAT情况下,路由器可以崩溃并重启,对TCP连接没有长远影响。发送进程只是在几秒钟内发生超时,然后重传所有未被确认的数据包。使用了NAT之后,Internet如同电路交换网络一样,变得非常脆弱。
  • 第四,NAT违反了最基本的的协议分层原则:第K层不应该为第K+1层在本层的有效载荷中方什么任何假设。这条基本原则可以保证层与层之间的独立性。如果TCP后来升级到TCP-2,它的头结构发生了变换(比如使用32位的端口),那么NAT将不能正常工作。分层协议的总体思想是保证某一层的变化不会要求其他层也跟着变化。NAT破坏了这种独立性。第五,Internet上的进程并不一定必须使用TCP或者UDP。如果一个机器A上的一个用户决定使用一种新的传输协议与机器B上的用户进行通话(比如,一个多媒体应用),那么由于NAT的介入,这样的应用无法工作,因为NAT盒子将无法正确地定位到TCP的源端口。
  • 第六,有些应用以规定的方式使用多个TCP/IP连接或者UDP端口。例如,标准的文件传输协议(FTP)在数据包正文插入IP地址,接收方正文中提取出这些地址,并使用它们。由于NAT对这些地址安排一无所知,它不可能重写这些IP地址,或者说明情况。无法理解就意味着除非采取特殊措施,否则FTP和其他一些应用,比如H.323Internet电话协议,在必须通过NAT的情况下不能正常工作。一般可能的做法是在NAT盒子上打补丁。但是,每次有新应用出现时都要为NAT盒子打补丁显然不是一个好主意。
  • 最后由于TCP源端口字段16位长,所以至多只有65536台机器可以被映射到同一个IP地址上。实际上,这个数值还要略小一些,因为前4096个端口被保留作特殊的用途。然而,如果有多个IP地址可用,那么每个地址可以处理多达61440台机器。RFC 2993针对NAT的这些问题和其他一些问题进行了讨论。尽管存在问题,实际上作为处理IP地址短缺的权宜之计,NAT已经被广泛应用,它与防火墙和隐私性结合在一起,因为它能阻止未经请求的入境数据包。出于这个原因,甚至当IPv6被广泛部署后,它也不太可能消失。

29、Internet网络层——IPv4协议IP地址(网络层)相关推荐

  1. Internet的接入与IP地址 概述

    文章目录 一.计算机接入Internet 1.公用交换电话网(PSTN)接入 2.有线电视(CATV)接入 3.局域网接入 4.无线接入 二.IP地址 1.IP地址的格式 2.IP地址分类 3.子网掩 ...

  2. oracle+查询主机地址,oracle函数:获取Internet主机名和ip地址

    您可能感兴趣的话题: Oracle 核心提示:oracle函数获取Internet主机名和ip地址 Oracle包utl_inaddr 作用:用于取得局域网或Internet环境中的主机名和IP地址. ...

  3. 图解TCPIP-IP 网际协议-IP地址(网络层)

    网络层由IP(Internet Protocol) 和ICMP(Internet Control Message Protocol)两个协议组成 1.数据链路层主要是在一种数据链路的节点之间进行包传递 ...

  4. 网络层网络层服务及其 IP 地址

    ARP 协议功能 将 IP 地址通过广播(一个网段, 不能跨路由器), 目标 MAC 地址是FFFFFFFF 解析目标IP地址的 MAC 地址. IP 协议 网络层的一个协议, 是一个协议的统称, 包 ...

  5. Java ee 网络层重点协议IP协议

    文章目录 一.认识IP地址 1)概念: 2)作用 3)格式 4)组成 二.IP协议报头结构: 1)4位版本:IP协议的版本号,当前只有两个取值,4和6 2)4位首部长度:表示当前IP协议报头是多长 3 ...

  6. CN_@IP协议IP地址@IP首部@IPv4@地址分类@私有地址@NAT@单播地址@组播地址@广播地址

    文章目录 IP协议 IP数据报(Packet structure) IPv4分组的格式 Header 重要字段 Note: IP数据报分片 IP数据报分片案例

  7. 【计算机网络】第七章:[网络层]网络协议(Part1.网络层首部)

    CN.StudyLog.Ch7.Network Layer.网络层 (Part1.网络层首部) 网络层首部 版本/首部长度 区分服务 总长度 标识&标志 片偏移 生存时间TTL 协议/首部校验 ...

  8. Internet网际协议---IPv4协议

    IPv4协议 一.IPv4协议简介 二.IPv4数据报格式(由首部和数据组成) 三.数据报分片与重组 四.IP协议功能及报头字段总结 一.IPv4协议简介 1.IPv4协议:网际协议版本4,一种无连接 ...

  9. 虚拟服务器 ip是ipv4,服务器ip地址ipv4地址是什么

    服务器ip地址ipv4地址是什么 内容精选 换一换 当前不支持使用手工配置的IPv6地址进行通信,请参考使用虚拟IP替代.了解更多虚拟IP信息,请参见虚拟IP. 弹性公网IP支持IPv4地址和IPv6 ...

最新文章

  1. Alpha发布用户使用报告
  2. 【原生js】js动态添加dom,如何绑定事件
  3. jenkins gitlab php,jenkins(8): 实战jenkins+gitlab持续集成发布php项目(代码不需要编译)...
  4. 微服务架构统一安全认证设计与实践
  5. 披着 Chromium 皮的微软 Edge 浏览器到底长什么样?
  6. CAD迷你画图2020 R11 中文绿色版,详细使用教程
  7. 螺旋模型的概念简答题
  8. C语言驾校管理系统,驾校网站查询系统
  9. 第三章 灰度变换与空间滤波
  10. 软件测试面试题之自我介绍
  11. java 锁 面试题_Java面试题-Java中的锁
  12. java中怎么让字体可以显示下划线呢_Java如何在数字文字中使用下划线?
  13. jeecg扩展自定义菜单图标
  14. UVALive 4997 ABCD Tiles
  15. python空间计量经济学_一文读懂空间计量经济学及stata操作
  16. Qt:55---QT创建和使用静态链接库(.lib、.a)
  17. 平面直角坐标系中的旋转公式_初中数学《平面直角坐标系》说课稿
  18. python爬取中国知网(中国优秀硕士学位论文数据库)
  19. Ubuntu修改密码及密码复杂度策略设置
  20. 轻舟已过万重山:专访网易云陈谔

热门文章

  1. 基于opencv的一种快速有效椭圆检测方法
  2. PHP 微信客户端 网页授权登录
  3. LH(啮齿动物)ELISA试剂盒,为科研助力
  4. Antd+Vue2实现动态编辑表格
  5. 硬件基础知识---三极管放大电路
  6. python中的继承冲突及继承顺序
  7. 哈佛学生是如何度过大学4年的
  8. 云计算技术与应用赛项竞赛试题(样卷)
  9. 2023年第一批上海市服务业发展引导资金项目静安区申报工作的通知
  10. Vlog基础教程+系统教程