Bootstrap

输入www.baidu.com后发生的事情

我们假设你想要访问 www.baidu.com 查找一些你所需要的东西。

  1. 你将 www.baidu.com 键入浏览器的地址栏。
  2. 浏览器检查缓存中的DNS记录,以查找 www.baidu.com 的相应IP地址。
    DNS(域名系统)是一个数据库,用于维护网站名称(URL)及其链接的特定IP地址。互联网上的每个URL都有一个唯一的IP地址。IP地址属于托管我们请求访问的网站的服务器的计算机。例如, www.baidu.com 的IP地址为 183.232.231.174。因此,如果你愿意,可以在浏览器中输入 183.232.231.174 来访问www.baidu.com。DNS是一个URL列表及其IP地址,就像电话簿是一个名称列表及其相应的电话号码一样。

DNS的主要目的是人性化导航。你可以通过在浏览器上键入正确的IP地址轻松访问网站,但想象一下,我们必须记住我们经常访问的所有网站的不同数字集?因此,使用URL更容易记住网站的名称,让DNS为我们工作,并将其映射到正确的IP。
为了找到DNS记录,浏览器检查四个缓存。

  • 首先,它检查浏览器缓存。浏览器为您之前访问过的网站维护一段固定时间的DNS记录存储库。因此,它是第一个运行DNS查询的地方。
  • 其次,浏览器检查操作系统缓存。如果在浏览器缓存中找不到它,浏览器将在底层计算机操作系统上进行系统调用(即Windows上的gethostname)以获取记录,因为操作系统还会维护DNS记录的缓存。
  • 第三,它检查路由器缓存。如果在您的计算机上找不到它,浏览器将与维护其自己的DNS记录缓存的路由器通信。
  • 第四,它检查ISP缓存。如果所有步骤都失败,浏览器将转移到ISP。您的ISP维护其自己的DNS服务器,其中包括DNS记录的缓存,浏览器将检查该记录,最后希望找到您请求的URL。
    您可能想知道为什么在如此多的级别上维护了如此多的缓存。虽然我们在某处缓存的信息并没有让我们感到非常舒服,但在缓存方面,缓存对于调节网络流量和改善数据传输时间非常重要。
  1. 如果请求的URL不在缓存中,ISP的DNS服务器将启动DNS查询以查找托管www.baidu.com的服务器的IP地址。
    如前所述,为了让我的计算机与托管www.baidu.com的服务器连接,我需要www.baidu.com的IP地址。DNS查询的目的是搜索Internet上的多个DNS服务器,直到找到网站的正确IP地址。这种类型的搜索称为递归搜索,因为搜索将从DNS服务器重复继续到DNS服务器,直到它找到我们需要的IP地址或返回错误响应,说它无法找到它。
    在这种情况下,我们将ISP的DNS服务器称为DNS recursor,其职责是通过询问互联网上的其他DNS服务器来寻找答案,从而找到目标域名的正确IP地址。其他DNS服务器称为名称服务器,因为它们基于网站域名的域架构执行DNS搜索。
    在没有进一步混淆的情况下,我想使用下图来解释域架构。
    在这里插入图片描述
    我们今天遇到的许多网站网址都包含第三级域名,第二级域名和顶级域名。这些级别中的每一个都包含自己的名称服务器,在DNS查找过程中会对其进行查询。
    对于www.baidu.com,首先,DNS recursor将联系根名称服务器。根名称服务器将其重定向到.com域名服务器。.com名称服务器会将其重定向到google.com名称服务器。baidu.com名称服务器将在其“DNS记录”中找到www.baidu.com的匹配IP地址,并将其返回到你的DNS recursor,然后将其发送回您的浏览器。
    这些请求使用小数据包发送,这些数据包包含诸如请求内容和目的地IP地址之类的信息(DNS recursor的IP地址)。这些数据包在到达正确的DNS服务器之前通过客户端和服务器之间的多个网络设备传输。该设备使用路由表来确定数据包到达其目的地的最快方式。如果这些数据包丢失,您将收到请求失败错误。否则,他们将到达正确的DNS服务器,获取正确的IP地址,然后返回浏览器。

  2. 浏览器启动与服务器的TCP连接。
    一旦浏览器收到正确的IP地址,它将与服务器建立连接,以匹配IP地址以传输信息。浏览器使用Internet协议来构建此类连接。可以使用许多不同的Internet协议,但TCP是用于任何类型的HTTP请求的最常用协议。
    为了在您的计算机(客户端)和服务器之间传输数据包,建立TCP连接很重要。使用称为TCP / IP三次握手的过程建立此连接。这是一个三步过程,客户端和服务器交换SYN(同步)和ACK(确认)消息以建立连接。

  • 客户机通过互联网向服务器发送SYN数据包,询问它是否为新连接打开。
  • 如果服务器具有可以接受和发起新连接的开放端口,则它将使用SYN / ACK数据包响应SYN数据包的确认。
  • 客户端将从服务器接收SYN / ACK数据包,并通过发送ACK数据包来确认它。然后建立TCP连接以进行数据传输!
  1. 浏览器向Web服务器发送HTTP请求。
    建立TCP连接后,就可以开始传输数据了!浏览器将发送GET请求,要求提供www.baidu.com网页。如果您输入凭据或提交表单,则可能是POST请求。此请求还将包含其他信息,例如浏览器标识(User-Agent标头),它将接受的请求类型(Accept标头),以及连接标头,要求它保持TCP连接为其他请求保持活动状态。它还将传递从浏览器为此域存储的cookie中获取的信息。
    示例GET请求(标题突出显示):
    在这里插入图片描述

