HTTP请求如何工作

从头到尾在浏览器中键入URL时会发生什么

本文介绍了浏览器如何使用HTTP / 1.1协议执行页面请求

如果您曾经接受过采访,那么您可能会被问到:“当您在Google搜索框中输入内容并按Enter时,会发生什么情况”。

这是您提出的最受欢迎的问题之一。人们只是想看看您是否可以解释一些相当基本的概念,以及您是否对互联网的实际工作有任何了解。

在本文中,我将分析当您在浏览器的地址栏中键入URL并按Enter时会发生什么。

在博客文章中进行剖析是一个非常有趣的话题,因为它涉及到许多我可以在单独的文章中探讨的技术。

这项技术很少更改,可以为人类建立的最复杂,最广泛的生态系统提供动力。

HTTP协议

首先,我特别提到HTTPS,因为它与HTTPS连接有所不同。

我仅分析网址请求

现代的浏览器能够知道您在地址栏中写的内容是实际的URL还是搜索词,并且如果不是有效的URL,它们将使用默认的搜索引擎。

我假设您键入一个实际的URL。

输入URL并按Enter键后,浏览器会首先构建完整的URL。

如果您刚刚输入域,例如flaviocopes.com,默认情况下,浏览器会前置HTTP://,默认为HTTP协议。

事情与macOS / Linux有关

仅供参考。 Windows的某些功能可能会略有不同。

DNS查找阶段

浏览器启动域名解析查找以获取服务器IP地址。

域名对于我们人类来说是一个方便的快捷方式,但是互联网的组织方式使得计算机可以通过其IP地址查找服务器的确切位置,该IP地址是一组数字,例如222.324.3.1(IPv4)。

首先,它检查DNS本地缓存,以查看该域最近是否已解析。

Chrome浏览器有一个方便的DNS缓存可视化工具,您可以在以下位置看到chrome:// net-internals /#dns

如果在此找不到任何内容,则浏览器将使用DNS解析器,并使用gethostbynamePOSIX系统调用以检索主机信息。

gethostbyname

gethostbyname首先查看本地主机文件,该文件在macOS或Linux上位于/etc/hosts,以查看系统是否在本地提供信息。

如果这没有提供有关域的任何信息,则系统会向DNS服务器发出请求。

DNS服务器的地址存储在系统偏好设置中。

这些是2种流行的DNS服务器:

  • 8.8.8.8:Google公共DNS服务器
  • 1.1.1.1:CloudFlare DNS服务器

大多数人使用其互联网提供商提供的DNS服务器。

浏览器使用UDP协议执行DNS请求。

TCP和UDP是计算机网络的两个基本协议。它们处于相同的概念级别,但是TCP面向连接,而UDP是一种无连接协议,更轻巧,用于发送消息而开销很小。

UDP请求的执行方式不在本教程的范围之内

DNS服务器可能在缓存中具有域IP。如果没有,它将询问根DNS服务器。那是一个驱动整个互联网的系统(由13台实际服务器组成,分布在地球上)。

DNS服务器可以不是知道地球上每个域名的地址。

它所知道的是顶级DNS解析器是。

顶级域是域扩展:.com.it.pizza等等。

根DNS服务器接收到请求后,会将请求转发到该顶级域(TLD)DNS服务器。

说您正在寻找flaviocopes.com。根域DNS服务器返回.com TLD服务器的IP。

现在,我们的DNS解析器将缓存该TLD服务器的IP,因此它不必再次询问根DNS服务器。

TLD DNS服务器将具有我们要查找的域的权威名称服务器的IP地址。

如何?当您购买域名时,域名注册商会向相应的TDL发送名称服务器。当您更新名称服务器时(例如,当您更改托管服务提供商时),该信息将由您的域名注册商自动更新。

这些是托管服务提供商的DNS服务器。它们通常大于1,以用作备份。

例如:

  • ns1.dreamhost.com
  • ns2.dreamhost.com
  • ns3.dreamhost.com

DNS解析器从第一个开始,然后尝试询问您要查找的域的IP(也包含子域)。

那是IP地址真实性的最终来源。

现在我们有了IP地址,就可以继续前进了。

TCP请求握手

在服务器IP地址可用的情况下,现在浏览器可以启动与之的TCP连接。

在完全初始化TCP连接之前,您需要进行一些握手,然后您才能开始发送数据。

建立连接后,我们可以发送请求

发送请求

该请求是以通信协议确定的精确方式构造的纯文本文档。

它由3部分组成:

  • 请求行
  • 请求头
  • 请求主体

请求线

请求行设置为一行:

  • HTTP方法
  • 资源位置
  • 协议版本

例子:

GET / HTTP/1.1

请求标头

请求标头是一组field: value对设置某些值。

有2个必填字段,其中一个是Host,另一个是Connection,而所有其他字段都是可选的:

Host: flaviocopes.com
Connection: close

Host表示我们要定位的域名,而Connection始终设置为close除非必须保持连接断开。

一些最常用的标头字段是:

  • Origin
  • Accept
  • Accept-Encoding
  • Cookie
  • Cache-Control
  • Dnt

但还有更多。

标题部分由空白行终止。

请求主体

请求主体是可选的,不在GET请求中使用,但在POST请求中有时甚至在其他动词中也使用非常多,它可以包含以下内容:JSON格式格式。

由于我们现在正在分析GET请求,因此主体为空白,因此我们不再赘述。

响应

发送请求后,服务器将对其进行处理并发送回响应。

响应以状态代码和状态消息开头。如果请求成功并返回200,它将以以下内容开头:

200 OK

该请求可能返回不同的状态码和消息,例如以下之一:

404 Not Found
403 Forbidden
301 Moved Permanently
500 Internal Server Error
304 Not Modified
401 Unauthorized

然后,响应包含HTTP标头和响应正文的列表(由于我们在浏览器中发出请求,因此将为HTML)

解析HTML

现在,浏览器已收到HTML并开始对其进行解析,并将对页面所需的所有资源重复与我们完全相同的过程:

  • CSS文件
  • 图片
  • 网站图标
  • JavaScript文件

然后,浏览器如何呈现页面是超出范围的,但重要的是要了解,我描述的过程不仅针对HTML页面,而且针对通过HTTP服务的任何项目。


更多网络教程: