网络和Linux网络_10(网络层)IP协议+分片组装+网段划分+路由

目录

1. IP协议作用和报头

1.1 IP和TCP作用

1.2 IP协议报头

2. 分片与组装

2.1 分片与组装概念

2.2 类似面试题的QA

3. 网段划分和IP地址

3.1 网段划分

3.2 IP地址分类

3.3 内外IP和公网IP地址

4. 路由和8位生存时间

4.1 路由的概念

4.2 8位生存时间

5. IP相关选择题

答案解析

本篇完。


1. IP协议作用和报头

1.1 IP和TCP作用

前面学习了传输层的TCP和UDP协议,它们主要是用来控制数据在网络中的传输的,像滑动窗口,超时重传,确认应答,拥塞控制等等,都是在控制数据的传输。

在TCP/IP模型中,传输层的下一层是网络层,传输层封装好的数据段并不是直接交给了网络,而是给到了网络层,也就是我们今天要讲解的IP协议。

IP协议的作用:定位目标主机,具有将数据报从A主机跨网络送到B主机的能力。

IP层是有这样的能力,但是有能力就一定能办到吗?不一定,只能说有非常大的概率可以办到。

既然是概率问题,就可以通过一些策略让其成为接近百分之百的事情,比如没有传成功时就重传,直到传送成功,这样一来就保证了IP协议传送数据的可靠性。

TCP协议就是给IP协议提供数据传送策略的。

TCP协议又叫传输控制协议,它通过多种机制来保证数据能够可靠的传送到对端主机,但是它并不是执行者,真正的执行者是IP协议,TCP协议只是提供相关的策略让IP协议执行,进而保证数据的可靠传送


1.2 IP协议报头

IP协议报头格式(采用定长报头+自描述字段)

和讲解TCP协议的时候一样,主要字段的作用穿插在后面具体内容中讲解。

  • 4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4字节,32比特位,这里主要讲解的就是IPv4。看看IPv6:IPv6是互联网协议第6版,是IPv4的后继者。IPv6地址长度为16字节,128比特位,相比IPv4的32位地址长度更长,可以提供更多的地址空间,从而解决了IPv4地址不足的问题。此外,IPv6还提供了更好的安全性和可扩展性,但是IPv6和IPv4是不兼容的。
  • 4位首部长度(header length):IP头部的长度是多少个32bit(单位是4字节), 也就是 length * 4 的字节数,和TCP的首部长度一样,4个比特位表示最大的数字是15,因此IP头部最大长度是60字节。(如没有选项,四位首部的值就是5,即0101)
  • 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要,对于ftp这样的程序,最大吞吐量比较重要。
  • 16位总长度(total length): IP数据报整体占多少个字节。(有效载荷=总长度-首部长度*4)
  • 8位协议:表示上层协议的类型(如UDP/TCP),UDP和TCP协议都有编号。
  • 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏。
  • 字段选项:略。
  • 数据部分为TCP等传来的数据

没有提到的字段,在后面的具体内容中会详细讲解。


解包分用:

任何一个协议都必须考虑解包和分用,IP协议也不例外,要考虑对端的IP层是如果将报头和有效载荷分离的,又是将数据交给传输层的哪个协议的?

在IP首部中,有4位首部长度,根据这个字段中的内容可以得到当前数据报报头的长度,首部中还有16位总长度,可以得到整个数据报的长度,二者做差得到的就是有效载荷。

知道有效载荷后,只需要读取固定字节数的有效载荷即可分离报头。

在IP首部中,还有一个8位协议号,这里的编号就是要将数据交给的上层(传输层)协议的编号,如TCP或者UDP等,所以实现分用非常容易。


2. 分片与组装

2.1 分片与组装概念

IP协议报头的第二行就是用来实现分片与组装的:

为什么要分片?

我们知道,在TCP/IP模型中,网络层的下一层是数据链路层,网络层中的IP协议并不是把数据直接发送到了网络中,而是交给了数据链路层,数据链路层才是真正将数据发送到网络中。

数据链路层中使用的是MAC帧协议,该协议规定自己的有效载荷不能超过1500个字节。虽然可以修改,但是这里我们不考虑,就按默认情况来说。

如上图所示,IP层位于TCP层和数据链路层之间,IP层发送的数据是TCP层交付下来的,交付多少就向数据链路层发多少。

此时TCP层交付给IP层3000个字节的数据,IP层向下交付的时候,数据链路层说它最多只要1500个字节,否则就不要。

数据量的多少并不是IP层决定的,而是由TCP层决定的。

所以此时IP层就非常无语,上面是领导要求发送3000个字节,下面员工只能处理1500个字节,面对这个矛盾,IP层只能自己想办法,所以就将数据分片,分成多个数据包,每个数据包不超过1500个字节,然后分多次交付给数据链路层。

