更多优质内容
请关注公众号

计算机网络基础(六)网络层——IP协议详解-张柏沛IT博客

正文内容

计算机网络基础(六)网络层——IP协议详解

栏目:Linux 系列:计算机网络系列谢希仁 发布时间:2022-02-23 22:22 浏览量:69

IP数据报

IP 数据报由⾸部和数据两部分组成:

⾸部的前⼀部分是固定⻓度,共 20 字节;

⾸部的固定部分的后⾯是⼀些可选字段,其⻓度是可变的。

版本:占 4 位,指 IP 协议的版 本。⽬前的 IP 协议版本号为 4 (即 IPv4)。

 

⾸部⻓度:占 4 位,可表示的最 ⼤数值是 15 个单位(⼀个单位为 4 字节)。IP 的⾸部⻓度的最⼤值 是 60 字节。⼀般IP⾸部仅有固 定部分20字节。

 

区分服务:指明期望获得哪种类型的服务(该字段一直未被使用过)。

 

总⻓度:占 16 位,⾸部 + 数据,单位为字节,数据报的最⼤⻓度 为 65535 字节。但实际上总长度不会超过数据链路中的MTU。如果发生IP数据报分片,则总长度字段等于每个分片的首部长度和数据长度的总和。

 

标识:是⼀个计数器,⽤来产⽣ IP数据报标识。一个IP数据报可能分成多个分片,所有IP分⽚的标 识与原始IP标识⼀致,便于接收 方还原原始IP数据报。

 

标志:占3位,最⾼位⽆意义。

中间位DF(Don’t Fragment):

• DF=1,不允许分⽚;

• DF=0,允许分⽚。

最低位MF(More Fragment):

• MF=1,后⾯还有分⽚;

• MF=0,这是最后⼀⽚。

 

⽚偏移:占13位,某⽚在原始IP中的 相对位置,以8字节为单位。

 

⽣存时间:占8 位,记为 TTL (Time To Live),指示数据报在⽹络中可通 过的路由器数的最大次数(称为跳数),TTL是为了防止无法交付的数据报无限制的在互联网中兜圈子,白白消耗网络资源。路由器收到 IP数据报后,将TTL减1,减1之后 TTL值若变为0,路由器丢弃该IP数 据报。并向源端报超时错误。默认最大跳数为255。若报文的初始TTL设为1,表示该IP数据包只能在本局域网中传输。

 

协议:占8 位,指出此数据报携带的 数据使⽤何种协议(TCP或UDP),以便⽬的主机 的 IP 层将数据部分,上交给那个处 理过程。

 

⾸部检验和:占16 位,只检验数据报的 ⾸部,不检验数据部分。这⾥不采⽤ CRC 检验码⽽采⽤简单的计算⽅法(即首部分为多个16位串求和取反)。

 

地址:源地址和⽬的地址都各占 4 字 节。

 

IP数据报分片

MTU是由局域网的链路决定的,一个局域网内的MTU相同,不同网络的MTU可能不同。

下面是一个数据包经过多个链路的分片过程:

一个数据报长6558字节,数据部分65538字节,链路1的MTU = 1480,主机A对数据报分片情况如下:

 

分片1~5到达路由器M后,在输出链路之前还要对分片再分片(MTU = 800)。

 

 

 

IP层转发分组过程

路由器转发遵循2个原则:基于终点转发最长前缀匹配

 

基于终点转发

路由表是根据数据报首部的目的IP地址查路由表找到下一跳的接口进行转发的。

为了压缩路由表的行数,路由表不记录所有目标(全球范围)的主机地址,而是记录目标的网络地址。查路由表不直接查目的主机,而是查目的网络。

举一个例子

主机H1发送一个数据报给H2。

1、判断H2的IP是否在本网络中,具体做法:通过将H1所在网络N1的网络地址(128.1.2.0/26 )的子网掩码(255.255.255.192)与H2的IP地址(128.1.2.132)进行&运算。

如果得到的结果res 等于 N1的网络号(或者说等于N1的网络地址,或者说等于H1的网络地址),说明H2和H1在同一个网络里面,此时无需经过路由器转发,只需要H1使用ARP协议询问到H2的MAC地址,然后H1封装包含数据的MAC帧,由交换机转发给同一链路的H2即可。

 

2、一个网络的默认网关是这个网络相连的众多路由器中的一个,这里假定N1的默认网关路由器是路由器R1(128.1.2.1)。

