一、网络层IP

1. 认识IP

在正式学习IP协议之前,先举个例子来理解传输层和网络层之间的联系

这个世界上总有人可以考上清华北大,假如你的班级里有一名学霸张三,该名学霸具有考100分的能力(100分为满分),那能保证他每一次都考满分吗?不能,只能证明张三有非常大的概率能考满分。但是没关系,这名学霸的老舅在这所学校,老舅看张三没有考到满分,于是大手一挥要求重新考试,于是所有的学生都要重新考试,但是张三依旧没有考到满分,不过没关系,有老舅在呢,大不了再考一次。所以,按照这种方式下去,总有一次张三是可以考到满分的。

网络层IP就像张三,IP提供了一种能力,把数据从A主机跨网络发送给B主机的能力。但是只能保证大概率能成功发送给目标主机,所以依然存在丢包的风险。那如果丢包了怎么办呢?没关系,这时候老舅就发挥作用了,老舅充当的就是传输层TCP,是实现可靠性的执行者,传输层会再一次发送数据给网络层,TCP/IP就保证了数据可靠的跨网络发送给目标主机

2. IP地址的构成

如果今天你要从台湾到天安门广场去看升国旗,你会乘坐飞机一路飞到天安门广场吗?这时候有人说了,当然了我有钱,可以坐飞机飞过去呀。没错你确实可以飞过去,但是你可以直接飞到天安门广场吗!当然不行了,你只能飞到北京的飞机场,然后在打车或者坐地铁什么的过去。

所以,目标地址 = 所在城市 + 具体的目标地址。那么对于IP地址而言,也是一样的。IP地址一定是属于某个子网的,IP地址 = 目标网络 + 目标主机。这个地址是一个32位的整数,前若干位用来表示目标网络,剩下的用来表示目标主机

用一张图来阐述一下。

在这里插入图片描述

假设,主机B把数据发送给主机C,就要经过路由器F,路由器G,路由器H等等同一个子网内的主机是可以直接进行通信的主机B要把数据发送给主机C,就要经过这些路由器,一个路由器既要属于主机B,又要属于其它路由器或者主机C就要求一个路由器同时属于两个或以上的子网

所以,路由的本质其实就是在不同的子网间进行信息传递

3. IP协议

在这里插入图片描述

首先IP协议的标准报头长度也是20字节,和TCP是一样的,其次它也含有选项,带有四位首部长度,和TCP的是一样的4位首部长度代表IP协议报头的总长度,也是[0,60]个字节,而标准报头长度为20字节,所以选项有40个字节

4位版本代表IP的版本号,IP分为IPv4和IPv6

16位总长度代表IP协议的总长度

每遇到一个协议,我们都要思考两个问题。一、如何将报头和有效载荷进行分离。二、如何解决分用问题

先回答第一个问题,4位首部长度代表了IP协议的报头长度,16位总长度代表了IP协议的总长度,那IP协议的总长度 - IP报头的长度(即4位首部长度)不就是数据的长度了吗!这不就将报头和有效载荷进行分离了吗

那如何解决分用问题呢

IP协议里有一个8位协议,这个就代表着传输层某一个协议的端口号不要忘了0-1023的端口号是知名端口号,是被具体的协议约定的端口号是具有唯一性的

那8位服务类型是干什么的呢

举个例子:张三是一个富二代,去这些远地方旅游,就喜欢坐飞机过去,又快又方便。李四就比较贫穷了,他就坐火车到目的地,虽然慢了点,但符合自己的需求。

一个报文从一台主机到另一台主机,可能因为自身需求的不同,会选择不同的服务类型。所以就有了8位服务类型

8位服务类型(Type Of Service): 三位优先权字段已经被弃用,4位TOS字段和一位保留字段(必须置为0)4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本,这四者相互冲突,只能选择一个

那什么是8位生存时间呢

