网络原理
介绍TCP/IP协议中每一层里面的核心内容~
- 应用层
- 传输层
- 网络层
- 数据链路层
- 物理层
一、网络层
接下来介绍网络层
网络层做的工作,就是在两点之间,规划处一个合理的路径~
同时也需要对主机所处的位置,进行定义~
这里网络层做的工作:
- 地址管理
- 路由选择
1.IP协议
IP复杂程度和TCP相比不遑多让
针对IP协议只介绍一些简单的原理~
为啥就转发这几次就能到? 基于一个社会科学上的理论: 六度空间理论
每个路由器,都认识和他相邻的路由器 (它的朋友)~~
朋友进一步还有朋友~
源IP : 发件人地址
目的IP : 收件人地址
IP地址,本质上是32位的整数 ,4个字节,类似于一个int。
为了给人来看,通常就会把这个32位的整数,转成"点分十进制" 表示方式
🎑例如:
61.156.196.5
, 使用3个点,把IP地址分成4个部分,每个部分1个字节,每个部分的取值范围0-255
IP地址用来区分网络上唯一一台主机~
🎀一个IP地址,是4个字节,32个bit位,能表示的范围,0 - 42亿9千万
按照上述设定,IP地址最多只能表示不到43亿个不同的主机
但此时当前能够上网的设备早已超过了这个数值!
这就诞生了一个非常关键的问题,IP地址不太够用~
IP地址不够用,有如下几种解决方案:
- 动态分配IP地址~
设备上网的时候才分配IP地址,不上网的时候,就把IP回收,给别人用
这种方案,并没有增加IP地址的数量,只是提高了利用率而已,治标不治本! NAT
机制~ (主流机制)
不再强制要求,每个主机都有独立的IP。
把IP地址分成两大类:
- 外网IP /公网IP
- 内网IP/私网IP/局域网IP
约定 10 .*
,172.16-172.31.*
,192.168 .*
都是局域网IP
并且约定,在同一个局域网内部,IP不能重复~
以上IP全是内网IP,其他的IP都是外网IP
但是在不同的局域网IP中,IP之间允许重复~
比如我的电脑在我家的局域网里,IP唯一 。
别人的电脑在别人家的局域网中,也可以和我有一样的IP 。
如果在局域网内部,想访问某个外网的服务器,就会使用一个外网IP来代替一大波局域网中的设备(大大的节省了外网IP的个数了)
NAT
机制图解:
返回:
IP一般来说不是固定的,有动态IP和静态IP之分 ~
运营商路由器还连接着很多很多千家万户的设备
一个外网IP就可以代替上万个设备
当前网络环境的现状,就是NAT + 动态地址分配
我这里启动的服务器(UDPEchoSever
),别人就访问不了~
为啥不行,就是因为NAT~
我的IP只是局域网内部能够使用的,我可以通过NAT
设备访问到 外网的IP ,但是我无法访问到其他的内网的设备~
如果你想在局域网里访问另一个局域网中的设备:
- 内网穿透
- vlan
简单介绍下内网穿透:
vlan
也是借助一个外网IP服务器,然后把连着它的几个主机加到一个虚拟的局域网去,给它们重新分配一个虚拟的局域网IP
- 彻底解决IP地址不够用问题的方案:使用IPv6
IPv4
4字节,32位来表示IP地址
IPv6
,16字节,128位表示IP地址(42亿 * 42亿 * 42亿 * 42亿)
❓IPv6
已经提出很多年了,当前网络的现状仍然是 NAT+ 动态分配,为什么IPv6没有大规模普及呢?
因为IPv6
和IPv4不兼容~
要想升级,就需要把路由器从IPv4升级到IPv6(花钱)!
关于IP地址具体的规则
IP地址组成:
IP地址分为两个部分,网络号和主机号
- 网络号 : 标识网段,局域网的身份标识
在两个相邻的局域网中,要求网络号是不同的(同一个路由器连接的局域网),WAN口和LAN口得有不同的网络号 - 主机号:标识主机
同一个局域网中,主机之间的网络号是相同的,主机号必须不同
子网掩码: 划分出从哪里到哪里是一个网络号
子网掩码有32位,左半边都是1,右半边都是0(不会10 混着)
左半边有多少个1,就表示IP地址左侧的多少位是网络号
(把子网掩码和IP地址进行按位与运算,得到的结果是网络号)
255
=>0xFF
=>11111111
也就是说左边24个1,后面8个0,所以前3个字节就是网络号
IP地址:
192.168.1
就是网络号,后面的180
就是主机号
我的局域网里,我的电脑,我的手机,其他的设备,只要是连到我这个路由器上,大家的网络号都是192.168.1
但是主机号是不同的~
我家的路由器又连着我家的光猫,我的路由器连接了两个局域网,这俩局域网的网络号是不同的
特殊的IP地址 :
- 如果一个IP地址,主机号为0,此时这个IP就标识网络号,
192,168.0.0
代表当前局域网 - 如果一个IP地址,主机号为1,此时这个IP往往表示这个局域网的" 网关 ",
192.168.0.1
,代表局域网的网关(通常就是路由器的IP)
网关:
出入口,网关的角色一般就是路由器,把守着当前局域网和其他局域网之间的出入口(这个不是强制要求,只是习惯,可以手动改掉)
- 如果一个IP地址,主机号为全1,此时这个IP表示广播IP,专门用于同时向网络中所有工作站进行发送的一个IP
例:10.1.1.255
(255
即为2
进制的11111111
) 127.*
开头,都是"环回IP"(表示自己的主机)
典型的就是127.0.0.1
实际上只要是127
开头的都是环回IP
2.路由选择
就像地图导航一样,能够在两点之间规划出一个路线~
路由选择,是"启发式"的过程~
非常类似于"问路"
IP数据报中,就包含 目的IP
网络数据报到达路由器的时候,路由器自身有一个"路由表"数据结构(路由表就是这个路由器认识的路)
一个路由器无法认识到网络的全貌,但是可以认识附近的一部分~
如果当前的目的IP路由器认识,就会给出一个明确的路线~
如果当前的目的IP路由器不认识,路由器就会把数据报转发给一个"更见多识广"的路由器(在路由表里有个默认的选项,下一跳)
❓是否可能问了一大圈也没找到目的地呢?
有可能 ,比如IP地址不存在(或者不可达),此时就与TTL联系起来,TTL减到0,就不再转发了~
路由过程不光是找一条路,也需要筛选一条更好的路~
二、数据链路层
简单介绍数据链路层
以太网
以太网帧格式:
mac
地址:标识主机的位置,和IP一样,是定位的作用。
mac
地址通常使用16进制来表示~
mac
设计的时候,6个字节~ 当下mac
地址还是够用,是可以让每个主机都有独立的mac
地址,这个地址是网卡出厂的时候就写好了~
正经的网卡,出厂的时候会被分配一个唯一的
mac
地址,但是也有一些山寨厂商,没有相关的资质,生产的网卡的mac
地址可能和别人重复~
由于当前mac
只是在数据链路层使用~
只要相邻区域内的设备mac
地址不重复即可~
因此在网络上,mac
地址也可以作为是主机身份标识的一种方式~
❔都有一套IP地址了,为啥还要在搞一套mac地址呢?
历史原因
设计IP地址的人和设计mac地址的人是两个团队~
两个团队各自独立的搞了一套地址体系~
💖举个例子:
有一个网络数据报,从A转发给B,转发过程中需要经过C D
源IP和目的IP始终都是起点和终点,但是源mac
和目的mac
是此时所处的位置和下一个位置
IP数据报传输过程:
CRC
: 校验和
UDP的时候就已经说了校验和了,UDP的校验和是通过软件来计算的~
CRC是交给硬件(网卡来算的)
软件是算不过硬件的~
很多硬件设备功能越来越复杂,也越来越丰富了
总结
☕面试题:
从浏览器这里输入一个URL
到最终展示出页面,这里大概都会发生哪些事情?
从后端开发的角度:
- 进行DNS域名解析
网络上的设备都是IP地址作为身份标识的,但是IP地址不好记,不好传播,此时就可以使用一串单词(域名),来表示这个IP地址
DNS
系统功能就是把域名自动转换成IP地址
2.进行封装
浏览器就可以构造出HTTP
数据报(这个后面详细介绍)
交给了传输层,TCP
TCP
就根据刚才的地址,先建立连接(三次握手)
然后再发送刚才的HTTP
请求
数据交给了网络层,IP协议
IP协议封装成IP数据报
IP数据报再交给数据链路层,封装成对应的数据帧,最终通过网卡传输出去(物理层)~
3.进行传输
中间会经历一些交换机和路由器
交换机会把数据分用到数据链路层(更上层的就不再进行解析了)
再重新封装,继续转发,路由器会把数据分用到网络层(更上层就不解析了)
路由表匹配过程~ 路由器根据数据报中的目的IP在路由表中匹配,找个合适的方向发出去,每次转发TTL-1
- 到达目标服务器之后,服务器进行层次分用~
一直到HTTP
这一层(HTTP具体解析过程后面再说)
服务器就会找到你想访问的那个资源,把资源再进行构造成HTTP
响应(根据请求计算响应)- 服务器把响应数据重新封装
- 响应数据再中间进行转发,回到浏览器
- 客户端这里再针对数据进行解析~ (分用)
- 解析出一个网页,渲染到浏览器上