当前位置: 首页 > news >正文

HTTP协议3)----对于网络层的详细讲解

꧁ 大家好,我是 兔7 ,一位努力学习C++的博主~ ꧂

☙ 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步❧

🚀 如有不懂,可以随时向我提问,我会全力讲解~💬

🔥 如果感觉博主的文章还不错的话,希望大家关注、点赞、收藏三连支持一下博主哦~!👀

🔥 你们的支持是我创作的动力!⛅

🧸 我相信现在的努力的艰辛,都是为以后的美好最好的见证!⭐

🧸 人的心态决定姿态!⭐

🚀 本文章CSDN首发!✍

目录

0. 前言

IP协议

1. 基本概念

2. 协议头格式

如何将报头和有效载荷分离?(解包)

将有效载荷交付给谁?(分用)

如果超过了MAC的规定,IP应该如何做呢?

分片会有什么影响呢?

mac的有效载荷最大是MTU,其中这个MTU包含了什么呢?

那么这里是MSS是多大?跟MTU有什么关系?

3. 网段划分(重要)

4. 特殊的IP地址

5. IP地址的数量限制

6. 私有IP地址和公网IP地址

用着互联网公司的产品和服务,为何钱却直接交给了运营商(电信、联通、移动)?

7. 路由

8. 路由表生成算法


0. 前言

        此博客为博主以后复习的资料,所以大家放心学习,总结的很全面,每段代码都给大家发了出来,大家如果有疑问可以尝试去调试。

        大家一定要认真看图,图里的文字都是精华,好多的细节都在图中展示、写出来了,所以大家一定要仔细哦~

        感谢大家对我的支持,感谢大家的喜欢, 兔7 祝大家在学习的路上一路顺利,生活的路上顺心顺意~!

IP协议

        网路层解决的问题是将数据从一台主机送到到另一台主机。

        首先数据从客户端一定是要100%可靠的送到服务器端,这也是基于tcp协议我们想要做的。可是tcp想要做到100%可靠的传送给对面的前提条件一定是:你一定要有一个将数据传能发送到对方的能力。

        注意,这里说的是能,而不是一定能,相当于tcp对端要把数据可靠的发送给对方server端,就要现有这个能力,可以发送到server端。

        接下来给大家举个例子:比方说我是一个学霸,学校里有很多考试,而我对这么多考试都具有考满分的能力,但是是不是我每次都能得满分呢?肯定是不是的。

        比方在C语言考试中,我具有考满分的能力,而且在之前的考试中我也得过满分,那么我在考试C语言的时候,我怎么100%保证我一定考满分呢?我就先去考试,如果我考到满分了,那没得说,如果我没有考满分,那么这时我的校长父亲就有作用了,校长父亲会说:这次考试不算,重新考。直到我考到满分,这次考试才算。

        在这里我是执行者的角色,我是具有得满分的能力的,但我不一定每次都得满分。这里的校长父亲是一个决策者。所以一方面我有能力,一方面校长父亲也有能力,所以可以让我每次都得满分。

        所以我们前面说过的传输层协议:TCP承担的角色就是我的校长父亲,他给我提供了各种各样的可靠性保证,而往网络里发的我们现在认为就是网络层:IP决定,也就是我这个执行者。(但实际上真正在网络中传输的还要是下层的协议数据链路层)。

        所以IP具有一种能力,将数据跨网络传送到对端主机的能力!(主机->网络->主机)

        那么如果有公司到学校来寻找人才,此时校长父亲就会引荐我,说我次次考试都靠满分,可以去你们公司上班,这就是:TCP除了向下提供各种数据的传输任务之外,对上还可以提供的能力是将数据交付给对应的应用层。也就是TCP解决的是:进程->进程,这样的问题,所以我们最开始说的套接字编程也叫做进程间通信就是这个道理。

        现在有个前提:假设每个路上路由器都已经有了自己的路由表。

        比如你从河北要到海南去自驾旅游,那么旅游的时候,"目的地"的意义是什么呢?当然就是路上选择,你要到海南,那么你肯定不会先到东北转一圈吧?所以进行路径选择,我们才会较为准确的到我们的目的地。

        在网络中也一样,只有正确的路径选择, 我们才能较为准确的到达目标主机,这也是我们能够跨网络找到目标主机的根本。

        当然我们在路径选择的时候,也要有人支持我们做路径选择,我们最早在旅游的时候,找不到位置,都是通过问人来进行路径选择的,而别人在告诉你怎么去走的时候,是凭借着人家的认路经验。

        在网络中,这个认路的人的角色就是路由器,认路的经验就是路由表。

        所以此时我们就具有的准备条件:基于IP的互联网数据从A主机送到B主机。