路由器,网站,路由程序这些都是由运营商或者程序员做的,只要是人做的就有漏洞。主机A跨网络发送数据给主机B,路途需要经过许多路由器,有没有可能报文从路由器C到达路由器D,再到路由器E,再到路由器C呢?这是有可能的,因为这都是人做出来的。所以像这种问题叫做报文路由的环路问题。它在路由器中迷路了。而我们知道数据在长距离传输的过程中,信号是会衰减的,所以为了保证长距离的传输,就要求有一样东西:集线器。它是用来进行信号放大的,这样就能够保证数据可以远距离的传输

那如果出现了报文路由的环路问题,因为有集线器的存在,所以,这个迷路的报文就会一直在网络中存在。全世界有这么多的主机,若是有大量的报文环路,那岂不是要耗费大量的资源。这肯定是不行的。

所以有了8位生存时间(TTL),每经过一个路由器就让TTL--。TTL为0,该报文自动被丢弃,TTL一般为64

4. 网段划分

首先要知道网络的基础设施是由运营商搭建的。网络划分是由谁划分的?怎么划分?为什么

网络划分是由运营商划分的。IP地址是被精心设计过的,IP = 网络号+ 主机号。要理解这个,我们举一个例子来理解。

在学校中,每个学生都有自己的学号,学号也是被精心设计过的。每个学生的学号都具有唯一性和很强的指向性

在学校中,会有各种各样的系,每个系里面都会创建一个独属于该系的群聊,所以在学校中会有不同的群聊,比如计算机群聊,理学院群聊,经管学院群聊等等。所以我们给不同的学院起一个编号,比如计算机学院编号为01,理学院群聊编号为02,经管学院群聊编号为03…,每个学生的学号为学院的院号 + 编号。

在学校中,不仅会有学生,班长,学委等等这样的身份,还会有院学生会主席这样的身份,用来帮助导员做一些事情。每个学院都会有属于自己的院学生会主席,这些不同的院互相之间会再创建一个群聊,这个群聊是属于学校的群聊,每个院都在里面。

今天,有一名学生在操场散步,突然捡到了一个钱包,该钱包里装有人民币若干,学卡等等,这个时候你拿起学卡看上面的信息,发现这个学卡的学号开头是06,你就知道这个学生不是你们院里的了,所以,你要开始找这个失主了,因此你选择去了食堂,因为食堂是学生每天都要去的地方,你一个一个问,始终没有找到。于是,你在你自己的院系(计算机院系)里通知院学生会主席张三,说有人丢钱包了,张三拿到信息以后,发现这个人不是计算机院系的,但他身为院学生会主席,虽然不知道这个人是谁,但他知道06开头的院系是机械工程院系的,所以,他在学校的大群里面艾特机械工程学院的院学生会主席李四,李四看到消息之后,一看这个学号是06321,就知道这个人是机械工程院系的,而他刚好记得这个学号是自己舍友的,所以就艾特自己的舍友王五来领取他的东西。

在食堂去一个个找,这样太慢了,未必能找到失主。这样做本质是在线性遍历,一个个淘汰的过程。

在这个过程当中,每个学院自己的群聊就相当于子网,学校里的大群就相当于公网,而每个院的院学生会主席就相当于路由器。在这个钱包没有到机械工程学院群聊之前,我们一直关注的是06这个数字,这个数字就是院系的编号,即院号,到了机械工程学院之后,才开始关心学号后面的编号了。这个院号就相当于网络号,学号后面的编号就相当于主机号,而钱包这个信息就相当于报文

所以,报文在到达目标网络之前,最关心的是网络号

我们发信息发到院系里面去找这个失主,明显比自己去食堂里面一个个去找效率更高,这是为什么呢?

因为每个学生的学号都是被精心设计过的,学号开头部分的数字06代表的就是院号,我们根据院号去查找,一次就可以淘汰掉其它所有院系的学生,所以自然就快了

所以,为什么要网络划分这样可以提高全网中定位主机的效率,所以要IP网段划分

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

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

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

