我们每天使用互联网,你是否想过,它是如何实现的?
全世界无数台电脑,连接在一起,两两通信。上海的某一台电脑送出信号,洛杉矶的电脑居然就收到了,两者实际上根本不知道对方的物理位置,你不觉得这是很神奇的事情吗?
五层协议的体系结构
互联网的实现,分成好几层。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。
用户接触到的,只是最上面的一层,根本没有感觉到下面的层。要理解互联网,必须从最下层开始,自下而上理解每一层的功能。
物理层
电脑要组网,第一件事要干什么?当然是先把电脑连起来,可以用光缆、电缆、双绞线、无线电波等方式。
上面的这个网线我们可以简单理解这就是我们所说的“物理层”,类似古代发电报一样,使用强弱电流表示0和1,因为电脑所有数据都是二进制,也就是说,电脑其实只认识0和1
数据链路层
有了物理层,我们只有0和1电信号。仅仅有一串0和1是没有意义的。这也是因为什么我们传0和1的电报,不怕泄露。因为,没有解析规则,你即使拿到了0和1 的电信号,也是没有意义的。
基于上面的问题,我们需要有一个规则来解析0/1电信号。多少电信号组成一组,然后每个电信号什么意义。这就是数据链路层的功能。我们主要使用的协议就是“以太网协议”
以太网协议规定:一组电信号构成一个数据包,这个数据包叫做“帧”,每一帧分两个部分:head+data
head:发送者,接收者
data:数据包的具体内容
然后上面我们知道数据包的head主要包括发送者和接收者。那这个发送者和接收者怎么标识呢?
以太网规定:接入网络的所有设备,都必须具有“网卡”接口。数据包必须从一块网卡,传送到另一块网卡。
每块网卡出厂的时候,都有一个全世界独一无二的MAC地址
我们可以用ipconfig/all,查看一下
接下来有两个问题:
1.我们怎么知道远在国外的朋友的网卡的MAC地址(通讯本质:一个网卡传递数据包给另一个网卡)
【这个主要实现是使用的ARP协议,这个在后面网络层再讲】
2.就算我知道了对方的MAC地址,系统怎么把数据包准确的送给接收方?
这个实现:以太网使用广播的方式。他把数据包发送给本网络的所有计算机,让每台计算机自己去判断是否接受。
上面如果①要向②发送数据包;①就把数据包广播给所有人,然后每台计算机取出数据包的头部,这样就知道接收者的mac地址,然后与自己的mac地址比较,如果相等,就接受,如果不等就丢弃。这就是广播的方式。
网络层
按照上面的以太网的协议,依靠mac地址发送数据。理论上,单单依靠mac地址,北京的网卡可以给洛杉矶的网卡数据包。技术上是可以实现的。但是,这样做有一个重大的缺陷:以太网以广播的方式发送数据包,所以每个人发送一个数据包,全世界只要入网的计算机都可以收到。不仅效率极低。而且很容易造成网络崩溃。
所以做了一个限制,只有同一个子网中的电脑可以接受广播的数据包,不同子网是广播传不过去的。
互联网是由无数的子网络共同组成的一个巨型网络。
因此,必须找到一种方法,区分哪些MAC地址的属于同一个子网,哪些不是,如果是同一个子网,就采用广播方式传送数据包。然后跨子网间的通信,我们交给网关去处理。【网关在这次分享中不涉及】
单单的mac地址,根本无法区分哪些计算机在一个子网中,由于这个问题,所以网络层就出现了。
网络层出现后,每个电脑就会有两个地址,一个是网络地址(ip地址),一个是mac地址;mac地址和网络地址没有任何关系,mac地址是与网卡绑定的,而网络地址是我们联网后网络管理员给我们分配的。
mac地址帮我们将数据包送到该子网的目标网卡,网络地址帮我们确认计算机所在的子网,具体是怎么确认的请看下文分解。
网络地址为什么能确认计算机属于哪个子网呢?
我们必须知道ip地址的组成,如下图:
如果网络id部分一样,说明两个计算机在一个子网中,但是,这里的网络id是不固定的,有的是前8位表示网络id,有的是前16位表示网络id,有的是前24位表示网络id。这是怎么确定多少位表示网络id呢?
为了确定一个网络到底多少位表示网络id,另一个参数就出现了“子网掩码”。
11111111.00000000.00000000.00000000 =>表示前8位是网络部分
11111111.11111111.00000000.00000000 =>表示前16位是网络部分
11111111.11111111.11111111.00000000 =>表示前24位是网络部分
那么计算机怎么判断的呢?
已知IP地址172.16.254.1和172.16.254.233
子网掩码都是255.255.255.0
让两个ip地址都和子网掩码做AND运算 得到的结果都是172.16.254.0,所以上面两个ip地址属于同一个子网。
经过上面的学习,我们知道网络层的数据包中一定会包含ip地址。
由于上一层是依赖下一层,所以网络层的数据包是需要放入以太网的数据包
到这里我们可以解释一个问题,就是我们想要和另一台电脑通讯,我们是怎么知道另一台电脑的mac地址的。因为通讯的本质是:从一个网卡发送数据包到另一个网卡,所以mac地址是一定要知道的。
答案:其实就是ARP协议。简单理解就是,发一个广播数据包,这个数据包核心两个东西:接收方的ip地址和接收方的Mac地址。ip地址我们肯定知道,比如我们浏览器网址就是对方的ip地址。而对方的mac地址是我们要想知道的,此时我们使用特殊标识:比如:FF:FF:FF:FF:FF:FF
其他电脑接受到了这个数据包后,比对接收方的ip地址和自己的ip地址是否一致,如果一致,就会把自己的mac地址返回给发送方。这样是不是就知道了接收方的mac地址。
比如①是我的电脑,②百度服务器电脑
此时:我们想要访问百度,肯定是知道百度的域名,其实域名也就等于ip地址。但是我们要给百度服务器发送数据包必须知道②的mac地址。此时我们发送的数据包包括:②的ip和②的mac地址,此时是不知道②的mac地址,只是为了查找②的mac地址,所以需要把接收方的mac地址写成一个特殊的:FF:FF:FF:FF:FF。
此时子网上的所有电脑都会收到这个数据包,当他们发现这个数据包的接收方的mac地址是FF:FF:FF:FF:FF,说明这个数据包的作用是为了获取接收方的mac地址,他们把自己的ip地址与接收方的ip地址比对,一致,则会原路回复发起者自己的mac地址。
至此我们知道了ip地址和mac地址,我们已经可以和互联网上任意两台计算机建立通信了。但是又有一个问题, 比如:我们一边用浏览器浏览网页,一边和朋友在线聊天,这时候有一个数据包发过来,我怎么知道他表示的网页的内容还是聊天的内容呢?这时候传输层就出现了
传输层
传输层是怎么区分发过来的数据包属于哪个应用呢?答案就是“端口”
上面的网络层其实是实现了:主机和主机之间的通信
传输层实现了:端口和端口之间的通信
对于端口,我们并不陌生。我们浏览器中的每一个tab就相当于一个web应用。也就有一个端口,对于没有端口的是因为使用默认端口“80”,这个80端口可以省略,所以只有域名。
将传输层的数据包放入网络层中数据包中,就是下图这样的
对于上面的分析,我们知道,我们的数据包中一定要加上端口信息,所以这就需要新协议:UDP和TCP,但是UDP和TCP有什么区别的?
UDP是不可靠的
TCP是可靠的【tcp可以近似理解为是有确认的UDP】
具体来说:UDP,只管发出数据包,至于对方有没有收到是无法知道的
TCP,每发出一个数据包,都要等待一个确认数据包。如果有个数据包遗失,这时发送方就无法收到确认,发出方就知道有必要重发这个数据包。
我们回想一下,tcp三次握手和四次挥手,是不是每次都会有一个确认数据包!!!这样我们学习的知识就串联起来了
至此,是不是就可以完全实现了网络互通,但是还有最后一个问题:应用程序有很多,包括 Web 浏览器、电子邮件、远程登录、文件传输、网络管理等,每个应用传输的数据都是由各自的特点,比如浏览器传输的就是要给网页,但是文件传输的内容就比较大,这个时候肯定要用不同的策略,这样就能提交传出效率。例如,浏览器应用程序的HTTP协议、邮件传递的SMTP协议和支持文件传递的FTP协议。
应用层
FTP 使用两条 TCP 连接实现文件传输。一条是 FTP 控制连接,用来控制管理;另一条是 FTP 数据连接,用于数据传输。FTP 控制连接用于传输 FTP 控制命令和命令执行的应答信息
比如登录用户名和密码的验证、发送文件的名称、发送方式的设置。这条连接在整个 FTP 会话过程中一直保持打开,通过 ASCII 码字符串发送请求和接收应答。在控制连接上无法发送数据,而 FTP 数据连接用于文件和文件列表的传输,仅在需要传输数据时建立数据连接,数据传输完毕后终止。
在HTTP 1.0 中每一个命令和应答都会触发一次 TCP 连接的建立和断开。而从 HTTP 1.1 开始,允许在一个 TCP 连接上发送多个命令和应答,这种方式也叫保持连接( keep-alive )。可以大量减少 TCP 连接的建立和断开操作,提高传输效率。
至此,我们将互联网的五层结构自下而上全部讲完了。接下来,我们从用户的角度,来看看用户是怎么实现上网的。
用户上网设置
你新买的电脑,插上网线,开机就能上网吗?应该不是吧。
通常我们会进行一些设置:有四个核心参数
①本机的ip地址
②子网掩码
③网关的ip
④DNS的ip
有的同学可能说我没有配置啊,其实啊,这四个参数是必须配置的,你没有配置一定是有人给你配置了。
我们访问一个网页
1.我们在浏览器网址栏输入:“https://www.baidu.com/”
2.此时我们就要用到DNS【将这个域名转化为我们需要的ip地址】
3.有了ip地址我们就需要使用子网掩码去判断我们本机和百度的ip地址是否在一个子网中
4.如果在一个子网,直接使用ARP获取百度的Mac地址,然后在一个子网,又有了目标计算机的mac地址,此时就完成了通信
5.如果不在一个子网中,此时无法将数据包广播出去。此时我们配置的网关就开始派上了用场。如下图
①要给④发数据包,因为①和④不在一个子网,所以①先将数据包发给网关A,然后网关A通过路由协议(这里就不深入将路由协议),找到④在网关b中,就会将数据包发给网关B,然后网关b就会把数据包发给④
6.经过上面的流程,我们发送的请求已经到达了百度的服务器。此时百度的服务器就知道了我的ip和mac地址,百度就会把百度首页html网页发送给我们,此时的资源回传和我们请求的时候逻辑是一样。
7.我们浏览器就收到了百度传递过来的html页面
8.浏览器呈现了百度的首页
更多学习视频学习资料请参考:B站搜索“我们一起学前端”