互联网是如何工作的
ericwxy

Q: 从我们在浏览器地址栏输入网址按下回车,到我们看到内容中间发生了什么?

这个问题可以说是一个 web 开发者在面试中除了具体的技术问题之外被问得最频繁的综合类问题之一了吧。这个问题可以从不同的角度以及深度来回答,很能体现出一个工程师对于原理的理解程度。

接下来我会用若干篇,来盘一盘这个问题。今天我先从网络这个层面切入。

你是如何访问到 bilibili.com 的站点数据的

当你的电脑连入互联网之后,你的电脑将会获得一个编号地址这个地址我们称之为 Internet Protocol address (IP地址),当然你要访问的目标网站也需要接入互联网,它也将分配一个IP 地址。我们常说的访问某网站,其实就是在访问这个网站的服务器。
我们假设你的电脑需要访问 bilibili 服务器中的 index.html 来获取 b 站的首页,此时我们称你的电脑为客户端,bilibili 的服务器为服务端。这就是我们常说的 客户端服务端模型,如果我们是通过一个客户端程序去请求 b 站的数据,这就是所谓的 C/S 架构,如果我们是在浏览器中访问测试所谓的 B/S 架构。
客户端在需要时可通过互联网与服务端进行通信,拿访问 b 站的首页这个例子来说,你的电脑发送消息给 bilibili 服务器”我想要获取 index.html 的内容,请把它传给我”,这条消息会被转化成电子信号通过电缆发送给 bilibili 服务器,在服务端再将电子信号转换成计算机可以识别的文本数据。

那么这一切是如何实现的呢?(TCP/IP 协议族)

  • 首先我们需要明确什么是协议。

协议是一种规则,用于指定计算机应如何通过网络来相互通信

  • TCP/IP

TCP/IP 协议共分成4层:应用层、TCP 传输控制层、IP 网络层、链路层。很多复杂的系统都是采用这种分层结构,每一层都是相互独立相互调用,通过分层来区分明确每一层的工作职责同过定义好的接口来相互调用协同工作,每一层都可以使用下面各层的功能而不去关心各层是如何实现的。

应用层:提供特定于应用程序的协议, 如前端后端工程师每天都会接触的负责 浏览器和网络服务器相互通信的 HTTP 协议,负责文件传输的 FTP 协议,负责电子邮件客户端检索邮件的 IMAP 协议。
传输控制层: 发送数据包到计算机上使用特定端口号的应用程序
网络层: 使用 IP 地址将数据包发送到特定的计算机
链路层: 将二进制数据包于网络信号之间相互转换

在上面的 访问 b 站的例子中,我们使用 应用层的 http 协议请求获取 b 站首页的 html 文本,请求消息在发送之前会被分解为许多片段我们称之为”数据包”。
数据包首先通过应用层进入TCP(传输控制层) 层,进入 TCP 后每个数据包都会被分配端口号(其中包括 源端口/目标端口),端口号用于确定目标计算机的哪一个程序要接受并使用该数据包。
TCP 是一种面向连接的可靠字节流服务协议。这里我们需要重点注意 “面向连接”和”可靠” 这两个词
TCP 必须先经过三次握手建立连接后才能交换数据每个收到的数据包都会向发送方发送ack确认,以保证发送成功。
接下来”数据包”会从 TCP 层中进入 IP 层,进入IP 层后,每个数据包将会被赋予源和目标计算机的 IP 地址。

IP 是不可靠的无连接协议,它并不关系数据包是否到达目的地,也不关心连接和端口号它的工作是发送数据包并将其路由到目标计算机,其中每个数据包都相互独立的不互相依赖的,所以有可能乱序到达目标地址或在传输途中丢失。保证数据包到达和传输顺序正确的工作都交给了 TCP 层,这也就体现出了分层的作用。

当数据包过大时,在 IP 层会进行分包。由于每个数据包在物理链路层走的物理链路不一样,传输速度也不一样导致数据包没有按照顺序到达目的地。但 TCP 会根据数据包上携带的序列号来进行排序重组。并且发送方在特定时间内没有接收到对方的ack确认时则发送方会重新传送该数据包。

这里需要注意的是 IP 不等同于 IP 地址,IP 是传输协议而 IP 地址是一串数字。IP 地址目前分为 ipv4(Internet Protocal Version 4) 和 ipv6 (Internet Protocal Version 6)两种标准。

