页面解析的流程学习
一、域名解析的整个过程
1.域名和域名解析概念
a、域名
域名(Domain names)是互联网基础架构的关键部分。它们为互联网上任何可用的网页服务器提供了方便人类理解的地址。
域名格式:
顶级域名:
国家顶级域名nTLD:采用ISO3166的规定。如:cn代表中国,us代表美国,uk代表英国,等等。
通用顶级域名gTLD:最常见的通用顶级域名有7个,即:com(公司企业),net(网络服务机构),org(非营利组织),int(国际组织),gov(美国的政府部门),mil(美国的军事部门)。
基础结构域名(infrastructure domain):这种顶级域名只有一个,即arpa,用于反向域名解析,因此称为反向域名
b、域名解析
DNS,就是Domain Name System的缩写,翻译过来就是域名系统,是互联网上作为域名和IP地址相互映射的一个分布式数据库。DNS能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。
2、域名解析的过程
- 在输入www.xxx.com后,首先检查浏览器缓存,如果有则直接返回ip
- 如果没有查到,就在操作系统缓存里面查找,linux的话在/etc/hosts
- 如果没有查到,就去本地DNS服务器查找,本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。一般80%的域名都可以查到。
- 如果没有查到,本地DNS服务器就去根域名服务器查找,根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。
- 然后根域名服务器去对应的域名服务器查询,比如去.com域服务器,.com域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你的域名的解析服务器的地址
- 本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。
3、cdn和waf技术
a、cdn技术
CDN的全称是Content Delivery Network,即内容分发网络。使用户可就近取得所需内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度。
- 提高用户的访问速度
- 减轻服务器的压力
- 提升网站的稳定性和安全性
可以看到,使用了cdn技术的服务器,在域名解析的时候,解析的并不是源站的IP,而是cdn服务器的IP,
b、waf
waf:也叫web应用防火墙,通过对HTTP(S)请求进行检测,识别并阻断SQL注入、跨站脚本攻击、网页木马上传、命令/代码注入、文件包含、敏感文件访问、第三方应用漏洞攻击、CC攻击、恶意爬虫扫描、跨站请求伪造等攻击,保护Web服务安全稳定。
可以看到,云waf的发展趋势越来越猛,目前最常见的有腾讯云,阿里云waf等
云waf的绕过:
二、页面请求的过程
在经过DNS域名解析之后,获得了服务器的IP地址。然后就开始向服务器发送请求,服务器进行响应等,具体流程如下
1、请求页面步骤
a、DNS解析
如上所述,在浏览器输入域名之后,通过DNS域名解析获得服务器的IP
b、建立tcp连接
拿到域名对应的IP地址之后,User-Agent(一般指浏览器)会以一个随机端口(1024<端口<65535)向服务器的WEB程序(常用的有httpd,nginx)等的80端口。这个连接请求(原始的http请求经过TCP/IP4层模型的层层封包)到达服务器端后(这中间有各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终达到WEB程序,最终建立了TCP/IP的连接。
三次握手完成之后这个TCP连接就进入Established状态,就可以发起http请求了。
c、发起http请求
HTTP请求报文由三部分组成:请求行,请求头和请求正文
请求行:用于描述客户端的请求方式,请求的资源名称以及使用的HTTP协议的版本号
请求行:描述请求那台主机,以及客户端的信息
正文:请求的数据
详细内容后文详解
d、服务端进行HTTP响应
HTTP响应也由三部分组成:状态码,响应头和实体内容
状态码:状态码用于表示服务器对请求的处理结果
2xx:请求成功
3xx:重定向
4xx:客户端发生错误
5xx:服务端发生错误
若干响应头:响应头用于描述服务器的基本信息,以及客户端如何处理数据,比如第一次响应的时候会有set cookie响应头
实体内容:服务器返回给客户端的数据
注:html资源文件应该不是通过 HTTP响应直接返回去的,应该是通过nginx通过io操作拿到的。
e、浏览器请求html
浏览器拿到index.html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每个浏览器的线程数不一样),这个时候就用上keep-alive特性了,建立一次HTTP连接,可以请求多个资源,下载资源的顺序就是按照代码里的顺序,但是由于每个资源大小不一样,而浏览器又多线程请求请求资源,
f、浏览器进行页面渲染
最后,浏览器利用自己内部的工作机制,把请求的静态资源和html代码进行渲染,渲染之后呈现给用户,浏览器是一个边解析边渲染的过程。
2、nginx处理HTTP请求的过程(11个阶段)
(1)postread阶段
这个阶段刚刚获取到了请求的头部,还没有进行任何处理,我们可以拿到一些原始的信息。例如,拿到用户的真实 IP 地址。
HTTP 协议中,有两个头部可以用来获取用户 IP:
X-Forwardex-For 是用来传递 IP 的,这个头部会把经过的节点 IP 都记录下来
X-Real-IP:可以记录用户真实的 IP 地址,只能有一个
realip 模块
默认不会编译进 Nginx,需要通过 --with-http_realip_module 启用功能
变量:如果还想要使用原来的 TCP 连接中的地址和端口,需要通过这两个变量保存
realip_remote_addr
realip_remote_port
功能:修改客户端地址
指令:
set_real_ip_from:指定可信的地址,只有从该地址建立的连接,获取的 realip 才是可信的
real_ip_header:指定从哪个头部取真实的 IP 地址,默认从 X-Real-IP 中取,如果设置从 X-Forwarded-For 中取,会先从最后一个 IP 开始取
real_ip_recursive
环回地址,默认关闭,打开的时候,如果 X-Forwarded-For 最后一个地址与客户端地址相同,会过滤掉该地址
(2)sever-rewrite阶段
首先 rewrite 阶段分为两个,一个是 server_rewrite 阶段,一个是 rewrite,这两个阶段都涉及到一个 rewrite 模块,而在 rewrite 模块中,有一个 return 指令,遇到该指令就不会再向下执行,直接返回响应。
return 指令的语法如下:
- 返回状态码,后面跟上 body
- 返回状态码,后面跟上 URL
- 直接返回 URL
返回状态码包括以下几种:
Nginx 自定义:
444:立刻关闭连接,用户收不到响应
HTTP 1.0 标准:
301:永久重定向
302:临时重定向,禁止被缓存
HTTP 1.1 标准:
303:临时重定向,允许改变方法,禁止被缓存
307:临时重定向,不允许改变方法,禁止被缓存
308:永久重定向,不允许改变方法
return 指令与 error_page
error_page 的作用。当访问一个网站出现 404 的时候,一般不会直接出现一个 404 NOT FOUND,而是会有一个比较友好的页面,这就是 error_page 的功能。
1.当 server 下包含 error_page 且 location 下有 return 指令的时候,会执行哪一个呢?
会执行 location 下的 return 指令。
2.return 指令同时出现在 server 块下和同时出现在 location 块下,它们有合并关系吗?
没有合并关系,先遇到哪个 return 指令就先执行哪一个。
(3)find_config阶段
当经过 rewrite 模块,匹配到 URL 之后,就会进入 find_config 阶段,开始寻找 URL 对应的 location 配置。
会用到location指令
location 的匹配规则是仅匹配 URI,忽略参数,有下面三种大的情况:
前缀字符串
常规匹配
=:精确匹配
^~:匹配上后则不再进行正则表达式匹配
正则表达式
~:大小写敏感的正则匹配
~*:大小写不敏感
用户内部跳转的命名 location
@
(4)rewrite阶段
由于 Nginx 已经在 find-config 阶段完成了当前请求与 location 的配对,所以从 rewrite 阶段开始,location 配置块中的指令便可以产生作用。当 ngx_rewrite 模块的指令用于 location 块中时,便是运行在这个 rewrite 阶段。
(5)post_rewrite阶段
没有模块能够介入这个阶段。这个阶段完全是为了配合 ngx_http_rewrite_module 模块
(6)PREACCESS 阶段
ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模块工作在这个阶段,它们分别实现并发连接数限制和请求速率限制功能。
limit_conn模块
(7) ACCESS 阶段
ngx_http_access_module 和 ngx_http_auth_basic_module 工作在这个阶段,它们分别实现访问控制和基本认证的功能。
(8)POST_ACCESS 阶段
没有模块能够介入这个阶段。这个阶段是为了配合 ACCESS 阶段。
(9)PRECONTENT 阶段
ngx_http_mirror_module 工作在这个阶段,实现流量镜像的功能。
(10)CONTENT 阶段
这是最关键的一个阶段,也是外部模块最喜欢介入的阶段。ngx_http_index_module、ngx_http_static_module 工作在这个阶段实现返回静态页面的功能。后面分析代码,我们也是重点关注这个阶段。
(11) LOG 阶段
ngx_http_log_module 模块工作在这个阶段,实现输出访问日志的功能。
功能:将 HTTP 请求相关信息记录到日志
模块:ngx_http_log_module,无法禁用
三、HTTP协议的字段即含义
1、http请求报文
2、http方法
- GET:请求访问已经被URL识别的资源
- POST:传输实体的主体
- PUT:传输文件
- HEAD:和GET方法一样,只是不返回报文主体部分,用于确认URL有效性和更新时间
- DELETE:删除文件
- OPTIONS:查询针对请求URL指定的资源支持的方法
- TRACE:让web服务器把之前的请求通信回环给客户端
3、http响应报文和状态码
响应报文:
1xx:信息性状态码,接受的请求正在处理 2xx:成功状态码
3xx:重定向状态码,需要附加操作以完成请求
4xx:客户端错误状态码 5xx:服务器错误状态码
常见状态码:
200 |
请求正常处理 |
301 |
永久性重定向,表示请求的资源被分配了新的url,以后使用现在所指的URL |
302 |
临时重定向,希望用户(本次)使用新的URL |
304 |
资源已找到,但未符合条件请求。该状态码表示客户端发送附带条件的请求时服务端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回304。 |
400 |
服务器端无法理解客户端发送的请求,请求报文中可能存在语法错误。 |
401 |
该状态码表示发送的请求需要有通过HTTP认证的认证信息 |
403 |
不允许访问那个资源。该状态码表明对请求资源的访问被服务器拒绝了。(权限,未授权IP等) |
404 |
服务器上没有请求的资源。路径错误等。 |
500 |
该状态码表明服务器端在执行请求时发生了错误。也有可能是web应用存在bug或某些临时故障。 |
503 |
该状态码表明服务器暂时处于超负载或正在停机维护,现在无法处理请求。 |
4、常见http请求首部字段
- Accept:通知服务器,用户代理能处理的媒体类型,
文本文件:text/html,text/plain,text/css,application/xml
图片文件:image/jpeg,image/gif,image/png
应用程序或者二进制文件:application/zip
- Accept-Language:告诉服务器用户能接受的语言,q表示优先级
例如:Accept-Language:zh-cn,zh;q=0.7,en-us,en;q=0.3
- Host:告诉服务器,请求的资源所处的主机名和端口,Host字段在HTTP/1.1规范是唯一一个必须被包含在请求内的首部字段
- Referer:告诉服务器请求的原始资源的URL
例如:Referer:http://www.example.com/index.php
- User-Agent:表示客户端浏览器的版本信息
- Cookie:首部字段Cookie会告知服务器,当客户端想获取HTTP状态管理支持时,就会在请求中包含从服务器接收到的Cookie。接收到多个Cookie时,同样可以以多个Cookie形式发送
- Connection: keep-alive:可以在请求头里明确地要求使用长连接机制不管客户端是否显式要求长连接,如果服务器支持长连接,它总会在响应报文里显示“Connection: keep-alive”
5、常见http响应字段
- Server:告诉客户端当前正在提供 Web 服务的软件名称和版本号,例如“Server: openresty/1.15.8.1”。但是出于安全考虑,一般不会给出具体的。
- Location:将响应接收方引导至某个与请求URL不同的资源
- Content-Length:响应报文的长度
四、HTTPS协议的原理
1、https概念
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL
2、http和https区别
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- http是超文本传输协议,信息是明文传输;https 则是具有安全性的ssl加密传输协议。
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
- https协议需要到CA申请证书
3、ssl安全套接层协议
SSL的体系结构中包含两个协议子层,其中底层是SSL记录协议层(SSL Record Protocol Layer);高层是SSL握手协议层(SSL HandShake Protocol Layer)。
SSL协议主要分为两层:
SSL记录协议层的作用是为高层协议提供基本的安全服务。SSL纪录协议针对HTTP协议进行了特别的设计,使得超文本的传输协议HTTP能够在SSL运行。纪录封装各种高层协议,具体实施压缩解压缩、加密解密、计算和校验MAC等与安全有关的操作。
SSL握手协议层包括SSL握手协议(SSL HandShake Protocol)、SSL密码参数修改协议(SSL Change Cipher Spec Protocol)和SSL告警协议(SSL Alert Protocol)。握手层的这些协议用于SSL管理信息的交换,允许应用协议传送数据之间相互验证,协商加密算法和生成密钥等。
阶段一:
客户端首先发送ClientHello消息到服务端,服务端收到ClientHello消息后,再发送ServerHello消息回应客户端。
其中ClientHello会有一个加密套件用来告诉服务器自己已经知道的密码套件列表,这是由客户按优先级排列的,但完全由服务器来决定发送与否。TLS中使用的密码套件有一种标准格式。
上面的报文中,客户端发送了18套加密套件。服务端会从中选出一种来作为双方共同的加密套件。
Server hello确定了使用那种加密方法
阶段二
- 证书:服务器将数字证书和到根CA整个链发给客户端,使客户端能用服务器证书中的服务器公钥认证服务器。
- 服务器密钥交换(可选):这里视密钥交换算法而定
- 证书请求:服务端可能会要求客户自身进行验证。
- 服务器握手完成:第二阶段的结束,第三阶段开始的信号
阶段三
客户机启动SSL握手第3阶段,是本阶段所有消息的唯一发送方,服务器是所有消息的唯一接收方。该阶段分为3步:
- 证书(可选):为了对服务器证明自身,客户要发送一个证书信息,这是可选的,在IIS中可以配置强制客户端证书认证。
- 客户机密钥交换(Pre-master-secret):这里客户端将预备主密钥发送给服务端,注意这里会使用服务端的公钥进行加密。
- 证书验证(可选),对预备秘密和随机数进行签名,证明拥有(a)证书的公钥
阶段四
客户机启动SSL握手第4阶段,使服务器结束。该阶段分为4步,前2个消息来自客户机,后2个消息来自服务器。
建立起一个安全的连接,客户端发送一个Change Cipher Spec消息,并且把协商得到的CipherSuite拷贝到当前连接的状态之中。然后,客户端用新的算法、密钥参数发送一个Finished消息,这条消息可以检查密钥交换和认证过程是否已经成功。其中包括一个校验值,对客户端整个握手过程的消息进行校验。服务器同样发送Change Cipher Spec消息和Finished消息。握手过程完成,客户端和服务器可以交换应用层数据进行通信。