关于计算机网络:灵魂拷问浏览器输入xxxxhub的背后

58次阅读

共计 7666 个字符,预计需要花费 20 分钟才能阅读完成。

Hey guys 各位读者姥爷们大家好,这里是程序员 cxuan 计算机网络连载系列的第 13 篇文章。

到当初为止,咱们算是把应用层、运输层、网络层和数据链路层都介绍完了,那么当初是时候把这些内容都串起来,做一个全面的回顾了。那么我这就以 Web 页面的申请历程为例,来和你聊聊计算机网络中这些协定是怎么工作的、数据包是怎么收发的,从输出 URL、敲击会车到最终实现页面出现在你背后的这个过程。

首先,我关上了 Web Browser,而后在 Google 浏览器 URL 地址栏中输出了 maps.google.com

而后 ……

查找 DNS 缓存

浏览器在这个阶段会查看四个中央是否存在缓存,第一个中央是浏览器缓存,这个缓存就是 DNS 记录。

浏览器会为你拜访过的网站在固定期限内保护 DNS 记录。因而,它是第一个运行 DNS 查问的中央。浏览器首先会查看这个网址在浏览器中是否有一条对应的 DNS 记录,用来找到指标网址的 IP 地址。

我是 chrome 浏览器,所以在 mac 中,无奈应用 chrome://net-internals/#dns 找到对应的 IP 地址,在 windows 中是能够找到的。

那么 mac 怎么查问 DNS 记录呢?你能够应用 nslookup 命令来查找,但这不是咱们探讨的重点。

DNS(Domain Name System) 是一个分布式的数据库,它用于保护网址 URL 到其 IP 地址的映射关系。在互联网中,IP 地址是计算机所可能了解的一种地址,而 DNS 的这种别名地址是咱们人类可能了解和记忆的地址,DNS 就负责把人类记忆的地址映射成计算机可能了解的地址,每个 URL 都有惟一的 IP 地址进行对应。

举个例子,google 的官网是 www.google.com,而 google 的 ip 地址是 216.58.200.228,这两个地址你在 URL 上输出哪个都能拜访,然而 IP 地址不好记忆,而 google.com 简单明了。DNS 就相当于是咱们几年前应用的家庭电话薄,比方你想给 cxuan 打电话,你有可能记不住 cxuan 的电话号码,此时你须要查询电话薄来找到 cxuan 的电话号码。

浏览器第二个须要查看的中央就是 操作系统缓存。如果 DNS 记录不在浏览器缓存中,那么浏览器将对操作系统发动零碎调用,Windows 下就是 getHostName

在 Linux 和大部分 UNIX 零碎上,除非装置了 nscd,否则操作系统可能没有 DNS 缓存。

nscd 是 Linux 零碎上的一种 名称服务缓存程序

浏览低第三个须要查看的中央是 路由器缓存,如果 DNS 记录不在本人电脑上的话,浏览器就会和与之相连的路由器独特保护 DNS 记录。

如果与之相连的路由器也没有 DNS 记录的话,浏览器就会查看 ISP 中是否有缓存。ISP 缓存就是你本地通信服务商的缓存,因为 ISP 保护着本人的 DNS 服务器,它缓存 DNS 记录的实质也是为了升高申请工夫,达到疾速响应的成果。一旦你拜访过某些网站,你的 ISP 可能就会缓存这些页面,以便下次快速访问。对于常常看小电影的你是否感到震惊呢?如果家里还装置了一个能够联网的摄像头的话,那就有点嗨皮了。

你必定比拟困惑为什么第一步浏览器须要查看这么多缓存,你可能会感到不难受,因为缓存可能会走漏咱们的隐衷,然而这些缓存在调节网络流量和缩短数据传输工夫等方面至关重要。

所以,下面波及到 DNS 缓存的查问过程如下。

如果下面四个步骤中都不存在 DNS 记录,那么就示意不存在 DNS 缓存,这个时候就须要发动 DNS 查问,以查找指标网址(本示例中是 maps.google.com)的 IP 地址。

发动 DNS 查问

