从你在浏览器输入url到发起http请求,这过程到底发生了什么?

bigdata 2018-11-26 17:38:48 ⋅ 143 阅读

原文作者:波波说运维

链接:https://www.toutiao.com/i6626321723874607620/

概述

当你在浏览器输入url到发起http请求,这过程到底发生了什么?其实整个流程如下:

  1. 域名解析

  2. 为了将消息从你的PC上传到服务器

  3. 上.需要用到1P协议、ARP协议和0SPF协议

  4. 发起TCP的3次握手

  5. 建立TCP连接后发起http请求

  6. 服务器响应htp请求

  7. 浏览器解析htm代码,并请求html代码中的资源(如js、css、图片等)

  8. 断开TCP连接

  9. 浏览器对页面进行渲染呈现给用户


用户输入url

当用户输入url,操作系统会将输入事件传递到浏览器中,在这过程中,浏览器可能会做一些预处理,比如 Chrome 会根据历史统计来预估所输入字符对应的网站,例如输入goog,根据之前的历史发现 90% 的概率会访问「www.google.com 」,因此就会在输入回车前就马上开始建立 TCP 链接甚至渲染了。

接着是输入url之后,点击回车,这时浏览器会对 URL 进行检查,首先判断协议,如果是 http 就按照 Web 来处理,另外还会对这个 URL 进行安全检查

安全检查完成之后,在浏览器内核中会先查看缓存,然后设置 UA 等 HTTP 信息,接着调用不同平台下网络请求的方法。

注意:

浏览器和浏览器内核是不同的概念,浏览器指的是 Chrome、Firefox,而浏览器内核则是 Blink、Gecko,浏览器内核只负责渲染,GUI 及网络连接等跨平台工作则是浏览器实现的



http网络请求

  • 通过 DNS 查询 IP;

  • 通过 Socket 发送数据

dns查询ip

DNS,英文是Domain Name System,中文叫域名系统,是Internet的一项服务,他将域名和IP地址相互映射的一个分布式数据库

假设用户在浏览器中输入的是www.google.com,大概过程:

如果输入的是域名,则需要进行dns查询,将域名解析成ip;

进行DNS查询的主机或软件叫做DNS解析器,用户使用的工作站或电脑都属于解析器。域名解析就是利用DNS解析器得到对应IP过程,解析器会向域名服务器进行查询处理。

主要过程如下:

  • 从浏览器缓存中查找域名www.google.com的IP地址

  • 在浏览器缓存中没找到,就在操作系统缓存中查找,这一步中也会查找本机的hosts看看有没有对应的域名映射(当然已经缓存在系统DNS缓存中了)

  • 在系统中也没有的话,就到你的路由器来查找,因为路由器一般也会有自己的DNS缓存

如果以上都没有找到,则继续往下向dns域名服务器查询

  • 用户电脑的解析器向LDNS(也就是Local DNS,互联网服务提供商ISP),发起域名解析请求,查询www.google.com的IP地址,这是一个递归查找过程

  • 在缓存没有命中的情况下,LDNS向根域名服务器.查询www.google.com的IP地址,LDNS的查询过程是一个迭代查询的过程

  • 根告诉LDNS,我不知道www.google.com对应的IP,但是我知道你可以问com域的授权服务器,这个域归他管

  • LDNS向com的授权服务器问www.google.com对应的IP地址

  • com告诉LDNS,我不知道www.google.com对应的IP,但是我知道你可以问google.com域的授权服务器,这个域归他管

  • LDNS向google.com的授权服务器问www.google.com对应的IP地址

  • google.com查询自己的ZONE文件(也称区域文件记录),找到了www.google.com对应的IP地址,返回给LDNS

  • LDNS本地缓存一份记录,把结果返回给用户电脑的解析器

  • 在这之后,用户电脑的解析器拿到结果后,缓存在自己操作系统DNS缓存中,同时返回给浏览器,浏览器依旧会缓存一段时间。

注意,

域名查询时有可能是经过了CDN调度器的(如果有cdn存储功能的话)

而且,需要知道dns解析是很耗时的,因此如果解析域名过多,会让首屏加载变得过慢,可以考虑dns-prefetch优化

tcp/ip请求

有了 IP 地址,就可以通过 Socket API 来发送数据了,这时可以选择 TCP 或 UDP 协议。

http本质是tcp协议。

TCP是一种面向有连接的传输层协议。他可以保证两端(发送端和接收端)通信主机之间的通信可达。他能够处理在传输过程中丢包、传输顺序乱掉等异常情况;此外他还能有效利用宽带,缓解网络拥堵。

建立TCP连接一开始都要经过三次握手:

三次握手


第一次握手,请求建立连接,发送端发送连接请求报文

第二次握手,接收端收到发送端发过来的报文,可知发送端现在要建立联机。然后接收端会向发送端发送一个报文

第三次握手,发送端收到了发送过来的报文,需要检查一下返回的内容是否是正确的;若正确的话,发送端再次发送确认包

在TCP连接建立完成之后就可以发送HTTP请求了。

注意