ipv4 采用 32 位地址(4字节)因此最多又2的32次方种可能性(约40亿个地址),其中一些地址是为特殊用途保留的,如专用网络约1800万个地址,和多播地址约2.7亿个地址。随着互联网爆炸式的发转,地址不断被分配,ipv4 地址枯竭的问题也随之产生。
于时就有了 ipv6 ,ipv6 采用128位的地址,因此新增的地址空间支持2的128次方约3.4乘以10的38次方个地址,以地球人口 70 亿计算每个人平均可分的约 4.86 乘以 10 的28次方个 ipv6 地址。

有了 ip 地址和端口号后,链路层将数据包的文本信息转译成电子信号通过电缆传输。在电缆的另一端的路由器,检查每一个数据包中的目标地址并确定将其发送到何处。
最终数据包到达服务器后,数据包从TCP/IP 协议族的最底层开始向上一层一层逆向处理。当数据包向上通过协议族时客户端添加的所有路由数据如 ip 地址和端口号都将从数据包中剥离出来,当数据包到达顶部的引用层时,数据包已经重新恢复成最初的形式。通过端口号可以将数据包传输给当前服务器对应端口上的应用程序,应用程序根据当前的数据包做出反应。如我们当前想要获取 b 站首页的 index.html ,b 站的服务器会将响应路径下的 index.html 文件通过刚才的方式返回给你的电脑也就是客户端,这样一来你就看到了b 站首页的内容了。

互联网是怎么构成的

通过上面的描述我们了解到了客户端与服务器之间的一次数据交互是如何进行的,现在我们来看一个更加宏观的问题:你的电脑和 b 站之间的互联网是怎么构成的?

你的电脑通过 “调制解调器(modem)”也就是我们所说的猫接入,猫将计算机的数字信号翻译成可沿着电话线或光纤传输的模拟信号后在公共电话网络进行传输,公共电话网络通过连接 Internet Service Provider(ISP) 互联网服务提供商接入互联网。我们生活中常见的移动 联动 电信 都是ISP。数据包经过电话网络和ISP后,将路由到 ISP 的主干网络。数据包通常会经过多个主干网直到找到目的地。互联网主干网由许多相互连接的大小网络组成,这些大型网络被称为网络服务提供商(Network Service Provider),简称NSP。NSP 是为 ISP 提供网络主干服务的公司,ISP 可以从 NSP 那里批量购入带宽。NSP 网络通过网络访问点 NAP 相连,每个 NSP 都必须连接到至少三个 NAP 。这就是一个简化后的互联网模型,互联网的实际组成更为复杂。
既然互联网组成如此复杂,互联网是如何帮助数据包找到一个正确的路线把数据送到的呢?
在互联网中有一种特殊的计算机-路由器,路由器上有路由表记录了其自网络的所有 ip 地址然而它并不知道上一层包含的 ip 地址。当数据包到达路由器,路由器就会先检查路由表上是否有目标的 ip 地址,如找不到则会将数据转发到上一层。如此一层一层便会找到我们的目标地址了。

我们不需要记住网站的 ip 地址

我们已经知道了如何通过 ip 地址向我们的目标发送 http 请求来做数据交互了。那么新的问题出现了,我们真的需要记住每个网站的 ip 地址吗?答案是否定的,因为互联网中存在这(Domain Names Service)DNS,DNS 是一种分布式数据库记录了域名和 ip 地址的对应关系。当我们在浏览器地址栏中输入网址(也就是域名)时,我们的浏览器首先连接DNS 服务器获取到该域名对应的 ip 地址后浏览器再连接访问该 ip 地址对应的服务器获取所需的数据。
有了 DNS 服务器的 ip 地址变化了只需要重新绑定就可以了,这样就不需要用户去记住新的 ip 地址了。
上面说到了 DNS 是分布式的 它存在一个根服务,当我们的浏览器将域名发送给 DNS 时首先发送给离我们最近的 DNS 服务器,然后离我们最近的这个 DNS 会去连接 根服务,根服务会根据我们域名的分级(域名中的点)依次“询问” 对应的 DNS 查找 ip 地址,找到之后再原路返给我们的浏览器。这就是 DNS 的一个大概的工作过程。

写在最后

现在我们已经了解了当我们在浏览器输入 bilibili.com 按下回车后,互联网层面发生了什么。当我们收到数据后浏览器是如何将数据呈现给我们的呢? 这又涉及到了浏览器的工作原理,以后有机会再聊。

 评论
评论插件加载失败
正在加载评论插件