1. 基本概念

  • 主机:配有IP地址,但是不进行路由控制的设备。(这个说法不准确或者说就不对,因为现在的主机都是会进行路由控制的)
  • 路由器:即配有IP地址,又能进行路由控制。
  • 节点:主机和路由器的统称。

2. 协议头格式

  • 4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4。
  • 4位头部长度(header length):IP头部的长度是多少个32bit,也就是 length * 4 的字节数。 4bit表示最大的数字是15,因此IP头部最大长度是60字节。
  • 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位 TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于 ssh/telnet这样的应用程序,最小延时比较重要。对于ftp这样的程序,最大吞吐量比较重要。
  • 16位总长度(total length):IP数据报整体占多少个字节。
  • 16位标识(id):唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。
  • 3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示"更多分片",如果分片了的话,最后一个分片置为1,其他是0。类似于一个结束标记。
  • 13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)。
  • 8位生存时间(Time To Live, TTL):数据报到达目的地的最大报文跳数。一般是64。每次经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。
  • 8位协议:表示上层协议的类型。
  • 16位头部校验和:使用CRC进行校验, 来鉴别头部是否损坏。
  • 32位源地址和32位目标地址:表示发送端和接收端。
  • 选项字段(不定长, 最多40字节):略

如何将报头和有效载荷分离?(解包)

        我们可以看到这里有4位首部长度和选项,这里和我前面讲得TCP的协议头格式是一样的,15*4=60,所以报头就是20-60字节大小,先提取前20字节,然后找到首部长度这个字段,然后进行提取,根据首部长度大小判断有没有选项,所以IP协议是通过定长和自描述字段可以将报头和有效载荷分离。

将有效载荷交付给谁?(分用)

        我们可以看到8位协议,这里是填写协议的编号,如果上层是tcp就传给tcp的应用。


        4位版本有ipv4和ipv6,IPv4中规定IP地址长度为32,即有2^32-1个地址。而IPv6中IP地址的长度为128,即有2^128-1个地址。现在主流用的还是ipv4,虽然ipv6可以解决某些问题,但是因为这两个之间是不兼容的,所以不会很快的将ipv4替换掉。

        16位总长度是IP数据报整体占多少个字节,我们在前面说udp的时候里面有16位UDP长度,这是面向数据报的,而tcp中却没有这样的标识,那么tcp不怕传输后读取的时候有问题么?其实是不怕的,因为tcp是面向字节流的,只要将tcp的报头和有效载荷分离,然后读取报头,将有效载荷通过面向字节流的方式读取到输入、输出缓冲区即可。


        前面说到了tcp要想做到100%可靠的传送给对面的前提是:你一定要有一个将数据传能发送到对方的能力。

        而IP要想跨网络传输也需要一个前提:把报文从一台主机送到和自己直接相连的下一台主机。

        这个能力是由mac帧,也就是数据链路层提供的。

        所以对于上面的主机B来讲,和这个路由器F是直接相连的,而任意两个直接相连的主机一定是在同一个局域网中。所以其实数据链路层解决的其实是局域网通信的问题。

        其中mac帧有一个规定:ip交下来的数据要受mac携带的有效载荷最大长度的影响,而且我们知道,有效载荷最大长度一定是ip交给mac的,既然是ip交给它的,那么其中就会涵盖ip报头+ip的有效载荷。而这个值就是mtu(max transfer unit最大传送单元),常规的就是1500字节。

         所以ip在向下交付自己的报文,让mac帧去做下一个跳转的时候最大有效载荷长度不能超过1500字节,这就是规定。