H1通过ARP获取 128.1.2.1这个IP的MAC地址。报文通过交换机传到R1。

3、R1根据报文的目的IP与它路由表里的每一行记录的网络号(网络前缀)一一匹配,所谓的匹配其实还是用 目的IP与这些网络号的掩码一一做&运算得到res,看res是否等于这行的网络号。每行的网络号就代表一个网络,每行都做&运算相当于在问每个网络,这个目的IP在不在你们这些网络里。

目的IP是 128.1.2.132。

与第一行匹配

128.1.2.132 & 255.255.255.192 = 128.1.2.128 ≠ 128.1.2.0

与第二行匹配

128.1.2.132 & 255.255.255.128 = 128.1.2.128 = 128.1.2.128

所以与第二行匹配成功,第二行的下一跳没有,是直接交付接口1,即R1的接口1是连着128.1.2.128/25这个网络的。R1将报文交付给H2(ARP广播找到H2的MAC地址,更换原报文的目标MAC地址,交给交换机转发该报文给H2)。

4、假如H1是要发送数据给H3而不是H2呢?那么报文到达R1之后,查路由表发现第3行匹配。于是报文转发给128.1.2.254这个路由器R2转发。

 

两个问题:如果路由表匹配结果有多个怎么办(答:使用最长前缀匹配原则)?一个都没匹配到怎么办(答:走默认路由)?

 

 

最长前缀匹配

在查找路由表时可能会得到不⽌⼀个匹配结果:

应当从匹配结果中选择具有最⻓⽹络前缀的路由,⽹络前缀越⻓,其地址块就越⼩,因⽽路由就越具体 。

下面是一个最长匹配的实例:

目标地址 206.0.71.130 和 两个路由网络地址206.0.68.0/22、206.0.71.128/25 都能成功匹配,此时应该选择 206.0.71.128/25 这个路由作为下一跳,因为它的网络号长25位,比206.0.68.0/22的网络号长。

其实不是说走 206.0.68.0/22这个路由到不了目的主机,而是可能要多经过几条链路和路由器的转发,因为206.0.68.0/22这个网络的范围更大。

为了更加迅速的查找转发表,可以按照前缀的长短排序,长的放前面,前缀最长的排在第一行,只要匹配到就肯定是最精确的,无需再往下匹配。

 

 

主机路由

前面我们说,路由表索引字段记录的都是网络号,根据网络号给目标IP匹配下一跳。

其实索引字段也可以是特定的某一个主机(即/32的IP地址),这样的路由称为主机路由(特定主机路由)。如下所示,红色的就是主机路由,黑色部分是网络路由:

 

采⽤特定主机路由有2个用途(知道即可,不是重点):

1、测 试这条⽹络链路能够走通,以及性能如何。

R2到目标主机10.0.0.10/32可能有5条链路,但我就希望R2选择下一跳为20.0.0.1这条链路,测试一下这条链路的性能。

2、考虑某种安全问题时采⽤这种特定主 机路由。

怕报文走其他链路会被拦截和攻击,因此指定 10.0.0.10/32这个主机只走下一跳为20.0.0.1这条更安全的链路。

 

 

 

 

默认路由

默认路由是 0.0.0.0/0,每一个路由器的路由表都会有一个默认路由。

默认路由的出现是为了减少路由表的行数,毕竟路由表不可能记录全世界所有网络的网络地址,只能记住本路由器邻近的多个网络地址。当路由器A根据目的地址的网络号检索不到它所知道的网络地址时,就可以交给默认路由(即下一跳是默认的一个路由器B,交给这个路由器B转发,如果B也找不到,则再交给B的默认路由C,以此类推)。

 

综上,路由器分组转发算法如下:

 

 

有结构的路由表

为了进⾏更加有效的查找,通常是将路由表存放在二叉搜索树中。

如果直接使用表格存储路由表,匹配路由的时候需要一行行的匹配,假如路由表有1万行,而目的地址只能匹配到最后一行的默认路由,就需要匹配1万次。

路由表中IP地址存⼊⼆叉线索的规则:对于路由表里的每一行,先检查IP地址左边的第⼀位,如为 0,则第⼀层的节点在根节点 的左下⽅;如为 1,则在右下⽅。然后再检查地址的第⼆位,构造出第⼆层的节点。依此类 推,直到唯⼀前缀的最后⼀位。

