在浏览器中输入URL并按Enter时会发生什么?
如果您从事任何技术专业,我肯定有人在某个时候问过您这个问题。无论您是工程师,开发人员,营销人员,甚至是销售人员,对我们的浏览器背后的工作以及如何通过互联网将信息传输到我们的计算机都有一个基本的了解总是很高兴的。
假设您要访问map.baidu.com,以检查下班前预订晚餐所需的确切时间。
1.您在浏览器的地址栏中输入map.baidu.com。
2.浏览器检查缓存中是否有DNS记录,以找到map.baidu.com的相应IP地址。
DNS(Domain Name System)是维护的网站(URL),并将其链接到特定IP地址的名称的数据库。互联网上的每个URL都有一个唯一的IP地址。IP地址属于托管我们请求访问的网站服务器的计算机。例如,www.baidu.com的IP地址为209.85.227.104。因此,您可以根据需要在浏览器中输入http://209.85.227.104来访问www.baidu.com。DNS是URL及其IP地址的列表,就像电话簿是名称及其对应电话号码的列表一样。
DNS的主要目的是人性化的导航。您可以通过在浏览器中输入正确的IP地址来轻松访问该网站,但是想像一下我们必须经常访问的所有网站都必须记住不同的数字集吗?因此,更容易记住使用URL的网站名称,并让DNS通过将其映射到正确的IP为我们完成工作。
要查找DNS记录,浏览器将检查四个缓存。
-
首先,它检查浏览器缓存。浏览器会为您以前访问的网站在固定期限内维护DNS记录的存储库。因此,它是运行DNS查询的第一位。
-
其次,浏览器检查操作系统缓存。如果它不在浏览器缓存中,则浏览器将对您的基础计算机操作系统进行系统调用(即Windows上的gethostname)以获取记录,因为该操作系统还维护DNS记录的缓存。
-
第三,检查路由器缓存。如果不在您的计算机上,则浏览器将与维护自己的DNS记录缓存的路由器通信。
-
第四,检查ISP缓存。如果所有步骤失败,浏览器将继续使用ISP。您的ISP维护自己的DNS服务器,其中包括DNS记录的缓存,浏览器将检查该DNS记录,以期找到希望的URL。
您可能想知道为什么在这么多级别上维护了这么多缓存。尽管将我们的信息缓存在某个地方并不能使我们感到非常自在,但缓存对于调节网络流量和缩短数据传输时间至关重要。
3.如果请求的URL不在缓存中,则ISP的DNS服务器会发起DNS查询,以查找托管map.baidu.com的服务器的IP地址。
如前所述,要使我的计算机与托管map.baidu.com的服务器连接,我需要map.baidu.com的IP地址。DNS查询的目的是在Internet上搜索多个DNS服务器,直到找到该网站的正确IP地址。这种搜索称为递归搜索,因为该搜索将反复从DNS服务器继续进行到DNS服务器,直到找到我们需要的IP地址或返回错误消息(表明找不到该地址)为止。
在这种情况下,我们将ISP的DNS服务器称为DNS递归器,其职责是通过向Internet上的其他DNS服务器询问答案来找到所需域名的正确IP地址。其他DNS服务器称为名称服务器,因为它们基于网站域名的域体系结构执行DNS搜索。
在不让您进一步困惑的情况下,我想使用下图说明域体系结构。
我们今天遇到的许多网站URL包含一个第三级域,一个第二级域和一个顶级域。这些级别中的每一个都包含自己的名称服务器,该名称服务器在DNS查找过程中进行查询。
对于map.baidu.com,首先,DNS递归将与根名称服务器联系。根名称服务器会将其重定向到.com域名服务器。** .com** 名称服务器会将其重定向到baidu.com名称服务器。在 baidu.com域名服务器将在其DNS记录找到map.baidu.com匹配的IP地址,并返回到你的DNS recursor,将其发送回浏览器。
这些请求是使用小型数据包发送的,这些数据包包含信息,例如请求的内容以及其发往的IP地址(DNS递归的IP地址)。这些数据包在到达正确的DNS服务器之前,会通过客户端和服务器之间的多个网络设备传输。该设备使用路由表确定哪种方法是数据包到达其目的地的最快方法。如果这些数据包丢失,您将收到请求失败错误。否则,它们将到达正确的DNS服务器,获取正确的IP地址,然后返回您的浏览器。
4.浏览器启动与服务器的TCP连接。
一旦浏览器收到正确的IP地址,它将与服务器建立一个与IP地址匹配的连接以传输信息。浏览器使用Internet协议建立此类连接。可以使用几种不同的Internet协议,但是TCP是用于许多类型的HTTP请求的最常见协议。
要在您的计算机(客户端)和服务器之间传输数据包,建立TCP连接非常重要。此连接是使用称为TCP / IP三向握。这是一个三步过程,其中客户端和服务器交换SYN(同步)和ACK(确认)消息以建立连接。
1.客户端计算机通过Internet将SYN数据包发送到服务器,询问是否为新连接打开。
2.如果服务器具有开放的端口,可以接受和发起新的连接,它将使用SYN / ACK数据包以对SYN数据包的确认进行响应。
3.客户端将从服务器接收SYN / ACK数据包,并通过发送ACK数据包确认它。
然后将建立一个TCP连接以进行数据传输!
5.浏览器将HTTP请求发送到Web服务器。
一旦建立了TCP连接,就该开始传输数据了!浏览器将发送GET请求,要求提供map.baidu.com网页。如果您输入凭据或提交表单,则可能是POST请求。此请求还将包含其他信息,例如浏览器标识(User-Agent标头),将接受的请求类型(Accept标头)以及要求其保持TCP连接有效以进行其他请求的连接标头。它还将传递从浏览器存储在该域中的cookie中获取的信息。
样本GET请求(标头突出显示):
(如果您对幕后情况感到好奇,可以使用Firebug等工具查看HTTP请求。在我们不知道的情况下,查看客户端和服务器之间传递的信息总是很有趣的)。
6.服务器处理该请求并发送回响应。
该服务器包含一个Web服务器(即Apache,IIS),该服务器从浏览器接收请求并将其传递给请求处理程序以读取并生成响应。请求处理程序是一个程序(用ASP.NET,PHP,Ruby等编写),它读取请求,其标头和cookie以检查所请求的内容,并在需要时更新服务器上的信息。然后,它将以特定格式(JSON,XML,HTML)组合响应。
7.服务器发出HTTP响应。
服务器响应包含您请求的网页以及状态代码,压缩类型(Content-Encoding),如何缓存页面(Cache-Control),要设置的任何cookie,隐私信息等。
HTTP服务器响应示例:
如果您查看以上响应,第一行将显示状态码。这非常重要,因为它告诉我们响应的状态。使用数字代码可详细说明五种状态。
-
1xx表示仅参考消息
-
2xx表示某种成功
-
3xx将客户端重定向到另一个URL
-
4xx表示客户端错误
-
5xx表示服务器方面的错误
因此,如果遇到错误,则可以查看HTTP响应以检查收到的状态码类型。
8.浏览器显示HTML内容(用于HTML响应,这是最常见的)。
浏览器分阶段显示HTML内容。首先,它将渲染裸露的HTML骨架。然后,它将检查HTML标记并发出GET请求,以获取网页上其他元素的请求,例如图像,CSS样式表,JavaScript文件等。这些静态文件由浏览器缓存,因此不必提取它们下次您再次访问该页面时。最后,您会看到map.baidu.com出现在浏览器中。
参考
What happens when you type a URL in the browser and press enter?