同样的,当这些分开的数据报发送到对端后,对端的IP层需要进行组装,将分片的数据拼装成一个完整的数据。

  • 分片:自己的IP层完成。
  • 组装:对端的IP层完成。
  • TCP层和数据链路层完全不关心IP层进行了分片,实现了高度解耦。

  • 16位标识(id):发送的每一个数据报该标识都是唯一的,如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。
  • 3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到)。第二位置为1表示禁止分片,这时候如果报文长度超过MTU(1500个字节) IP数据报就会丢弃报文。第三位表示更多分片,如果该数据报被分片了的话,这个第三位就是1,最后一个分片由于不会再分了,所以是0。

如上图所示,将3000字节的数据报分片,第一次分片的报头是用原来的,其它的分片都需要新加报头(因为后面进行组装需要报头里的数据),每个数据再加一个IP报头,其中前两个数据报是3000字节的前半部分,被分片了,所以报头中的第三个标志位是1。第三个数据报是3000字节的后半部分,它没有再分片,所以IP报头中的第三个标志位是0。

  • 13位片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移,实际偏移的字节数是这个值 * 8 得到的。

重新画下上面的13位片偏移就是这样的:


2.2 类似面试题的QA

对端IP层收到数据报后怎么知道这是一个被分片了的数据报?

数据链路层不关心IP层是否分片了,它只管发,所以对端的IP层收到数据报后需要知道这是一个被分片了的报文。

  • 如果更多分片标志位(第三个标志位)是1,说明该数据报被分片了。
  • 如果更多分片是0,但是片偏移值大于0,说明该数据报被分片了。

同一个报文的所有分片对端是如何识别出来的?

由于16位标识符的存在,对端收到的数据报中,标识符相同的数据报组合起来就是一个完整的数据报。


哪一个数据报是第一个分片,哪一个是最后一个分片?

更多分片标志位是1,片偏移量是0,说明这是第一个分片。更多分片标志位是0,片偏移量大于0,说明这是最后一个分片。


哪个分片在前,哪个分片在后?

将所有分片的片偏移量按照升序排序,就可以知道哪个分片在前,哪个分片在后。


有没有收全或者丢失分片呢?

当前分片的起始位置+自身数据长度,如果等于下一个分片中的片偏移量,说明这两个分片是挨着的,如次反复判断,便能判断出是否收全了,只要有一次判断结果不相等,那么就说明有数据片丢了。


怎么保证对端组装起来的报文是正确的?

IP协议有16位首部校验和,校验通过会分发给上层TCP协议。

TCP协议也有校验和,可以判断出数据是否是正确的。


假设传送一个报文的成功率是99%,将一个长的数据报分片成两个以后,两个数据报的传送的成功率就是99% * 99% = 98.01%,如果是10个报文呢,这个大数据报传送的成功率就越来越低了。

一个数据报被分片成多个,任意一个丢失就会导致对端IP层组装失败,从而导致发送发TCP层超时重传。如果是UDP就直接丢包了。

分片和组装并不好,而且这种情况也并不是经常的,并不是主流方式。


3. 网段划分和IP地址

IP层工作示意图:

  • 主机:配有IP地址,可以进行网络通信的设备,比如电脑,手机等等。
  • 路由器:配有IP地址,又能进行路由控制,也就是将数据从一个节点传送到另一个节点。
  • 节点:主机和路由器的统称。

上面说了,IP协议具有将数据从A主机跨网络可靠的送到D主机的能力,那么IP协议是怎么从主机A找到主机D的呢?

路径选择中,目的IP地址非常重要,它决定了我们的路径该如何走。

IP协议报头中有两个IP地址字段,32位源IP地址标识的是主机A所在的位置,32位目的IP地址标识的是主机D所在的位置。IP地址就像生活中的家庭住址等地址一样,都具有唯一性。

IP地址 = 网络号 + 主机号

网络号(网络标识):保证相互连接的两个网段具有不同的标识。

主机号(主机标识):同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。

IP地址采用的是点分十进制,IPv4的格式形如192.168.1.1这样的形式,共有四个字节,字节和字节之间用点隔开,每个字节的数字范围是0~255,所以IP地址理论上的范围是0.0.0.0~255.255.255.255,这个范围中有2^32个IP地址,也就是42亿多,是不够全球网民使用的。


3.1 网段划分

网段划分:

假设你现在从你的电脑上用微信发送了一条消息,这条消息第一步肯定是到腾讯的微信服务器上,服务器也是一个计算机,也是一个节点,它也有自己的IP地址。

此时你电脑上的数据也知道服务器的IP地址,但是怎么找到呢?你的电脑和服务器之间有无数个节点,难道要把42亿多个IP地址遍历一遍吗?肯定不是的,这样效率太低了。

所以要进行网段的划分:

上图按照国家,省市区为单位来划分子网,实际上的划分并不是这样的,而是按照人口区域来划分的,下面例子和实际情况没有任何对应关系,这样划分只是为了好理解。

世界上有众多国家,每一个国家对应IP地址中4字节中第一个字节里的一个数字,假设中国就是10.x.x.x,日本是1.x.x.x这样。

