大家好,我是「云舒编程」,今天我们来聊聊计算机网络面试之-(网络层ip)工作原理。
文章首发于微信公众号:云舒编程 关注公众号获取: 1、大厂项目分享 2、各种技术原理分享 3、部门内推
想必不少同学在面试过程中,会遇到「在浏览器中输入www.baidu.com后,到网页显示,其间发生了什么」类似的面试题。 本专栏将从该背景出发,详细介绍数据包从HTTP层->TCP层->IP层->网卡->互联网->目的地服务器 这中间涉及的知识。 本系列文章将采用自底向上的形式讲解每层的工作原理和数据在该层的处理方式。
❝ IP是整个网络架构中的心脏,你的请求可以跨过大洋彼岸,准确的到达目的服务器,就是IP提供的能力。它实现了网络设备点对点通信。 ❞
IP地址(IPv4)由32位正整数构成,在计算机中采用二进制表示。但是为了方便记忆和查看,一般采用点分十进制进行书面表示。也就是将 32 位 IP 地址以每 8 位为组,共分为 4 组,每组以“.”隔开,具体格式如下:
由于限制了IPv4由32位组成,那么IP最大可以表示的值为:2^32=4294967296,也就是最多允许42.9亿多台计算机进行网络连接。
❝ 这里肯定会有人有疑问了:按照现在的互联网发展,网络上的设备早就超过42.9亿多了,那为什么互联网还是在正常运行呢? 其实这得益于两方面的技术:ipv6和NAT。后面会详解介绍 ❞
互联网初开之时,网络上的设备还没有这么多,42亿多的IP地址显得非常充足。于是大佬们大手一挥,决定将IP地址进行三六九等区分,方便进行管理。 IP地址于是被分为了五类:A类、B类、C类、D类、E类。 同时还分为了网络号和主机号,网络号可以对比是小区,主机号可以对比是小区里的房间
❝ 网络号和主机号的划分是为了实现网络地址的层次化管理。通过将网络号和主机号分开,可以将一个大的 IP 地址空间分成多个子网,每个子网可以包含多台计算机。这样可以更好地管理网络资源。 ❞
A类:第一位固定为0,紧接着的7位为网络位,剩下的24位为主机位。 B类:前两位固定为10,紧接着的14位为网络位,剩下的16位为主机位。 .... 其余类推。
所以ip是按照以下原则进行层次分配的:
上述的ip分配原则,具有明显的缺点:
于是人们开始放弃IP地址分类,采用任意长度分割IP地址的网络标识和主机标识。这种方式叫做CIDR(无类型域间路由)。
CIDR采用 a.b.c.d/x 的形式表示IP,其中 /x 表示前 x 位属于网络号, x 的范围是 0 ~ 32,这使得 IP 地址更加具有灵活性。 例如: 203.183.224.0/24
地址数 | 2^8-1=255 |
---|---|
网络号 | 203.183.224.0 |
第一个IP地址 | 203.183.224.1 |
最后一个IP地址 | 203.183.224.255 |
CIDR应用的初期,网络内部采用固定长度的子网掩码机制,也就是说,当子网掩码的长度被设置后,域间的所有子网掩码都得使用同样的长度。 但是假如一个公司的市场部有100台电脑,销售部有70台电脑,一般企业中会希望将不同的部门划分成为不同的网段,一方面为了安全,一方面是为了方便网络管理。 如果想用c类地址段分别给三个部门划分不同的网段,我们看到需要用到三个c类地址段,我们知道一个c类地址段里就有254个主机地址,而这里用到了三个c类地址段,就造成了ip地址浪费的情况,为了保证ip地址的高利用率,这时候我们用到了vlsm(可变长子网掩码)。
除了使用上诉a.b.c.d/x分割网络号主机号,还可以使用子网掩码的形式进行分割。
❝ 子网掩码仅具有一项功能,即将IP地址分为两部分,即网络地址和主机地址。子网掩码也是由32构成,子网掩码不能单独存在,必须与IP地址一起使用。 ❞
将ip地址跟子网掩码进行and运算,就可以得到IP地址的网络号。 例如图中IP地址为:203.183.224.1,子网掩码为:255.255.255.0。两者and运算得到:203.183.224.0。这就是该IP对应的网络号。同时子网掩码不为0的部分有8位,所以主机部分有8位可以进行分配。
还是以上面的公司举例: 假设公司有一个C类地址:192.168.1.0 我们都知道这样一个c类地址段里有256个地址,接下来我们将这256个地址划分成两个不同的网段,一个给市场部,一个给销售部。 假设我们从8位主机位中借一位,当做内部网段的网络位:
那么市场部的网络号就是:11000000.10101000.00000001.0 0000000(后面7位可以分配给主机) 那么销售部的网络号就是:11000000.10101000.00000001.1 0000000(后面7位可以分配给主机) 那么相应的子网掩码就变为:11111111.11111111.11111111.1 0000000,表示为10进制:255.255.255.128 同样的,只要主机位有剩余的位可以借,市场部内部还可以继续划分为市场部一、市场部二。 通过这样的形式就可以把网络划分为不同的子网。
前面已经了解了IP的构成,接下来进入本章的重点:路由控制 再次回顾上一篇最后画的网络拓扑图:
❝ 补充:其中A,D的子网掩码都为255.255.255.0 ❞
假设A现在要发消息到D,也就是192.168.0.1要发消息到192.167.0.1。
image.png
默认网关是提前配置好的一条路由规则,存储在路由表中,一般使用default标识。 默认网关一般情况下由路由器担当。
❝ A的默认网关必须跟A在同一个子网,D的默认网关必须跟D在同一个子网。但是A的默认网关可以不跟D的默认网关在同一个子网 ❞
通常情况下,默认网关的IP地址就是直接连接的路由器的某个端口的IP地址。 一般情况下,当主机发现目的IP跟自己不是同一个子网时,就会把消息发给默认网关,由默认网关进行下一步处理。
前面说到,A发送消息给默认网关时,需要知道默认网关的mac,但是路由表中只有ip地址,该怎么获取mac地址呢?这就是arp协议的作用了。
当A需要知道某个ip的mac地址时,他就会广播arp消息:ip=xxx的mac地址是多少啊。当同一个子网上的设备收到消息后会判断ip与自己是否一致,一致的话就会响应消息:我的mac地址是xxx
当A把消息发送给路由器后,路由器怎么知道把消息发送给D呢? 这就是路由表的功能了。
❝ 路由表是一个存储在路由器或者联网计算机中的电子表格(文件)或类数据库。它存储了网络周边的拓扑信息。他为路由器指明了怎么把收到的消息包正确发送出去。 ❞
路由表主要由以下几部分组成:
目的网络/掩码 | 协议类型 | 开销 | 下一跳 | 输出接口 |
---|
假设有如下路由拓扑:
A现在要发消息到D,也就是10.1.1.30要发消息到10.1.2.0。
10.1.2.0/24 | 10.1.0.2 | 2 |
---|
这条路由规则将消息从端口2发送给10.1.2.1(路由器2)
10.1.2.0/24 | 10.1.2.1 | 2 |
---|
这条路由规则将消息从端口2发送给D
静态路由一般就是手动配置的,可管理性高。 缺点: 1、如果网络特别庞大、设备数量特别,配置的工作量就相当大了,这是很低效的; 2、静态路由无法根据网络拓扑的变更做出动态响应,因此当网络发生变化时,管理员可能不得不重新配置或调整静态路由。 所以静态路由一般很少使用。这里我们也不做讲解。
❝ 动态路由可以根据特定的算法策略,通过路由器之间不断地交互信息,从而建立和更新自己的路由表。可以更好的适应网络变化 ❞
目前比较常用的是:基于链路状态路由算法的OSPF(Open Shortest Path First,开放式最短路径优先) 它把链路状态信息的获取分成了4个主要步骤:
本机ID | |
---|---|
序号 | |
生存期 | |
邻居1 | 链路成本 |
邻居2 | 链路成本 |
。。。 |
image.png
A的最短路
A->B
A->B->D
A->B->D->E
A->B->D->E->F
A->C
A的路由表
Destination Gateway
B B
C C
D B
E B
F B
类似我们在日常生活中寄快递,如果我们的东西非常多,那么会把东西分别打包成几个包裹再进行寄送。 在网络中也是一样的,受限于光缆和路由器内存限制,所以单个数据数据包不能过大,过大时需要分割成几个数据包再进行发送。
IP报文的首部格式如下:
其中以下三个字段控制IP分片重组
还是以前面说的为例:假设需要发送4342字节的数据,由于MTU=1500,那么数据包就会被分割成3个数据包发送出去。
分片一:包含原包前 1480 字节数据,因此偏移量 offset=0 ,而 MF=1 表示后面还有其他分片。 分片二:包含原包紧接着的 1480 字节数据,偏移量 offset=1480/8=185 ,MF=1 ; 分片三:包含原包最后 1381 字节数据,偏移量 offset=(1480+1480)/8=370 ,MF=0 表示它是最后一片了。
目标主机操作系统会分配一块内存作为重组分片的缓冲区,缓冲区存在多个队列。
经过ip层的补充讲解,现在我们的网络分层长这样了,接下来我们需继续讲解TCP层。