前一段时间,面试问到了这个问题,感觉自己回答的不是很好,
当时我的回答是

1.域名解析(这个说了一下域名解析的过程)  ,解析出对应IP地址
2.解析成功之后,发起TCP三次握手建立连接
3.建立连接后发起HTTPS请求
4.服务器响应https请求,浏览器得到html代码
5.浏览器解析html代码,并请求静态资源(html/css/js等)
6.然后浏览器渲染,展示给用户

但是当时面试官问我, 发起http请求到服务器然后返回给客户端主要做了那些工作,但是我一下蒙了就没有想起来,当时回答这一块就感觉很一般。今天来总结一下一次完整的HTTP请求过程到底经历了什么

我们按照上面的步骤一步一步详细说明

1.域名解析

域名解析这一步,我当时回答的比较完整,因为之前自己在阿里云上注册了一个域名,然后详细看了一下域名解析的步骤,《深入分析java web》许令波著,当中有详细将,下图借鉴《深入分析java web》当中DNS解析所用到的图

1)首先会搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存)

2)如果浏览器自身的缓存里面没有找到,那么浏览器会搜索操作系统自身的DNS缓存,其实操作系统也会有一个域名解析的过程,在Windows中可以通过C:\Windows\System32drivers\etc\hosts文件来设置,你可以将任何域名解析到任何能够访问的IP地址。如果你在这里指定了一个域名对应的IP地址,那么浏览器会首先使用这个IP地址。  在Linux中这个配置文件是/etc/hosts,修改这个文件可以达到同样的目的。操作系统会在缓存中缓存这个解析结果,缓存的时间同样是受这个域名的失效时间和缓存的空间大小控制的。

小总结:   前面这两个步骤都是在本机完成的,所以在图1-10中没有表示出来。到这里还没有涉及真正的域名解析服务器,如果在本机中仍然无法完成域名的解析,就会真正请求域名服务器来解析这个域名了。

3)在我们的网络配置中都会有“DNS服务器地址”这一项,这个地址就用于解决前面所说的如果两个过程无法解析时要怎么办,操作系统会把这个域名发送给这里设置的LDNS(Local DNS),也就是本地区的域名服务器。(这个DNS通常都提供给你本地互联网接入的一个DNS解析服务,例如你是在学校接入互联网,那么你的DNS服务器肯定在你的学校,如果你是在一个小区接入互联网的,那这个DNS就是提供给你接入互联网的应用提供商,即电信或者联通,也就是通常所说的SPA)

小总结:这个专门的域名解析服务器性能都会很好,它们一般都会缓存域名解析结果,当然缓存时间是受域名的失效时间控制的,一般缓存空间不是影响域名失效的主要因素。大约80%的域名解析都到这里就已经完成了,所以LDNS主要承担了域名的解析工作。

4)如果LDNS仍然没有命中,就直接到RootServer域名服务器请求解析。

5)根域名服务器返回给本地域名服务器一个所 查询域的主域名服务器(gTLdServer)地址。gTLD是国际顶级域名服务器,如.com、 .cn、.org 等,全球只有(台左右。

6)本地域名服务器(Local DNS Server) 再向上-步返回的gTLD服务器发送请求。

7)接受请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常就是你注册的域名服务器,例如你在某个域名服务提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成。

8)NameServer域名服务器会查询存储的域名和IP的映射关系表,在正常情况下都根据域名得到目标IP记录,连同一个TTl值返回给DNS Server域名服务器。

9)返回该域名对应的IP和TTL值,Local DNS Server 会缓存这个域名和IP的对应关系,缓存的时间由TTL值控制。

10)把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,城解析过程结束。

在实际的DNS解析过程中,可能还不止这10个步骤,如Name Sever也可能有多或者有一个GTM来负载均衡控制,这都有可能会影响域名解析的过程。

总结: 一般情况前5步是可以解析出域名的。

2.TCP建立连接(三次握手)

ACK TCP报头的控制位之一,対数据迸行确认.硝人由目的端发出,用它来告泝发送端这个序列号之前的数据段都收到了。