每个国家里又划分为多个行政区,拿中国来说,有34个省(自治区,直辖市,特别行政区),将IP地址中的第二个字节分配给这些省,第一个字节保持不变,如山东就是10.0.x.x,上海就是10.2.x.x这样。

上海市又分为多个区,将IP地址中的第三个字节分配给这些区,第一个和第二个字节保持不变,如浦东就是10.2.0.x,黄埔就是10.2.3.x。

每个区中又有多台主机,也就是有多个节点,包括服务器也是一个节点,将IP地址中的第四个字节分配给这些节点,如张三的电脑就是10.2.3.2,腾讯的微信服务器就是10.2.3.4。

假设你现在在日本,用微信发了一个消息,当数据到了IP层被封装以后,报头如上图所示,源IP地址是1.1.1.1,目的IP地址是10.2.3.4。

数据被发送出去以后,首先到达的是你所在区子网的路由器,路由器发现目的IP中的前三个字节是10.2.3,而整个日本子网的IP地址中第一个字节是1,所以判断这不是发给你所在国家的子网的,就将数据交给了上层路由器,最后到了日本的入口路由器。

每个子网都有一个入口路由器,该路由器是子网内部所有路由器的上层路由器,也叫做默认路由器。

日本的入口路由器和其他国家的入口路由器处于一个子网内,所以它肯定知道IP地址第一个字节是1属于哪个国家的,所以就将这个数据报直接发给了中国的入口路由器。

每一个入口路由器都横跨两个子网,一个是它所在的子网,还有一个是它下一层的子网。

中国的入口路由器横跨所有国家入口路由器所在的子网,和中国内部所有省份所在的子网,所以它清楚的知道每个省份的IP地址中第二个字节的数字是多少。

中国的入口路由器拿到日本入口路由器发来的数据报以后,发现目的IP是10.2.3.4,前两个字节是10.2,对应的是上海市,所以就将数据报直接发送到了上海市的入口路由器。

上海的入口路由器拿到这个数据报后,发现目的IP中的前3个字节是10.2.3,对应的是黄埔区,所以就将数据报直接发送到了黄浦区的入口路由器。

黄埔区的入口路由器发现IP地址是10.2.3.4,对应的是微信服务器,所以就将数据直接发送给了微信服务器的路由器。此时,数据报就被送到了目标地址。


上诉例子中,每一层子网只关注IP地址中的一个字节,越往下层,被确定的字节个数就越多,目标也就越明确,所查找的范围也就越小。

通过子网划分的方式,让数据报每传送一次就能排除大量的IP地址,比起遍历的方式,效率提升的不是一星半点。

网段划分的目的就是提高网络通信数据传输的效率。

可以看到,在数据报传送的过程中,根据IP地址中的前3个字节,可以将数据报通过多个路由器送到目标主机所在子网的入口路由器,此时也就确定了目标主机所在的子网络,所以前三个字节被叫做网络号。

目标主机所在子网的路由器再根据主机号,也就是IP地址中的最后一个字节来确定具体是哪个主机,然后将数据报发送到目标主机上。

前面说到:IP地址 = 网络号 + 主机号

网络号(网络标识):保证相互连接的两个网段具有不同的标识

主机号(主机标识):同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号

IP地址中的前3个字节被叫做网络号,最后一个字节被叫做主机号

如上图所示,不同网段(子网)的网络号必须不同,但是主机号可以相同,只要保证同一个网段内的所有主机号不同即可。

网络号保证了两个相连的子网具有不同的标识,主机号保证了同一子网内不同主机有不同的标识。

  • IP地址中,主机号为0,如192.168.128.0就代表网络号,等价于前三个字节192.168.128,所以这个IP地址是不能绑定主机的。
  • IP地址中,主机号为1,如192.168.128.1代表当前子网的默认路由器(入口路由器),所以这个IP地址也不能绑定主机。

网段划分是经过设计的,所以说互联网是一个被设计过的世界,那么是谁设计的呢?答案是运营商,在我们国家就是移动,电信,联通三大运行商,其他国家也有自己运营商。

运营商不仅设计了互联网的网段划分,而且搭建了物理层中的通信设备,使得网络数据能够在一根根网线中跑,进行网络通信。

所以说,运营商是底层网络的设计者,我们在使用网络的时候,需要向运营商交钱,因为我们使用了人家的底层设计和设备。


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

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

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

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

我们在日常生活中连接家里的wifi时,第一次连接需要输入账号和密码,这其实就是在向路由器申请IP地址,在没有联网的时候,你的设备是没有IP地址的。


3.2 IP地址分类

以前有人提出过一种划分网络号和主机号的方案,把所有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

其中网络号和我们前面网段划分中是一样的,也是用来标识不同的子网的,只是不同类型IP地址网络号的范围不一样,主机号的范围也不一样。

某一个子网会领取几类IP地址去使用,其中用的最多的是B类IP地址,随着网络的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量地址。

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

因为有组织已经申请了一个A类IP地址,即使主机数没有那么多,没有用完,但是别的组织也不能申请这个A类的IP地址了,因为网络号是唯一的。此时就导致A类IP地址存在大量的浪费,而B类IP地址严重不足。