如上所述,如果想要使我的计算机和 maps.google.com 建设连贯并进行通信的话,我须要晓得 maps.google.com 的 IP 地址,因为 DNS 的设计起因,本地 DNS 可能无奈给我提供正确的 IP 地址,那么它就须要在互联网上搜寻多个 DNS 服务器,来找到网站的正确 IP 地址。

这里有个疑难,为什么我须要搜寻多个 DNS 服务器的来找到网站的 IP 地址呢?一台服务器不行吗?

因为 DNS 是分布式域名服务器,每台服务器只保护一部分 IP 地址到网络地址的映射,没有任何一台服务器可能维持全副的映射关系。

在 DNS 的晚期设计中只有一台 DNS 服务器。这台服务器会蕴含所有的 DNS 映射。这是一种 集中式 的设计,这种设计并不适用于当今的互联网,因为互联网有着 数量微小并且持续增长 的主机,这种集中式的设计会存在以下几个问题

  • 单点故障(a single point of failure),如果 DNS 服务器解体,那么整个网络随之瘫痪。
  • 通信容量(traaffic volume),单个 DNS 服务器不得不解决所有的 DNS 查问,这种查问级别可能是上百万上千万级,一台服务器很难满足。
  • 远距离集中式数据库 (distant centralized database),单个 DNS 服务器不可能 邻近 所有的用户,假如在美国的 DNS 服务器不可能邻近让澳大利亚的查问应用,其中查问申请势必会通过低速和拥挤的链路,造成重大的时延。
  • 保护(maintenance),保护老本微小,而且还须要频繁更新。

所以在当今网络状况下 DNS 不可能集中式设计,因为它齐全没有可扩大能力,所以采纳 分布式设计,这种设计的特点如下

分布式、层次数据库

首先分布式设计首先解决的问题就是 DNS 服务器的扩展性问题,因而 DNS 应用了大量的 DNS 服务器,它们的组织模式个别是档次形式,并且散布在全世界范畴内。没有一台 DNS 服务器可能领有因特网上所有主机的映射。相同,这些映射散布在所有的 DNS 服务器上。

大抵来说有三种 DNS 服务器:根 DNS 服务器 顶级域 (Top-Level Domain, TLD) DNS 服务器 权威 DNS 服务器。这些服务器的层次模型如下图所示

  • 根 DNS 服务器,有 400 多个根域名服务器遍布全世界,这些根域名服务器由 13 个不同的组织治理。根域名服务器的清单和组织机构能够在 https://root-servers.org/ 中找到,根域名服务器提供 TLD 服务器的 IP 地址。
  • 顶级域 DNS 服务器,对于每个顶级域名比方 com、org、net、edu 和 gov 和所有的国家级域名 uk、fr、ca 和 jp 都有 TLD 服务器或服务器集群。所有的顶级域列表参见 https://tld-list.com/。TDL 服务器提供了权威 DNS 服务器的 IP 地址。
  • 权威 DNS 服务器,在因特网上具备公共可拜访的主机,如 Web 服务器和邮件服务器,这些主机的组织机构必须提供可供拜访的 DNS 记录,这些记录将这些主机的名字映射为 IP 地址。一个组织机构的权威 DNS 服务器珍藏了这些 DNS 记录。

在理解了 DNS 服务器的设计理念之后,咱们回到 DNS 查找的步骤上来,DNS 的查问形式次要分为三种

DNS 查找中会呈现三种类型的查问。通过组合应用这些查问,优化的 DNS 解析过程可缩短传输间隔。在现实状况下,能够应用缓存的记录数据,从而使 DNS 域名服务器可能间接应用非递归查问。

  • 递归查问:在递归查问中,DNS 客户端要求 DNS 服务器(个别为 DNS 递归解析器)将应用所申请的资源记录响应客户端,或者如果解析器无奈找到该记录,则返回谬误音讯。

  • 迭代查问:在迭代查问中,如果所查问的 DNS 服务器与查问名称不匹配,则其将返回对较低级别域名空间具备权威性的 DNS 服务器的援用。而后,DNS 客户端将对援用地址进行查问。此过程持续应用查问链中的其余 DNS 服务器,直至产生谬误或超时为止。

  • 非递归查问:当 DNS 解析器客户端查问 DNS 服务器以获取其有权拜访的记录时通常会进行此查问,因为其对该记录具备权威性,或者该记录存在于其缓存内。DNS 服务器通常会缓存 DNS 记录,查问到来后可能间接返回缓存后果,以避免更多带宽耗费和上游服务器上的负载。

