警察叔叔顺着网线是怎么找到你的?计算机网络(四)之网络层未完待续

大家好,我是后来,我会分享我在学习和工作中遇到的点滴,希望有机会我的某篇文章能够对你有所帮助,所有的文章都会在公众号首发,欢迎大家关注我的公众号" 后来X大数据 ",感谢你的支持与认可。

自律真的是太重要了,我才坚持了不到半个月就犯起了懒,一边抱怨账号不好运营,但反过来想自己也没付出太多的努力。接下来开始继续写。

之前我们讲了物理层和数据链路层,今天就到了网络层。再来串一下这几层的关系。
我们之前讲的物理层和数据链路层,其实再TCP/IP协议的体系结构中属于一层,网络接口层,我们为了更容易理解把它拆分开了。在这里插入图片描述
那么今天我们开始讲网络层,在开始讲之前,还是先引出一个问题:
我们有一句玩笑话,警察叔叔,这不是之前有同学在宿舍吃火锅还得瑟发微博,还没吃完消防员就出现了。
那么问题来了,警察叔叔顺着网线是怎么找到你的?

其实这个问题我想把它转换为:通过一个IP地址怎么找到具体的主机?
在这里插入图片描述
带着疑问来看看我们今天的重要内容,哈哈。

  1. 虚拟互连网络的概念。
  2. IP地址与物理地址的关系。
  3. 传统的分类的IP地址(包括子网掩码)和无分类域间路由选择CIDR。
  4. 路由选择协议的工作原理。(这个下一篇文章继续讲,这篇文章太长了)

网络层是干啥的?

我在学习每个知识点之前都会问自己这个问题,专业术语是这样的

  1. 网络层负责为分组交换网上的不同主机提供通信服务。
  2. 网络层要选择合适的路由,使源主机运输层所传下来的分组,能够通过网络中的路由器找到目的主机

这里面都提到一个重要的关键词,分组,那么什么是分组?
在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组或包进行传送。在TCP/IP体系中,由于网络层使用IP协议,因此分组也叫做IP数据报,或简称为数据报。所以我们也把“分组”和“数据报”作为同义词使用。

网络层是可靠的么?

我们之前在数据链路层的时候,就有个问题,说我发送的0和1有丢失怎么办?
当时我们通过CRC校验,只解决了发送数据的完整性,但对于乱序以及重复问题并没有解决。那么数据到网络层的时候已经是一个一个的分组了,它怎么传输呢?要不要保证可靠性?

关于这个问题,其实曾经引起了长期的争论,他们争论的实质是:在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统?

这个问题到最后采用了后者

网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。

这也就意味着,**网络在发送分组时不需要先建立连接。**每一个分组(也就是IP数据报)独立发送,与其前后的分组无关(不进行编号)。**网络层不提供服务质量的承诺。**也就是说,所传送的分组可能出错、丢失、重复和失序(即不按序到达终点),当然也不保证分组交付的时限。由于传输网络不提供端到端的可靠传输服务,这就使网络中的路由器比较简单,且价格低廉(与电信网的交换机相比较)。

如果主机(即端系统)中的进程之间的通信需要是可靠的:那么就由网络的主机中的运输层负责(包括差错处理、流量控制等)

采用这种设计思路的好处是:网络造价大大降低,运行方式灵活,能够适应多种应用。互联网能够发展到今日的规模,充分证明了当初采用这种设计思路的正确性。

好了,上面这个问题只是告诉你为啥网络层提供的是不可靠的服务,其实知道结论就可以了。

网际协议IP

网际协议IP是TCP/IP体系中两个最主要的协议之一,也是最重要的互联网标准协议之一。
与P协议配套使用的还有三个协议:
地址解析协议ARP
网际控制报文协议ICMP(下篇文章再讲)
网际组管理协议IGMP(下篇文章再讲)

为什么说互联网是虚拟的?

在计算机网络发展初期,许多厂家都生产出具有自己独特体系结构的计算机网络。这些计算机网络就像一个个孤岛一样,它们是不能互相通信的。那么这些网络怎么通信就成了问题。

但IP协议成功地解决了这个难题。不管你使用的具体网络采用什么样的硬件结构,但只要你的网络使用IP协议,并给连接在网络上的主机分配了合法的IP地址,那么连接到这种虚拟的IP互连网上的任何一对计算机都可以很方便地进行通信。

虚拟的IP地址

这里提到一个重要的概念,就是虚拟互联网,为什么是虚拟的呢?,IP地址为什么也被称为“虚拟地址”?