如果超过了MAC的规定,IP应该如何做呢?

        要么IP就别发了,要么IP就要分片,而其中分片不算必须做的,因为你可以不传超过1500字节的数据。在网络通信的时候,不分片是常态,因为分片会引发很多潜在的问题。

        首先我们要明确,既然分片了,那么到了对端就必须要组装。而且要组装正确,不能发过去一个数据,因为分片了,组装后又是另一种,所以从分片到组装当中传递时会携带相应的属性信息,换言之,属性信息在那个协议上,那么就由哪个协议完成分片和组装,所以刚刚说的都是由IP协议自己完成的。

  1. 上层tcp  or  udp不关心IP的分片和组装的问题。
  2. 下层对端mac也不关心分片和组装的问题。

分片会有什么影响呢?

        分片过多会导致丢包的概率增多,任何一个包丢了,都代表此处的传输有问题。

        16位标识用来标识IP报文有没有进行分片。

        13位分片偏移是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。

        3位的标志第一位没用,第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示"更多分片",如果分片了的话,最后一个分片置为1,其他是0。类似于一个结束标记。

        所以提取出分片的报文,根据16位标识,聚合"所有的"分片报文。

        根据片偏移进行升排序来判断丢没丢包,如果第一个丢了,则用第一个片偏移是不是从0开始的。

        根据更多分片最后是否为0,保证多个分片报文全部收到了。

        当然上面的保证都不是只单单通过一个对应一个的保证的,而且它们三个相互作用而保证的。

        当然报文是有可能丢失的,而且我们可以根据这三个标志位来判断是哪几个丢失了。 

        我们在上面说的时候其实是有一个漏洞的,这就是如果一个报文分片后,只有最后一片丢了,也就是"更多分片"最后不是0,但是紧接着下一个就是没有分片的报文,此时它的"更多分片"是0,这又怎么区分报文丢没丢呢?其实很简单,因为如果没有丢,那么它的片偏移肯定不是0,如果是0那么这个肯定就是没有分片的报文。

        总结:根据3位标志的更多分片来看是否被分片,根据16位标识将所有分片的报文聚合在一起,根据13位片偏移进行排序,然后再根据更多分片来决定我们是否收到的最后一个报文,再根据13位片偏移来决定中间是否丢包,如果上面的操作没有任何问题,那么将上面的报文合并成一个报文完成拼接的功能。

mac的有效载荷最大是MTU,其中这个MTU包含了什么呢?

        其实包含了:IP的报头和IP的数据(IP数据包含->tcp报头、tcp数据),这也就说明了,每一个分片都必须携带IP报头!因为也只有携带了IP报头才能进行正确的组装。

不希望太多的分片,如何保证呢?

        也就是让IP的报文(IP报头+数据) <= 1500字节。可是我作为IP层来讲,不是我要传送那么多字节啊,我只是办事的,是tcp一次交给我了1500以上的字节,我也没办法啊。

        所以IP的报文大小并不是由IP决定,而是由传输层决定的。所以为了让传输层不要给IP太大的报文,所以一般情况下,双方在建立握手的时候,除了规定IP本身的一些窗口大小....之外,双方还要协商MSS(最大传输段尺寸)。

那么这里是MSS是多大?跟MTU有什么关系?

        所以MSS的大小是MTU-20(IP)-20(TCP)。当然这里写20是因为报头的大小基本上都是20字节。

        MSS是双方在握手阶段协商的基本报文大小。

        MTU是mac规定的数据传输最大单元。

3. 网段划分(重要)

