IP协议是TCP/IP协议族中最为核心的协议。它提供不可靠、无连接的服务,也即依赖其他层的协议进行差错控制。在局域网环境,IP协议往往被封装在以太网帧中传送。而所有的TCP、UDP、ICMP、IGMP数据都被封装在IP数据报中传送。
图2-4 IP头部格式
报头长度:20-60字节bytes
白色部分为固定头部部分(20 bytes),绿色option选项部分为可选部分。
固定头部大小计算:
4bit + 4bit + 8bit + 16bit +16bit + 3bit + 13bit + 8bit +8bit + 16bit + 32bit(源IP) + 32bit(目IP) = 160bit = 20byte
所以IP头必须大于等于20byte,最大为60byte意味着Option选项部分取值范围0-40bits。
IP报文头部解析:
●版本(Version)字段:占4比特。用来表明IP协议实现的版本号,当前一般为IPv4,即0100。
●报头长度(Internet Header Length,IHL)字段:占4比特。因为头部长度不固定(Option可选部分不固定),所以需要标识该分组的头部长度多少,用4bit表示,以4byte为单位,取值范围:5-15,即20-40byte(其他字段也是类似的计算方式,因为bit位是不够表示该字段的值)。普通IP数据报(没有任何选项),该字段的值是5,即160比特=20字节。此字段最大值为60字节
●服务类型(Type of Service ,TOS)字段:占8比特。其中前3比特为优先权子字段(Precedence,现已被忽略)。第8比特保留未用。第4至第7比特分别代表延迟、吞吐量、可靠性和花费。当它们取值为1时分别代表要求最小时延、最大吞吐量、最高可靠性和最小费用。这4比特的服务类型中只能置其中1比特为1。可以全为0,若全为0则表示一般服务。服务类型字段声明了数据报被网络系统传输时可以被怎样处理。例如:TELNET协议可能要求有最小的延迟,FTP协议(数据)可能要求有最大吞吐量,SNMP协议可能要求有最高可靠性,NNTP(Network News Transfer Protocol,网络新闻传输协议)可能要求最小费用,而ICMP协议可能无特殊要求(4比特全为0)。实际上,大部分主机会忽略这个字段,但一些动态路由协议如OSPF(Open Shortest Path First Protocol)、IS-IS(Intermediate System to Intermediate System Protocol)可以根据这些字段的值进行路由决策。
●总长度字段:占16比特,表示整个IP 数据报长度,包括数据部分。指明整个数据报的长度(以字节为单位)。最大长度为65535字节。链路只允许1500byte,所以一般都需要MTU分片。
●标识符字段:占16比特。每个IP包的唯一值,相同的分片标识相同,用来唯一地标识主机发送的每一份数据报。通常每发一份报文,它的值会加1。Fragment ID,通常与标记字段和分片偏移字段一起用于IP报文的分片。当原始报文大小超过MTU,那么就必须将原始数据进行分片。每个被分片的报文大小不得超过MTU,而这个字段还将在同一原始文件被分片的报文上打上相同的标记,一般接收设备可以识别出属于同一个报文的分片。由源主机随机产生的一个号码,用于帮助重新组合一个被分段的数据包,当一个IP数据包从一个主机传输到另外一个主机时,它一般都需要通过另外一个网络,每一个物理网络都有一个最大帧的大小,也就是我们常说的最大传输单元(MTU),它限制了一个物理帧中数据的大小,当主机发送的数据超过了某一设备的MTU时,这时IP就会用一进程来对超过MTU的数据包进行分段,这个进程建立了一个小于MTU的数据报的集合,因此最终IP数据包以合适的大小发送到目标主机,由于数据包分过段,所以目标主机在接收数据包时会新建立一个缓存区来接收分段的数据包,目标主机判断某一数据包是否和其它数据包一样也是经过分段的就是通过判断标识符是否一样。在分段时只有数据会被分段,报头是复制而作为分段数据的头部。
●分段标志位字段(Flags):占3比特,但目前只有两位有意义,用来标志数据包是否分段。标志字段中间的一位为DF(Don't Fragment),意思是不能分片,只有当DF=0时才允许分片。标志字段中最低位记为包含DF(MF(more fragment),MF=1表示后面还有分片的数据包,MF=0表示这已是若干数据包片中的最后一片。当DF的值为1时,则MF的值必为0,DF为1,则说明数据包不能分段。同样可以知道当MF为1时,则DF为0,这表示的是数据包有分段。
●分片偏移字段(Fragmentation offset):占13比特,片偏移以8个字节为偏移单位,每个分片的长度一定是8字节的整数倍。如果一份数据报要求分段的话,此字段指明该段偏移距原始数据报开始的位置。标识某个分片在分组中的位置,也就是标识本包在整个包中的位置,任何一片数据的丢失需要上层重传整个报文。接收主机可以使用该字段的值来计算当前分段数据在原始数据报中的原始位置,由于该字段占用13个比特位,所以其最大值为8192,由于该字段的值是以8个字节为一个单位表示的,因此该字段可以表示在原始的数据报中的最远位置可以是65528个字节。举个例子来说吧,当某个数据包的大小为640个字节,现在分成8个大小为80个字节的数据包,这样第一个数据包的偏移量为0,则第二个数据包的偏移量就为10,后面的数据包依此计算可得到最后一个数据包的片偏移量是70。当然有些时候片偏移量就是0,这表示些数据包没有分段。
数据为何要分片(MTU):任何一个物理网络都有一个最大的传输单元,物理介质传输的能力是有限制的,不可能一次可传无限的数据帧。 以太网最大的帧长为1518, IP报文1500byte + 帧头18byte = 1518byte
●生存期(TTL:Time to Live)字段:占8比特,限制IP数据包在计算机网络中的存在的时间,即数据包可以经过的路由器数,每经过一个路由器,TTL减去1,当它为0时,则该数据报被丢弃。TTL值的查看可以通过ping命令查看,根据操作系统的不同TTL默认最大取值也会有所不同, linxu为TTL=255,win98为TTL=128,win7为TTL=64这都是由应用程序自由决定的。TTL的最大值是255,TTL的一个推荐值是64。
MTU:max transfer unit,最大传输单元。一般是1500个字节。一个ip数据报分片的单位。它是包括ip首部在内的。由于一般的ip首部是20个字节,因此一般的ip数据是1480个字节。
●协议字段:占8比特。确定在数据包内传送的上层协议,和端口号类似,IP 协议用协议号区分上层协议,指明IP层所封装的上层协议类型,以便目的主机的网络层知道将数据部分上交给哪个处理过程。ICMP协议的协议号为1,IGMP协议的协议号为2,TCP 协议的协议号为6,UDP 协议的协议号为17。
传输层的端口号用来区分应用层协议信息,网络层的协议号用来区分传输层协议信息,链路层的类型信息用来区分网络层协议信息
●头部校验和字段:占16比特。计算IP 头部的校验和,检查报文头部的完整性,内容是根据IP头部计算得到的校验和码,只校验头部,数据部分由高层协议校验。计算方法是:对头部中每个16比特进行二进制反码求和。(和ICMP、IGMP、TCP、UDP不同,IP不对头部后的数据进行校验)。校验和计算方法:首先把检验和字段置为0。然后,对首部中每个16 bit(切割成多个16bit组)进行二进制反码求和(整个首部看成是由一串16 bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部中每个16 bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。 报头:1011011101111011 = 16bit 反码:0100100010000100 求和:1111111111111111
●源IP地址、目标IP地址字段:各占32比特。用来标明发送IP数据报文的源主机地址和接收IP报文的目标主机地址。
●可选项字段:占32比特。用来定义一些任选项:如记录路径、时间戳等。这些选项很少被使用,同时并不是所有主机和路由器都支持这些选项。可选项字段的长度必须是32比特的整数倍,如果不足,必须填充0以达到此长度要求。
二 IP数据包的分片与重组
IP数据报格式:
在IP数据报头中有三个字段与数据报的分片与重组有很大的关系,分别是标识符、标志和片偏移量。
1.其中标志占3位,该字段目前只有后两位有意义。
其中,最低位记为MF(More Fragment),用于把数据报最后一片与前面其它各片区分开来。MF = 1代表片未完,即该分片不是原始数据报的最后一片;MF = 0表示该片是原始数据报的最后一片。
次低位DF(Don't Fragment),用来控制数据报是否允许分片。DF = 1表示该数据报不允许分片;DF = 0允许分片。
其实,数据报的分片和重组都是由机器自动完成的,因此设置DF位的真正意义在于,程序员可以控制数据报的分片过程,这为程序调试提供了方便和灵活性。
2.标识占16位,用于目的主机将数据报的各个分片重装成原来的数据报。当数据报分片时,该标识字段的值被复制到所有的数据报分片的标识字段中。这样,目的主机就可以正确的将标识字段值相同的各数据报分片重装成原来的数据报。
3.片偏移占13位,表示本片在原数据报中的偏移,偏移量以8字节为单位。由于各片数据均按照独立数据报方式传输,因此到达目的站的片序是不定的,目的主机在重装数据报时需要该字段提供偏移量。
例子说明:
有一数据报总长度4820,字节,首部20字节,数据4800字节。某一网络能传送的数据报的最大长度是1420字节(注意不一定是以最大传输单元1500字节分片的!),该如何分片?
片偏移以以8字节为单位。
当需要进行分片时,在每个数据报片的首部存放着该数据报的标识、标志位和片偏移,在进行重组时,标识用来分辨该数据报片的原数据报是哪个,标志位中的MF用来分辨这是不是原数据报的最后一片,片偏移用来分辨这个数据报片相对原数据报的位置。通过这几个字段,可以稳定的完成数据报的分片与重组操作。