上节回顾
网络原理,网络层协议.IP协议.
IP协议主要做的事情两方面:
地址管理(通过IP地址来管理)
路由选择
路由选择:
"路由"(路由这个词在计算机中也是有很多含义的)此处的"路由"指的是IP协议中的"路径规划功能"
好比用地图.从A到达B
如果经常开车或者坐车,就会有体会 ,地图会规划出好多路径,就可以根据不同的情况选择路径.
这个过程就是一个路由选择的过程.
IP协议中路由选择具体的过程,和 地图这里的路径规划还有本质区别
地图这里,是已知整体的路况,会综合来考量.
IP协议中,数据到达某个路由器之后,这个路由器并不知道网络整体的环境(这个太复杂了),这个路由器只是知道它附近的情况(它了解和它相邻的这些设备的情况)
IP协议寻路过程,是一个"探索式"的过程.
举个例子:
假设我要从陕科大,要去邮电.(假设没有地图)
我可以去问路!!
1.一出门,揪住一个路人就问,我该咋样去邮电?
我们这个路人甲,可能知道邮电咋走,也可能不知道.
如果知道,直接按照这个兄弟给出的路线前进即可
如果是不知道,路人甲就会说,你总归得去做公交,你去公交站牌那再问问.
2.到达公交站牌,我揪住路人乙继续问.
这个路人乙,如果知道邮电咋走,这就好办了....
如果不知道,路人乙就会说,虽然我不知道,但你总归得去做2号线,你先做公交到公园,去地铁口问.
3.到达运动公园地铁口,再揪住路人丙,继续问.
如果也不知道,路人丙告诉我你坐地铁往南走,做到小寨再问问下一步咋走....
随着这个过程的推移,我就逐渐靠近了"邮电大学".
当我逐渐靠近了之后,此时我就揪住了一个路人,他直接就知道邮电在哪这样的概率也就大大增加了!!
一旦我遇到耨个人,直接就知道邮电,按照他的路线直接过去即可.
每一个路人都相当于一个路由器,
每个路人都有一个自己熟悉的范围.在他熟悉的范围里,他知道具体咋走,出了范围,就知道一个大概方向,这个事情就类似于路由器中的一种核心数据结构"路由表"
路由器的存储空间有限,不可能通过一个路由器的路由表就保存整个互联网环境的所有节点情况
以上只是一个最简单的情况,实际的路由选择,可能还会更复杂.
可能你问的路人,完全不知道目标在哪里,告诉你的方向不一定是对的方向.....
也可能你问的路人,知道目标在哪,但是它知道好几条路线,你还得再权衡......
数据链路层重点协议
主要负责的工作:两个相邻节点之间数据的传输.
核心的协议:以太网(涉及到数据链路层+物理层协议)
网线:就是遵守以太网协议的!
假设我要回老家.老家山东,日照,岚山区
站在传输层:
起始位置:陕西省西安市未央区xxx路
目标位置: 山东,日照,岚山区
站在网络层:
就需要考虑路线的规划
可选路线1:西安 -> 山东 -> 日照
可选路线2:西安 -> 北京 -> 山东 -> 日照
.........
站在数据链路层:
假设选定路线2,
西安到北京,选择做飞机
北京到山东,选择坐高铁
日照到岚山,选择坐公交
以太网帧格式
在不同的网络层次上,描述一个数据,使用的术语,是不一样的.
传输层,描述一个数据包叫做一个数据段(segement)
网络层,叫一个数据报(packet)
数据链路层,叫一个数据帧(frame)
前面并没有对这几个术语明确区分.
平时使用的时候也很少区分这些概念,只不过要是去阅读一些正式文档资料,自己可以注意一下.
以太网帧格式
![]()
关于mac地址,数据链路层地址.
6个字节,表示的范围就比IPv4的地址要大很多.
当前来看mac地址是可以做到每个主机都有唯一的地址的.
IP地址是动态分配(连上网络之后,对应的路由器/其他设备会给这个主机分配一个IP)
mac地址是写死的(网卡出厂的时候,就被写死了)
mac地址也经常会用到一些其他场景中~~
举例:
网络上,某个人是一个黑客,入侵了别人的主机.....
如何找到他?如果要是黑客在入侵的时候暴露了自己的mac地址,此时就可以被锁定~
再比如:
游戏设定为"不能多开"
一个电脑多个客户端~(为了作弊)
根据mac地址来判定~如果发现两个账号对应的mac地址是同一个,就是在多开~~
当下来看,IP存在的目的,是为了描述一个主机在互联网上的位置.
mac地址也能描述一个主机的位置呀~
1.网络层协议和数据链路层协议,发明之初,也是各自独立的.
因此IP地址和mac地址就被独立发明出来.
2.这俩个地址,起到的作用还是有区别的!!!
![]()
认识MTU
MTU
物理层其实是存在这样的硬性限制的,对应的数据链路层的数据帧,是有一定大小范围.
这个范围治标就称为MTU
这就涉及到一个问题,如果我们要传输的数据太长怎么办?
这就需要IP数据包分包了.
不同的硬件介质对应的MTU是不同的.
IP数据分包.往往不是因为触达了IP长度上线才分的包,而是因为触达了MYU产生的分包.
ARP协议,是一个"辅助性"的协议,这个协议不仅仅是属于数据链路层的,而是横跨数据链路层和网络层.这个协议的功能就是根据IP查询对应的mac地址.
这些除非是你应聘那种做通信设备的岗位,大部分不会考,了解即可.
应用层协议DNS
DNS:域名解析系统,及时一个应用层协议,也是一套系统~
什么叫域名:www.edu.com
域名就是IP地址的马甲~
虽然IP地址可以通过点分十进制来表示,更方便用户来查看,但是点分十进制仍然不太方便记忆和传播~
更希望的就是当下有更方便的办法来表示一个网站的位置
域名就是一串单词,通常是使用点来分割.
真正网络传输的时候,其实就是先根据域名,转换成对应的IP地址,再根据IP地址来进行传输.
1
最初的DNS其实就是一个文本文件,叫做hosts文件.文件里面保存的就是键值对.ip和域名对应关系.
hosts文件是保存在每一个主机上的.一旦域名和'ip的映射关系发生改变了,此时就麻烦了.
因此hosts文件这个机制已经被淘汰了,现在已经不适用hosts来进行域名解析了,但是这个文件仍然存在.
现在使用hosts的场景,一般是进行测试程序的时候,
某个程序里面依赖另一个服务器(通过域名来访问这个服务器).测试该程序的时候就可以修改hosts,把这个域名映射到测试的服务器ip上.
保证不修改源代码就可以进行测试,也不会影响到正常的线上环境
通过修改hosts文件,也能起到fq效果.
fq是程序猿必备技能!!
很多资料要去google上搜索
现在的DNS是一组专门的服务器!
通过这个服务器就可以完成域名解析.
全世界这么多电脑都需要访问DNS服务器!!!怎么办?
这一台服务器能顶住全世界电脑的访问的压力吗
这一个DNS服务器显然是顶不住全世界的访问请求.
为了解决这个问题,有一系列的方案:
1.浏览器/客户端本身会对域名解析结果进行缓存.(域名和ip的对应关系,是可能会改变,但是并不频繁)
这样就避免了大量不必要的DNS请求.
2.DNS服务器也不是只有一台,而是有很多台.
这些最初的DNS服务器,都是由一个专门的组织机构来负责维护的.
根域名服务器.这些服务器就包含了所有的DNS信息.
如果你想要申请个域名,就需要人家批准,然后把这个结果放到DNS域名服务器中.
3.为了更进一步的降低压力,各种运营商,也会构建自己的域名服务器镜像.
就会国内就近的构造一些DNS服务器,定期从根域名服务器这边同步数据过来.
国内用户使用DNS的时候就只要查国内的DNS服务器即可.
4.针对DNS服务器做镜像的时候还可以按照域名来进一步的划分.
好比:
com搞个专门的服务器
org搞个专门的服务器
vip搞个专门的服务器
就能够保证每个服务器的数据量和请求量都不是太大.
DNS了解即可.
一个经典的面试题:
从浏览器中输入一个URL之后(地址之后),都发生了那些事情?
网络传输本身就是一个非常复杂的事情!!!
正因为非常复杂,所以才要"协议分层".
以上内容,是站在学生的角度,来看待这个面试题的.我们看到的是网络传输的一些基本原理.(核心就是这些关键协议如何相互配合,以及封装分用,路由转发....)
如果换一个角度,得到的答案就各不相同了!!
站在后端工程师的角度,这个时候,重点核心就不在网络通信上了,而是看到的是应用层所做的一些事情.
如果更复杂一点,不是访问搜狗主页,而是访问搜狗的搜索结果.
比如输入一个查询词"鲜花"这个过程就会更加复杂,简单画一下
![]()
这一系列只不过是整个系统中的"展示流"
除了展示流,还有点击流(用户点击了一个搜索结果,会咋办)
除了点击流之外,还有推送流(根据用户的历史操作,主动推送一些数据....)
广告服务器这个东西一展开,和刚才画的这一系列基本规模差不多.
还有数据库的数据是咋来的:
爬虫程序来抓数据
以及清洗程序整理数据.....