IPv4数据报格式
版本(号)
这4比特规定了数据报的IP协议版本,通过查看版本号,路由器能够确定如何解释IP数据报的剩余部分。不同的IP版本使用不同的数据报格式。IPv4的数据报格式如上图所示。
首部长度
因为一个IPv4数据报可包含一些可变数量的选项(这些选项包括在IPv4数据报首部中),故需要用这4比特来确定IP数据报中的载荷(例如在这个数据包中被封装的运输层报文段)实际开始的地方。大多数IP数据报不包含选项,所以一般的IP数据报具有20字节的首部。
服务类型
服务类型(TOS)比特包含在IPv4首部中,以便使不同类型的IP数据报(例如一些特别要求低延时、高吞吐量或可靠性的数据报)能互相区别开来。例如,将实时数据报与非实时流量区分开也许是有用的。提供特定等级的服务是一个由网络管理员对路由器确定和配置策略问题。
数据报长度
这是IP数据报的总长度(首部加上数据),以字节计。因为该字段长为16比特,所以IP数据报的理论最大长度为65535字节。然而,数据报很少有超过1500字节的,该长度使得IP数据报能容纳最大长度以太网帧的载荷字段。
标识、标志、片偏移
这三个字段与所谓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能够运行在一个不同的协议上,而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首部)以及应用层报文。