从输入url地址后浏览器发生了什么

从输入url地址后浏览器发生了什么-网络篇

假如输入了https://www.baidu.com/

一:网络请求:

1. 构建请求

浏览器会构建请求行:

//请求方法是GET,路径是根路径,HTTP协议版本为1.2
GET/HTTP/1.2

2. 查找强缓存
浏览器会先检查强缓存,如果命中直接使用,没有则进入下一步。

3.DNS解析
由于输入的是域名,数据包是通过IP地址传给对方的。因此我们需要得到域名对应的Ip地址。这个过程需要依赖一个服务系统,这个系统将域名和IP 一 一映射,我们称这个系统为DNS(域名系统)。得到具体IP的过程就是DNS解析。
注意:浏览器自带DNS数据缓存功能,即如果一个域名已经解析过了,会被缓存下来,下次直接走缓存,不走DNS解析 ,另外如果不指定端口号的话 浏览器默认IP为80的端口号。

4.建立TCP连接
*提醒:Chrome在一个域名下要求同时最多只能有6个TCP连接,超过6个其他的就要等待。

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。用

建立TCP连接经历了下面三个阶段:
1.通过三次握手(即发送3个数据包确认已经建立连接)建立客户端和服务器之间的连接
2.进行数据传输。这里有一个机制,就是接收到数据包后必须要向发送方确认,如果发送方没有接收到这个确认的消息,就会被判定为数据包丢失,并重新发送改数据包。当然发送过程中有一个优化策略,就是把大的数据包拆成小的数据包,依次传输到接收方,接收方按照小包的顺序把它们组装成完整的数据包。
3.断开连接的阶段。数据传输完成。通过四次挥手来断开连接
这里有详细的计算机网络基础知识,关于三次握手,四次挥手…大家有空可以看看推荐文章

5.发送HTTP请求
现在TCP连接建立完成,浏览器和服务器可以开始通信,即开始发送HTTP请求。浏览器发送HTTP请求要携带三样东西,请求行,请求头和请求体

首先,浏览器会向服务器器发送请求行,关于请求行,我们已经写过,
// 请求方法是GET,路径为根路径,HTTP协议版本为1.1 GET / HTTP/1.1

由请求方法,请求URL和HTTP版本协议组成。
同时也要带上请求头,比如我们之前说的Cache-Control、If-Modified-Since、If-None-Match都由可能被放入请求头中作为缓存的标识信息。当然了还有一些其他的属性,列举如下:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: no-cache
Connection: keep-alive
Cookie: /* 省略cookie信息 */
Host: www.baidu.com
Pragma: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1

最后是请求体,请求体只有在POST方法下存在,常见的是表单提交。

网络响应

HTTP请求到达服务器,服务器进行对应的处理,最后要把数据传给浏览器,也就是返回网络响应。
跟请求部分很像,有:响应行,响应头和响应体
响应行类似下面

HTTP/1.1 200 OK

HTTP协议版本、状态码和状态描述组成响应头包含了服务器及返回数据的一些信息,服务器生成数据的时间,返回的数据类型以及是否写入的Cookie信息。
如:

Cache-Control: no-cache
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Wed, 04 Dec 2019 12:29:13 GMT
Server: apache
Set-Cookie: rsv_i=f9a0SIItKqzv7kqgAAgphbGyRts3RwTg%2FLyU3Y5Eh5LwyfOOrAsvdezbay0QqkDqFZ0DfQXby4wXKT8Au8O7ZT9UuMsBq2k; path=/; domain=.baidu.com

响应完成后,TCP连接就断开?
不一定。这时候要判断Connection字段,如果请求头或者响应头包含Connection:keep-alive,表示建立了持久连接,这样TCP连接会一直保持。之后请求统一站点的资源会复用这个资源。
否则断开TCP连接,请求-响应流程结束。
总结:网络请求过程如下:
在这里插入图片描述