如果我们访问一个网站,只需要在浏览器中输入网站的域名,就可以请求到网站的服务器,得到我们想要的页面。这个过程很是短暂,但你知道他的过程是怎么的么?

今天就说一说一次完整的HTML请求的过程是怎么样的

解析URL

一次完整的http请求过程是怎样的?

我向浏览器中输入网址后,浏览器会效验网址的合法性,如果网址不合法,会传给默认的搜索引擎。

如果网址合法并通过验证,浏览器会解析,得到协议(http或https),域名,资源页面(比如首面等)

DNS查询

浏览器会先检查域名信息是否在缓存中。

再检查域名是否在本地的Hosts文件中。

如果还不在,那么浏览器会向DNS服务器发送一个查询请求,获得目标服务器的IP地址。

TCP封包及传输

一次完整的http请求过程是怎样的?

浏览器获得了目标服务器的IP(DNS返回)、端口(URL中包含,没有就使用默认),浏览器会调用库函数socket,生成一个TCP流套接字,也就是完成了TCP的封包。

得到服务器IP地址后,User-Agent(一般是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的WEB程序的80端口发起TCP的连接请求。这个连接请求(原始的http请求经过TCP/IP4层模型的层层封包)到达服务器端后还有可能要经过防火墙的过滤,最终到达WEB程序,最终建立了TCP/IP的连接。

TCP封包完成之后,就可以传输了,在完成“你瞅啥”,“瞅你咋地”,“来,过来唠唠”一系列操作之后,浏览器和服务器就完成了TCP的三次握手,建立了连接,后面就可以请求服务器资源了。

建立TCP连接后发起HTTP请求

TCP3次握手后,浏览器发起了http的请求

HTTP请求报文格式,报文由3部分组成(请求行+请求头+请求体)

1、请求行:

①请求方法,GET、POST最常见,还有DELETE、HEAD、OPTIONS、PUT、TRACE。

②URL地址,它和报文头的Host属性组成完整的请求URL。

③协议名称及版本号。

2、请求头:

HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。与缓存相关的规则信息,均包含在header中

3、请求体:

它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“tuotiao.com?param1=value1&param2=value2”的方式传递请求参数。

服务器接收请求并相应

服务器端WEB程序接收到http请求后,开始处理该请求,返回给浏览器html

一些常见状态码

200:成功

301:永久重定向, Location响应首部的值仍为当前URL,为隐藏重定向

302:临时重定向,显式重定向, Location响应首部的值为新的URL

304:Not Modified 未修改,本地缓存的资源文件

404:Not Found 请求的URL资源并不存在

500:Internal Server Error 服务器内部错误

502:Bad Gateway 连接不到服务器

504:Gateway Timeout 能连接服务器,但服务器未在规定时间内给响应

浏览器解析并渲染

一次完整的http请求过程是怎样的?

浏览器从服务器拿到了想要访问的资源,大多数时候,这个资源就是HTML页面,当然也可能是一个其他类型的文件。

浏览器先对HTML文档进行解析,生成解析树(以DOM元素为节点的树)。

加载页面的外部资源,比如JS、CSS、图片。

遍历DOM树,并计算每个节点的样式,最终完成渲染,变成我们看到的页面。