针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)。也就是现在采用的子网划分方式,不区分IP地址的类型,就像前面划分子网时那样。

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

子网掩码的存在就是为了区分网络号和主机号的,可以通过IP地址和子网掩码按位与高效的得到网络号。子网掩码和IP地址做“与”运算,分离出IP地址中的网络地址和主机地址,用于判断该IP地址是在本地网络上,还是在远程网络网上。

看一个例子:

如上图所示,一个路由器收到了一个IP数据报,其中目的IP地址是140.252.20.68,该路由器所处网段的子网掩码是255.255.255.0(255的二进制是1111),将IP地址和子网掩码按位与后得到的网络号是140.252.20.0。

然后与自己所处网段的网络号进行比较,如果相同,直接将数据给到本网段的子网中,如果不同,则需要跨网段,则将数据给到上一层路由器去处理。

得到的网络号所标识的子网中,节点的地址范围是140.252.20.0~140.252.20.255。 也就是主机号从全0到全1。

再看一个例子:

此时的子网掩码是255.255.255.240,按位与以后得到的网络号是140.252.20.64,作用和上面一样,也是用来判断目的IP是否位于本网段。

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

两个例子中,网络号的位数是变化的。

第一个例子中,网络号是前3个字节,第二个例子中网络号是前3个字节加4个比特位,剩下的才是主机号。

数据在传送的过程中,网络号是变化的。

继续拿前面的国家和省市之间网络拓扑结构来说,从日本发送出来的微信消息现在已经交到了中国入口路由器,假设中国网段的子网掩码是255.0.0.0。

每个路由器中都维护着一张路由表,里面存放着下层所有子网的网络号和子网掩码。

中国网段入口路由器将IP地址与它所知道的子网掩码遍历,进行按位与,最后发现该IP地址和上海的子网掩码255.255.0.0按位与后得到的网络号和上海的网络号相同,然后将该数据交给上海子网的入口路由器。

上海入口路由器同样进行上面的操作,最后发现该IP地址和黄浦区的子网掩码255.255.255.0按位雨后得到的网络号和黄浦区的网络号相同,然后将该数据交给黄埔区入口路由器。黄浦区入口路由器根据IP地址中的主机号找到微信服务器,至此,数据完成传送。

在上面数据从中国入口路由器传送到黄浦区入口路由器的过程中,网络号是不停变化的

越上层的子网掩码位数越少,也代表着网络号所位数越少。


特殊的IP地址:

  • 将IP地址中的主机号全部设为0,就成了网络号,代表这个子网,如140.252.20.0。
  • 将IP地址中的主机号全部设置为1,就成为了广播地址,用于给同一个子网中的所有主机发送数据,如140.252.20.255。
  • IP地址127.*用于本机环回(loop back)测试,通常是127.0.0.1,只能在本主机上进行网络通信。(不让它出现在网络上,之前写代码已经用来测试过很多次了)


IP地址的数量限制:

我们知道,IP地址(IPv4)是一个4字节32位的正整数,一共只有 2^32个IP地址,大概是43亿左右。而TCP/IP协议规定, 每个主机都需要有一个IP地址,难道这意味着,一共只有43亿台主机能接入网络么?

实际上,由于一些特殊的IP地址的存在,数量远不足43亿。另外IP地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址。

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

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

3.3 内外IP和公网IP地址

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

  • 10.*,前8位是网络号,后24位是主机号,所以共有16777216个地址。
  • 127.16到127.31,前12位是网络号,后20位是主机号,所以共有1048576个地址。
  • 192.168.*前16位是网络号,后16位是主机号,所以共有36636个地址。

在这个范围中的IP地址都称为内网IP(私有IP),其余的都称为公网IP(全局IP)。

如上图所示,路由器横跨两个子网,那么它必然配有两个IP地址,一个是WAN口IP,位于上层子网,就像前面网络拓扑结构中,上海市的入口路由器和其他省路由器组成的子网中,WAN口IP就是该路由器在这个网段中的IP地址。

另一个IP地址是LAN口IP,位于当前子网,上海的入口路由器和上海所有区组成的子网中,LAN口IP就是该路由器在这个网段中的IP地址。

和路由器LAN口连接的主机,都属于当前这个路由器的子网中。 子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复了。

上图中,所有家用路由器的子网IP(LAN口IP)都是192.168.1.1/24,这个IP地址是用来和家里与这个路由器相连的所有设备进来通信的,每一个家用路由器和与它相连的设备组成了一个局域网。

在这个局域网中,路由器的子网IP192.168.1.1就是唯一的。

但是左边的两个家用路由器的WAN口IP不同,因为它两和运营商路由器的LAN口IP组成一个子网(局域网),该子网中的IP地址都是唯一的。

上图中,两个运营商路由器的子网IP又是相同的,都是10.1.1.1/24,因为这个LAN口IP只用于该从属该路由器的子网中通信,在这个子网中也是唯一的。