我们说IP地址可以用来标识每台主机的唯一性现在采用的主流IP地址还是IPv4版本的,但是IPv4只能表示2^32次方个主机,IP地址也是一种有限的资源。既然是资源,那么必然是会被瓜分的,它就像一块大蛋糕一样,被划分给了世界上的各个国家。IP地址最后是被划分给了运营商,因为是运营商最后搭建的网络基础设施。

划分IP地址有两种方式,第一种方式将所有的IP地址分为5类,A,B,C,D,E五大类,A类将前8位作为网络号,前8位的第一位为0,24位为主机号,B类将前14位作为网络号,前两位为10,16位为主机号,C类将前21位作为网络号,前三位为110,8位为主机号…将网络号的前几位固定就可以用来表示IP地址的类别

在这里插入图片描述

这就意味着A类IP地址最多可以有2^24个主机,但是A类地址必然是被划分给某一个地区的,2^24台主机已经很多了,该地区未必有这么大的需求量,这就造成了大量的IP地址被浪费

所以这种划分方式是有缺点的。因此为了更合理的使用IP地址,提出了新的划分方案,CIDR(无类别域间路由)

引入了一个额外的子网掩码来区分网络号和主机号

子网掩码也是一个32位的正整数,通常用一串“0”来结尾

IP地址与子网掩码进行“按位与”操作,得到的结果就是网络号。网络号和主机号的划分与这个IP地址是A类,B类还是C类无关了。

子网掩码是一个32位的bit,它的bit有多少个1,就代表了多少位是网络号

比如有一个A类的IP地址000000110000…0000,子网掩码为11111111111111110000…0000,这就代表着IP地址中有16位是网络号,剩下的16位才是主机号,我们就可以将IP地址进行进一步的细分,0000001100000001[主机号],0000001100000010[主机号],0000001100000011[主机号],本来一个地区用2^16次方个地址,现在将IP地址细分,划分成一个个子网,这样就会有更多的地区可以使用IP地址了

所以,子网掩码的本质:是为了提高分类划分发的IP地址的利用率

还需要注意的一点:例如下面这张图

在这里插入图片描述

子网掩码为255.255.255.240换算成二进制,前28位bit都是1,说明该IP地址的前28位都是网络号,剩下的4位才是主机号,这个换算过程,以及如何利用IP地址和子网掩码得到网络号就不再进行赘述,大家可以下去算一下。

像这种主机地址全为0,表示网络地址,主机地址全为1表示广播地址

像这些子网掩码,IP地址,子网划分,它是如何做到的

IP地址最后是被运营商拿到的,基础网络设施也是由运营商搭建的,而组建网络是需要设备的,例如:光纤,路由器…,最重要的就是路由器了路由器分为家用路由器和企业路由器,运营商划分子网时就把子网掩码,IP地址设置到了企业路由器里,通过光迁入户,家用路由器,普通群众就可以上网了。所以家用路由器和企业路由器之间也具有一定的联系

5. 私有IP和公网IP

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

10.*,前8位是网络号,共16,777,216个地址

172.16.*到172.31.*,前12位是网络号,共1,048,576个地址

192.168.*,前16位是网络号,共65,536个地址

包含在这个范围中的IP地址,都是私有IP,其余的则称为公网IP

以上的这些IP地址只能用于构建子网,不能出现在公网上。平时接触到的网络,没有公网IP,只有内网IP

网络在宏观上的划分:局域网/子网,公网IP

上面说这些私有IP是用来组建局域网的,谁来组建呢?

家用路由器会自动帮我们组建局域网。所以路由器不仅仅具有路由功能,还有组建局域网的功能