IP地址分为两个部分,网络号和主机号

  • 网络号:保证相互连接的两个网段具有不同的标识。
  • 主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。

        我们知道IP:提供一种能力,把数据从A主机跨网络发送到B主机的能力,在公网中,IP具有唯一性。

        其中IP的构成 dst IP = 目标网络 + 目标主机。

        比方说我们要去西湖旅游,我们肯定是要先到西湖所在的城市,然后再到西湖。

        数据包路由的时候,一定是要贯穿了多个网络的。

        我们在找对方主机的时候:

  1. 先找到对应主机所在的目的网络。
  2. 在确定的网络中找到对应的主机。

        那么为什么这样呢?其实在我们找对方主机的过程本质是排除的过程,我们知道一个网络中有很多的主机,我们如果一个主机一个主机的找会很慢,我们如果先找目标网络,那么则会一次排除很多的主机。所以这样的目的就是为了提升效率。

        这也就是我们为什么要进行子网划分。

        子网是如何划分的呢?

  • 不同的子网其实就是把网络号相同的主机放到一起。
  • 如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复。

        通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同。

        那么问题来了,手动管理子网内的IP,是一个相当麻烦的事情。

  • 有一种技术叫做DHCP,能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便。
  • 一般的路由器都带有DHCP功能。因此路由器也可以看做一个DHCP服务器。

        经过合理的网络划分设置,可以非常快速的确定目标报文是属于哪个网络的,可以根据划分好的网络号来进行对比!

        过去曾经提出一种划分网络号和主机号的方案,把所有IP地址分为五类,如下图所示(该图出 自[TCP/IP])。

  •  A类 0.0.0.0到127.255.255.255
  • B类 128.0.0.0到191.255.255.255
  • C类 192.0.0.0到223.255.255.255
  • D类 224.0.0.0到239.255.255.255
  • E类 240.0.0.0到247.255.255.255

        这样划分的粒度是十分粗糙的。

        随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量地址。

  • 例如,申请了一个B类地址,理论上一个子网内能允许6万5千多个主机。A类地址的子网内的主机数更多。
  • 然而实际网络架设中,不会存在一个子网内有这么多的情况。因此大量的IP地址都被浪费掉了。

针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing):

  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号。
  • 子网掩码也是一个32位的正整数。通常用一串 "0" 来结尾。
  • 将IP地址和子网掩码进行 "按位与" 操作,得到的结果就是网络号。
  • 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关。

        可见,IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围。

        IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68,子网掩码的高24位是1,也就是255.255.255.0。

4. 特殊的IP地址

  • 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网。
  • 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。
  • 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。

5. IP地址的数量限制

        我们知道,IP地址(IPv4)是一个4字节32位的正整数。那么一共只有 2的32次方 个IP地址,大概是43亿左右。而TCP/IP 协议规定,每个主机都需要有一个IP地址。

        这意味着,一共只有43亿台主机能接入网络么?实际上,由于一些特殊的IP地址的存在,数量远不足43亿。另外IP地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址。

        CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率,减少了浪费,但是IP地址的绝对上限并没有增加),仍然不是很够用。这时候有三种方式来解决。

  • 动态分配IP地址:只给接入网络的设备分配IP地址。因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的。
  • NAT技术(后面会重点介绍)。
  • IPv6:IPv6并不是IPv4的简单升级版。这是互不相干的两个协议,彼此并不兼容。IPv6用16字节128位来表示一个IP地址,但是目前IPv6还没有普及。

6. 私有IP地址和公网IP地址

        如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址。

  • 10.*,前8位是网络号,共16,777,216个地址。
  • 172.16.到172.31.,前12位是网络号,共1,048,576个地址。
  • 192.168.*,前16位是网络号,共65,536个地址。

        包含在这个范围中的,都成为私有IP,其余的则称为全局IP(或公网IP)。 

        大家可以看到,我们学校的ip地址就是10.*。

        我的云服务器的私网ip也是10开头的,10.0.8.7,当然上面那个493232.134.146是公网ip啦。


        我们平时聊qq,刷抖音....如果不冲钱,也是可以使用的,那么...