这是因为IP地址是靠软件来维持的而不是靠硬件地址
虽然许多大小不同的物理网络是相互连接起来了,但这些网络都有各自不同的物理层。例如,有的是无线网络,有的是光纤网络,并且数据的传送速率也可能相差很大。这些网络的数据链路层协议也是不相同的。如果我们从网络层来看这个庞大的异构网络,那么就好像是构成了一个很大的、统一的IP网络。但是虚拟网络的地址也是虚拟的,因此IP地址又称为“虚拟地址”。实在的地址就是各网络和各主机的物理地址

可以打一个比方。基本上全世界每个国家的居民都有自己的唯一证件,但是格式肯定每个国家不一样,那么要让大家能够互相联系,只需要全世界的人都使用微信就可以了,每个人都有一个微信号(假设不需要实名认证)。但是这个微信号能被你使用的同时,别人也可以使用。

那么在微信后台系统能看到,这70多亿个微信号就构成了一个虚拟的网络。真正存在的是每个人的唯一证件(中国是身份证)

在这个例子中,唯一证件=硬件地址,微信号=IP虚拟地址

硬件地址

通过上面的例子,我们也知道了硬件地址是真实存在,代表主机的地址,那就是MAC地址,硬件地址已经固化在了网卡的ROM中,现在在适配器中。全球唯一
在这里插入图片描述

  1. 在网络层传输时只能看到IP地址,看不到MAC地址。
  2. 在链路层,只能看到MAC帧
  3. 路由器只根据目的站的IP地址的网络号进行路由选择
    也就是说IP层抽象的互联网直接屏蔽了下面比较复杂的细节,就比如我们日常使用的windows电脑,我们都是用鼠标点点点,但其实计算机是要执行很多条指令的。

看到这里,还有2个问题?

  1. 主机或路由器怎样知道应当在MAC帧的首部填入什么样的硬件地址?
  2. 路由器中的路由表是怎样得出的?

这两个问题,我们稍后讲。

抛开这2个问题,理解了IP地址与硬件地址的区别后,我们就需要考虑在这样的虚拟网路上怎么寻址?

IP地址的发展与分类

我们上面说了IP地址是虚拟的,那么IP地址的格式是啥样?

IP地址的A、B、C类划分

早在1981年的时候,关于IP地址怎么编址就决定了,那就是
IP地址 = {<网络号>,<主机号>}

那个时候的人还没预料到互联网发展会这么快,所以当时用了32位的标识符,来给全世界所有联网的主机分配地址。

32位一共才有多少个可能?
2的32次方,因此地址空间中只有4,294,967,296(2的32次方)个地址。 不过,一些地址是为特殊用途所保留的,如专用网络(约1800万个地址)和多播地址(约2.7亿个地址)。所以还剩下40亿多个,听起来是不少,但早在2011年2月,IPv4的地址就已经耗尽了

我们先来说当时的IP地址的分类吧;
在这里插入图片描述
大家也注意到了在图4-5种,网络号字段有几位是固定的,这其实是类别位,A、B、C类分别位1,2,3位,固定为0,10,110

当时想的是IP地址划分成A、B、C 3类,可以满足不同用户的要求,因为可能有的大公司,需要的IP地址多,就申请到网络号,实际上是获得了具有网络号的一块地址,具体的主机号是单位自己分配的,只要做到在自己单位没有重复的主机号就可以了。
在这里插入图片描述
这么说的话,一共也没多少个网络号啊,再说A类地址,网络号只占了8位,主机号24位,可以分配2的24次方-2(16777214)个IP,哪个公司能用的了这么多,纯属浪费。

具体为什么有的减2,有的减1呢?

A类

在IP地址中,比如A类的网络号一共8位,类别位占了1位,为0

  1. 而IP地址中的全0表示“本网络”,是一个保留地址。
  2. 127是一个环回测试时用的地址。

所以网络号里,0和127不能分配,那么可分配的网络号为2的7次方-2,就是126。而主机号也是2的24次方-2,是因为

  1. 全0的主机号字段表示该IP地址是“本主机”所连接到的单个网络地址(例如,一主机的IP地址为5.6.7.8,则该主机所在的网络地址就是5.0.0.0)
  2. 全1的主机号字段表示该网络上的所有主机

IP地址一共有2的32次,整个A类地址空间就有2的31个地址,占了整个IP地址空间的50%。

B类

A类的网络号一共16位,类别位占了2位,为(10)已经固定了,只剩下14位可以进行分配。

因为网络号字段后面的14位无论怎样取值也不可能出现使整个2字节的网络号字段成为全0或全1,因此这里不存在网络总数减2的问题。

