http完整请求过程

本文详细阐述了从浏览器输入URL到页面加载完成的全过程,包括DNS域名解析、TCP连接的三次握手、发送HTTP请求、服务器处理请求、返回响应结果、断开TCP连接以及浏览器解析渲染页面的每个阶段,深入理解HTTP请求的每个步骤及其原理。

浏览器输入URL全过程
1 DNS域名解析
2 与目的主机进行TCP连接(三次握手)
3 发送HTTP请求
4 服务器处理请求
5 返回响应结果
6 与目的主机断开TCP连接(四次挥手)
7 浏览器解析渲染页面

1.域名解析成IP地址
访问目标地址有两种方式:
①使用目标IP地址访问。由于IP地址是一堆数字不方便记忆,于是有了域名这种字符型标识。
②使用域名访问。域名解析就是域名到IP地址的转换过程,域名的解析工作由DNS服务器完成。

浏览器缓存:浏览器会记录DNS一段时间,因此,只是第一个地方解析DNS请求;
操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使用系统调用操作系统,获取操作系统的记录(保证最近的DNS查询缓存);
路由器缓存:如果上述两个步骤均不能成功DNS记录,继续搜索路由器缓存;
ISP缓存:若上述均失败,继续向ISP搜索。

DNS域名解析时用的是UDP协议。整个域名解析的过程如下:
1、浏览器向本机DNS模块发出DNS请求,DNS模块生成相关的DNS报文;
2、DNS模块将生成的DNS报文传递给传输层的UDP协议单元;
3、UDP协议单元将该数据封装成UDP数据报,传递给网络层的IP协议单元;
4、IP协议单元将该数据封装成IP数据包,其目的IP地址为DNS服务器的IP地址;
5、封装好的IP数据包将传递给数据链路层的协议单元进行发送;
6、发送时在ARP缓存中查询相关数据,如果没有,就发送ARP广播(包含待查询的IP地址,收到广播的主机检查自己的IP,符合条件的主机将含有自己MAC地址的ARP包发送给ARP广播的主机)请求,等待ARP回应;
7、得到ARP回应后,将IP地址与路由的下一跳MAC地址对应的信息写入ARP缓存表;/8、写入缓存后,以路由下一跳的地址填充目的MAC地址,以数据帧形式转发;
9、转发可能进行多次;
10、DNS请求到达DNS服务器的数据链路层协议单元;
11、DNS服务器的数据链路层协议单元解析数据帧,将内部的IP数据包传递给网络层IP协议单元;
12、DNS服务器的IP协议单元解析IP数据包,将内部的UDP数据报传递给传输层UDP协议单元;
13、DNS服务器的UDP协议单元解析收到的UDP数据报,将内部的DNS报文传递给DNS服务单元;
14、DNS服务单元将域名解析成对应IP地址,产生DNS回应报文;
15、DNS回应报文->UDP->IP->MAC->我的主机;
16、主机收到数据帧,将数据帧->IP->UDP->浏览器;
17、将域名解析结果以域名和IP地址对应的形式写入DNS缓存表。

2.与目的主机进行TCP连接(三次握手)
通过DNS域名解析后终于拿到了服务器的IP地址,下一步就是连接服务器。对于客户端与服务器的连接,当然指的是TCP的三次握手了。

基础介绍

SYN(SYNchronization):同步序号,用来建立连接。
SYN标志位和ACK标志位搭配使用,当SYN=1,ACK=0,表示连接请求;当SYN=1,ACK=1,表示连接被响应的时候;这个标志的数据包经常被用来进行端口扫描。
ACK(ACKnowledgment):确认号,用于确认连接是否有效。
仅当ACK=1时确认号字段有效,当ACK=0时是无效的。TCP规定在连接建立后所有传送的报文段都必须把ACK置为1。
ACKNum(Acknowledgment Number):所期望收到的下一个序列号。
32位确认序列号包含发送确认的一端所期望收到的下一个序号,因此,确认序号应当是上次已成功收到数据字节序号加1。不过,只有当标志位中的ACK标志(下面介绍)为1时该确认序列号的字段才有效。主要用来解决不丢包的问题;
seq(Sequence Number):序列号。
FIN(finish):表示终结连接。
当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。
三次握手过程:

  • 第一次握手(SYN=1,ACK=0,seq=x)
    客户端发送一个TCP的数据包(SYN=1,ACK=0)指明客户端打算连接服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里
  • 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1)
    服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 seq序列号,放到 Seq 域里,同时将确认序号(ACKNum)设置为客户的 seq加1,即X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。
  • 第三次握手(ACK=1,ACKnum=y+1)
    客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写seq的+1发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。