路由器内有一个DHCP服务器,比如说该网络号为192.168.1,IP地址为192.168.1.0/24,就可以根据这个网络号来划分出更多的子网,比如:192.168.1.1/24,那么当有用户连接该路由器时,路由器就会自动分配主机号,网络号是固定的,因为是在同一个子网内。那如果邻居也要光迁入户呢?那给他分配的子网IP也可以是192.168.1.1/24,当邻居家的成员连接他们家自己的路由器时,该路由器会为他们分配IP地址,那有没有可能这两家的路由器分配的IP地址是一样的呢?有可能呀,因为上述的IP地址都为私网IP,只能在自己家里使用,你和你领居家虽然私有IP是一样的,但是不会冲突。这是为什么呢?

举个例子:这就像那些高楼大厦一样,每栋楼都有自己的名字,每栋楼都会有101门牌号,你能说外卖员送外卖的时候把外卖送错地址了吗?当然这是有可能的,但我们不考虑这些特殊情况,如果外卖员按照指定的地址送到指定的位置,他会因为门牌号一样送错地方了吗,当然不会了。因为虽然有许多高楼大厦,但每栋高楼大厦都有属于自己的公共区域的地址,比如说朝阳小区,平安公寓,你能说是因为这两栋高楼都有101门牌号,外卖送错了吗!当然不能了。而且在每一栋楼里,也会有相同的门牌号,但是每栋楼也都有自己的楼号呀,所以不会错的。

这和刚才的路由器是一样的,虽然他们的私有IP是一样的(即路由器的IP地址是一样的),但是他们的公网IP是不一样的,私有IP只能在他们自己内部使用,是互不冲突的。

这也就是说在不同的子网内,可以出现相同的IP地址。这就相当于变相的提高了IP地址的绝对上限了

我们说路由器至少要有两个IP地址,因为路由器要进行路由功能,就要横跨两个子网,所以至少要有两个IP地址,而且属于两个不同的子网

那么,家用路由器一端连接的是家庭内部成员,那另一端连接哪里呢?

不要忘了,网络的基础设施都是由运营商搭建起来的,刷抖音,打游戏这些钱最后都要经过运营商,所以家用路由器的另一端连接的就是运营商

所以,我们要访问的数据,发送的数据这些都要经过运营商,当发送的报文要跨网络发送时,就要经过路由器转发,根据路由器的另一端(即连接运营商的一端)将报文转发给企业路由器,再由企业路由器在网络里转发

那企业路由器的一端连接的是家用路由器,那另一端连接哪里呢?我们就认为它连接的是广域网,更大的子网,它的WAN口IP是一个公网IP

像这种路由器对外提供的IP地址(即另一端连接的更大的子网),叫做WAN口IP地址

家用路由器的本质:其实是运营商路由器搭建的子网中一个主机节点

如果今天你的主机IP地址为192.168.1.201(私有IP)src,你要访问的目标主机的IP地址为122.77.241.3(公网IP)dst,你的需求是请求一个短视频,这条报文经过家用路由器进行匹配,发现不属于这个子网,所以通过WAN口IP转发给运营商,运营商将报文转发到网络里,最终找到目标主机。

目标主机将请求到的数据再进一步的转发给源主机,但是这个时候问题来了,源主机的IP地址是私网IP呀,我们说过私网IP是不能出现在公网IP上的,私网IP只能在属于自己的局域网中使用。所以,在源主机向目标主机发送报文的过程中,经过路由器,路由器会自动将私有IP地址转化为公网IP地址不是所有的路由器,有些路由器的WAN口IP地址也是私有的,但总有一个路由器的WAN口IP地址是公网IP地址),目标主机收到请求之后,将内容返回给源主机

但这个时候新的问题又来了,路由器将私有IP地址转化为公网IP地址是没问题的但是目标主机在给源主机回复的时候,会经过路由器,来的时候是将私有IP转化为公网IP,回去的时候如何将公网IP转化为私有IP呢,毕竟私网IP有可能许多台主机是一样的啊?我们把这个问题叫做内网转发。这个问题以后回答。

内网转化为公网IP路由器会自动进行内网IP的替换,自动用路由器的WAN口IP替换掉。我们把这种技术叫做NAT技术