两个运营商的WAN口IP是不相同的,而且是122.*,这个IP地址是公网IP,所以这两个WAN口IP地址是用来在公网之间通信的。

  • 局域网中:一个子网中所有节点的IP地址都不能相同,要具有唯一性。不同子网中的IP地址可以相同。
  • 公网中:IP地址必须具有唯一性,不论属于哪个子网。

前面画的网络拓扑结构中,是公网网段划分理想示意图,没有加入任何内网,实际上在到达某个省或者某个市就开始采用内网(局域网)的方式了。

就像我们平时在微博,抖音等软件里的评论归属地一样,只能看到所在省,无法看到再具体的信息了,因为省使用的还是公网IP,非常好识别,再网下使用的就是内网IP,就比较复杂了。


既然不同的内网中可以有相同的IP地址,那么就出问题了:

假设我现在从我的电脑上发送了一份数据到服务器上,IP报头如上图所示,源IP地址是192.168.204/24,这是一个内外IP地址,目的IP地址是122.77.241.3/24,这是一个公网IP地址。

你将数据从你的电脑上发送出去后,首先交给了家用路由器,家用路由器用子网掩码按位与后发现不是发送到本网段的,然后交给了运营商路由器。

运营商同样判断出不是发送给本网段的,而是要发送给公网中的服务器的,所以运营商路由器将数据发送给了服务器。

服务器收到数据以后通过特定进程处理,处理完进行响应,但是响应数据段到了IP层以后,发现目的IP是192.168.1.1,这是一个内网IP,填入到IP报头中的目标IP地址字段里,然后发到公网中。

但是由于这是一个内网IP,所有运营商路由器都不认识,并且它们的子网中都有这个IP地址,所以就会导致服务器的响应无法传送到我的电脑上。

  • 内网中的主机需要和公网网进行通信时,路由器将IP首部中的目的IP地址进行替换(替换成WAN口IP),这样逐级替换,最终数据包中的目的IP地址成为一个公网IP。
  • 这种技术称为NAT(Network Address Translation,网络地址转换),具体详细内容以后会讲解。

如上图所示,在从你的电脑将数据发送到家用路由器时,IP报头中的目的IP是192.168.201/24,是一个内网IP地址。

家用路由器将数据发送给运营商路由器的时候,将IP报头中的目的IP地址替换成了自己的WAN口IP10.1.1.2/24,同样是一个内网IP地址,但是属于你电脑的上一层。

运营商路由器在将数据发送到公网中给服务的时候,将IP报头中的目的IP地址替换成了自己的WAN口IP122.77.241.4/24,这是一个公网IP,在全网都具有唯一性。

此时服务器在处理完数据做出响应时,构建的IP数据报中目的IP就填运营商的WAN口IP地址122.77.241.4/24,将数据发到公网中后可以准确发回运营商路由器,然后再由运营商路由器发给它子网的路由器,最终到了你电脑上。


4. 路由和8位生存时间

4.1 路由的概念

路由:就是在复杂的网络拓扑结构中找出一条通往终点的路线。

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

通俗来说,一跳就是两个节点相连之间的路径。路由的过程就如上图那样一跳一跳的问路的过程。

当IP数据报到达路由器以后,由路由器决定这个数据包是直接发送给目标主机还是需要发给上一层路由器。如果目标IP地址在本网段内就直接发送给目标,否则就发送给上一层路由器。

那么路由器是如何判断当前这个IP数据报该发送到哪里呢?这就要靠每个路由器(节点)内部维护的路由表了。

我们的计算机也有路由功能,也是可以看作一个路由器的,在Linux上,使用route指令可以查看当前机器上的路由表:

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

现在不关心最后两列Metric和Ref是什么意义。

这台主机有两个网络接口,一个网络接口eth0连到192.168.10.0/24网络,另一个网络接口eth1连到192.168.56.0/24网络。

路由表的Destination是目的IP地址,Genmask是子网掩码,Gateway是下一跳地址,也就是下一个路由器IP地址。Iface是发送接口,是物理上存在的接口,该接口通过网线和对应网络相连。

Flags中的U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。

转发过程例1:如果要发送的数据报的目的IP是192.168.56.3

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


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

依次和路由表前几项进行对比,发现都不匹配,说明目的IP不在本网段,按缺省路由条目(最后一行),从eth0接口发出去,发往IP地址为192.168.10.1的路由器,由192.168.10.1路由器根据它的路由表决定下一跳地址。


总的来说,当一个数据报文到来节点后,会经过四步来完成数据报文发送:

  1. 遍历路由表
  2. 目的IP和路由表中的每一行的子网掩码按位与,确定该数据报要去的目标网络。
  3. 对比结果和目标网络
  4. 最后通过Iface接口发出报文。

4.2 8位生存时间

如上图红色框所示,IP协议报头中有一个字段叫做8位生存时间(TTL),该字段的值表示跳数

在整个网络拓扑结构中,存在非常多的节点,数据报在发送的过程中会经过这些节点,如果某个或者某些路由器发生故障,则有可能导致数据报在网络中的传送路径变成环状,在固定路由器之间循环,始终到不了目标IP地址。

