🕸️ 之前,我们在这篇 【Linux】: 传输层协议 TCP 已经讲了关于 传输层上,TCP 究竟做了什么,那么实际在网络层中,tcp究竟做了什么,ip 又扮演了什么角色?
现在,我们来看下面一个小故事,方便我们对后面的理解,如下:
张三老爹是教务处主任他要求张三每次数学考试都考100分,张三也很争气,10次数学考试8次都是100分,但是架不住意义可能考了95分。而张三老爹每次必须让张三数学考100分,那张三老爹怎么办呢?他决定之前考试作废,重新考试,如果张三还没有考到,那考试继续作废,直到张三考到100分。
刚才我们两个人,一个教务处主任(张三老爹),张三(儿子)。考试的是张三,他也有能力考到100分,但并不一定每次都考到100。张三没考到没事他还有他老爹,他可以让他儿子继续考。
因此现在我们可以知道,前面 tcp
学的超时重传、确认应答、流量控制等等全都是策略!而具体怎么做全部都是由 ip
来执行!
主机: 配有 IP 地址, 但是不进行路由控制的设备; 路由器: 即配有 IP 地址, 又能进行路由控制; 节点: 主机和路由器的统称;
比如上面图中,主机B 要到达 主机C,它两并不是直接连接的,下面补充两个问题
因此我们可以得到一个小结论: IP = 目标网络+目标主机
举个例子,就比如我们要去旅游,如果要去目标城市 --> 就需要经过一些目标地点(高铁站、酒店 …),最后到达我们最后目的地
因此我们可以得到一个结论:这是一套精心设计过的网络体系!
在学习任何网络协议之前,需要先理解以下两个基本问题:
IP 报头与有效载荷分离
分离方法 (第一层:
version
):指定 IP 协议版本,对于IPv4来说总是4。注意:IPv4和IPv6之间没有直接兼容性。header length
):表示IP报头总长度,单位为4字节。取值范围是【5, 15】(对应于20到60字节),其中5是最常见的值,代表20字节。total length
):指整个IP报文的长度,包括报头和有效载荷。Type Of Service
): 为什么需要16位总长度?
确保接收方完整地接收到整个IP报文。 因为IP报文是以独立报文形式存在,并非像TCP那样的连续字节流,因此需要明确标示出报头和有效载荷的具体长度。
(第二层:涉及到 IP 报文和分片(后面会讲)
framegament offset
): 是分片相对于原始 IP 报文开始处的偏移, 其实就是在表示当前分片在原报文中处在哪个位置, 实际偏移的字节数是这个值 8得到的。 因此 除了最后一个报文之外, 其他报文的长度必须是 8 的整数倍(否则报文就不连续了)如何交付 (第三层:
Time To Live, TTL
):定义了数据报到达目的地前允许经过的最大跳数。通常初始化为64,每经过一个路由器TTL减1,直至归零仍未达目的地则被丢弃。此字段 防止出现路由环路
CRC
)来检测头部错误。如果发现损坏,则丢弃该包,TCP随后会触发重传机制。
引入:
路由器的工作只在网络层,没有 tcp 层。只有两台主机有 tcp 层,src_ip:src_port(进程)->dst_ip: dst_port(进程)
背景说明:
互联网上的所有IP地址都是经过精心设计和规划的。 强调理解IP地址网段划分及子网划分的重要性,不应仅停留在对子网掩码等技 细节的理解上,而要从更宏观的角度去认识这一过程。
宏观理解:
复杂性与挑战:
具体网络划分:
路由器的作用:
子网是由一组网络号相同的主机组成的集合
那么子网是怎样进行管理的呢??
问题背景:
管理设备:在一个子网中,负责管理子网内IP的通常是路由器。
自动管理解决方案:
🤪 我们来讲一个小故事,背景如下:
每个学校都有很多学院如计算机学院、理学院、化工学院、机械学院、电子信息工程学院等等,每个学生也都有自己的学号,这个学号其实是经过精心设置的。这里我们简化一下把 学号 分成 学院号+自己所在院系内的编号。每个学院也都有自己的编号。 每一个学院都有自己院学生会主席并且他还是院群里面的群主,而且他也有属于自己的学号。并且这个学号在全校范围内唯一。每个院学生会主席都还要在加一个校学生会主席群。
事件如下: 今天电子信息工程学院的一名普通学生李四同学把自己学生证丢了,学生证上面其他信息都模糊看不清了,只有学号(101 00101)可以看得清。 然后计算机学院张三同学(学号:000 01001)在校园内捡到这个学生证。张三同学就想把学生证归还给该同学,但这个学生证只有 学号 看的请。可是张三除了自己院学生号清楚并不清楚其他院的学号。
方法如下: 他知道 学号在全校范围内唯一,他要找这个人,因此张三就在食堂门口抓住一个人就问同学你的学号
查找本质是在做排除。如果进行线性遍历,效率太低了,所以就有了我们的方法二,如下:
因此我们可以从上例知道:网络通信本质是把数据交给目标主机
张三:源主机 李四:目表主机 院学生会主席:路由器 院内的群:局域网 校学生会群:公网
捡到的李四钱包中的学号(ip):学院(目标网络)+学号(目标主机)
补充知识:路由器,认识主机,认识网络目标中的转接,局域网到公网中的查找
为什么第二种方法这么快?因为一次排除一群,排除的效率更高。通过校学生会可以直接锁定了电信学院,排除了其他学院,相当于进行了 网络划分
IP地址分为两个部分,网络号和主机号:
根据网络号查找目标网络,进入目标网络后,再查找并对比IP中的主机号,就确定了目标主机。
最开始时提出一种划分网络号和主机号的方案,把所有IP地址分为五类,如下图所示: 如下图所示 (该图出 自[TCPIP])
什么是 A、B、C 类地址?
其中对于 A、B、C 类主要分为两个部分,分别是网络号和主机号。这很好理解,好比小林是 A 小区 1 栋 101 号,你是 B 小区 1 栋 101 号。
我们可以用下面这个表格, 就能很清楚的知道 A、B、C 分类对应的地址范围、最大主机个数。
那么 A、B、C 分类地址最大主机个数是如何计算的呢?
最大主机个数,就是要看主机号的位数,如 C 类地址的主机号占 8 位,那么 C 类地址的最大主机个数:2^8-2=254
为什么要减 2 呢?
因此,在分配过程中,应该去掉这两种情况
什么是D、E类地址?
相比于上面的 A、B、C类, D 类和 E 类地址是没有主机号的,所以不可用于主机 IP,D 类常被用于多播,E 类是预留的分类,暂时未使用。
① 广播地址用于什么? 广播地址用于在同一个链路中相互连接的主机之间发送数据包。
广播地址可以分为本地广播和直接广播两种。
② 多播地址用于什么? 多播用于将包发送给特定组内的所有主机。
多播使用的 D 类地址,其前四位是 1110 就表示是多播地址,而剩下的 28 位是多播的组编号。
从 224.0.0.0 ~ 239.255.255.255 都是多播的可用范围,其划分为以下三类:
IP分类的缺点:
缺乏地址层次性: 在同一网络中使用了B类地址,但是无法按照生产、测试、开发等环境来划分地址层次。这种情况下,缺少地址的层次性划分,使得IP地址的管理和分配缺乏灵活性和有效性。
A、B、C类地址的限制:
虽然上面分类很好,但是随着 Internet 的飞速发展,这种划分方案的局限性很快显现出来大多数组织都申请 B 类网络地址, 导致 B 类地址很快就分配完了, 而 A 类却浪费了大量地址;
例如,一个B类地址理论上允许单个子网内存在超过65,000台主机;而A类则更多。然而实际网络架设中很少有网络需要如此多的地址空间,导致许多分配出去的地址并未得到充分利用。
为解决上述问题,提出了CIDR机制
CIDR地址表示通常采用IP地址加上斜线后跟随的子网掩码位数,比如 10.100.122.2/24,这种地址表示形式就是 CIDR,/24 表示前 24 位是网络号,剩余的 8 位是主机号。
10.100.122.2/24
表示IP地址为 10.100.122.2
,属于一个使用子网掩码 /24 的网络,该网络的范围是 10.100.122.0
到 10.100.122.255
,可以支持最多254台主机连接(因为0和255分别是网络地址和广播地址,不能用于主机)
还有另一种划分网络号与主机号形式,那就是子网掩码,掩码的意思就是掩盖掉主机号,剩余的就是网络号。
子网掩码用于将IP地址分成网络部分和主机部分。对于IP地址 10.100.122.2/24,子网掩码 /24 表示前面24位是网络部分,后面8位是主机部分。
现在让我解释一下如何计算子网掩码和网络地址:
IP地址: 00001010.01100100.01111010.00000010
子网掩码: 11111111.11111111.11111111.00000000
----------------------------------------------
网络地址: 00001010.01100100.01111010.00000000
最终得到的网络地址是 10.100.122.0
目的IP & 当前路由器的子网掩码 = 该报文要去的目的网络
在上面我们知道可以通过子网掩码划分出网络号和主机号,那实际上子网掩码还有一个作用,那就是划分子网。
子网划分实际上是将主机地址分为两个部分:子网网络地址 和 子网主机地址
下面我们再来看看子网划分的例子,如下: 【案例1】:
例如上面的 IP 地址:140.252.20.68/24
【案例2】:
225.225.255.240 前面28位是网络号,后面4位是主机号~计算思路如下
可见,IP地址与子网掩码做与 & 运算可以得到网络号,主机号从全0到全1就是子网的地址范围
特殊的 IP 地址
loop back
)测试,通常是 127.0.0.1local 设备如下:
我们知道, IP 地址(IPv4)是一个 4 字节 32 位的正整数。 那么一共只有 2 的 32 次方 个 IP地址大概是 43 亿左右,而 TCP/IP 协议规定每个主机都需要有一个 IP 地址.
那么这是不是意味着一共只有 43 亿台主机能接入网络❓
实际上由于一些特殊的 IP 地址的存在数量远不足 43 亿;另外 IP 地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个 IP 地址.
此时, CIDR
在一定程度上缓解了 IP
地址不够用的问题(提高了利用率, 减少了浪费, 但是 IP
地址的绝对上限并没有增加),仍然不是很够用。这时候有三种方式来解决:
IPv4 首部与 IPv6 首部的差异如下图:
Pv6 相比 IPv4 的首部改进:
NAT是现在内网到公网上数据转发的主流技术。目前我们用IPv6也能访问公网也是用的类似技术
现在我们知道IP地址可以被分成内网IP和公网IP,那么哪些是内网IP?哪些又是公网IP?
那网络既有内网又有公网我们该如何理解呢?
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet 上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址,如下:
IP | 网络号 | 地址数 |
---|---|---|
10.*/ | 前8位 | 共16,777,216个地址 |
172.16./12 ~ 172.31./ | 前12位 | 共1,048,576个地址 |
192.168.*/ | 前16位 | 共65,536个地址 |
注意:只能用上面这三类来组建局域网,而包含在这个范围中的,都称为私有IP。 其余的则称为全局IP(或公网IP)
因此之前我们经常说IP地址具有唯一性,通常谈的是 全局IP 或者说是 公网IP
验证:ipconfig 查看
公网IP在整个网络都不能重复,但私网IP在不同网段内是可以重复的。
公有 IP 地址由谁管理呢?
链路层限制有效载荷的大小,一般为1500字节。每种数据链路的最大传输单元 MTU 都是不相同的,如 FDDI 数据链路 MTU 4352、以太网的 MTU 是 1500 字节等。如果IP报文过大,就必须分成多个数据包交给链路层。
分片和组装都是IP协议的任务。
分片会提高报文丢失的风险,所以一般不分片。传输层控制会报文的大小,这样IP层就不需要分片。
一旦数据包丢失,所有数据包都会丢弃,反映到传输层就是触发重传。
字段 | 解释 |
---|---|
16位标识 | 报文的标识各不相同,分片报文的标识是一致的,可以根据标识查找分片的报文 |
13位片偏移 | 片偏移表示分片报文的有效载荷距原始有效载荷起始位置的偏移量 |
3位标志 | 1位保留,1位禁止分片,1位更多分片:为1表示中间报文,为0表示为结尾报文 |
如果报文丢失了,如何检验呢?
比如:一个3420字节的IP报文,可以分成3个分别是1480、1480、440,再给加上报头即可
接收端如何判断收到的报文是普通报文还是分片报文?
我们可以在 IPSHU 上查看全球 IP 的使用情况
背景:当我们想在家中上网时,如果我们已经使用了某个运营商的手机卡,只需要打电话给运营商,联系其安装网络的师傅来安装。
他们通常会带来一个调制解调器(俗称“猫”)和一个路由器,安装人员会将网络账号与密码设置好,接着配置无线网络名称和密码,这样,家里的设备就可以通过WiFi上网了。
网络基础设施的来源
因此,运营商实际上位于用户和互联网服务提供商之间,扮演着基础设施建设者的角色。
网络访问的控制
运营商有权限制你的网络访问,尤其是当你欠费时,他们可以阻止你的数据报文的转发。除此之外,运营商也可以审核你的上网内容。
例如,发现你尝试访问谷歌、推特等被限制的网站时,运营商可以选择不转发你的请求。
在网络架构上,用户必须 经过运营商的网络才能访问外部互联网服务
主要功能:
组建局域网
在上网过程中,通常会遇到两种密码:
解释: ① 上网账号密码:这是你向互联网服务提供商申请宽带服务时获得的一组账号信息。
② 路由器账号密码:实际上这里可以分为两个部分:
因此我们可以知道:如果邻居能够蹭网,则意味着他们知道了你的Wi-Fi密码。这是因为只要知道正确的Wi-Fi密码,任何人都可以连接到你的无线网络上。
每个家庭都有自己的路由器,负责创建家庭局域网,使用 192.168.*
开头的内网IP。当家庭网络连接到互联网时,需要通过运营商的网络。所以家庭路由器实际上跨越了两个子网:
结论:这意味着当数据从家用路由器发出时,先到达运营商的子网,再经过多级路由器,最终转发到公网。
家庭路由器会配备两个IP地址:
同理,运营商的路由器也具有LAN口IP和WAN口IP:
然而,这带来了一个问题:当不同局域网中的设备使用相同的IP地址(例如,192.168.1.201)时,外部服务提供商(如抖音)如何知道数据包应该返回到哪个局域网?
路由器能横跨两个网络,所以要配两个IP,LAN口连接内网,WAN口连接外网。 IP数据包的传输时,路由器将目的IP与路由表进行对比:
个人主机上的 IP 是私有 IP,而且每个路由器都有两个IP地址:
路由器内的主机(如手机、电脑等)使用局域网的IP地址,而这些IP地址在不同的局域网中是可以重复的。
路由 在复杂的网络结构中, 找出一条通往终点的路线;
IP 数据包的传输过程也和问路一样.
那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表;
route
命令查看假设某主机上的网络接口配置和路由表如下:
这台主机有两个网络接口,一个网络接口连到 192.168.10.0/24 网络,另一个网络接口连到 192.168.56.0/24 网络;
Destination
是目的网络地址,Genmask
是子网掩码,Gateway
是下-跳地址,lface
是发送接口,Flags
中的 U标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有 G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;转发过程例 1:如果要发送的数据包的目的地址是 192.168.56.3
转发过程例 2:如果要发送的数据包的目的地址是 202.10.1.2
公网和子网的划分通常可以通过IP地址和子网行。
比如,如果从美国发出一个请求,目标IP地址是湖南长沙的服务器
整个互联网的拓扑结构虽然复杂,但这种逐级转发的逻辑是其核心。运营商在地方上建立了本地网络,并将不同子网进行划分,然后通过公网入口路由器与全球互联网连接。
网络模式如下,可以看到,在接入长沙之后,由公网入私网
注意:
私有 IP 不断被替换的过程:NAT 技术(后面会讲) 为了解决 IP 不足问题,采取了 互联网 = 公网+私网 的模式