简而言之,发生了以下过程:DNS域名解析、建立TCP链接、浏览器请求获取页面html、接受响应结果解析html渲染页面、断开TCP链接

具体来说:

1.DNS域名解析:

通过DNS多级缓存解析域名对应的 WEB 服务器的实际IP地址。 缓存查找顺序如下:浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,公共的域名(如根域名服务器缓存等),查找的过程还是一个递归查询的过程。


2.建立TCP链接:(三次握手

客户端发送syn包(Seq=x)到服务器请求连接,并进入SYN_SEND状态,等待服务器确认;

服务器收到连接请求后,返回确认同时发送客户的SYN(ack=x+1)和自己的SYN包(Seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

通俗点说:

  1. 客户端:你能接收到我的消息吗?
  2. 服务端:可以的,那你能接收到我的回复吗?
  3. 客户端:可以,那我们开始传输吧。

为什么俩次不行:

a.服务器无法知道自己的序号是否被确认

b.不能防止客户端失效的请求报文段被服务器接收而出现错误,导致服务端一直等待,出现资源浪费

为什么不是四次握手:

三次足够,四次没必要。


3.浏览器请求获取页面html

        注意:HTTP的端口为80/8080,而HTTPS的端口为443

浏览器向服务器的 ip 地址发送相应的 http get 请求页面html,发起http请求的过程主要是组装http报文并将报文发向指定地址的过程。常用的方法有: GET, POSTPUT...


4.服务器返回响应结果

对TCP连接进行处理,对HTTP协议进行解析,并按照报文格式进一步封装成HTTP Request对象,供上层使用。这一部分工作一般是由Web服务器去进行,HTTP报文也分成三份,状态码 ,响应报头响应报文。

浏览器解析渲染页面

解析html:

  • 浏览器下载 HTML 数据,将html文档解析成为一个个标签,这些标签组成了树状结构
  • 如果解析到style标签则开始解析css,如果解析到link标签则先异步下载,完成后解析css。
  • 如果遇到script标签,判断是行内写法则直接解析执行,如果是src引入则同步下载脚本文件,下载完成立即执行,注意这里下载过程是阻塞的,其他流程都会等下载完成后执行。

渲染页面:

解析完成后,浏览器引擎会根据DOM树和CSS规则树来构造渲染树,并开始渲染并绘制页面这个过程涉及两个比较重要的概念回流重绘


5.断开TCP链接:(四次挥手

        1.客户端认为数据发送完成,向服务端发送一个FIN释放连接请求。

2.服务端收到释放请求后告诉应用层要释放TCP连接,发送ACK进入close-wait状态(TCP为双向连接,此时服务端不再接受客户端的数据,但可以发送数据给客户端)

3.服务端此时继续发送剩下的数据,完毕后向客户端发送连接释放请求,进入last-ack状态等待客户端的确认。

4.客户端收到释放请求后想服务端发送ACK确认应答,此时客户端进入time-wait状态持续2msl(报文段最大生存期),若该时间段内没有服务端的重发请求就进入closed状态,当服务端收到确认应答后也进入closed状态。



补充:若协议是https则会做加密

HTTPS = HTTP + 加密 + 认证

  • 要先申请CA证书,并安装在服务器上(一个文件,配置nginx支持监听443端口开启ssl并设置证书路径)
  • 浏览器发送请求;
  • 网站从浏览器发过来的加密规则中选一组自身也支持的加密算法和hash算法,并向浏览器发送带有公钥的证书,当然证书还包含了很多信息,如网站地址、证书的颁发机构、过期时间等。
  • 浏览器解析证书。
    • 验证证书的合法性。如颁发机构是否合法、证书中的网站地址是否与访问的地址一致,若不合法,则浏览器提示证书不受信任。
    • 若合法,浏览器会生成一串随机数的密码(即密钥),并用证书中提供的公钥加密。
    • 使用约定好的hash计算握手消息,并使用生成的随机数(即密钥)对消息进行加密,最后将之前生成的所有消息一并发送给网站服务器。
  • 网站服务器解析消息。用已有的私钥将密钥解密出来,然后用密钥解密发过来的握手消息,并验证是否跟浏览器传过来的一致。然后再用密钥加密一段握手消息,发送给浏览器。
  • 浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。

浏览器输入一个url会发生什么相关推荐

  1. 【计算机网络漫游】浏览器输入一个URL后发生了什么

    浏览器输入一个URL之后发生了什么?这个问题一直是一个非常经典的问题,透过这个问题,我们可以从数据包的角度,自顶向下 (也可以自底向上) 地理解计算机网络各层发生的事情,同时也是一个面试的热点问题.但 ...

  2. 浏览器输入一个URL地址后发生的事情

    在浏览器中输入一个URL至页面呈现,发生的事情? 1.域名解析:浏览器获得URL地址,向操作系统请求该URL对应的IP地址,操作系统查询DNS(首先查询本地HOST文件,没有则查询网络)获得对应的IP ...

  3. 浏览器输入一个URL过程

    1.输入地址,通过DNS域名解析成id地址 2.根据ip地址在互联网里找到对应服务器 3.tcp三次握手,正式发送请求前要建立TCP链接 4.建立TCP原因就是要在发送数据之前建立通道,客户端和服务器 ...

  4. 一文搞懂从浏览器输入一个URL到页面出现都经历了哪些过程

    1 过程一览 DNS解析(如果IP直接访问则此过程省略) 客户端与服务端进行TCP三次握手连接 客户端发送HTTP请求 服务器处理请求并返回HTTP报文 浏览器解析渲染页面 连接结束 2 细节剖析 2 ...

  5. 从浏览器输入一个URL(www.baidu.com)后执行全过程

  6. 当你在浏览器地址栏输入一个URL后回车,将会发生的事情?

    之前和前辈交流,他问了我这样一个问题,自己一时没有答上来,今天可以研究了一下,看到了一篇很不错的博客,转载过来,供大家学习. 原文地址:http://blog.csdn.net/libin_1/art ...

  7. 在地址栏上输入一个url,到这个页面呈现出来,中间会发生什么?

    在地址栏上输入一个url,到这个页面呈现出来,中间会发生什么? 查缓存 DNS 解析 TCP 连接 发送 HTTP 请求 服务器处理请求并返回 HTTP 报文 浏览器解析渲染页面 连接结束 o 首先在 ...

  8. 从输入一个URL地址到浏览器完成渲染的整个过程

    从输入一个URL地址到浏览器完成渲染的整个过程 1. 浏览器地址输入URL并回车 2. 浏览器查找当前URL是否存在缓存,并比较缓存是否过期 3. DNS解析URL对应的IP DNS解析实际上就是寻找 ...

  9. 当你在浏览器地址栏输入一个URL后回车,浏览器做了什么?

    以下是一个大概流程: 1. 浏览器向DNS服务器查找输入URL对应的IP地址. 2. DNS服务器返回网站的IP地址. 3. 浏览器根据IP地址与目标web服务器在80端口上建立TCP连接 4. 浏览 ...

最新文章

  1. 一种基于FPGA硬件求解对数的简化方法
  2. STL源码剖析学习七:stack和queue
  3. 用Python进行SQLite数据库操作
  4. DP 之 poj 2229
  5. StringBoot设置了拦截器没有产生作用,页面没有拦截
  6. Software_King-jdk配置java
  7. 从万物互联到万物智联,物联网的下一个爆发点在哪里?
  8. 阿里发布《2015-2016中国云栖创新报告》,北上杭深广排名前5
  9. 泛泰A860(高通8064 cpu 1080p) 刷4.4专用中文recovery TWRP2.7.1.2版(三版通刷)
  10. 服务端(java)实现微信支付二次签名
  11. linux ls -lrt 命令是什么意思
  12. VBA 复制同文件夹下多工作簿中同名工作表 分别粘贴至同一工作簿的不同工作表
  13. linux 内核配置otg,Linux 4.9.11 测试USB OTG功能
  14. 样本不平衡问题分析与部分解决办法
  15. 启动tomcat卡在“信息: Destroying ProtocolHandler”
  16. 如何用随机森林算法,在深海养肥一群鱼
  17. WhbtomT(半路出家) 的每日英语 收集 (四)
  18. 敞开心扉,一起聊聊Java多线程
  19. 基于android的宠物领养系统
  20. Excel总VBA相关类模块

热门文章

  1. [译] 正确实现 linkedPurchaseToken 以避免重复订阅
  2. condition实现通知部分线程
  3. Ubuntu 15.10 默认壁纸?
  4. [.NET] 怎样使用 async await 一步步将同步代码转换为异步编程
  5. Eclipse Web开发出现莫名其妙错误
  6. 按Sybase的PowerDesigner工具设计的数据库模型 --- 解析生成能兼容多种数据库的相应的C#底层代码...
  7. vue调用const_2020年Vue的这些面试题你会吗?
  8. java 守护进程 linux_Java使用appache deamon实现linux守护进程
  9. 中班音乐活动计算机反思,中班音乐教学反思
  10. 三阶汉诺塔java源代码_如何使用Java实现汉诺塔问题求解