发送端迟迟得不到应答,就会触发超时重传机制,然后新发的数据报又会陷入到循环中,导致网络中数据越来越多,最后就拥塞了。

此时8位的生存时间就派上用场了,假设生存时间字段的值是10,数据报在网络中每进行一跳该值就会减1,如果减到0这个数据报就消亡了。

  • 8位生存时间的最大值是255,也就是说一个数据报最多进行255跳。
  • 255跳可以到达整个网络中的任何一台主机了,不会存在还没有到达数据就消亡了,除非路由出现了问题。
  • 在数据传送的过程中,类似于多叉树的模型,每一跳就在向下遍历,能排除相当多的主机。

5. IP相关选择题

1. IPv6地址占()个字节

A.4

B.6

C.8

D.16

2. 【多选题】IP地址是一个4字节的数字,实际上由两部分合成,第一部分是(),第二部分是()

A.网络号

B.主机号

C.网段号

D.以上都不对

3. IP地址中的主机号有什么作用?()

A.它指定了网络上主机的标识

B.它指定了被寻址的子网中的某个主机

C.它指定了主机所属的网络

D.它指定了设备能够进行通信的网络

4. Internet使用TCP/IP协议实现了全球范围的计算机网络的互连,连接在Internet上的每一台主机都有一个IP地址,下面不能作为互联网上可用的IP地址的是( )

A.201.109.39.68

B.127.0.0.1

C.21.18.33.48

D.120.34.0.18

5 . 以下关于描述IP地址错误的是()

A.127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1

B.将IP地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号

C.E类IP地址的范围是: 240.0.0.0到247.255.255.255

D.如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号可以和子网中的其他主机重复

6. 以下地址中的哪一个和76.32/12网段匹配( )

A.76.33.214.12

B.76.79.24.11

C.76.58.119.74

D.76.68.204.11

7. 下列哪个IP地址可以分配给一台计算机?( ) 

A.256.1.3.4

B.197.3.11.0

C.199.5.89

D.11.15.33.235

8. 局域网中的 MAC层 与 OSI 参考模型()相对应

A.物理层

B.数据链路层

C.网络层

D.传输层

9. 局域网体系结构中 () 被划分成 MAC 和 LLC 两个子层

A.物理层

B.数据链路层

C.网络层

D.运输层

10. 一个广域网和一个局域网相连,且需要进行协议转换,需要的设备是什么。()

A.路由器

B.网关

C.集线器

D.NIC

11. 局域网是计算机网络中最流行的一种形式。下面有关局域网的叙述中错误的是()

A.局域网指较小地域范围内的计算机网络,它有多种类型

B.局域网通常为一个单位所拥有,自建自管

C.它主要使用光缆进行连网和数据通信

D.局域网数据传输速率高,延迟时间短,误码率低

12. 下面哪种设备是组建以太局域网必不可少的?()

A.多个线程共有一个栈,各自有一个堆

B.多个线程共有一个栈, 共有一个堆

C.多个线程各自有一个栈,共有一个堆

D.多个线程各自有一个栈, 各自有一个堆


答案解析

1. D

IPv4版的IP地址是无符号四字节大小,共有接近43亿个IP地址,但是IP地址不够用,因此在IPv6中扩大了IP地址范围为16个字节大小(因为并不向前兼容IPv4所以推广较慢)

2. AB

IP地址由两部分组成,

  • 一部分是标识自己所属网络的网络号,以便于在网络中寻找指定的子网络,
  • 一部分是自己在该子网络中的主机唯一标识,以便于在该子网络中找到指定的主机

3. B

IP地址由两部分组成:

  • 一部分是标识自己所属网络的网络号,以便于在网络中寻找指定的子网络,
  • 一部分是自己在该子网络中的主机唯一标识,以便于在该子网络中找到指定的主机

A错误:网络上主机的标识,这是IP地址整体的作用

B正确

C错误:这是网络号的功能

D错误:网络的标识都是网络号的功能

4. B

127网段中的地址,用于是实现本地回环,其中 127.0.0.1 地址被用于本地的回环网络测试(也就是自己发自己收,不能对外通信)

5. D

A正确:127网段中的地址,都是用于实现本地回环的,常见的 127.0.0.1 地址被用于本地的回环网络测试(也就是自己发自己收,不能对外通信)

B正确:这就是子网掩码的重要功能之一,在网络通信中路由的时候用于判断目标IP属于哪个网络

C正确:了解范围即可

D错误:子网中新增一台主机,则意味着网络号不变(网段号不变),则主机号一定不能重复,否则就无法唯一标识该子网当中的哪台机器,则数据路由的时候就会出问题

6. A

题干中76.32/12 表示网络号占据12个比特位,

  • 子网掩码为 11111111.1111,12个比特位为1, 因此子网掩码十进制表示为 255.240.0.0
  • 76.32使用二进制表示 01001100.00100000 , 与子网掩码相与得到网络号,则得到网络号是 01001100.0010 也就是 76.32

