概述
我们上网的时候经历了什么?(码农翻身学习笔记)
我们用手机上网的时候,点开wifi,点开浏览器就算完成了,但其实背后隐藏(或者说是封装)了很多细节。
本文在很多地方参考了刘欣出版著作《码农翻身》和公共号:码农翻身的文章,可以看作是作者对文章的感悟和总结。
分层和协议
下面的表格就是我们上网背后经常会用到的东西。其中理想的标准是7层模型,但事实标准是四层模型。
或者看这个图
想要了解更多可以点击如下链接(目前以下文章还未完成,如果完成了本文会有更新):
- 七层模型
- 四层模型
- TCP/UDP
- HTTP
从上网设备看上网过程
手机和电脑一样,可以视为我们上网的一个终端,它需要经过很多设备,才能访问到网络上海量的资源(或者说别人的服务器)
古老的集线器
集线器只会把受到的包广播到所有端口上,相当于把包裹复制很多份,再给每个PC都发,如下图所示:
然而再接到集线器上面的机器变多时,不仅效率低下,而且当多台PC同时发送数据的时候会出现冲突,解决的方法就是冲突的其中一方先发送数据,其他的在后面的一个随机时刻再进行发送。这样一旦接到集线器上的机器多了,效率就会严重下滑。
先进聪明的交换机
交换机在运行一段时间(一般来说很快)后就可以做到精准投递“包裹”。
交换机里有一张表,记录的是每个端口对应的MAC地址(Media Access Control ),每当某个端口发来一个数据报文的时候,他会记录下这个端口的MAC地址值,比如插在端口1上的PC1设备发来报文,他会记录下这个报文来源的地址:
端口号 | MAC地址 |
---|---|
端口1 | E4-02-9B-E7-26-A7 |
然后再在这个表中找报文目标MAC地址对应的端口,如果没有找到就会以广播的方式转发报文(和交换机一样)
过了一段时间后端口4上的PC4也发了一报文给PC1会怎么样呢?
结果是:这报文不会广播,而是查表得到PC1MAC地址对应地端口后直接发给PC1,同时把端口4和PC4的MAC地址对应上,填在表格里:
端口号 | MAC地址 |
---|---|
端口1 | E4-02-9B-E7-26-A7 |
端口4 | AC-37-43-52-74-4A |
E4:02:9B:E7:26:A7
这样经过一段时间后,接在同一个交换机上的设备就是“熟人”了。
但是当交换机上的某个端口上RJ45接口松掉,或者被拔开之后,那么这个端口对应行的记录就会消失,这是为了让新的设备能接到老的端口上。
总结:交换机不断更新自己的表格,这就像一个学习的过程,最后在交换机认识了每一个端口上的设备后,便不需要广播转发数据包,节省资源提升效率。
网卡的故事
DHCP
在PC1没有连上网络之前,PC1只有一个MAC地址(其实就是网卡的物理地址)当设备需要连接网络的时候,就需要DHCP服务器给PC1分配一个IP。
但是事实上DHCP服务器不知道PC1想要一个IP地址,这就需要PC1主动广播一个如下图所示的报文:
网卡需要把这个报文发送出去,但是网卡只在数据链路层工作,所以他把报文再封装了一次
当某个路由器(192.168.1.1)收到这个报文后,便知道PC1想要租用一个IP,然后就会回复报文说
“给PC1一个内网IP:192.168.1.2
网关路由器:192.168.1.1
DNS服务器:202.96.128.86“
随后PC1的网卡再广播一个确认租用192.168.1.2的报文,就算是连上局域网了。
ARP和DNS
ARP
刚才我们已经拿到PC1在内网的IP了,这个时候应该试着通过网关路由去访问互联网了。
然而网卡工作在数据链路层,现在只知道网关路由的IP地址,而不知道MAC地址,所以现在网卡还是不能给网关路由器发报文。
于是PC1广播了一个”问192.168.1.1的MAC地址是什么?“的报文,网关路由器接收到之后回应他”这个IP和这个MAC对应:192.168.1.1 <—> D0-FC-CC-CA-86-D8“,随后PC1记录下这条信息,等下PC1需要发送报文给192.168.1.1时,便可以直接让网卡把报文发送到D0-FC-CC-CA-86-D8。
这就是ARP协议
DNS
现在PC1与网关路由终于在交流上畅通无阻了,然后PC1打开Chrome,输入www.baidu.com,网卡便把PC1想要浏览百度的报文发给网关路由器,但是网关路由器可不懂这个域名,他只知道IP地址和MAC地址,于是网关路由器转发给DNS服务器,并返回一个百度的IP地址,比如14.215.177.39(由于ww.baidu.com使用了nginx负载均衡,所以不同时间/机器访问百度时,返回的IP不一定相同,但是他们的内容是一致的)之后PC1和百度就可以基于IP地址进行通讯。
真实的情况是:PC1直接发报文给DNS服务器(202.96.128.86),但是必须经过网关路由器(192.168.1.1)的转发,最后DNS服务器(202.96.128.86)回复PC1百度对应的IP地址(14.215.177.39),然后PC1就可以通过这个IP地址访问百度。
这就是DNS协议
从PC1到DNS服务器的图示
网关路由器
上述讨论已经让我们明白PC1需要访问互联网就必须经过网关路由器,那么一个网关路由器里面连着多个终端设备,要怎样才能让他们同时上网呢?
网关路由器只有一个公网IP,但是网关路由器连着成千上万的终端设备,如何让他们共享这一个IP是一个问题。
NAT(网络地址转换)
网关路由器本身是一个DHCP服务器,给连到网关路由器的的终端设备一个内网IP。然后为了让所有内网上的设备能公用公网IP访问互联网上的海量资源,就需要NAT(网络地址转换)
以PC1访问百度为例:
PC1发送GET请求报文到百度的服务器上,如下图所示:
百度会在收到请求后反回自己主页给PC1,但是百度可不知道什么是192.168.1.2,所以需要从PC1到百度的服务器(14.215.177.39)之前,在经过网关路由器的时候,网关路由器把这个报文的源地址给改了:
把源地址192.168.1.2:3345改成61.52.247.112:2001
然后再接收GET请求返回的百度主页时,如果网关路由器从61.52.247.112:2001收到数据包,就会转发给192.168.1.2:3345,这样就就实现了一个公网IP多终端使用。
而在网关路由器上会生成一张表,记录下公网和内网对应的IP和端口号
WAN端 | LAN端 |
---|---|
61.52.247.112:2001 | 192.168.1.2:3345 |
协议总结
协议 | 作用 |
---|---|
DHCP | 给局域网上的终端动态分配(可以理解为出租)内网IP地址 |
DNS | 域名解析,例如把www.baidu.com解析为14.215.177.39 |
NAT | 从内网IP:端口与网关路由器IP:端口之间进行映射,如:192.168.1.2:3345<->61.52.247.112:2001 |
ARP | 内网IP与MAC地址之间的映射 ,如:192.168.1.1 <-> D0-FC-CC-CA-86-D8 |
最后
以上就是甜美灰狼为你收集整理的我们上网的瞬间经历里什么(网卡、集线器、路由器、交换机、DHCP、DNS、NAT、ARP)我们上网的时候经历了什么?(码农翻身学习笔记)的全部内容,希望文章能够帮你解决我们上网的瞬间经历里什么(网卡、集线器、路由器、交换机、DHCP、DNS、NAT、ARP)我们上网的时候经历了什么?(码农翻身学习笔记)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复