《用tcp/ip进行网际互联》第6章 网际协议:无连接数据报交付

时间:2022-12-21 22:31:00

这段时间在看用《tcp/ip进行网际互联》,看来别人的推荐真的是非常的不错,的确是一本好书。之前上来就去看史蒂文斯先生的《tcp/ip详解》,实在有点啃不动。另外apue的更新往后推推,但是我还是会更新完的。在这里我主要记录下IP数据报的静态部分,以后还会对IP数据报的分组转发进行研究,到时候也会写成博客的。

首先,要分析IP数据报,就要对更加底层的物理网络有一个了解。IP协议是对底层的物理网络的一个抽象,底层物理网络进行通信的时候要使用每块网络接口卡都唯一的MAC地址,而在IP通信的时候主要是使用IP地址。这里就有一个问题出现的了,为什么要使用两个地址?只使用一个物理地址会怎么样?这个问题我个人认为,会给路由器的设计带来非常大的压力,可能现在的路由器价格比现在要贵上不少。如果只有IP地址,那么网桥这样的底层网络设施又如何进行工作那?显然,这里两个地址都是不可分割的。下面我就从IP数据报的结构和内容入手分析IP数据报。

《用tcp/ip进行网际互联》第6章 网际协议:无连接数据报交付《用tcp/ip进行网际互联》第6章 网际协议:无连接数据报交付《用tcp/ip进行网际互联》第6章 网际协议:无连接数据报交付

《用tcp/ip进行网际互联》第6章 网际协议:无连接数据报交付

这个就是IP数据报的整体结构,其中最重要的部分当然是头部,搜易我对IP数据报头部中每一个字段都进行解释和一些自己的思考,如果有不对的地方还请大家指出来。

1.版本:指代当前这个IP数据报的版本信息,我们当前使用使用的是IPv4的版本,所以在这里的版本字段的值是4。

2.首部长度:这里指的是IP数据报的首部长度,而不是整个数据报的长度,同时这里也要注意这里的单位是32位的字,比如这里数据报首部长度是20,那么这里的值就是4。

3.服务类型:这个字段有些复杂。服务类型字段一共有8位,最后2位是未用的字段。现在我们只考虑前六个位。当后三位为0的时候,由前三个位组合成优先级(分为8个优先级)当优先级级数较高的时候,路由器会对这个数据报优先对待。当然这里对服务类型字段的管理也分为三个池,池1由标准委员会管理,池2和池3都由实验人员管理。其实这里的服务类型只是给路由器的转发算法的一个提示,指导路由器进行转发,并不能完全保证转发路径上的所有路由器都按照指定的算法进行转发。

4.总长度:这里的长度指的是数据报首部和数据区一起的长度,单位是八位组。数据区的长度可以用总长度减去首部长度,当然在这里要注意两个之间的单位区别。

5.标识符:由于在分片的过程中可能将一个数据报分成很多大于等于当前物理网络的MTU(注意MTU指的长度是指IP数据报首部和IP数据报的数据区的总长度,MTU和物理帧没有关系)的数据报片,为了在重装的过程中识别不同原始数据报的数据分片,就需要给每个原始数据报的标识符字段生成一个唯一的值,每个原始数据报分片过后的每一个数据报片这个字段都应该是一样的。

6.标识符字段:这个字段控制分片,一般来讲用户并不需要知道具体是如何分片的,这些都是底层操作系统的任务,但是在这里有些服务一旦分片就会使得最后的效果受到影响,这个时候选择强制不分片,这个时候如果操作系统发现任然需要分片那么就把整个数据报简单丢弃。这个字段中一个比特位还可以标识是否是原始数据报的尾部分片。通过这个字段,系统可以分辨出全部的 数据报是否全部到达。

7.数据报片偏移量:这个字段的单位比较特殊的,单位是8八位组。所以这也决定了数据报片的长度必须是8八位组长度的整数倍。这个字段标识了在原始数据报中的偏移,只有从偏移0到最高偏移所有的数据报片都接收到后才能重装。

8.生存时间:这里指的是这个数据报中间所能经过的最大路由器数量,一旦路由器接收到数据报就将该字段的值减一,如果值为0,那么路由器就将这个数据报丢弃,我记得在史蒂文斯先生的《tcp/ip详解》中有对这个方面的实验。

9.协议:这个字段解释这个数据报是由什么上层协议创建的,当然这里的值的定义应该有一个标准,从我们现在的网络来看,不放认为这里表示的就是IP协议。

10.首部检验和:这个字段是防止在发送过程中出现遗漏的情况。计算方法是将整个数据报首部看成有16位的整数组成,对每个整数求二进制的反码,然后相加,再对结果求二进制反码,同时再求值的时候,将这个字段初始化为全部为0。

11.源站IP地址:指发出的数据报的IP地址。

12.目的站IP地址:指最终的目的站的IP地址。

13.IP选项:这里我们最感兴趣的是记录路由,源路由,时间戳这个三个选项。

14.填充:为了将整个数据报的长度符合数据报偏移字段的单位的倍数。

16.DATA:数据报的数据字段。