B类网络地址128.0.0.0是不指派的,而可以指派的B类最小网络地址是128.1.0.0。因此B类
地址可指派的网络数为2的14次-1,即16383。

B类地址的每一个网络上的最大主机数是2的16次方-2,即65534。这里需要减2是因为要扣除全0和全1的主机号

整个B类地址空间共约有个地址,占整个IP地址空间的25%。

C类

C类的网络号一共24位,类别位占了3位,为(110)已经固定了,只剩下21位可以进行分配。

C类网络地址1920.0.0也是不指派的,可以指派的C类最小网络地址是192.0.1.0,因此C类地址可指派的网络总数是2的21次-1,即2097151。

每一个C类地址的最大主机数是2的8次-2,要扣除全0和全1的主机号。即254。

整个C类地址空间共约有2的29次个地址,占整个IP地址的12.5%。

知道了A、B、C类地址的划分规则,那其实按照这个逻辑,就有以下结论:

  1. IP地址管理机构当时只需要分配网络号就可以了,主机号单位自己分
  2. 路由器只需要根据目的主机所连接的网络号来转发分组,减小了路由表所占的存储空间以及查找路由表的时间
  3. 一个网络指的是相同网络号的主机的集合。所以用转发器或网桥连接起来的若干个局域网仍为一个网络。而不同网络号的局域网必须使用路由器进行互联

地址解析协议ARP

我们上面抛了2个问题

  1. 主机或路由器怎样知道应当在MAC帧的首部填入什么样的硬件地址?
  2. 路由器中的路由表是怎样得出的?

我们这里的ARP协议就是解决这个问题的。
在这里插入图片描述
由于是IP协议使用了ARP协议,因此通常就把ARP协议划归网络层。但ARP协议的用途是为了从网络层使用的IP地址,解析出在数据链路层使用的硬件地址。
它怎么做到的呢?
我们知道IP地址32位,而MAC地址48位(上篇数据链路层文章讲过),而且主机的IP地址可能会变,同时主机换适配器,MAC地址也会变,所以这个映射关系比较复杂。

每一台主机都设有一个ARP高速缓存( ARP cache),里面有本局域网上的各主机和路由器的IP地址到硬件地址的映射表,这些都是该主机目前知道的一些地址。
那么主机怎样知道这些地址呢?

  1. 主机A广播发送ARP请求分组
  2. 本局域网上的所有主机上运行的ARP进程都会收到这个ARP请求分组
  3. 主机B的IP地址与目前ARP请求分组中查询的IP地址一致,就会手下这个ARP请求分组,并向主机A发送ARP响应分组,同时在这个ARP响应分组中写入自己的硬件地址
  4. 其他主机不会关心这个响应分组,因为响应分组是单播,请求分组是广播。于是主机A收到了主机B的ARP响应分组,就在它的ARP高速缓存中写入主机B的IP地址到硬件地址的映射。

ARP只解决了在同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题,那么假如他们不在同一个局域网怎么办呢?
在这里插入图片描述
我们刚刚分析的ARP协议只解决了H1——H2的映射,假如H1——H3怎么办?
路由器因为连接2个网络,所以它有2个硬件地址。

  1. H1先在网1发送ARP请求分组,找到网1的路由器R1的硬件地址
  2. R1在网2发送ARP请求分组,找到了目的主机H3的硬件地址。

所以无非就是多次使用ARP协议就能实现,路由器起了很大的作用,详细如下图。
在这里插入图片描述

IP层路由器怎么转发分组的?

我们一直在说,路由器把不同的网络连接在了一起,比如上图的H1——H3

既然H1要发消息给H3,那么H1主机肯定知道H3主机的IP地址,于是到路由器后,通过匹配,是直接交付还是继续找下一个路由器。

结合上面的ARP来说一下具体的流程

  1. 路由器收到一个待转发的数据报,从数据报的首部提取目的主机的IP地址D,得出目的网络地址为N。
  2. 若N就是与此路由器直接相连的某个网络地址,则进行直接交付,不需要再经过其他的路由器,直接把数据报交付目的主机(这里包括把目的主机地址D转换为具体的硬件地址,把数据报封装为MAC帧,再发送此帧);否则就是间接交付,执行(3)。
  3. 若路由表中有目的地址为D的特定主机路由,送交数据链路层的网络接口软件。网络接口软件负责把下跳路由器的IP地址转换成硬件地址(必须使用ARP),并将此硬件地址放在链路层的MAC帧的首部,然后根据这个硬件地址找到下一跳路由器。否则,执行4。
  4. 若路由表中有到达网络N的路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行5。
  5. 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行6。
  6. 报告转发分组出错。
    在这里插入图片描述

IP数据报格式

大家看到这个词是不是感觉又熟悉又陌生。
我们之前也看到过这张图
在这里插入图片描述
也就是数据链路层向网络层传输的时候,网络层这块就把MAC帧包装成了IP数据报。那么它的格式是什么样的?不想了解的大家可以直接跳过。
在这里插入图片描述
这张图上面那些都是首部的数据,一共有14种。
我大概简单介绍一下:

  1. 版本:IPv4还是IPv6
  2. 首部长度:最大是15,但它的单位是4字节,也就是最大60字节,最常用的首部长度是20字节,(首部长度位0101)
  3. 区分服务:一般情况不使用这个字段
  4. 总长度:首部和数据之和的长度,单位字节,最大长度为2的16次-1=65535字节,实际上以太网规定最大1500字节,否则分片
  5. 标识:切片后,相同标识字段的值使分片后的各个数据报片最后能重装起来
  6. 标志:虽然占3位,但只有后2位有意义,中间位DF,当DF=0允许分片,最低位MF,MF=1,表示后面还有分片的数据报,MF=0表示这个最后一片。
  7. 片偏移:分片后,表示该片在原分组中的相对位置。
  8. 生存时间:TTL,单位跳数,指明数据报在互联网最多可以经过多少个路由器。初始值为1,意味着只能在该局域网中传输。
  9. 协议:指出此数据报携带的数据使用的使什么协议,方便网络层交接在这里插入图片描述
  10. 首部检验和:只检验数据报的首部,不包括数据部分。
  11. 源地址
  12. 目的地址
  13. 可选字段:用来支持排错、测量以及安全等措施,很少使用
  14. 填充:可选字段中有的选项需要多个字节,最后选项拼接后中间不能有分隔符,所以使用全0的填充字段补齐为4字节的整数倍。

划分子网

后来发现那会儿的IP地址的设计确实不合理。

比如说某公司分到了一个B类网络,它一共有65534个IP,先不说这个公司能不能用完,这么多主机处在同一个广播域进行通信,这个网络效率能高么?

那么就需要对网络进行划分,所以,1985年起在IP地址种又增加了一个“子网号字段”,使两级IP地址变为三级IP地址,这种做法叫做划分子网。
IP地址={<网络号>,<子网号>,<主机号>}

这个思路就是:

  1. 把一个比较大的网络划分为若干个子网。但对外仍然是一个网络
  2. 从主机号借用若干位作为子网号,这样的话主机号也就相应的少了几位。
  3. 外网发给某主机的IP数据报,还是先根据网络号找到连接在本公司网络上的路由器,然后再按照目的网络的网络号和子网号找到目的子网,再把IP数据报交付目的主机。

相当于中间多了一层。举例:
本来一个大学2万人是一起管理的,学号也从00001——20000,每次找人都再广播喊一下,但现在分了班,以班级为单位,现在其他学校的学生来找人,门卫先看一下要找的这个学号是不是咱们学校的,然后通过班级号找到这个班主任,班主任再通过喊话的方式找到人。这样很明显提高了效率。但是对外,所有的学生还是一个学校的。

但是从IP数据报的首部是没办法看出源主机或者目的主机所连接的网络是否进行了子网划分,所以就有了子网掩码,来方便的找到子网。

在B类网中,主机号是16位,而子网号是要占用主机号的位数,所以就有了多种划分子网的方法。
在这里插入图片描述在这里插入图片描述
能发现子网号的位数没有,0,1,15,16这4种情况,是因为这没有意义。
而且能发现子网号占用的位数越少,每一个子网上可以连接的主机数就越多,反之亦然。所以划分子网增加了灵活性,但却减少了能够连接在网络上的主机总数。上面表中任意一行的最后两项的乘积一定小于65534。

下面举例子来说明怎么求子网地址:
在这里插入图片描述
那么如果不划分子网,还要使用子网掩码么?

那当然了,这样更便于查找路由表。互联网的标准规定,所有的网络都必须使用子网掩码,同时在路由器的路由表中也必须有子网掩码这一栏。
如果一个网络不划分子网,那么该网络的子网就使用默认子网掩码。
A类地址的默认子网掩码:255.0.0.0
B类地址的默认子网掩码:255.255.0.0
C类地址的默认子网掩码:255.255.255.0

使用子网时分组转发

