我们上网的瞬间经历里什么(网卡、集线器、路由器、交换机、DHCP、DNS、NAT、ARP)

我们上网的时候经历了什么?(码农翻身学习笔记)

我们用手机上网的时候,点开wifi,点开浏览器就算完成了,但其实背后隐藏(或者说是封装)了很多细节。
本文在很多地方参考了刘欣出版著作《码农翻身》和公共号:码农翻身的文章,可以看作是作者对文章的感悟和总结。

分层和协议

下面的表格就是我们上网背后经常会用到的东西。其中理想的标准是7层模型,但事实标准是四层模型。
在这里插入图片描述
或者看这个图
在这里插入图片描述
想要了解更多可以点击如下链接(目前以下文章还未完成,如果完成了本文会有更新):

从上网设备看上网过程

手机和电脑一样,可以视为我们上网的一个终端,它需要经过很多设备,才能访问到网络上海量的资源(或者说别人的服务器)

古老的集线器

集线器只会把受到的包广播到所有端口上,相当于把包裹复制很多份,再给每个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主动广播一个如下图所示的报文:

img

网卡需要把这个报文发送出去,但是网卡只在数据链路层工作,所以他把报文再封装了一次
在这里插入图片描述

当某个路由器(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
发布了41 篇原创文章 · 获赞 27 · 访问量 5862

猜你喜欢

转载自blog.csdn.net/weixin_43217564/article/details/98443763