下面负责开始 DNS 查找的介质就是 DNS 解析器,它个别是 ISP 保护的 DNS 服务器,它的主要职责就是通过向网络中其余 DNS 服务器询问正确的 IP 地址。

如果想要理解更多对于 DNS 的音讯,请查阅 万字长文爆肝 DNS 协定!

所以对于 maps.google.com 这个域名来说,如果 ISP 保护的服务器没有 DNS 缓存记录,它就会向 DNS 根服务器地址发动查问,根名称服务器会将其重定向到 .com 顶级域名服务器。.com 顶级域名服务器会将其重定向到 google.com 权威服务器。google.com 名称服务器将在其 DNS 记录中找到 maps.google.com 匹配的 IP 地址,并将其返回给您的 DNS 解析器,而后将其发送回你的浏览器。

这里值得注意的是,DNS 查问报文会通过许多路由器和设施才会达到根域名等服务器,每通过一个设施或者路由器都会应用 路由表 来确定哪种门路是数据包达到目的地最快的抉择。这外面波及到路由抉择算法,如果小伙伴们想要理解路由抉择算法,能够看看这篇文章 https://www.cisco.com/c/en/us…

ARP 申请

我看了很多篇文章都没有提到这一点,那就是 ARP 申请的这个过程。

什么时候须要发送 ARP 申请呢?

这里其实有个前提条件

  • 如果 DNS 服务器和咱们的主机在同一个子网内,零碎会依照上面的 ARP 过程对 DNS 服务器进行 ARP 查问
  • 如果 DNS 服务器和咱们的主机在不同的子网,零碎会依照上面的 ARP 过程对默认网关进行查问

ARP 协定的全称是 Address Resolution Protocol(地址解析协定),它是一个通过 用于实现从 IP 地址到 MAC 地址的映射,即询问指标 IP 对应的 MAC 地址 的一种协定。

简而言之,ARP 就是一种解决地址问题的协定,它以 IP 地址为线索,定位下一个应该接收数据分包的主机 MAC 地址。如果指标主机不在同一个链路上,那么会查找下一跳路由器的 MAC 地址。

对于为什么有了 IP 地址,还要有 MAC 地址概述能够参看知乎这个答复 https://www.zhihu.com/questio…

ARP 的大抵工作流程如下

假如 A 和 B 位于同一链路,不须要通过路由器的转换,主机 A 向主机 B 发送一个 IP 分组,主机 A 的地址是 192.168.1.2,主机 B 的地址是 192.168.1.3,它们都不晓得对方的 MAC 地址是啥,主机 C 和 主机 D 是同一链路的其余主机。

主机 A 想要获取主机 B 的 MAC 地址,通过主机 A 会通过 播送 的形式向以太网上的所有主机发送一个 ARP 申请包,这个 ARP 申请包中蕴含了主机 A 想要晓得的主机 B 的 IP 地址的 MAC 地址。

主机 A 发送的 ARP 申请包会被同一链路上的所有主机 / 路由器接管并进行解析。每个主机 / 路由器都会查看 ARP 申请包中的信息,如果 ARP 申请包中的 指标 IP 地址 和本人的雷同,就会将本人主机的 MAC 地址写入响应包返回主机 A

由此,能够通过 ARP 从 IP 地址获取 MAC 地址,实现同一链路内的通信。

所以,要想发送 ARP 播送,咱们须要有一个指标 IP 地址,同时还须要晓得用于发送 ARP 播送的接口的 MAC 地址。

这里会波及到 ARP 缓存 的概念。

当初你晓得了发送一次 IP 分组前通过发送一次 ARP 申请就可能确定 MAC 地址。那么是不是每发送一次都得通过播送 -> 封装 ARP 响应 -> 返回给主机这一系列流程呢?