3 发送HTTP请求
与服务器建立了连接后,就可以向服务器发起请求了。
发送HTTP请求的过程就是构建HTTP请求报文并通过TCP协议中发送到服务器指定端口(HTTP协议80/8080, HTTPS协议443)。HTTP请求报文是由三部分组成: 请求行, 请求报头和请求正文。

 - GET     请求获取Request-URI所标识的资源
 - POST    在Request-URI所标识的资源后附加新的数据
 - HEAD    请求获取由Request-URI所标识的资源的响应消息报头
 - PUT     请求服务器存储一个资源,并用Request-URI作为其标识
 - DELETE  请求服务器删除Request-URI所标识的资源
 - TRACE   请求服务器回送收到的请求信息,主要用于测试或诊断
 - CONNECT 保留将来使用
 - OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

4.服务器处理请求
服务器端收到请求后的由web服务器(准确说应该是http服务器)处理请求,诸如Apache、Ngnix、IIS等。web服务器解析用户请求,知道了需要调度哪些资源文件,再通过相应的这些资源文件处理用户请求和参数,并调用数据库信息,最后将结果通过web服务器返回给浏览器客户端。
请求方法(所有方法全为大写)有多种,各个方法的解释如下:

5.返回响应结果
HTTP响应报文也是由三部分组成: 状态码, 响应报头和响应报文。

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

 - 1xx:指示信息--表示请求已接收,继续处理
 - 2xx:成功--表示请求已被成功接收
 - 3xx:重定向--要完成请求必须进行更进一步的操作
 - 4xx:客户端错误--请求有语法错误或请求无法实现
 - 5xx:服务器端错误--服务器未能实现合法的请求

常见状态代码、状态描述、说明:

200 //服务器已成功处理了请求
304(未修改) //自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden  //服务器收到请求,但是拒绝提供服务
404 Not Found  //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
502(错误网关)//服务器作为网关或代理,从上游服务器收到无效响应
503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
504(网关超时)//服务器作为网关或代理,但是没有及时从上游服务器收到请求
505  //服务器不支持请求的HTTP协议的版本,无法完成处理

6.与目的主机断开TCP连接(四次挥手)
TCP连接释放过程:
1、浏览器向目的主机发出TCP连接结束请求报文,此时进入FIN WAIT状态;
2、该报文FIN标志位设为1,表示结束请求;
3、TCP结束请求报文通过IP(DNS)->MAC(ARP)->网关->目的主机;
4、目的主机收到数据帧,通过IP->TCP,TCP协议单元回应结束应答报文;
5、当前只是进行回应,因为目的主机可能还有数据要传,并不急着断开连接;
6、该报文中ACK标志位设为1,表示收到结束请求;
7、目的数据发送完所有数据后,向我的主机发出TCP连接结束请求报文;
8、该报文FIN标志位设为1,表示结束请求;
9、TCP结束请求报文通过IP(DNS)->MAC(ARP)->网关->我的主机;
10、我的主机收到数据帧,通过IP->TCP,TCP协议单元回应结束应答报文,此时进入TIME WAIT状态,因为不相信网络是可靠的,如果目的主机没收到还可以重发;
11、该报文中的FIN标志位均设为1,表示结束应答;
12、该TCP回应报文通过IP(DNS)->MAC(ARP)->网关->目的主机;
13、目的主机关闭连接;
14、TIME WAIT等待结束后,没有收到回复,说明目的正常关闭了,我的主机也关闭连接。

7.浏览器解析渲染页面
浏览器在收到HTML,CSS,JS文件后,就需要进行渲染。

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

JS的解析是由浏览器中的JS解析引擎完成的。

浏览器在解析过程中,如果遇到请求外部资源时,如图像,iconfont,JS等。浏览器将重复1-6过程下载该资源。请求过程是异步的,并不会影响HTML文档进行加载,但是当文档加载过程中遇到JS文件,HTML文档会挂起渲染过程,不仅要等到文档中JS文件加载完毕还要等待解析执行完毕,才会继续HTML的渲染过程。原因是因为JS有可能修改DOM结构,这就意味着JS执行完成前,后续所有资源的下载是没有必要的,这就是JS阻塞后续资源下载的根本原因。CSS文件的加载不影响JS文件的加载,但是却影响JS文件的执行。JS代码执行前浏览器必须保证CSS文件已经下载并加载完毕。

URL访问网站时的网络传输全过程,可以归纳为:
首先通过域名找到IP,如果缓存里没有就要请求DNS服务器;得到IP后开始与目的主机进行三次握手来建立TCP连接;连接建立后进行HTTP访问,传输并获取网页内容;传输完后与目的主机四次挥手来断开TCP连接。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值