将私有IP地址转化为公网IP地址的路由器叫做出入口路由器

理解公网:

举个例子,以俄罗斯,美国,英国,法国,中国,意大利这几个国家为例,它们的网络号分别为1.0.0.0/8,2.0.0.0/8,3.0.0.0/8,4.0.0.0/8,5.0.0.0/8,6.0.0.0/8,IP地址被分给了各个国家,这些国家之间也要进行通信,所以每个国家都有国际路由器,但是呢,国家之间的距离会很长,有些国家之间隔着太平洋,要数万公里,怎么通信呢?所以有了卫星通信,海底光纤。在路由器内必须配置相关的路由表,这些国家要进行通信,就必须都处在同一个公网里,我们把这个公网叫做国际骨干网络,当美国人要在这个公网里进行通信的时候,这个报文就会在这个公网里被广播给这些国家,这些国家就可以根据IP地址完善自己的路由表了,完善路由表的方法叫做路由条目交换算法

比如说今天有一个俄罗斯人想要访问www.baidu.com,dst:5.0.3.9,当这条报文发出时,俄罗斯的国际路由表就会进行查找,利用IP地址与子网掩码得到网络号,再进行依次对比,发现网络号不是俄罗斯本地的,就会匹配下一个,直到匹配到中国,才匹配成功,说明这条报文就是发给中国某一个地区的。这就构成了第一层子网划分

现在国际间能够进行通信了,祖国瓜分下来这么大的一块蛋糕,自然是要使用的。我们说路由器至少属于两个子网,国际路由器一端连接的是国际间的WAN口IP地址,那另一端连接的就应该是国内的WAN口IP地址了。中国有着这么多的省份,这些IP地址自然是要被分给这些省份的,但是网络号已经固定好了,以5开头(用于国际间通信),现在为了省份之间通信,就需要继续划分,为了简单阐述,我们就认为是8个bit来标记省份,例如:陕西的WAN口IP地址为5.1.0.1/16,河南WAN口IP地址为5.2.0.1/16,浙江的WAN口IP地址为5.3.0.1/16,吉林的WAN口IP地址为5.4.0.1/16…等等,这时省份的网络号为5.X,省份之间通信或者用于国际通信,也就需要省间路由器了,省间路由器同样也有路由表,根据IP地址与子网掩码按位与运算就可以得到目的地的网络号了。这些省份之间互相通信,自然也需要一个公网了,我们把这个公网叫做国内骨干网络,也有路由条目交换算法。这就是第二次子网划分了

可是一个省份内还有许多的市啊,所以还需要继续划分,继续分割bit,用来标记市,这些市也需要路由器,路由表…等等这些和上面都是一样的,这就构成了第三次子网划分

那么,市下面还有许多地区啊,多的都数不清,难道还要继续划分吗?不用了,继续划分bit都不够用了。不要忘了我们还有私网IP呢!私网IP在不同的地方IP地址是可以一样的

我们认为西安的出入口路由器就是之前乃个子网的出入口路由器

由此可以看来,所谓网络世界就是被人精心设计过的,就类似于学生的学号,院号。目标IP能够找到目标主机本身,是由网络拓扑结构决定的,是子网划分和路由配置决定的

6. IP分片与组装的问题

首先ip为什么要分片与组装

这是因为数据链路层要求收到的ip报文(即有效载荷,传给数据链路层就成了有效载荷了),大小不能超过MTU(1500字节)

在这里插入图片描述

那如果超过MTU呢ip就要进行分片了,ip属于网络层,所以分片也是在网络层,对端进行组装那传输层要不要知道呢不需要

那如何进行分片与组装呢?这就需要了解IP协议报头的其它字段了。

在这里插入图片描述

16位标识的是一个报文的唯一性那为什么要有这个标识呢如果ip分片了,那分片报文的标识就是相同的

13位片偏移是分片相对于原始IP报文开始处(指有效载荷处)的偏移,就是在表示当前分片在原始报文中处在哪个位置