想想看,浏览器是如何做的?浏览器内置了缓存可能缓存你最近常常应用的地址,那么 ARP 也是一样的。ARP 高效运行的要害就是保护每个主机和路由器上的 ARP 缓存(或表)。这个缓存保护着每个 IP 到 MAC 地址的映射关系。通过把第一次 ARP 获取到的 MAC 地址作为 IP 对 MAC 的映射关系到一个 ARP 缓存表中,下一次再向这个地址发送数据报时就不再须要从新发送 ARP 申请了,而是间接应用这个缓存表中的 MAC 地址进行数据报的发送。每发送一次 ARP 申请,缓存表中对应的映射关系都会被革除。

通过 ARP 缓存,升高了网络流量的应用,在肯定水平上避免了 ARP 的大量播送。

一般来说,发送过一次 ARP 申请后,再次发送雷同申请的几率比较大,因而应用 ARP 缓存可能缩小 ARP 包的发送,除此之外,不仅仅 ARP 申请的发送方可能缓存 ARP 接管方的 MAC 地址,接管方也可能缓存 ARP 申请方的 IP 和 MAC 地址,如下所示

不过,MAC 地址的缓存有肯定期限,超过这个期限后,缓存的内容会被革除

深刻了解 ARP 协定的话,能够参考 cxuan 的这篇文章。

ARP,这个隐匿在计网背地的男人


所以,浏览器会首先查问 ARP 缓存,如果缓存命中,咱们返回后果:指标 IP = MAC。

如果缓存没有命中:

  • 查看路由表,看看指标 IP 地址是不是在本地路由表中的某个子网内。是的话,应用跟那个子网相连的接口,否则应用与默认网关相连的接口。
  • 查问抉择的网络接口的 MAC 地址
  • 咱们发送一个数据链路层的 ARP 申请:

依据连贯主机和路由器的硬件类型不同,能够分为以下几种状况:

直连:

  • 如果咱们和路由器是间接连贯的,路由器会返回一个 ARP Reply(见上面)。

集线器:

  • 如果咱们连贯到一个集线器,集线器会把 ARP 申请向所有其它端口播送,如果路由器也连贯在其中,它会返回一个 ARP Reply

交换机:

  • 如果咱们连贯到了一个交换机,替换机会查看本地 CAM/MAC 表,看看哪个端口有咱们要找的那个 MAC 地址,如果没有找到,替换机会向所有其它端口播送这个 ARP 申请。
  • 如果交换机的 MAC/CAM 表中有对应的条目,替换机会向有咱们想要查问的 MAC 地址的那个端口发送 ARP 申请
  • 如果路由器也 连贯 在其中,它会返回一个 ARP Reply

ARP Reply:

当初咱们有了 DNS 服务器或者默认网关的 IP 地址,咱们能够持续 DNS 申请了:

  • 应用 53 端口向 DNS 服务器发送 UDP 申请包,如果响应包太大,会应用 TCP 协定
  • 如果本地 /ISP DNS 服务器没有找到后果,它会发送一个递归查问申请,一层一层向高层 DNS 服务器做查问,直到查问到起始受权机构,如果找到会把后果返回。

