IP 数据报概貌展开目录
完整的 IP 数据报由首部和数据两部分组成。首部第一部分 20 字节,是所有 IP 数据报必须具有的;首部第二部分是可选字段,其长度是可变的。其各字段如下图所示:
首部固定部分各字段含义展开目录
固定部分第一行展开目录
- 版本:占 4 位,指 IP 的协议版本。通信双方使用的 IP 协议的版本必须一致,目前广泛使用的 IP 协议的版本号为 4(即 IPv4),字段内填充为 0100
- 首部长度:占 4 位,表示首部字段长度。其单位为 4 字节,通常情况下默认值为 0101(十进制 5),代表首部固定长度 20 字节。最大为 1111(十进制 15),即 60 字节。当 IP 分组首部长度不是 4 字节整数倍,需利用最后字段填充
- 区分服务:占 8 位,用来获得更好的服务。利用 DS(Differentiated Services)字段的不同数值,提供不同等级的服务。一般情况下不使用
- 总长度:占 16 位,指首部和数据之和的长度。单位为字节,总长度字段为 16 位,因此数据报的最大长度为 216 - 1 = 65535 字节。实际上传送这样长的数据报在现实中是很少的
我们知道,在 IP 层下面的每一种数据链路层协议都规定了一个数据帧的数据字段的最大长度,这称为最大传送单元 MTU (Maximun Transfer Unit)。当一个 IP 数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分),如果大于数据链路层规定的 MTU 值,就必须把过长的数据报进行那个分片处理。
IP 协议规定,在因特网上的主机和路由器,必须能够接收长度不超过 576 字节的数据报。这是假定上层交下来的数据长度有 512 字节(合理长度),加上最长的 IP 首部 60 字节(15 * 4),再加上 4 字节的富裕量
固定部分第二行展开目录
- 标识:占 16 位。IP 软件在存储器中维持一个计数器,每产生一个数据报,计数器就加 1,并将此值赋给标识字段。当数据报由于长度超过网络的 MTU 值而必须分片时,这个标识字段的值就被复制进所有数据报片的标识字段中,相同的标识字段的值,使分片后各数据报片最后能正确地重装为原来的数据片
- 标志:占 3 位,最低位记为 MF(More Fragment)。MF = 1 表示后面还有分片数据报,MF = 0 表示这是若干数据报分片中的最后一个。标志字段中间一位记为 DF(Don’t Fragment), 意思是不能分片,只有 DF = 0 才允许分片。标志最高位,目前没使用
- 片偏移:占 13 位,片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对于用户数据字段的七点,该片从何处开始。片偏移以 8 个字节为偏移单位
固定部分第三行展开目录
- 生存时间:占 8 位,其缩写为 TTL(Time to live),表明数据报在网络中的寿命。由发出数据报原点设置这个字段,其目的是防止无法交付的数据报无限制在因特网中兜圈子。路由器在转发数据报之前将 TTL 数值减 1,若 TTL 数值减为 0,则丢弃这个数据报
- 协议:占 8 位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的 IP 层知道将数据部分上交给哪个进程处理。常用的一些协议和相应的协议字段值如下:
- 首部校验和:占 16 位,这个字段只检验数据报的首部,不包含数据部分。这是因为每经过一个路由器,路由器都重新计算一下首部检验和(生存时间、标志、片偏移等可能发生变化)
举一个简单的例子,假如在发送端检验和为 11010011 11001100,其取反码写入检验和字段的值为 00101100 00110011,若在传输过程没有差错,则接收端(除检验和)依旧为 11010011 11001100,与校验和相加为 11111111 11111111, 取反码为 00000000 00000000。需要注意的是在发送端,反码算数运算求和,初始化检验和字段为全 0,接收端检验和字段参与运算,判定数据在传输过程中是否出现差错
固定部分第四五行展开目录
- 源地址:占 32 位,是源主机 IP 地址
- 目的地址:占 32 位,是目的主机 IP 地址
首部可变部分展开目录
IP 首部的可选部分就是一个选项字段,用来支持排错、测量以及安全等措施。这些选项连接起来,中间不需要有分割符,最后使用全 0 的填充字段补齐成为 4 字节的整数倍。
增加首部的可变部分是为了增加 IP 数据报的功能,但这同时也使得 IP 数据报的首部长度成为可变的。增加了每一个路由器处理数据报的开销,实际上这些选项很少使用。很多路由器都不考虑 IP 首部的选项字段,因此新的 IP 版本 IPv6 就把 IP 数据报的首部长度做成固定的