用着互联网公司的产品和服务,为何钱却直接交给了运营商(电信、联通、移动)?

        运营商为我们做了基础设施建设。

        我们在上网的时候,不是直接将请求直接发送到字节跳动、腾讯的服务器上,而是先要到移动的机站,收到你的请求,然后按照它自己的通信标准转化成自己的样式,然后转到自己的内网服务器,然后检测身份、话费等,确认没有问题,然后才会通过公网转发到你所要访问的服务器上。

        也就是说所有路上的事情都是由这些运营商去搞的。

        运营商为我们做了基础设施建设的好处是可能存在大量的互联网公司的诞生。比方说,如果我们现在处于2G、3G网络,我们怎么可能会可以刷短视频呢,就算是3G,我们打开个图片都要卡半天,所以我们不要只看好多互联网公司风风光光,我们更要看的是这些电信、联通、移动这种国企的功劳。所以没有必要把互联网公司捧的很高,这些公司的诞生,都是社会发展的必然,就算没有某些公司,另一个某些公司也会诞生。

        如果我想要上网,首先需要让运营商的工作人员给我家接网,然后就要用到路由器和调制解调器(猫),要用这些就要交钱给运营商,因为路由器需要配置入网账号密码,然后此时是路由器可以上网了,但是我不行,所以此时我们可以对路由器进行配置,也就是设置路由器的wifi密码,当然不配置也可以,直接就可以连上,然后对你的电脑进行检测,输入密码,获取动态IP。

  • 一个路由器可以配置两个IP地址,一个是WAN口IP,一个是LAN口IP(子网IP)。
  • 路由器LAN口连接的主机,都从属于当前这个路由器的子网中。
  • 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1)。子网内的主机IP地址不能重复。但是子网之间的IP地址就可以重复了。
  • 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点。这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN口IP就是一个公网IP了。
  • 子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(替换成WAN口IP),这样逐级替换,最终数据包中的IP地址成为一个公网IP。这种技术称为NAT(Network Address Translation,网络地址转换)。
  • 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上。这样的服务器可以在阿里云/腾讯云上进行购买。

        局域网IP是可以重复的,因为我们使用的IP并不是公网IP,而是路由器设备构建出的局域网,也就是内部使用的设备。

        所以就说明了路由器不仅仅是做数据转发的,还是可以组件局域网的。

        而且一般而言,一个局域网中的1号主机通常是路由器。

        A主机可以通过路由转发正确的发送到对端服务器,可以保证发送,但是如果此时B主机也想对同一个服务器进行请求,这时尴尬的事情就来了,192.168.1.201不就是私有IP么,但是私有IP是不能出现在公网IP上,因为服务器想要返回相应的时候它会发现,为什么这两个报文都会返回到192.168.1.201这台机器,也就是说如果可以用私有IP,那么IP就不能作为互联网中的唯一标识,那么响应也就不能够正确的返回给用户。

        那怎么办呢?

        现在先说一半,等到后面说mac帧的时候继续说。

        我们以A主机要进行服务请求为例:我们的目的 dst:122.77.241.3不变,然后从源 src:192.168.1.201,经过路由转发为 src:10.1.1.2,再到 src:122.77.241.4,然后直接到目标主机。

        这样就发送了出去,至于如何回来,需要后面说到MAC协议的时候再说,我们现在只考虑出去的问题。

        这里我们用的是通过将源IP替换的方式不让私有IP出现在公网上,让服务器不感到困惑。

        这里我们将源IP地址替换成特定路由器的WAN口IP的技术称之为NAT地址转化协议。

        那么我们为什么这样做呢?

        其实就是因为我们的IP地址不够用,因为这样就可以重复的利用IP地址。还有一个原因是我们在上网的时候要经过运营商,如果我们绕过了运营商,那么我们就不是可以无限上网了?那么此时运营商就不能控制你了,钱也没地方交了,这也不可能。

        所以我们现在知道如果我们想不经过运营商就像实现不同局域网之间的通信几乎是不可能的,因为可能在通信的时候,我们两个的私网IP是一样的,这样就表示自己发送给自己。

        但是不排除一些黑科技技术,比如内网穿透可以做到不经过NAT直接将数据从一个局域网传到另一个局域网。