叶子节点记录下一跳的地址。

假设路由表中有如下5行:

假设目的IP是 0110xxxx...,则查找过程为:左节点 - 右节点 - 右节点(到达叶子节点),匹配成功。

假设目的IP是 110xxx...,则查找过程为:右节点- 没有右节点了,由于没有到达叶子节点就结束了,说明路由表没有匹配的路由,走默认路由

树的最大高度为32,这么一来查找的复杂度从O(n)降到了O(1),因为无论路由表里面有多少条路由,最多只需查找32次。

 

 

 

IPv6地址
IPv6有三种基本类型地址:单播、多播和任播。
任播是IPv6增加的一种类型,任播的重点是一组计算机但数据报只交付给其中一个,是按照路由算法得出的距离最近的一个。

IPv6地址共128比特,16字节。用:分成8段,每段2个字节(4个16进制数)。
每组地址0开头可用省略。连续多个0可以用一个零可以用一个0表示。连续多组0信息可以用双冒号表示,双冒号只能用1次。

 

有6种类型,/128是指网络号的位数。

 

 

单播地址

前48 位是全球路由选择前缀(其中前三位固定为001),是第⼀级地址,分配给ISP等机构,相 当于IPv4的⽹络号。

⼦⽹标识:16 位,第⼆级地址,ISP等机构创建⾃⼰的⼦⽹;

接⼝ ID:64位,第三级地址,指明主机或路由器单个的⽹络接⼝。相当于 IPv4地址的主机号。

 

 

IPv6的IP数据报格式(了解即可)

两⼤部分组成:

• 基本⾸部;

• 后⾯的有效载荷:有效载荷允许有零个 或多个扩展⾸部,再后⾯是数据部分; 所有的扩展⾸部并不属于IPv6数据报的⾸部。

 

 

版本号,值固定为6,4个⽐特位。

通信量类,与IPv4 ⾸部ToS字段等效,没被⼴泛使⽤。

流标识,标识这个数据包属于源节点和⽬标节点之间的⼀个特定数 据包(例如一个视频或音频)序列,对实时⾳频/视频数据的传送特别有⽤。

有效载荷⻓度,不包含IPv6⾸部⻓度。这个⻓度就是 扩展⾸部和数据⻓度和。

下一个首部,指出下⼀个扩展⾸部的类型,如果没有扩展⾸部的话, 这个字段指的是传输层的协议类型,例如TCP/UDP(17 or 6)。

跳数限制,这个字段和IPv4⾸部中TTL类似,最⼤ 255。

 

 

 

从IPv4过渡到IPv6

不可能突然要求全球的主机立刻使用IPv6,而是需要一个过渡过程。下面是两种过渡策略:双协议栈和隧道技术。

 

双协议栈

是指一部分主机或路由器同时安装装有IPv4和IPv6的协议栈。这样主机就可以又和IPv4的系统通信,又和IPv6的系统通信,这样的主机它会同时拥有IPv4和IPv6地址。

该方法代价太大,因为要安装2套协议。

 

 

隧道技术

指某个主机只安装了IPv6协议栈,该主机发送一个数据报给另一个IPv6的主机,但是他们需要途径IPv4的网络。IPv6数据进入IPv4网络时,把IPv6数据报封装为IPv4的数据部分,并经由IPv4网络传输。这里的隧道是指报文经过的IPv4网络。当报文离开隧道时(具体是指遇到一个双协议栈的路由器)就把数据部分交给IPv6协议栈。

注意,包裹IPv6的IPv4报文的源地址和目的地址是隧道的入口和出口路由器。

该方法可以允许主机不安装双协议栈,但部分的路由器需要安装双协议栈。该方法无法让一个IPv4的主机和IPv6的主机通信。

 

ICMPv6 协议(了解即可)

是IPv6版本的ICMP协议。ARP 协议和 IGMP 协议的功能合并到 ICMPv6 中;也就是说,IPv6协议栈没有ARP协议和IGMP协议,ICMPv6除了差错报文和查询信息报文,还增加了临站发现报文和组成员关系报文这2种。

 




更多内容请关注微信公众号
zbpblog微信公众号

如果您需要转载,可以点击下方按钮可以进行复制粘贴;本站博客文章为原创,请转载时注明以下信息

张柏沛IT技术博客 > 计算机网络基础(六)网络层——IP协议详解

热门推荐
推荐新闻