比如,确认号为x,則表示前x-1个数据段都收到了,只有当ACK=1肘,确认号オ有效当,ACK=0时,确认号无效,这时会要求重传数据,保正数据的完整性.SYN同歩序列号,TCP建立连接吋将这个位置1

FIN发送端完成发送任努位,当TCP完成数据传输需要断开吋,提出断开连接的一方将这位置1

3.建立TCP连接之后,发起HTTP请求

 HTTP请求报文由三部分组成:请求行请求头请求正文

  1.请求行:用于描述客户端的请求方式,请求的资源名称以及使用的HTTP协议的版本号(例:GET/books/java.html HTTP/1.1)

  2.请求头:用于描述客户端请求哪台主机,以及客户端的一些环境信息等

  注:这里提一个请求头 Connection,Connection设置为 keep-alive用于说明 客户端这边设置的是,本次HTTP请求之后并不需要关闭TCP连接,这样可以使下次HTTP请求使用相同的TCP通道,节省TCP建立连接的时间

  3.请求正文:当使用POST, PUT等方法时,通常需要客户端向服务器传递数据。这些数据就储存在请求正文中(GET方式是保存在url地址后面,不会放到这里)

4.服务器端响应http请求,浏览器得到html代码

HTTP响应也由三部分组成:状态码,响应头和实体内容

  1.状态码:状态码用于表示服务器对请求的处理结果

  2.响应头:响应头用于描述服务器的基本信息,以及客户端如何处理数据

  3.实体内容:服务器返回给客户端的数据

 5.浏览器解析html代码,并请求html代码中的资源

浏览器拿到html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每个浏览器的线程数不一样),这是时候就用上 keep-alive特性了,建立一次HTTP连接,可以请求多个资源,下载资源的顺序就是按照代码里面的顺序,但是由于每个资源大小不一样,而浏览器又是多线程请求请求资源,所以这里显示的顺序并不一定是代码里面的顺序。

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

最后,浏览器利用自己内部的工作机制,把请求的静态资源和html代码进行渲染,渲染之后呈现给用户

  浏览器是一个边解析边渲染的过程。首先浏览器解析HTML文件构建DOM树,然后解析CSS文件构建渲染树,等到渲染树构建完成后,浏览器开始布局渲染树并将其绘制到屏幕上。这个过程比较复杂,涉及到两个概念: reflow(回流)和repain(重绘)。DOM节点中的各个元素都是以盒模型的形式存在,这些都需要浏览器去计算其位置和大小等,这个过程称为relow;当盒模型的位置,大小以及其他属性,如颜色,字体,等确定下来之后,浏览器便开始绘制内容,这个过程称为repain。页面在首次加载时必然会经历reflow和repain。reflow和repain过程是非常消耗性能的,尤其是在移动设备上,它会破坏用户体验,有时会造成页面卡顿。所以我们应该尽可能少的减少reflow和repain。

  JS的解析是由浏览器中的JS解析引擎完成的。JS是单线程运行,JS有可能修改DOM结构,意味着JS执行完成前,后续所有资源的下载是没有必要的,所以JS是单线程,会阻塞后续资源下载

总结:

1.域名解析(这个说了一下域名解析的过程)  ,解析出对应IP地址
2.解析成功之后,发起TCP三次握手建立连接
3.建立连接后发起HTTPS请求
4.服务器响应https请求,浏览器得到html代码
5.浏览器解析html代码,并请求静态资源(html/css/js等)
6.然后浏览器渲染,展示给用户

参考:

1. https://www.cnblogs.com/xuzekun/p/7527736.html

2.《深入分析java web》许令波著

