从头到尾在浏览器中键入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解析器,并使用gethostbyname
POSIX系统调用以检索主机信息。
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服务的任何项目。
更多网络教程:
- WebSockets简介
- HTTP请求如何工作
- HTTP请求标头列表
- HTTP响应标头列表
- HTTP与HTTPS
- 什么是RFC?
- HTTP协议
- HTTPS协议
- HTTP请求的curl指南
- HTTP缓存
- HTTP状态代码列表
- 什么是CDN?
- HTTP / 2协议
- 什么是港口
- DNS,域名系统
- TCP协议
- UDP协议
- REST API简介
- 如何在macOS中安装本地SSL证书
- 如何生成本地SSL证书
- 如何为HTTPS配置Nginx
- 一个简单的Nginx反向代理,用于从子文件夹中提供多个Node.js应用程序
- 什么是反向代理?