7. 路由

        在复杂的网络结构中,找出一条通往终点的路线。

        路由的过程,就是这样一跳一跳(Hop by Hop) "问路" 的过程,我们在问路的时候会有4种情况:

  1. 不知道,别问我。
  2. 你接下来要怎么走。
  3. 我不知道,但是我知道谁知道。
  4. 你已经到了。

        所谓 "一跳" 就是数据链路层中的一个区间。具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。

        IP数据包的传输过程也和问路一样。

  • 当IP数据包,到达路由器时,路由器会先查看目的IP。
  • 路由器决定这个数据包是能直接发送给目标主机,还是需要发送给下一个路由器。
  • 依次反复,一直到达目标IP地址。

        那么如何判定当前这个数据包该发送到哪里呢?这个就依靠每个节点内部维护一个路由表。

        当然路由器不会出现上面第一种情况:我不知道,别问我。如果这样的话,肯定是路由器有bug。所以路由器会有一下的告知:

  1. 如果知道:下一跳应该跳去哪个子网。
  2. 如果不知道:转发给默认路由。
  3. 已经到达目标网络的入口路由器。

        这也就是由 dst IP 查找目标网络,通过公网转发,变成局域网内转发。

         因为我不能拿出来路由器的路由表,所以我就用了我服务器去大概看一眼,但是这个路由表的意义不大。

  • 路由表可以使用route命令查看。
  • 如果目的IP命中了路由表,就直接转发即可。
  • 路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。

假设某主机上的网络接口配置和路由表如下:

  •  这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到 192.168.56.0/24网络。
  • 路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。

转发过程例1: 如果要发送的数据包的目的地址是192.168.56.3

  • 跟第一行的子网掩码做与运算得到192.168.56.0,与第一行的目的网络地址不符。
  • 再跟第二行的子网掩码做与运算得到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去。
  • 由于192.168.56.0/24正是与eth1接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发。

转发过程例2: 如果要发送的数据包的目的地址是202.10.1.2

  • 依次和路由表前几项进行对比,发现都不匹配。
  • 按缺省路由条目,从eth0接口发出去,发往192.168.10.1路由器。
  • 由192.168.10.1路由器根据它的路由表决定下一跳地址。

8. 路由表生成算法

        路由表可以由网络管理员手动维护(静态路由),也可以通过一些算法自动生成(动态路由)。请同学们课后自己调研一些相关的生成算法,例如距离向量算法、LS算法、Dijkstra算法等。

         如上就是 HTTP协议网络层 的所有知识,如果大家喜欢看此文章并且有收获,可以支持下 兔7 ,给 兔7 三连加关注,你的关注是对我最大的鼓励,也是我的创作动力~!

        再次感谢大家观看,感谢大家支持!

相关文章:

  • [单片机框架][device层] charger 电源管理
  • [单片机框架][drivers层][bq25601] charger 电源管理
  • Java多线程--InheritableThreadLocal--使用/实例
  • java计算机毕业设计宿迁学院学生设计作品交流网站源代码+数据库+系统+lw文档
  • ByteTrack:通过关联每个检测框进行多对象跟踪
  • 新能源汽车行业资讯-2022-9-22
  • Ajax学习笔记(一)
  • 【【计算机组成原理】中央处理器(二)—— 指令执行过程
  • YOLOv5、v7改进之二十八:ICLR 2022涨点神器——即插即用的动态卷积ODConv
  • php警车管理系统设计与实现
  • 提高PHP编程效率的技巧
  • 安防单位怎么实施RPA新员工提升企业运作效率
  • 线程安全问题的原因和解决方案
  • zabbix配置邮件告警
  • 【Vue】Mixin 混入的基础语法(1)
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 《Java编程思想》读书笔记-对象导论
  • Android组件 - 收藏集 - 掘金
  • create-react-app项目添加less配置
  • extjs4学习之配置
  • Facebook AccountKit 接入的坑点
  • js对象的深浅拷贝
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • ubuntu 下nginx安装 并支持https协议
  • 回顾2016
  • 基于遗传算法的优化问题求解
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 提醒我喝水chrome插件开发指南
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • RDS-Mysql 物理备份恢复到本地数据库上
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 正则表达式-基础知识Review
  • #QT项目实战(天气预报)
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (11)MSP430F5529 定时器B
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (附源码)计算机毕业设计ssm电影分享网站
  • (接口封装)
  • (九)One-Wire总线-DS18B20
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)appium-desktop定位元素原理
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (原創) 物件導向與老子思想 (OO)
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET CLR基本术语
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET NPOI导出Excel详解
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET4.0并行计算技术基础(1)
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验