A正确.:76.33 与 255.192 相与后得到 76.32,网络号相同

B错误:.76.79 与 255.192 相与后得到 76.64,网络号不同

C错误:.76.58 与 255.192 相与后得到 76.48,网络号不同

D错误:.76.68 与 255.192 相与后得到 76.64,网络号不同

7. D

互联网的网络地址分为A~E五类,其中:

  • A类地址:0.0.0.0 ~ 127.255.255.255, 主机号是后24位
  • B类地址:128.0.0.0 ~ 191.255.255.255,主机号是后16位
  • C类地址:192.0.0.0 ~ 223.255.255.255,主机号是后8位
  • D类地址:224.0.0.0 ~ 239.255.255.255,后28位为多播组号
  • E类地址:240.0.0.0 ~ 255.255.255.255,后27位待用

A错误:点分十进制IP地址中,一个数字表示一个字节,256 超过了单字节存储最大值,是一个不符合规则的IP地址

B错误:197是一个C类地址,低8位是主机号,但是197.3.11.0中低八位主机号全为0,而主机号全为0表示一个网段,表示的是一个网络号,主机号全为1的时候,是该子网的广播地址

C错误:参照TCP/IP详解卷一第三章 IP:网际协议的图3-3,代表了一个直接相连的网络。

D正确:作为一个A类地址,是可以分配给一台计算机的。

8. B

OSI参考模型:物理层,数据链路层,网络层,传输层, 会话层, 表示层, 应用层

局域网中的MAC层对应数据链路层。

9. B

  •  MAC子层的主要功能包括数据帧的封装/卸装,帧的寻址和识别,帧的接收与发送,链路的管理,帧的差错控制等
  •  LLC 是在高级数据链路控制(HDLC:High-Level Data-Link Control)的基础上发展起来的

 MAC和LLC同属于数据链路层的功能,因此正确选项为:B

10. B

  •  MAC子层的主要功能包括数据帧的封装/卸装,帧的寻址和识别,帧的接收与发送,链路的管理,帧的差错控制等
  •  LLC 是在高级数据链路控制(HDLC:High-Level Data-Link Control)的基础上发展起来的

 MAC和LLC同属于数据链路层的功能,因此正确选项为:B

11. C

局域网通常指的是网络覆盖范围在1000米以内的网络,地域范围较小,往往属于一个单位所有,由单位自建自管,具有多种类型。

局域网使用专门铺设的传输介质进行联网和数据通信,数据传输速率高,延迟时间短,误码率低。

故本题选C,一般家庭或企业的局域网布线都是使用普通网线(现在一般网线都是双绞线,当然也有其他的一些种类)

12. B

A错误:网桥是早期的两端口二层网络设备,比集线器(Hub)性能更好,但是后来被交换机替代。

B正确:局域网按照传输介质使用的访问控制方法,可以分为以太网、FDDI网和令牌网,目前广泛使用的是以太网,它以集线器或交换机为中心构成。

C错误:路由器的主要功能是路由功能连接其他网络对外通信。我们生活中都是购买路由器组建一个局域网,但是路由器并非必须的设备。

D错误:中继器(RP repeater)是工作在物理层上的连接设备。适用于完全相同的两个网络的互连,主要功能是通过对数据信号的重新发送或者转发,来扩大网络传输的距离


本篇完。

下一篇:11(数据链路层)以太网(MAC帧)协议+局域网转发+ARP协议

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/209702.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云之一键安装宝塔面板

华为云之一键安装宝塔面板 一、本次实践介绍1.1 实践环境简介1.2 本次实践目的 二、宝塔面板介绍三、环境准备工作3.1 预置实验环境3.2 查看环境信息3.3 登录华为云3.4 查看弹性云服务器状态3.5 ssh登录弹性云服务器3.6 查看操作系统版本 四、安装宝塔面板4.1 一键部署宝塔面板…

git 本地改动无法删除

1. 问题 记录下git遇到奇怪的问题,本地有些改动不知道什么原因无法删除 git stash, git reset --hard HEAD 等都无法生效,最终通过强制拉取线上解决 如下图: 2. 解决 git fetch --all git reset --hard origin/master执行这两…

业务场景中Hive解析Json常用案例

业务场景中Hive解析Json常用案例 json在线工具 json格式转换在线工具 https://tool.lu/json/format格式互转: // 格式化可以合并整行显示 {"name":"John Doe","age":35,"email":"johnexample.com"}// 格式化…

TimeGPT:时间序列预测模型实例

时间序列预测领域正在经历一个非常激动人心的时期。在过去的三年里,我们见证了许多重要的贡献,如N-BEATS、N-HiTS、PatchTST和TimesNet等。同时,大型语言模型(LLM)近来在流行度方面取得了很大的成功,例如Ch…

深入了解Java Period类,对时间段的精确控制

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概2900多字,预计阅读时间长需要3分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#x…

海外的直播平台