(上述均来自:https://github.com/skyline754…)


封装 TCP 数据包

浏览器失去指标服务器的 IP 地址后,依据 URL 中的端口能够晓得端口号(http 协定默认端口号是 80,https 默认端口号是 443),会筹备 TCP 数据包。数据包的封装会通过上面的层层解决,数据达到指标主机后,指标主机会解析数据包,残缺的申请和解析过程如下。

这里就不再具体介绍了,读者敌人们能够浏览 cxuan 的这篇文章 TCP/IP 基础知识详解具体理解。

浏览器与指标服务器建设 TCP 连贯

在通过上述 DNS 和 ARP 查找流程后,浏览器就会收到一个指标服务器的 IP 和 MAC 地址,而后浏览器将会和指标服务器建设连贯来传输信息。这里能够应用很多种 Internet 协定,然而 HTTP 协定建设连贯所应用的运输层协定是 TCP 协定。所以这一步骤是浏览器与指标服务器建设 TCP 连贯的过程。

TCP 的连贯建设须要通过 TCP/IP 的三次握手,三次握手的过程其实就是浏览器和服务器替换 SYN 同步和 ACK 确认音讯的过程。

假如图中左端是客户端主机,右端是服务端主机,一开始,两端都处于 CLOSED(敞开) 状态。

  1. 服务端过程筹备好接管来自内部的 TCP 连贯。而后服务端过程处于 LISTEN 状态,期待客户端连贯申请。
  2. 客户端向服务器收回连贯申请,申请中首部同步位 SYN = 1,同时抉择一个初始序号 sequence,简写 seq = x。SYN 报文段不容许携带数据,只耗费一个序号。此时,客户端进入 SYN-SEND 状态。
  3. 服务器收到客户端连贯后,,须要确认客户端的报文段。在确认报文段中,把 SYN 和 ACK 位都置为 1。确认号是 ack = x + 1,同时也为本人抉择一个初始序号 seq = y。请留神,这个报文段也不能携带数据,但同样要消耗掉一个序号。此时,TCP 服务器进入 SYN-RECEIVED(同步收到) 状态。
  4. 客户端在收到服务器收回的响应后,还须要给出确认连贯。确认连贯中的 ACK 置为 1,序号为 seq = x + 1,确认号为 ack = y + 1。TCP 规定,这个报文段能够携带数据也能够不携带数据,如果不携带数据,那么下一个数据报文段的序号仍是 seq = x + 1。这时,客户端进入 ESTABLISHED (已连贯) 状态
  5. 服务器收到客户的确认后,也进入 ESTABLISHED 状态。

这样三次握手建设连贯的阶段就实现了,单方能够间接通信了。

浏览器发送 HTTP 申请到 web 服务器

一旦 TCP 连贯建设实现后,就开始间接传输数据办闲事了!此时浏览器会发送 GET 申请,要求指标服务器提供 maps.google.com 的网页,如果你填写的是表单,则发动的是 POST 申请,在 HTTP 中,GET 申请和 POST 申请是最常见的两种申请,基本上占据了所有 HTTP 申请的九成以上。

除了申请类型外,HTTP 申请还蕴含很多很多信息,最常见的有 Host、Connection、User-agent、Accept-language 等

首先 Host 示意的是对象所在的主机。Connection: close 示意的是浏览器须要通知服务器应用的是 非长久连贯。它要求服务器在发送完响应的对象后就敞开连贯。User-agent: 这是申请头用来通知 Web 服务器,浏览器应用的类型是 Mozilla/5.0,即 Firefox 浏览器。Accept-language 通知 Web 服务器,浏览器想要失去对象的法语版本,前提是服务器须要反对法语类型,否则将会发送服务器的默认版本。上面咱们针对次要的实体字段进行介绍(具体的能够参考 https://developer.mozilla.org… MDN 官网学习)

HTTP 的申请标头分为四种:通用标头 申请标头 响应标头 实体标头

这四种标头又别离有很多内容,如果你想要深刻了解一下对于 HTTP 申请头的相干内容,能够参考 cxuan 的这篇文章

深刻了解 HTTP 标头

服务器解决申请并发回一个响应

这个服务器蕴含一个 Web 服务器,也就是 Apache 服务器,服务器会从浏览器接管申请并将其传递给申请处理程序并生成响应。

申请处理程序也是一个程序,它个别是用 .net、php、ruby 等语言编写,用于读取申请,查看申请内容,cookie,必要时更新服务器上的信息的这么一个程序。它会以特定的格局比方 JSON、XML、HTML 组合响应。

服务器发送回一个 HTTP 响应

服务器响应蕴含你申请的网页以及状态代码,压缩类型(Content-Encoding),如何缓存页面(Cache-Control),要设置的 cookie,隐衷信息等。

比方上面就是一个响应体

对于深刻了解 HTTP 申请和响应,能够参考这篇文章

看完这篇 HTTP,跟面试官扯皮就没问题了

浏览器显示 HTML 的相干内容

浏览器会分阶段显示 HTML 内容。首先,它将渲染袒露的 HTML 骨架。而后它将查看 HTML 标记并发送 GET 申请以获取网页上的其余元素,例如图像,CSS 样式表,JavaScript 文件等。这些动态文件由浏览器缓存,因而你再次拜访该页面时,不必从新再申请一次。最初,您会看到 maps.google.com 显示的内容呈现在你的浏览器中。

我本人肝了六本 PDF,微信搜寻「程序员 cxuan」关注公众号后,在后盾回复 cxuan,支付全副 PDF,这些 PDF 如下

六本 PDF 链接

正文完
 0