原文:https://blog.csdn.net/cainv89/article/details/50676670
IP数据报的首部
注:IP数据报的格式,能够说明IP协议都具有什么功能。
1. IP数据报首部——固定部分
1.1 版本
- 占4位,指IP协议的版本。
- 通信双方使用的IP协议的版本必须一致。
- IP协议版本号为4(即IPv4),IP协议版本号为6(即IPv6)。
1.2 首部长度
- 占4位,可表示的最大十进制数值是15。
- 这个字段所表示数的单位是32位字(即4字节),因此,当IP的首部长度为1111(即十进制的15)时,首部长度就达到最大值60个字节。
- 最常用的首部长度就是20个字节(即首部长度为0101),这时不使用任何选项,是固定首部的长度。
- 当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。
1.3 区分服务
- 占8位,用来获得更好的服务。
1.4 总长度
- 占16位,指首部和数据之和的长度。
- 数据报的最大长度为2^16 -1 = 65535字节。
- 在IP层下面的每一种数据链路层都有其自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU(Maximum Transfer Unit)。当一个IP数据报封装成数据链路层的帧时,此数据报的总长度(即首部加上数据部分),一定不能超过下面的数据链路层的MTU值。
- 虽然使用尽可能长的数据报会使传输效率提高,但由于以太网的普遍应用,所以实际上使用的数据报长度很少有超过1500字节的。
- 为了不使IP数据报的传输效率降低,有关IP的标准文档规定,所有的主机和路由器必须能够处理的IP数据报的长度不得少于576字节。这个数值也就是最小的IP数据报的总长度。
- 当数据报长度超过网络所容许的最大传送单元MTU时,就必须把过长的数据报进行分片后才能在网络上传送(“片偏移”字段相关)。这时,数据报首部中的总长度不是指未分片前的数据报长度,而是指分片后的每一个分片的首部长度与数据长度的总和。
1.5 标识
- 占16位,指IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值付给标识字段。
- 但这个标识并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。
- 当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就会被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
1.6 标志
- 占3位,但目前只有两位有意义。
- 标志字段中的最低位记为MF(More Fragment)。
(1)MF=1即表示后面“还有分片”的数据报。
(2)MF=0即表示这已是若干数据报片中的最后一个。 - 标志字段中的中间位DF(Don’t Fragment),意思是“不能分片”,只有当DF=0时才允许分片。
1.7 片偏移
- 占13位,指出较长的分钟再分片后,某片在原分组中的相对位置。
- 也就是说,相对于用户数据字段的起点,该片从何处开始。
- 片偏移以8个字节为偏移单位。也就是说,每个分片的长度一定是8字节(64位)的整数倍。
- 例子:一数据报的总长度为3820字节,其数据部分为3800字节长(使用固定首部),需要分片为长度不超过1420字节的数据报片。因固定首部长度为20字节,因此每个数据报片的数据部分长度不能超过1400字节。于是分成3个数据报片,其数据部分的长度分别分为1400,1400和1000字节。原始数据报首部被复制为各数据报片的首部,但必须修改有关字段的值。
1.8 生存时间
- 占8位,常用的英文缩写是TTL(Time To Live),表明数据报在网络中的寿命。
- 由发出数据报的源点设置这个字段。
- 其目的是为了防止无法交付的数据报无限制地在因特网中兜圈子,因而白白浪费网络资源。
- 随着技术的发展,TTL字段的功能改为“跳数限制”。路由器在转发数据报之前就把TTL值减1。若TTL值减少到零,就丢弃这个数据报,不再转发。
- 因此,现在TTL的单位不再是秒,而是跳数。
- TTL的意义是指明数据报在因特网中至多可经过多少个路由器。显然,数据报能在因特网中经过的路由器的最大数是255。
- 若把TTL的初始值设置为1,就表示这个数据报只能在本局域网中传送。
1.9 协议
- 占8位,指出此数据报携带的数据是使用何种协议,一遍使目的主机的IP层知道应将数据部分上交给哪个处理过程。
- 常用的一些协议和相应协议的字段值。
1.10 首部检验和
- 占16位,只检验数据报的首部,但不包括数据部分。
- 这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。
- 不检验数据部分可减少计算的工作量。
- 为了进一步减少计算检验和的工作量,IP首部的检验和不采用复杂的CRC检验码而是采用以下算法:
(1)在发送方,先把IP数据报首部划分为许多16位字的序列,并把检验和字段置零。
(2)用反码算术运算把所有16位字相加后,将得到的和的反码写入检验和字段,
(3)接收方收到数据报后,将首部的所有16位字再使用反码算术运算相加一次。将得到的和取反码,即得出接收方检验和的计算结果。若首部未发生任何变化,则此结果必为0,于是就保留这个数据报,否则即认为出错,并将此数据报丢弃。
1.11 源地址
- 占32位。
1.12 目的地址
- 占32位。
2. IP数据报首部——可变部分
IP首部的可变部分就是一个选项字段。
2.1 可选字段(长度可变)
- 选项字段用来支持排错、测量以及安全等措施,内容很丰富。
- 此字段的长度可变,从1~40个字节不等,取决于所选择的项目。
- 某些选项项目只需要1个字节,它只包括1个字节的选项代码。但还有些选项需要多个字节,这些选项一个个拼接起来,中间不需要有分隔符。
2.2 填充
- 最后用全0的填充字段补齐成为4字节的整数倍。
注:增加首部的可变部分是为了增加IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。实际上这些选项很少被使用。新的IP版本IPv6就把IP数据报的首部长度做成固定的。