1、Netflix Netflix以允许人们从众多设备观看系列和电影而闻名。用户可以开设一个帐户并添加不同的用户个人资料,这对于想要为整个家庭拥有单独帐户而又无需开设大量帐户并单独付款的人来说非常有用。它现在增加了一个直播服务,允许观众参加现场练习课程…

chrome overrides 怎么用?

在network里找到你想替换的文件 右键选择override content 他会提示你选择文件夹 你选择本地的一个 紧接着他会提示你 点允许 再去你创建的那个目录里查看 会发现 他自动帮你创建了目录 他会把线上的被替换目标文件放在里面 你直接修改他就可以了

MySQL InnoDB Cluster

MySQL InnoDB Cluster 一、InnoDB Cluster 基本概述 MySQL InnoDB Cluster 为 MySQL 提供了一个完整的高可用解决方案。通过使用 MySQL Shell 提供的 AdminAPI,你可以轻松地配置和管理一组至少由3个MySQL服务器实例组成的 InnoDB 集群。 InnoDB 集群中的每个 MySQL 服务器实例…

python爬虫基础知识

使用python进行网络爬虫开发之前,我们要对什么是浏览器、什么HTML,HTML构成。请求URL的方法都有一个大概了解才能更清晰的了解如何进行数据爬取。 什么是浏览器? 网页浏览器,简称为浏览器,是一种用于检索并展示万维网信息资源的…

基于Java SSM框架实现实现四六级英语报名系统项目【项目源码+论文说明】

基于java的SSM框架实现四六级英语报名系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个高校四六级报名管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作…

绿色建筑革新,气膜球馆成为城市锻炼新热点

近年来,全民健身设施蓬勃发展,个性化球场设计逐渐取代了传统模式,其中备受欢迎的是新潮的绿色建筑——气膜室内球馆。这种创新的建筑形式不仅适用于传统的篮球、足球、羽毛球等常规运动,还可以容纳冰壶、滑雪等更为复杂的活动&…

Spring事务传播机制

在上篇文章中,小编带领大家了解了Spring事务:Spring事务-CSDN博客,那么,本篇文章将会带领大家深入了解:Spring事务传播机制,感兴趣的各位老铁,欢迎深入探讨!! 事务传播机…

JavaScript编程基础 – For循环

JavaScript编程基础 – For循环 JavaScript Programming Essentials – For Loop By JacksonML 循环可以多次执行代码块,而不用反复重写相同的语句。这无疑对提升代码质量、减少错误大有脾益。本文将简要介绍for循环的几种案例,希望对读者有所帮助。 …

PostgreSQL + SQL Server = WiltonDB

WiltonDB 是一个基于 PostgreSQL 的开源数据库,通过 Babelfish 插件支持 Microsoft SQL Server 协议以及 T-SQL 语句。 Babelfish 是亚马逊提供的一个开源项目,使得 PostgreSQL 数据库同时具有 Microsoft SQL Server 数据查询和处理的能力。Babelfish 可…

【源码篇】基于SpringBoot+Vue实现的在线考试系统

文章目录 系统说明技术选型成果展示账号地址及其他说明 系统说明 基于SpringBootVue实现的在线考试系统是为高校打造的一款在线考试平台。 系统功能说明 1、系统共有管理员、老师、学生三个角色,管理员拥有系统最高权限。 2、老师拥有考试管理、题库管理、成绩管…

C++分数计算器

C分数计算器各种分数计算类型都能计算 代码:https://mbd.pub/o/bread/ZZeZk5hx 一 目的 (1)定义一个整数类。 定义一个分数类,由整数类派生。能对分数进行各种计算和输入/输出。可进行分数的加、减、乘和除法等四则运算。 流程…

CYCA少儿形体礼仪 朝阳市培训成果考核圆满落幕

少年成长从形体教育开始——从2020年美育中考落地执行开始,美育成为少儿教育发展的必经之路,助力少儿综合能力全面发展。CYCA中国文化管理协会青少年文化艺术委员会全面贯彻党的教育方针,促进儿童素质艺术教育并深入实施,从少儿形…

“Install Js dependencies failed“JS SDK安装失败【Bug已解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案:解决措施1解决方案2:其他解决方案解决方案3:此Bug解决方案总结项目场景: 在下载JS SDK时,出现下载失败的情况,并显示“Install Js dependencies failed”。 在使用版本为DevEco Studio 3.0.0.601 Beta1进行低代码开发时…

react-flip-move结合array-move实现前端列表置顶效果

你有没有遇到这样的需求?点击左侧列表项,则像聊天会话窗口一样将被点击的列表项置顶。 如果只是单纯的置顶的话,直接使用array-move就可以实现了,但置顶效果多少有点突兀~ 先上代码,直接使用array-move的情况&#xf…

JAVA调优

1 JAVA虚拟机 1.1 基本组成 通常来说Java平台标准版(Java SE)包括 Java SE开发工具包(JDK)和Java SE运行时环境(JRE)。 JRE提供了运行以Java编程语言编写的applet和应用程序所必需的库,Java虚…