浏览器对同一个域名有连接数限制,大部分是 6,http1.0中往往一个资源下载就需要对应一个tcp/ip请求,而像 HTTP 2.0 协议尽管只使用一个 TCP 连接来传输数据,但性能反而更好,而且还能实现请求优先级。

---------------END----------------

后续的内容同样精彩

长按关注“IT实战联盟”哦



全部评论: 0

    我有话说:

    京东技术:Web自动化测试 | 充分利用浏览器记录的信息

    Web页面的展示依托于浏览器,当用户请求一个URL的时候,浏览器会记录下HTTP请求页面渲染成功这个过程的所有信息。

    浅谈http中的Cache-Control

    前言   我们用http访问时,会先发送一个请求,之后服务器返回一个应答,Chrome的开发者工具(按F12或右击选择检查)中展现整个过程:     第一部分

    移动Web实战篇-使用CSS Sprites减少的页面http请求

    用户新打开一个网页80%的时间耗费加载网页内容方面。很多炫酷的网页往往通过图片来展现给用户的,那么页面每加载一张图片就是一个http请求,如果图片过多会严重影响图片渲染速度。

    搞对数据库连接池,100优化3ms!阿里架构师都说好

    研究HikariCP(一个数据库连接池)时无意间HikariCP的Github wiki上看到一篇文章(即前面给出的链接),篇文章有力地消除我一直以来的疑虑,看完之后感觉神清气爽。故

    「360技术」Pika 3.4.0 发布单机集群

    pika 3.4.0 发布。pika 是 360 公司发布一个可持久化的大容量 redis 存储服务,兼容 string、hash、list、zset、set 的绝大部分接口,解决 redis

    为什么要使用 Node.js?几点必须知道!

    经过几年的发展,前端普遍进入技术深水区,只会Web页面开发已经难以满足企业的需求,Node逐渐成为刚性技能。 但Node业务上的使用还没有那么普及,有的时候想用老板还不同意,本文将4个角度

    Swoole v4.5.8 版本发布,新增 swoole_error_log 函数

    Swoole v4.5.8 版本已经发布这个版本中增加 swoole_error_log 函数,用户可以手动调用此函数将错误信息输入日志中。 并且还优化 Server

    HTTP/2.0 服务器推送实现

    HTTP/2允许服务器请求之前先推送响应信息客户端(之前客户端有过请求),如果实现HTTP缓存,推送的响应信息可以客户端被缓存(可通过no-cache进行配置)。

    Nginx灰度升级实现说明

    基础介绍 下文分别名词解释、灰度升级的作用、灰度升级方案3个方面展开介绍: 1.名词解释 灰度升级:灰度升级是一种升级时候的平滑切换,当有些服务器的客户端要进行升级,可以只对其中一个客户端升级并

    Linux 5.10 LTS 发布,支持 2026 年

    Linus Torvalds 宣布 Linux 5.10 的发布是当下最新的主线内核更新,也是最新的 "长期支持(LTS)"版本。内核开发人员计划一直维护 Linux 5

    「下载」Spring Cloud Alibaba 入门实战.pdf

    前言 近些年随着云技术的发展,越来越多的用户选择使用云技术来代替将传统的 IT 基础设 施。云技术发展的早期,业界的关注点集中虚拟化、分布式、存储等 Iaas 方面的技 术。但是随着“云原生

    PyCharm 2021.1 EAP 4 发布,支持 WSL 2 和更快的索引

    PyCharm 2021.1 EAP 4 为 WSL 2 的支持带来几个不错的补充,并使索引速度更快,同时引入 GitHub 拉取请求模板。 支持 WSL 2 现在开始,可以

    高并发案例 - 库存超发问题

    1. 库存超发的原因是什么执行商品购买操作时,有一个基本流程: 例如初始库存有3个。 第一个购买请求,想买2个,数据库中读取库存有3个,数量够,可以买,减库存后,更新库存为1个

    数据生成工具 ZenData 发布 1.5 版本,新增 CSV 和 Excel 输出格式,字段定义支持表达式

    随着DevOps的日益流行,越来越多的团队开始关注持续集成和持续交付。这种大背景下,自动化测试就越来越重要。那么问题来,如何能够实现大规模、工程化的自动化测试呢?里面会涉及诸多的问题,比如

    httpclient v1.2.11 已经发布

    httpclient v1.2.11 已经发布。本项目针对http协议定义所有http实现之上的接口来描述一个http请求,使用者只需要面对同一套语义化的接口, 如果需要切换http

    GeoGebra 6.0.606.0 发布,绘图神器

    Geogebra 是动态数学软件,它将几何、代数、电子表格、绘图、统计和微积分集成一个易于使用的软件包中。 GeoGebra 6.0.606.0 版本现已发布,具体更新内容如下: 符号输入框:为

    代码这样优化,瞬间清爽多

    今天篇文章我们又来聊聊代码优化。 隐藏行为细节 平时的开发过程中,肯定会碰到这样的业务,比如判断车速是否正常。一般编码如下: float speed = 60f

    Logstash 7.9.2 发布,开源服务端数据处理流程

    Logstash 是开源的服务器端数据处理管道,能够同时多个来源采集数据,转换数据,然后将数据发送最喜欢的“存储库”中。目前,Logstash 7.9.2 已正式发布,该版本更新内容如下