我们在之前提到的分组转发时基于A、B、C3类的,直接根据网络号就可以了,那现在还需要考虑子网号。

  1. 从收到的数据报的首部提取目的IP地址D
  2. 先判断是否为直接交付。对路由器直接相连的网络逐个进行检查:用各网络的子网掩码和D逐位相“与”(AND操作),看结果是否和相应的网络地址匹配。若匹配,则把分组进行直接交付(当然还需要把D转换成物理地址,把数据报封装成帧发送出去),转发任务结束。否则就是间接交付,执行(3)。
  3. 若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行(4)
  4. 对路由表中的每一行(目的网络地址,子网掩码,下一跳地址),用其中的子网掩码和D逐位相“与”(AND操作),其结果为N。若N与该行的目的网络地址匹配,则把数据报传送给该行指明的下一跳路由器;否则,执行(5)。
  5. 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行(6)。
  6. 报告转发分组出错。

构造超网

其实到目前为止,子网只解决了内部网络通信的畅通,减轻了路由器的压力,但是IPv4地址逐渐枯竭还是没解决。

所以在1987年的时候,就研究出了无分类域间路由选择CIDR。

  1. 消除了传统的A类、B类、C类地址以及划分子网的概念,所以能更加有效的分配IP地址。
    IP地址={<网络前缀>,<主机号>}
    也称为“斜线记法”,在IP地址后面加斜线,写网络前缀所占的位数
  2. 把网络前缀相同的连续IP地址组成一个“CIDR地址块”

这个具体怎么玩:

比如某个服务商拥有地址块206.0.64.0/18,这相当于有16个C类网络,具体咋算的,你想一想,这个IP32位,前18位不能动,后面的14位都可以分配,相当于2的14次方个IP地址,C类地址只有最后8位可以分配,相当于2的8次,所以这个地址块=64个C类网络。

假如某大学要800个IP地址,那么这个服务商就可以给它分配一个地址块206.0.68.0/22,这包括了2的10次方个地址,也就是1024个地址。

而且分给学校后,学校还可以继续划分给各个系,各个系还可以继续划分给各个专业。非常灵活。
在这里插入图片描述
每一个CIDR地址块中众多的地址就构成了超网。网络前缀越短,它包含的地址块就越多。

CIDR使用的地址掩码也继续称为子网掩码,比如:/20地址块的地址掩码是:11111111 11111111 11110000 00000000(20个连续的1)

但是使用超网那怎么转发分组呢?

对所有可能的前缀进行循环查找,假如给定一个目的地址D,对每一个可能的网络前缀长度M,路由器从D中提取前M个位当为网络前缀,然后去路由表中查找网络前缀,所找到的最长匹配就对应于要查找的路由。

这不就是二叉线索么
在这里插入图片描述
在路由表中,每个IP地址都有一个唯一前缀,这样的话当搜索到一个叶节点时,把寻找匹配的目的地址和该叶节点的子网掩码进行 与 运算,看看结果是否与对应的网络前缀想匹配,如果匹配就按照下一条的接口转发该分组。否则就丢弃该分组。

最后回到文章开头的问题,警察叔叔顺着网线怎么找到你的?

首先我们上网的主机都有一个虚拟的IP地址,那么我们知道所有的IP地址都是ISP卖给你的,那么在ISP那块的资料里是不是就有你的详细地址呢?
所以网警完全可以通过找具体的服务商定位到具体的地址啊。

但我们个人就几乎做不到从IP定位到详细地址,只能定位到一个大致的区域,这个可以把自己的IP放到百度试试看。

所以我们把这个问题转换为,怎么通过IP地址找到具体的主机进行通信的?
我们在上面学习了IP为什么是虚拟的,通过地址解析协议ARP来做到一个IP地址与硬件地址的映射,如果是跨网络的,那就需要通过路由器进行转发分组,也多次使用ARP协议。(具体的请返回文中学习ARP协议)

每一种IP地址的划分规则对应的分组规则不同,从最早简单划分的A、B、C类网,升级为划分子网,到现在在用的超网,但原理都是一样的。

其实这段时间通过学习 计算机网络,解决了心里不少的疑问,我写的文章中很多都直接引用了《计算机网络(第7版)谢希仁》书中的内容,写的文章比较长,但是尽可能的把重点加黑,希望能给大家了解计算机网络一点帮助。

网络层的知识还没讲完,下篇继续。

关于计算机网络的知识还是非常多的,我学到的也只是其中一点皮毛而已,还是那句话,”在技术领域,我们都要有一颗谦卑的心。“

扫码关注”后来X大数据“,回复【电子书】,领取【超多本pdf java及大数据 电子书】

在这里插入图片描述

©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页