IP 协议是 TCP/IP 协议族中的核心协议,提供不可靠的无连接服务,即依靠其他层协议进行错误控制。在 LAN 环境中,IP 协议通常封装在以太网帧中进行传输。所有 TCP、UDP、ICMP 和 IGMP 数据都封装在 IP 数据报中进行传输。
图2-4 IP报头格式
报头长度:20-60字节
白色部分为固定头部分(20字节),绿色选项部分为可选部分。
固定头大小计算:
4bit + 4bit + 8bit + 16bit +16bit + 3bit + 13bit + 8bit +8bit + 16bit + 32bit (源 IP) + 32bit (目标 IP) = =
所以IP头肯定是大于等于,最大值就意味着选项部分,取值范围是0-。
IP数据包头分析:
● ()字段:占4位,用于指示IP协议实现的版本号,一般为IPv4,即0100。
●报头长度(IHL)字段:占4位。由于报头长度不固定(可选部分不固定),需要标识该数据包的报头长度,用4位表示,以4字节为单位,取值范围为:5-15,即20-(其他字段计算方法类似,因为位不足以表示此字段的值)。对于普通的IP数据报(不带任何选项),此字段的值为5,即160位=20字节。此字段的最大值为60字节
● 服务类型(TOS)字段:占用8位。前3位为优先级子字段(现已忽略)。第8位保留,未使用。第4至第7位分别表示时延、吞吐量、可靠性和成本,当它们设置为1时分别表示要求最小时延、最大吞吐量、最高可靠性和最小成本。服务类型4位中只能有一个设置为1,也可以全为0,如果全为0表示一般服务。服务类型字段声明了数据报在被网络系统传输时能被如何处理。例如:协议可能要求最小时延,FTP协议(数据)可能要求最大吞吐量,SNMP协议可能要求最高可靠性,NNTP(News,网络新闻传输协议)可能要求最小成本,ICMP协议可能没有特殊要求(4位全为0)。事实上,大多数主机都会忽略这个字段,但是一些动态路由协议如OSPF(Open Path First)和IS-IS(IS-IS)可以根据这些字段的值来做出路由决策。
●总长度字段:占16位,表示整个IP数据报的长度,包括数据部分。表示整个数据报的长度(以字节为单位)。最大长度为65535字节。链路只允许,所以一般需要进行MTU分片。
●标识符字段:占16位,是每个IP数据包的唯一值。同一个分片标识符用来唯一标识主机发送的每一个数据报,通常每发送一个消息,它的值就会增加1。ID通常和标记字段、分片偏移字段一起使用,对IP消息进行分片。当原始消息大小超过MTU时,必须对原始数据进行分片,每个分片消息的大小不得超过MTU,同时该字段还会标记从同一个原始文件分片出来的同一个消息,一般接收设备可以识别属于同一个消息的分片。由源主机随机生成的一个数字,帮助重新组装分片的数据包。当IP数据包从一台主机传输到另一台主机时,一般需要经过另一个网络,每个物理网络都有一个最大帧大小,也就是我们常说的最大传输单元(MTU),它限制了物理帧中数据的大小。当主机发送的数据超过某个设备的MTU时,IP会使用一个过程对超过MTU的数据包进行分片。这个过程会建立一个小于 MTU 的数据报集合,这样最终的 IP 数据包就会以合适的大小发送给目标主机。由于数据包是分段的,所以目标主机在收到数据包时会建立一个新的缓冲区来接收分段后的数据包。目标主机通过判断标识符是否相同来判断某个数据包是否像其他数据包一样被分段。分段时只会对数据进行分段,并将报头复制过来作为分段数据的报头。
●分片标志字段(Flags):占用3位,但目前只有两位有意义,用来标记该数据包是否被分片。标志字段的中间位为DF(Don't),表示不允许分片,只有当DF=0时才允许分片。标志字段的最低位记录为含有DF(MF(more),MF=1表示还有分片数据包来,MF=0表示这是几个数据包分片中的最后一个分片。当DF的值为1时,MF的值一定为0,如果DF为1,则表示该数据包不能被分片。由此还可以知道,当MF为1时,DF为0,表示该数据包被分片了。
●分片偏移字段( ):占13位。分片偏移以8字节为单位,每个分片的长度必须是8字节的整数倍。如果一个数据报需要分段,这个字段就表明了该段距离原始数据报起始的偏移量。它标识了一个分片在数据包中的位置,也就是标识了该数据包在整个数据包中的位置。任何一块数据的丢失都需要上层重新传输整个报文。接收主机可以利用这个字段的值来计算当前分片数据在原始数据报中的原始位置。由于这个字段占13位,所以它的最大值为8192。由于这个字段的值是以8字节为单位来表示的,所以这个字段可以表示的原始数据报中最远的位置是65528字节。例如,当一个数据包的大小为640字节时,现在将其分成8个80字节的数据包。这样第一个数据包的分片偏移量为0,第二个数据包的分片偏移量为10,后面的数据包以此方式计算,得到最后一个数据包的分片偏移量为70,当然有时候分片偏移量为0,也就是代表这些数据包没有分片。
数据为什么需要分片(MTU):任何物理网络都有一个最大传输单元,物理介质的传输能力是有限的,不可能一次性传输无限的数据帧,以太网的最大帧长为1518,IP报文+帧头=
●生存时间(TTL)字段:占8位,限制IP数据包在计算机网络中存在的时间,也就是数据包能够经过的路由器数量。每经过一个路由器,TTL就减1,为0时,数据报被丢弃。TTL值可以通过ping命令查看。TTL的默认最大值根据操作系统不同而不同,Linux下TTL=255,Win98下TTL=128,Win7下TTL=64,这都是由应用程序决定的。TTL的最大值是255,建议TTL值为64。
MTU:max 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位组)每个16位进行补码相加(整个报头被认为是由一串16位的字组成),结果存放在校验和字段中。在收到IP数据报时,也要对报头中每个16位进行2的补码相加。由于接收方在计算过程中包含了发送方存储在报头中的校验和,因此,如果传输过程中报头没有错误,接收方计算的结果应该全为 1。如果结果不全为 1(即校验和错误),则 IP 会丢弃收到的数据报。但是不会产生任何错误消息。上层会找到丢失的数据报并重新传输。报头:11011 = 16bit 反码:00100 和:11111
●源IP地址和目的IP地址字段:各占32位,分别用于指示发送IP数据报的源主机地址和接收IP数据报的目的主机地址。
● 可选字段:32 位。用于定义一些可选选项:如记录路径、时间戳等。这些选项很少使用,并不是所有的主机和路由器都支持。可选字段的长度必须是 32 位的整数倍,如果不足 32 位,必须用 0 填充以满足此长度要求。
2. IP数据包的分片与重组
IP数据报格式:
IP数据报头中有三个字段与数据报的分片和重组密切相关,分别是标识符、标志位和分片偏移量。
1、该标志占用3位,目前只有该字段的最后两位有意义。
最低有效位记为MF(More),用于区分数据报的最后一个片段和前面的片段。MF = 1表示该片段不完整,即该片段不是原始数据报的最后一个片段;MF = 0表示该片段是原始数据报的最后一个片段。
第二低位DF(Don't)用于控制数据报是否允许分片。DF = 1表示数据报不允许分片;DF = 0表示允许分片。
实际上数据报的分片和重组都是由机器自动完成的,因此设置DF位的真正意义在于程序员可以控制数据报的分片过程,为程序调试提供了方便和灵活性。
2、标识字段占16位,目的主机使用该字段将数据报的分片重组为原始数据报。当数据报被分片时,标识字段的值会被复制到所有数据报分片的标识字段中。这样,目的主机就能正确地将标识字段值相同的数据报分片重组为原始数据报。
3、分片偏移量占13位,表示分片在原始数据报中的偏移量,偏移量以8字节为单位。由于每个分片数据都是作为独立的数据报传输的,因此到达目的站的分片顺序是不确定的,目的主机在重组数据报时需要此字段来提供偏移量。
例子:
一个数据报总长度为4820字节,报头20字节,数据4800字节。网络能传输的数据报最大长度为1420字节(注意不一定在最大传输单位1500字节内分片!)。应该如何分片呢?
分片偏移以8字节为单位。
当需要分片时,每个数据报分片的头部会保存数据报标识、标志位、分片偏移量。重组时,通过标识来区分该数据报分片是哪个原始数据报,标志位中的MF来区分这是否是原始数据报的最后一个分片,分片偏移量来区分该数据报分片相对于原始数据报的位置。通过这些字段,可以稳定地完成数据报的分片重组。