IP数据报
IP协议提供不可靠无连接的数据报传输服务,IP层提供的服务是通过IP层对数据报的封装与拆封来实现的。IP数据报的格式分为报头区和数据区两大部分,其中报头区是为了正确传输高层数据而加的各种控制信息,数据区包括高层协议需要传输的数据。
IP数据报格式如下:
注意: 上图表示的数据,最高位在左边,记为0位;最低位在右边,记为31位。在网络中传输数据时,先传输0~7位,其次是8~15位,然后传输16~23位,最后传输24~31位。由于TCP/IP协议头部中所有的二进制数在网络中传输时都要求以这种顺序进行,因此把它称为网络字节顺序。在实际编程中,以其他形式存储的二进制数必须在传输数据前使用网络编程API相应的函数把头部转换成网络字节顺序。
IP数据报各字段功能:
1)版本号: 占用4位(二进制位)
,表示该IP数据报使用的IP协议版本。目前Internet中使用的主要是TCP/IP协议族中版本号为4
(二进制表示0100
)的IP协议。
2)头长度: 占用4位
,此域指出整个报头的长度(包括选项),该长度是以32位二进制数为一个计数单位的,接收端通过此域可以计算出报头在何处结束及从何处开始读数据。普通IP数据报(没有任何选项)该字段的值是5(二进制表示0101
)(即20个字节的长度)。
3)服务类型TOS(Type Of Service): 占用8位
,用于规定本数据报的处理方式。
服务类型字段的8位分成以下5个子域:
3位 | 1位 | 1位 | 1位 | 1位 |
优先权 | 短延迟D | 高吞吐量位T | 高可靠位R | 保留位 |
优先权: 占用3位
,数值(十进制0~7)越大,表示该数据报优先权越高。网络中路由器可以使用优先权进行拥塞控制,如当网络发生拥塞时可以根据数据报的优先权来决定数据报的取舍。
短延迟位D(Delay): 占用1位
,该位置为1时,数据报请求以短延迟信道传输,0表示正常延时。
高吞吐量位T(Throughput): 占用1位
,该位置1时,数据报请求以高吞吐量信道传输,0表示普通。
高可靠位R(Reliability): 占用1位
,该位置1时,数据报请求以高可靠性信道传输,0表示普通。
保留位: 占用2位
。
目前在Internet中使用的TCP/IP协议大多数情况下网络并未对TOS进行处理,但在实际编程时,有专门的函数来设置该字段的各域。一些重要的网际应用协议中都设置了建议使用的TOS值:
从上表可以看出,对于与用户直接交互的应用,一般使用短延时;对于有大量数据需要进行传输的应用,一般选用高吞吐量;对于数据报要传输控制信息的应用,一般选用高可靠性。在数据报的生存期内不支持TOS的,TOS字段就设置为0x00。
4)总长度: 占用16位
,总长度字段是指整个IP数据报的长度(报头区+数据区),以字节为单位。利用头部长度字段和总长度字段就可以计算出IP数据报中数据内容的起始位置和长度。由于该字段长度为16位二进制数,因此理论上IP数据报最长可达65536个字节(事实上受物理网络的限制,要比这个数值小很多)。
5)标识(identification): 占用16位
,IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”不是序号,因为IP是无连接的服务,数据报不存在按序接收的问题。当数据报由于过长超过网络MTU必须分片时,这个标识字段就会被复制到所有的数据报文标识字段,相同标识字段的值的各数据报片最后能够正确的重装位原来的数据报。
6)标志(flag): 占用3位
,R、DF(Don’t Fragment)、MF(More Fragment)三位。目前只有后两位有效,DF位:为1表示不分片,为0表示分片。MF:为1表示“更多的片”,为0表示这是最后一片。
7)片位移: 占用13位
,分片重组时会用到该字段。表示较长的分组在分片后,某片在原分组中的相对位置。以8个字节为偏移单位。
8)生存时间(TTL,time to live): 占用8位
,它指定了数据报可以在网络中传输的最长时间。实际应用中把生存时间字段设置成了数据报可以经过的最大路由器数。TTL的初始值由源主机设置(通常为32、64、128或256),一旦经过一个处理它的路由器,它的值就减1。当该字段为0时,数据报就丢弃,并发送ICMP报文通知源主机,因此可以防止进入一个循环回路时,数据报无休止地传输下去。
9)上层协议标识: 占用8位
,IP协议可以承载各种上层协议,目标端根据协议标识就可以把收到的IP数据报送到TCP或UDP等处理此报文的上层协议了。
常用网际协议编号:
10)头部校验和: 占用16位
,用于协议头数据有效性的校验,可以保证IP报头区在传输时的正确性和完整性。头部检验和字段是根据IP协议头计算出的检验和,它不对头部后面的数据进行计算。
原理:发送端首先将检验和字段置0,然后对头部中每16位二进制数进行反码求和的运算,并将结果存在校验和字段中。 由于接收方在计算过程中包含了发送方放在头部的校验和,因此,如果头部在传输过程中没有发生任何差错,那么接收方计算的结果应该是全1。
11)源地址: 占用32位,表示发送端IP地址。
12)目的地址: 占用32位,表述目的端IP地址。