IP提供的服务是不可靠(unreliable)、无连接(connectionless)的数据报传送。

  不可靠:不能保证IP数据报能成功地到达目的地,如果发生某种错误时, IP丢弃该数据报,然后发送ICMP消息报给信源端。
  无连接:每个IP数据报的处理相互独立(各自选择路由),可以不按发送顺序接收。
  IP数据报格式:

四位首部长度,以32bit为单位,因此首部最长为60个字节((1+2+4+8)*32/8)。普通IP数据报(没有任何选择项)该字段的值是5(20个字节)。

  TOS包括一个3bit的优先权子字段(现在已被忽略),4bit的TOS子字段和1bit未用位(必须置0)。4 bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4bit中只能置其中1bit。如果所有4bit均为0,那么就意味着是一般服务。根据不同的应用设置不同的TOS,例如Telnet和Rlogin这两个交互应用要求最小时延,因为人们主要用它们来传输少量的交互数据。FTP文件传输则要求最大吞吐量。最高可靠性被指明给网络管理协议(SNMP)和路由选择协议(routing protocols)。用户网络新闻(Usenet news, NNTP)要求最小费用。
  总长度字段以字节为单位。由于该字段长16比特,所以IP数据报最长可达65535字节。总长度字段是IP首部中必要的内容,因为一些数据链路(如以太网)需要填充一些数据以达到最小长度。尽管以太网的最小帧长为46字节,但是IP数据可能会更短。如果没有总长度字段,那么IP层就不知道46字节中有多少是IP数据报的内容。
  标识字段唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1。
  flag字段和片偏移字段,用于ip分片。
  TTL(time-to-live)设置了数据报可以经过的最多路由器数。TTL的初始值由源主机设置(通常为32或6 4),一旦经过一个处理它的路由器,它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。
  协议字段,接受数据时用来识别是哪个协议向IP传送数据(帧封装过程中),发送数据时根据字段值将数据报发送到相应的上层协议(帧分用过程中)。
  首部检验和字段只对IP首部计算检验和码(ICMP、IGMP、UDP和TCP计算检验和码用的是和IP一样的算法,不过要对首部和后面的数据都进行计算)。由于路由器经常只修改TTL字段(减1),因此当路由器转发一份报文时可以增加它的检验和,而不需要对IP整个首部进行重新计算。
  最后一个字段是任选项,是数据报中的一个可变长的可选信息。目前,这些任选项定义如下:
 • 安全和处理限制(用于军事领域)
 • 记录路径(让每个路由器都记下它的IP地址)
 • 时间戳(让每个路由器都记下它的IP地址和时间)
 • 宽松的源站选路(为数据报指定一系列必须经过的IP地址)
 • 严格的源站选路(与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址)。
 这些选项很少被使用,并非所有的主机和路由器都支持这些选项。选项字段一直都是以32bit作为界限,在必要的时候插入值为0的填充字节。这样就保证IP首部始终是32bit的整数倍(这是首部长度字段所要求的)。

 


IP数据报最高位在左边,记为0bit;最低位在右边,记为31bit。4个字节的32bit值从左到右(内存从低到高,数据从高到低)传输:首先是0~7 bit,其次8~15 bit,然后1 6~23 bit,最后是24~31 bit。这种传输次序称作big endian字节序,又称作网络字节序。

  big endian和little endian: Endian是指字节在内存中的组织,big代表把高位字节放在内存低位,little代表把低位字节放在内存低位。为什么都要争内存低位呢,因为内存低位代表数据的地址,例如:
  一个数0x1122
  使用Little Endian方式时,内存低位存储0x22,内存高位存储0x11。
  使用Big Endian方式时, 内存低位存储0x11, 内存高位存储0x22。