IPv4数据报格式 :
IPv4数据报中的关键字段如下:
- 版本: 这4比特规定了数据报的IP协议版本。不同的IP版本使用不同的数据报格式。IPv4的数据报格式如图所示。
- 首部长度: 因为一个IPv4 数据报可包含一些可变数量的选项(这些选项包括在IPv4数据报首部中),故需要用这4比特来确定IP数据报中数据部分实际从哪里开始。大多数IP数据报不包含选项,所以一般的IP数据报具有20字节的首部。
- 服务类型:服务类型(TOS)比特包含在IPv4首部中,以便使不同类型的IP数据报(例如,一些特别要求低时延、高吞吐量或可靠性的数据报)能相互区别开来。例如,将实时数据报(如用于IP电话应用)与非实时流量(如FTP)区分开也许是有用的。提供特定等级的服务是一个由路由器管理员决定的策略问题。
- 数据报长度: 这是IP数据报的总长度(首部加上数据),以字节计。因为该字段长为16比特,所以IP数据报的理论最大长度为65535字节。然而,数据报很少有超过1500字节的。
- 标识、标志、片偏移: 这三个字段与所谓IP分片有关,新版本的IP(即 IPv6)不允许在路由器上对分组分片。
- 寿命: 寿命(Time-To-Live,TTL)字段用来确保数据报不会永远(如由于长时间的路由选择环路)在网络中循环。每当数据报由一台路由器处理时,该字段的值减1。若TTL字段减为0,则该数据报必须丢弃。
- 协议: 该字段仅在一个P数据报到达其最终目的地才会有用。该字段值指示了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字段中插入它的P地址,在目的IP地址字段中插入其最终目的地的地址。通常源主机通过DNS查找来决定目的地址,如在第2章中讨论的那样。我们将在4.4.2节中详细讨论了IP编址。
- 选项: 选项字段允许IP首部被扩展。首部选项意味着很少使用,因此决定对每个数据报首部不包括选项字段中的信息,这样能够节约开销。然而,选项的可能存在的确是件复杂的事,因为数据报头长度可变,故不能预先确定数据字段从何处开始。而且还因为有些数据报要求处理选项,而有些数据报则不要求,故导致一台路由器处理一个IP数据报所需的时间变化很大。这些考虑对于高性能路由器和主机上的P处理来说特别重要。由于这样或那样的原因,在IPv6首部中已去掉了P选项。
- 数据(有效载荷): 我们来看看最后的也是最重要的字段,这是数据报存在的首要理由!在大多数情况下,IP数据报中的数据字段包含要交付给目的地的运输层报文段(TCP或 UDP)。然而,该数据字段也可承载其他类型的数据,如 ICMP报文
IP数据报分片
想象你是一台互联几条链路的路由器,且每条链路运行具有不同MTU(最大传送单元)的链路层协议。假定你从某条链路收到一个IP数据报,通过检查转发表确定出链路,并且该出链路的MTU比该IP数据报的长度要小。此时你会感到慌乱,如何将这个过大的IP分组压缩进链路层帧的有效载荷字段呢?解决该问题的方法是将IP数据报中的数据分片成两个或更多个较小的IP数据报,用单独的链路层帧封装这些较小的IP数据报;然后向输出链路上发送这些帧。每个这些较小的数据报都称为片。
但是!!!
在路由器中重新组装数据报会给协议带来相当大的复杂性并且影响路由器性能。(TCP等协议需要重新组装数据报)为坚持网络内核保持简单的原则,IPv4的设计者决定将数据报的重新组装工作放到端系统中,而不是放到网络路由器中。
IPv4 的设计者将标识、标志和片偏移字段放在P数据报首部中。当生成一个数据报时,发送主机在为该数据报设置源和目的地址的同时再贴上标识号。发送主机通常将为它发送的每个数据报的标识号加1。当某路由器需要对一个数据报分片时,形成的每个数据报(即片)具有初始数据报的源地址、目的地址与标识号。当目的地从同一发送主机收到一系列数据报时,它能够检查数据报的标识号以确定哪些数据报实际上是同一较大数据报的片。由于IP是一种不可靠的服务,一个或多个片可能永远到达不了目的地。因为这种原因,为了让目的主机绝对地相信它已收到了初始数据报的最后一个片,最后一个片的标志比特被设为0,而所有其他片的标志比特被设为1。另外,为了让目的主机确定是否丢失了一个片(且能按正确的顺序重新组装片),使用偏移字段指定该片应放在初始IP数据报的哪个位置。
IPv6废止分片原因
- 分片也是有开销的;
- 首先,它使路由器和端系统更为复杂;
- 其次,分片能够被用于生成致命的DoS攻击,攻击者向目标主机发送了小片的流,这些片中没有一个片的偏移量是0。当目标试图从这些不良分组中重建数据报时,可能会崩溃。
获取主机地址:动态主机配置协议DHCP
动态主机配置协议(Dynamic Host Configuration,DHCP)允许主机自动获取一个IP地址。网络管理员能够配置DHCP,以使某给定主机每次与网络连接时能得到一个相同的IP地址,或者某主机将被分配一个临时的IP地址 ,该地址在每次与网络连接时也许是不同的。除了主机IP地址分配外,DHCP还允许一台主机得知其他信息,例如它的子网掩码、它的第一跳路由器地址(常称为默认网关)与它的本地 DNS服务器的地址。
由于 DHCP具有自动将主机连接进一个网络的能力,故它又常被称为即插即用协议。这种能力对于网络管理员来说非常有吸引力,否则他将不得不手工执行这些任务! DHCP还广泛地使用于住宅因特网接入网与无线局域网中,其中的主机频繁地加入和离开网络。
例如,考虑一个学生带着便携机从宿舍到图书馆再到教室。很有可能在每个位置,这个学生将连接到一个新的子网,因此在每个位置都需要一个新的IP地址。DHCP在此情形下是最理想的方法,因为有许多用户来来往往,仅在有限的时间内需要地址。类似地,DHCP在住宅ISP接入网中是有用的。举一个例子,一个住宅区 ISP有2000个客户,但不会有超过400个客户同时在线。在这种情况下,动态地分配地址的DHCP服务器不需要一个含2048个地址的块,而仅需一个含512个地址的块(例如像形式为a.b.c.d/23的块)。当主机加入或离开时,DHCP服务器要更新其可用的IP地址表。每当一台主机加入时,DHCP服务器从其当前可用的地址池中分配一个任意的地址给它;每当一台主机离开时,其地址便被收回这个池中。
DHCP是一个客户-服务器协议。客户通常是新达到的主机,它要获得包括自身使用的IP地址在内的网络配置信息。在最简单场合下,每个子网将具有一台DHCP服务器。如果在某子网中没有服务器,则需要一个 DHCP中继代理(通常是一台路由器),这个代理知道用于该网络的DHCP服务器的地址。
上图显示了连接到子网223.1.2/24的一台 DHCP服务器,具有一台提供中继代理服务的路由器,它为连接到子网223.1. 1/24和223.1.3/24的到达客户提供 DHCP服务。
对于一台新到达的主机而言,针对上图所示的网络设置,DHCP 协议是一个4个步骤的过程,如下图DHCP客户-服务器交互所示:yiaddr(表示“你的因特网地址”之意)指示被分配给该新到达客户的地址。
这4个步骤是:
- DHCP服务器发现。一台新到的主机的首要任务是发现一个要与其交互的 DHCP服务器。这可通过使用一个 DHCP发现报文来完成,客户在UDP分组中向端口67发送该发现报文。但是这个数据报应发给谁呢?主机甚至不知道它所连接网络的IP地址,更不用说用于该网络的 DHCP服务器地址了。在这种情况下,DHCP客户生成包含DHCP发现报文的IP数据报,其中使用广播目的地址255.255.255.255(该报文会交付给同一个网络中的所有主机)源地址使用0.0.0.0。DHCP客户将该IP数据报传递给链路层,链路层然后将该帧广播到所有与该子网连接的子网
- DHCP服务器提供。DHCP服务器收到一个 DHCP发现报文时,用一个 DHCP提供报文向客户作出响应,仍然使用IP广播地址255.255. 255.255。因为在子网中可能有几个DHCP服务器,该客户也许会发现它处于能在几个提供者之间进行选择的优越位置。每台服务器提供的报文包含有收到的发现报文的事务ID、向客提供的IP地址、网络掩码以及IP地址租用期,即IP地址有效的时间量。服务器租用期通常设置为几小时或几天。
- DHCP请求。新到达的客户从一个或多个服务器提供中选择一个,并向选中的服务器提供用一个 DHCP请求报文(DHCP)进行响应,回显配置参数。
- DHCP ACK。服务器用DHCP ACK报文对DHCP请求报文进行响应,证实所要求的参数。
然而,从移动性角度看,DHCP确实有不足之处。因为每当结点连到一个新子网时,要从 DHCP得到一个新的IP地址,当一个移动结点在子网之间移动时,就不能维持与远程应用之间的TCP连接。移动IP技术就解决了这种问题。
IPv6
由于新的子网和IP结点以惊人的增长率连到因特网上(并被分配唯一的P地址),32比特的IP地址空间即将用尽。为了应对这种对IP地址空间的需求,开发了一种新的IP协议,即 IPv6。IPv6的设计者们还利用这次机会,在IPv4积累的运行经验基础上加进和强化了IPv4的其他方面。
IPv6数据报格式 :
IPv6中引入的最重要的变化显示在其数据报格式中:
- 扩大的地址容量。IPv6将IP地址长度从32比特增加到128比特。这就确保全世界将不会用尽IP地址。现在,地球上的每个沙砾都可以用IP地址寻址了。除了单播与多播地址以外,IPv6还引入了一种称为任播地址(anycast address)的新型地址,这种地址可以使数据报交付给一组主机中的任意一个。
- 简化高效的40字节首部。许多IPv4字段已被舍弃或作为选项。因而所形成的40字节定长首部允许更快地处理IP数据报。
- 流标签与优先级。IPv6有一个难以捉摸的流(flow)定义。该字段可用于“给属于特殊流的分组加上标签,这些特殊流是发送方要求进行特殊处理的流,如一种非默认服务质量或需要实时服务的流”。例如,音频与视频传输就可能被当作一个流。在另一方面,更为传统的应用(如文件传输和电子邮件,就不可能被当作流。由高优先级用户(如某些为使其流量得到更好服务而付费的用户)承载的流量也有可能被当作一个流。然而,IPv6的设计者们显然已预见到最终需要能够区分这些流。IPv6首部中还有一个8比特的流量类型字段,该字段就像IPv4中的TOS字段,可用于给出一个流中某些数据报的优先级,以便指明某些应用的数据报比其他应用的数据报有更高的优先权。
以下是在IPv6中定义的字段。
- 版本。该4比特字段用于标识IP版本号。IPv6将该字段值设为6。
- 流量类型。该8比特字段与我们在IPv4中看到的 TOS字段的含义相似。
- 流标签。该20比特的字段用于标识一条数据报的流。
- 有效载荷长度。该16比特值作为一个无符号整数,给出了IPv6数据报中跟在定长的40字节数据报首部后面的字节数量。
- 下一个首部。该字段标识数据报中的内容需要交付给哪个协议(如TCP或UDP)。该字段使用与IPv4首部中协议字段相同的值。
- 跳限制。转发数据报的每台路由器将对该字段的内容减1。如果跳限制计数到达0时,则该数据报将被丢弃。
- 源地址和目的地址。
- 数据。这是IPv6数据报的有效载荷部分。当数据报到达目的地时,该有效载荷就从IP数据报中移出,并交给在下一个首部字段中指定的协议处理。
在IPv4数据报中出现的几个字段在IPv6数据报中已不复存在:
- 分片/重新组装。IPv6不允许在中间路由器上进行分片与重新组装。这种操作只能在源与目的地上执行。如果路由器收到的IPv6数据报因太大而不能转发到出链路上的话,则路由器只需丢掉该数据报,并向发送方发回一个“分组太大”的ICMP差错报文即可。于是发送方能够使用较小长度的IP数据报重发数据。分片与重新组装是一个耗时的操作,将该功能从路由器中删除并放到端系统中,大大加快了网络中的IP转发速度。
- 首部检验和。因为因特网层中的运输层(如TCP与 UDP)和数据链路层协议执行了检验操作,IP设计者大概觉得在网络层中具有该项功能实属多余,可以将其去除。快速处理IP分组是重点。IPv4时,由于IPv4首部中包含有一个TTL字段,所以在每台路由器上都需要重新计算IPv4首部检验和。就像分片与重新组装一样,在IPv4中这也是一项耗时的操作。
- 选项。选项字段不再是标准IP首部的一部分了。但它并没有消失,而是可能出现在IPv6首部中由“下一个首部”指出的位置上。这就是说,就像TCP或UDP协议首部能够是IP分组中的“下一个首部”,选项字段也能是“下一个首部”。删除选项字段使得IP首部成为定长的40字节。