如果ip分片了,那每一片是否需要添加ip报头呢答案是需要,因为报文在跨网络传输的过程中,本质是两个网络协议栈在进行通信,要经过封装与解包的过程

如果ip报文的有效载荷是3000字节,那需要分片几次。我们知道数据链路层最多接收网络层1500字节,所以我们应该至少分片三次,因为有效载荷是3000字节,如果分片两次,每片都是1500字节,那还要额外计算ip报头呢?所以分片两次肯定是不够的,因此要分片三次

所以,分片不是简单的对ip报文进行分片,而是要对每一片添加ip报头

3位标志第一位保留(现在不用,没想好以后可能会用),第二位置为1表示禁止分片

那如果必须分片呢如果第二位置为1,表示禁止分片,那即使要分片,该报文也会被丢弃,因为数据链路层最多只能接收1500字节

第三位表示更多分片如果分片了,最后一个分片置为0,表示这是最后一个分片,没有更多分片了,其余分片置为1

现在理解了分片,那如何组装呢

要解决这个问题,就必须解决以下几个问题。

1.ip报文有的需要分片,有的不需要分片,如何挑选出来分片的报文

2.怎么保证挑选出来的分片,挑完整了

3.完整的分片,如何组装

先回答第一个问题,如果分片了,那么更多分片标志位一定为1,最后一片的更多分片标志位为0,片偏移大于0

那如果没有分片呢?

没有分片,更多分片标志位为0,片偏移为0

回答第二个问题,怎么保证分片全部被挑出来了?那回答这个问题,就要知道什么是不完整的。

报文既然分片了,那我们就可以将这些分片进行划分,第一片分片,中间片,最后一片。所以怎么判断有没有拿到完整的分片呢?

如果是第一片,那它的片偏移为0,如果是最后一片,片偏移大于0,更多分片标志位为0那如果是中间片呢?那我们就可以按照片偏移数字,进行升序排序。因为分片的过程是将有效载荷进行分片,对每一片分片添加ip报头,报头中有13位片偏移表示分片相对于原始报文(有效载荷)开始处的偏移

那如何组装呢根据16位标识就可以提取出同一个报文的所有分片,再按照片偏移进行升序排序就可以组装了

这里要注意几个细节了。如果一个报文分片了,那它在向链路层交付的时候,经过网络发送给对端的网络协议栈。如果丢包的概率为百分之一,那比如一个报文分成了4个分片,那本来一个报文的丢包率为百分之一,现在要把四个分片全部成功的传送过去,那丢包率应该为1-0.99^4,约为百分之三点九,变相的增大了丢包的概率

所以,分片并不是主流

细节一任意分片的丢失,会导致整个报文被丢弃,进行重传

细节二IP协议的总长度是2^16次方个字节,而它只有13位片偏移,那能用13位的片偏移表示这么多的字节吗?答案当然是不行了

所以,真实的片偏移必须是8的整数倍。如果分片的长度为1480,那么真实的片偏移应该是1480/8 = 185。为什么必须是8的整数倍呢?因为IP协议可表示的最大总长度是2^16次方,而片偏移只能表示2^13次方,刚好多个8倍,这样就可以用13位的片偏移表示更长报文的分片了

那IP要不要分片,ip说了算吗当然不算了,是因为传输层传了太多的数据,不得不分片

还记得滑动窗口吗,当时说滑动窗口内的数据是一个报文一个报文发的,为什么一次性不把滑动窗口内的所有数据发送过去因为要考虑ip分片,如果数据太多会导致分片,进而增加丢包率

今天从数据链路层向上看,链路层最多只接受1500字节,网络层ip协议的标准报头是20字节,传输层标准报头20字节,那数据最多只能有1500 - 20 - 20 = 1460个字节,这个1460我们把它叫做MSS(最大段尺寸)但实际数字会比这个小,因为协议中还有选项。所以才叫做最大段尺寸

Logo

葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务

更多推荐