(如果您对幕后发生的事情感到好奇,可以使用 Firebug, Fiddler 等工具来查看HTTP请求。在我们不知情的情况下查看客户端和服务器之间传递的信息总是很有趣)。

Fidder 界面展示:
在这里插入图片描述

  1. 服务器处理请求并发回响应。
    服务器包含一个Web服务器(即Apache,IIS),它接收来自浏览器的请求并将其传递给请求处理程序以读取和生成响应。请求处理程序是一个程序(用ASP.NET,PHP,Ruby等编写),它读取请求,其标题和cookie以检查请求的内容,并在需要时更新服务器上的信息。然后它将以特定格式(JSON,XML,HTML)组合响应。

  2. 服务器发出HTTP响应。
    服务器响应包含您请求的网页以及状态代码,压缩类型(Content-Encoding),如何缓存页面(Cache-Control),要设置的任何cookie,隐私信息等。
    HTTP服务器响应示例:
    在这里插入图片描述
    如果查看上面的响应,第一行显示状态代码。这非常重要,因为它告诉我们响应的状态。使用数字代码详细说明了五种类型的状态。

  • 1xx 仅表示信息性消息
  • 2xx 表示某种成功
  • 3xx 将客户端重定向到另一个URL
  • 4xx 表示客户端出错
  • 5xx 表示服务器部分出错
    因此,如果您遇到错误,可以查看HTTP响应以检查您收到的状态代码类型。
  1. 浏览器显示HTML内容(对于最常见的HTML响应)。
    浏览器分阶段显示HTML内容。首先,它将呈现裸骨HTML骨架。然后它将检查HTML标记并发送对网页上其他元素的GET请求,例如图像,CSS样式表,JavaScript文件等。这些静态文件由浏览器缓存,因此它不必再次获取它们下次访问该页面时。最后,你会看到www.baidu.com出现在您的浏览器上。
    而已!
    虽然这似乎是一个非常繁琐的延长过程,但我们知道在我们按下键盘后输入网页所需的时间不到几秒钟。所有这些步骤都在我们甚至没有注意到之前的几毫秒内发生。
;