一次完整的HTTP请求过程(深入分析)相关推荐

  1. 一次完整的域名请求过程

    一次完整的HTTP请求会经历哪些步骤? 这是最原始的问题 从网络的7层协议来划分 ( OSI参考模型 ),分别有 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 还有一个精简的5层模型 T ...

  2. php:一次完整的HTTP请求过程笔记

    HTTP 事务执行过程 1.客户端(浏览器)做出请求操作(输入网址.点击链接.提交表单) 2.客户端检测缓存 1)有缓存且较新,客户端直接读取本地缓存进行资源展示 2)有缓存但是不新,准备http请求 ...

  3. NetWork——描述一次完整的网络请求过程

    0.  前言 从我们在浏览器的地址栏输入http://blog.csdn.net/seu_calvin后回车,到我们看到该博客的主页,这中间经历了什么呢?简单地回答这个问题,大概是经历了域名解析.TC ...

  4. http-一次完整的HTTP请求过程-六个阶段

    当我们在浏览器的地址栏输入 www.baidu.com ,然后回车,回车这一瞬间到看到页面到底发生了什么呢? 域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请 ...

  5. 测试开发面试准备之HTTP协议-一次完整的Http请求过程

    1.域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并 ...

  6. PHP高频面试题 - 详述一次完整的HTTP请求过程

    这个问题的核心是域名解析和服务器(nginx)解析这两部分,基本上这两部分详细阐述就可以了. 步骤一.解析URL 浏览器会解析当前的URL数据,判断此URL是否为合法的链接.如果是合法链接则正常的向下 ...

  7. 深入分析Java Web技术内幕读书笔记(一)浅析Web请求过程

    随着Web技术的快速发展,互联网的网络架构已经从传统的C/S架构转变为B/S架构,B/S架构相较于传统的C/S架构,有诸多优点,例如:提供了统一的操作方式,简化了用户的学习成本:便捷的开发方式大大提高 ...

  8. 一次完整的http的请求过程与https的实现

    一次完整的http请求过程: (1)发起请求建立连接:  三次握手 接收请求或拒绝请求 (2)接受请求 来自网络的请求报文中对某资源的一次请求过程: 并发访问响应模型(Web I/O); 单进程I/O ...

  9. 一个完整的HTTP请求的详细过程

    整个流程 1.DNS解析 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址; 2.客户端连接到Web服务器 根据解析出 IP 地址与Web服务器的HTTP端口(默认为80)建立 ...

  10. python 爬虫001-http请求过程

    HTTP 请求流程 一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HT ...

最新文章

  1. 对Python中几种快速排序的实现以及运行时间进行比较
  2. 强烈推荐10 个机器学习教程!(含视频链接)
  3. 详解python 3下文本文件的编解码
  4. 动态加载NT驱动(源码)
  5. mysql fm999990.99999_Oracle如何显示小数点前面的0
  6. 腾讯智慧校园 php,河南省电化教育馆召开全省“腾讯智慧校园”试点工作推进会...
  7. C++实现整数值转中文大写
  8. js怎样递归遍历树形菜单数据
  9. AlphaGo是如何实现的
  10. 74LS138译码器介绍
  11. 基于Android的英文电子词典
  12. 《计算机系统与网络安全技术》一页纸开卷/期末复习内容
  13. Uninformed Students: Student–Teacher Anomaly Detection with Discriminative Latent Embeddings(翻译)
  14. 欧拉回路(欧拉路径)
  15. 项目经理需要掌握的硬技能和软技能
  16. 【HTML】常见的块元素,行内元素,行内块元素有哪些?
  17. npm ERR! code E404 npm ERR! 404 Not Found - GET
  18. 基于神经网络——鸢尾花识别(Iris)
  19. 17 geth客户端了解和安装
  20. Android TCP socket通信

热门文章

  1. 【拆解】便携示波器怎么选?
  2. 我的Java学习历程03【Java8接口新特性-下】
  3. TCP粘包和拆包问题
  4. matlab怎样定义全局变量,Matlab如何定义公共变量
  5. open3d 0.13的c++版本使用demo
  6. 计算机 金融工程 专业选择,金融工程专业对计算机编程能力是个什么要求呢
  7. 戴尔计算机恢复,DELL计算机恢复镜像问题(已解决)
  8. ANSYS模态分析详细步骤记录
  9. 增值税怎么用计算机算,增值税计算器
  10. Mac教程/迅雷mac版精简教程