HTTP协议分析
一、引言
当我们想要访问一个网页时,在浏览器中输入对应的网址(例如访问www.baidu.com),就可以看到我们想要是访问的页面,那么这个背后到底是怎么实现的呢?作为普通的上网者不会去关注实现的过程,但是作为一个运维人员或从事互联网相关岗位的人员,需要清晰的掌握是其背后实现的过程
二、什么是http协议
http协议www(万维网,简称web)应用 b/s结构 (browser/server) 浏览器/服务器架构
HTTP协议诞生发展到现在已经经历了若干版本,其中最主要的版本为HTTP/1.0,HTTP1.1, http1.0是第一个得到广泛使用的版本,http1.1为当前使用的主流版本
HTTP/0.9简介
http0.9版本现在已经过时了,它的组成很简单,只允许客户端发送GET这一种请求,而且还不支持请求头。由于没有协议头,造成了http 0.9协议只支持一种内容,即纯文本。不过网页仍然支持用HTML语言。仅于用户传输html文档,因为网络的快速的发展已经不是当初的看个网页就能满足日常需求,会有视频,图片等来增加情调,所以就出现了升级版本
HTTP/1.0简介
-
HTTP/1.0是第一个得到广泛使用的http版本,http/1.0在http/0.9的基础上增加了HTTP请求头,可支持更多的请求方法,并且能够对多媒体对象进行处理(如图像,视频)。http/1.0 规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立TCP连接,服务器完成请求处理后断开TCP连接,服务器不跟踪每个客户,也不记录过去的请求
-
1)引入了MIME((Multipurpose Internet Mail Extesions)机制:是多用途互联网邮件扩展,引入这个技术之后,http可以发送多媒体(比如视频 、音频等)信息。此机制让http不在单单只支持html格式,还可以支持其他格式来进行发送了。
-
2)引入了keep-alive机制,支持持久连接的功能(但这个keep-alive原理是在首部添加了某个字段而形成的,并非原生就支持此功能)
-
3)引入支持缓存功能
HTTP/1.1简介
- http/1.1的重点是修复http设计中的缺陷,从可扩展性、缓存处理、带宽优化、持久连接、host头(讲解web虚拟主机)、错误通知、消息传递、内容协商等多个方面都做了相关的改进,http/1.1是当前互联网主流的http版本
在连接方面http/1.1支持持久连接,在一个tcp连接上可以传送多个http请求和响应,减少了简历和关闭连接的消耗和时间延迟 - 在请求头方面,http/1.1增加了更多的请求头和响应信息,用来增强http功能,例如host主机头功能,可以让web浏览器使用主机头来明确表示要访问服务器的哪个web站点,这样就可以使用web服务器在同一个IP地址和端口号上配置多个虚拟web站点
- http/1.1.的持久连接,也需要增加新的请求头来帮助实现,例如connection请求头的值为keep-alive时,表示客户端通知服务器返回本次请求结果后保持连接,connection请求头的值为close时,表示客户端通知服务器返回本次请求结果后关闭连接,http/1.1还提供了身份认证和状态管理和cache缓存机制相关的请求头和响应头等
三、WEB页面资源类型
1、Html文本结构
<html>
<head> -->设置文档头部
<title> TITLE </title> -->设置文档标题
</head>
<body> -->网页文件内容
<h1>H1</h1> -->一号标题 (最大的标题)
<p></p> -->创建一个段落
<h2>H2</h2> -->二号标题
<p><a href="admin.html">ToGoogle</a> </p> -->创建超链接
</body>
</html>
静态页面的特点
- 开发者编写的是什么,他就显示的就是什么,一旦编写完成,就不会有任何改变,静态页面的维护和更新相对比较麻烦,静态页面一遍适用于更新较少的宣传展示网站
1、静态页面的特征
-
1)每个页面都有一个固定url地址,且url一般以html等形式为后缀,而且地址中不含有?或&特殊符号
2)网页内容发布到网站服务器上,无论是否有用户访问,每个页面的内容都是保存在网站服务器文件系统上,也就是说静态网页是实实在在存在服务器上的文件,每个网页都有一个独立的文件
3)网页内容固定不变的,因此,容易被搜索引擎收录(优点)
4)当网站信息量很大时完全依靠静态网页比较困难(缺点)
5)网页的交互性差,在程序和功能实现方面有很大的限制(缺点)
6)能够接受更多的并发访问量
2、 静态页面的处理过程
3、静态页面常见的扩展名
-
纯文本文件: .html .htm .xml .shtml .js .css等
-
图片类文件或数据文档: .jpg .gif .png .bmp .txt .doc .ppt等
-
视频类流媒体文件: .mp4 .swf .avi .wmv .flv等
动态页面的特点:
-
1)动态网页的url后缀是.php .jsp .asp .netd并且一遍在动态网页网址中会有标志性的符号?&,在大多数情况下后端都需要数据库支持,服务器上有相应的解析程序来运行动态网页
-
2)动态网页可以实现更多的功能(用户注册、登录、在线调查、订单管理等)
-
3) 动态网页并不是独立存在与服务器上的网页文件,当用户请求服务器上的动态程序时,服务器解析这些程序并可能通过读数据库来返回一个完整的网页内容,例如每个用户的登录账号密码
-
4)动态网页中的?在搜索引擎的收录方面存在一定的问题,搜索引擎一般不会从一个网站的数据库访问全部页面,或者处于技术方面的考虑,所有蜘蛛一般不会抓取网址中?后面的内容,因此在企业通过搜索引擎进行推广时,需要针对采用动态网页的网站做一定的技术处理(伪静态技术),一遍适应搜索引擎的抓取要求
如果用户请求的是动态内容,那么此时http服务器会调用后端服务器,由动态语言去处理用户的请求,如果需要请求数据的时候,会向内核申请调用,从而向磁盘 中获取用户指定的数据,通过解释器运行,运行的结果通常会生成 html 格式的文件。然后 构建成响应报文,最终发回给客户端
动态页面实现的过程
静态页面和动态页面的区别举例
- 静态页面相当于你去餐厅吃火锅,材料什么都准备好了,你只需要自己动手去完成想要的结果,静态页面的响应速度比较快,消耗cpu资源少,能够承载高并发
- 动态页面相当与你去餐厅吃炒菜,首先会给你一个菜单,根据自己的需求选择你要访问内容,这个过程中需要与后端的厨师进行交互,这个过程中会消耗后端服务器的资源,cpu需要处理自己的请求
四、HTTP协议的报文
-
HTTP 报文中存在着很多行的内容,一般是由 ASCII 码串组成,各字段长度是不确定的。HTTP 的报文可分为两种:请求报文与响应报文
-
request Message(请求报文)
客户端 -→ 服务器端
由客户端向服务器端发出请求,不同的网站用于请求不同的资源(html 文档) -
response Message(响应报文)
服务器端 -→ 客户端 是服务器予以响应客户端的请求1、HTTP请求报文格式
-
HTTP请求报文大致分为四部分:请求行+请求首部+空白行+请求实体
method 表示请求的方式,常见的方式有get、head、post、put等
-
Get:客户端向服务器发送请求资源信息,并返回资源信息,通常是可以缓存相当于你问别人借东西,别人需要将东西借给你,你需要得到具体的资源
Head:跟get方法类似,但不需要服务器响应请求资源,而返回头部响应首部
相当于你问别人借东西,别人只需要告诉你有或者没有,有的话会告诉你有什么类型的,而不是将他的东西借给你,Post: 基于html页面将数据发送给服务器,服务器通常需要存储提交的数据,通常存放在mysql这种关系型数据库中
Put:与get方式相反,向服务器发送资源,服务器通常需要存储此资源(存放位置通常是文件系统)
request-url请求的是那个资源,这里是相对路径,如/images /index.html等
- URL:URL(统一资源定位符),对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址,互联网上的每个文件都有一个唯一的url,它包含的信息指出文件的位置以及浏览器怎么处理它,与我们的地址原理相同,如/北京市/昌平区/昌平县城/商业街xx号
version:http使用的版本号 一般表示为HTTP/1.1 HTTP/1.0
请求首部:请求首部包含多个信息
Client-IP:客户端IP地址
Host:请求主机,可以基于域名或者IP
Referer:指明了请求当前资源原始资源的url,使用referer可以防盗链
User-Agent:用户代理,一般而言是浏览器
Accept首部:指客户端可以接受那些编码的类型
Accept:服务端能够发送的媒体的类型
Accept-Charset:接受的字符集
Accept-Encoding:支持压缩的压缩格式
Accept-Lanage:所能接受的语言编码格式
条件式请求首部:(在http1.1才会使用到)
当发送请求时,先问问对方是否满足条件,如果满足条件就请求,不满足就不请求
跟安全相关的请求:
Authorization
Cookie
Upgrade-Insecure-Requests:升级不安全的请求
Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密) -
1、HTTP响应报文格式
起始行包括:
version:表示http的版本 status:状态码 reason-phrase 状态码的信息
常见状态码
状态吗 说明 200 服务器成功返回网页,这是成功的 HTTP 请求返回的标准状 201 CREATED 上传文件成功后显示 301 Move Permanently,永久重定向,会返回一个新地址,并告诉我们你所请求的地址将永久挪到那个新地址去了 302 Fonud,临时重定向,临时放到某个地方,会在响应报文中使用“Location:新位置” 304 Not Modified,资源没有做任何 403 Forbidden 请求被拒绝 404 Not Found 请求的资源不存在 405 Method Not Allowed 你使用的方法不被允许,不支持 500 Internal Server Error:服务器内部错误 502 Bad Gateway,代理服务器从上游服务器收到一条伪响应;上一层服务器返回了一个无法理解的报文,所以代理服务器就会表示错 503 Service Unavailable,服务暂时不可用 HTTP响应报文格式
响应首部介绍
Accept-Ranges 服务器支持的请求:字节
Cache-Control:缓存类型
No-cache 代表不缓存过期资源,缓存会向源服务器进行有效确认、
No-store 代表不进行任何缓存
Proxy-revalidata 表示共享缓存,如果已经本地已经有缓存,还要去检查是否有改变
No-transform 不得对资源进行转换或转变
Private 用缓存的内容回应先访问该资源的用户
Connection 持久连接 http/1.1中采用的协议
Content-Length 传输长度
Content-Type 服务器发送或接受的mime类型
DATE:当前的gmt时间,表示消息发出的时间,相差8个小时
Last-Modified 需要和expires结合使用,用来控制请求文件的有效时间,当请求的资源子有效时间,从本地缓存中获取数据,当有效时间过期后才从服务器更新数据
Pragma 表示是否缓存
Servre 服务器web服务的版本
Etag 在网络上有一些缓存服务器,另外,浏览器自身也有缓存功能
基于一个前提:图片不会经常改动,服务器在返回状态码时200同时在etag中添加一个标签,当浏览器再次访问该图片的时,就会去服务器校验这个值,如果图片没有变化的时,直接使用缓存里面的值,这样可以减轻服务器的负担,有加快了访问速度 -
Cookie流程
HTTP事务
- 包含了一个 HTTP 请求,和对应请求的响应就叫做一个 http 事务,也可以理解 http 事务就是 一个完整的 HTTP 请求和 HTTP 响应的过程。 http 协议默认情况下每个事务都会打开和关闭一个新的连接,所以会相当耗费时间和带宽, 由于 TCP 慢启动特性,所以每条新的连接的性能本身就会有所降低,所以可打开的并行连接 的数量上限是有限的。所以使用持久连接这种模式比默认情况下不使用持久连接的方式会好 一点,他的好处表现在其请求和 tcp 断开的过程所消耗的时间会被减少。
五、HTTP资源类型
-
HTTP 资源 资源就是通过 HTTP 协议可以让用户通过浏览器或用户代理能够通过基于 http 协议向服务器 端请求并获取的内容,像 html 文档,一张图片等等。 资源类型:是通过 MIME 进行标记 格式:major/minor 主标记和次标记
常见的MIME类型
MIME类型 文件类型 test/html html、htm 文本 text/plain text 文本类型 image/jpeg jpeg 图像 image/gif gif 图像类型 vedio/mpeg4 音频标记类型 application/vnd.ms-powerpointt 动态资源的标记 URI和URL介绍
-
URI(Uniform Resource Identifier) 同一资源标示符
用于标识某一互联网资源名称的字符串,通过这种标识来允许你用户对资源可通
过特定的协议进行交互操作。在 Web 上可用的每种资源,包括 HTML 文档、图
像、视频片段、程序等, 由一个通用资源标识符进行定位。所以我们可以使用
URI 来标识每个资源的名称 -
URL(Uniform Resource Locator)(统一资源定位符)
用于描述一个特定服务器上某资源的特定位置。
例如:http://www.baidu.com:80/download/bash-4.3.1-1.rpmURL 的格式分为三个部分
i. scheme(方案)(也叫协议):http://
ii. Internet 地址:一般这个地址指的是服务器:www.baidu.com:8080
iii. 特定服务器上的资源:download/bash-4.3.1-1.rpm
客户端请求web页面的具体过程
-
- 客户端在 Web 浏览器输入需要访问的地址
- Web 浏览器会请求 DNS 服务器,查询解析到指定域名和 Web 服务器的地址
- 客户端与请求的 Web 服务器端建立连接(TCP 三次握手)
- TCP 建立成功之后,发起 HTTP 请求
- 服务器端收到客户端 HTTP 请求之后,会处理该请求
- 处理客户端指定请求的资源
- 服务器构建响应报文,响应给客户端
- 服务器端将此信息记录到日志中
六、通过浏览器查看http协议报文内容
通常浏览器缓存调用的过程为
抓包之前我们要清除浏览器缓存,打开浏览器按F12(浏览器推荐使用Chrome或者Firefox)打开开发者工具,点击Network选择All
选择要访问的网站,在浏览器输入上方输入http://www.baidu.com 就可以获取到百度服务器的报文信息,点击查看百度的index.html页面报文信息
Request URL: https://www.baidu.com/ | 请求web服务器地址 |
---|---|
Request Method: GET | 请求的方式 |
Status Code: 200 OK | 请求的状态码和状态的简略信息 |
Remote Address: 220.181.38.150:443 | 响应服务器IP地址 |
Referrer Policy: no-referrer-when-downgrade | 直接访问百度页面 |
##########http响应报文#######
Bdpagetype: 1 | 将http请求升级为https请求 |
---|---|
Bdqid: 0xde48f6750039cdbc | 连接的id号 |
Cache-Control: private | 缓存的类型公共缓存 |
Connection: Keep-Alive | 连接状态为持久连接 |
Content-Encoding: gzip | 页面的压缩类型为gzip压缩 |
Content-Type: text/html | 页面类型 html |
Cxy_all: baidu+8577a22a8d60ff4ce2564ad56a4593d0 | 连接时产生的id号 |
Date: Tue, 30 Jul 2019 09:22:02 GMT | 响应时间,与北京时间相差8小时 |
Expires: Tue, 30 Jul 2019 09:21:55 GMT | |
P3p: CP=" OTI DSP COR IVA OUR IND COM " | 使用协议类型 |
Server: BWS/1.1 | 服务提供商和版本号 |
Set-Cookie: | 跟安全相关的设置 |
Transfer-Encoding: chunked | 分块传输 |
Vary: Accept-Encoding | 告诉浏览器或者代理服务器当前页面时压缩过的 |
X-Ua-Compatible: IE=Edge,chrome=1 | 采用ie引擎的渲染 |
#########http请求报文##########
Accept: | 客户端接收的类型,默认浏览器会接收所有类型 |
---|---|
Accept-Encoding: gzip, deflate, br | 客户端接受的压缩类型 |
Accept-Language: zh-CN,zh;q=0.9 | 客户端接受的语言编码 |
Connection: keep-alive | 持久连接 |
Cookie: | 跟安全相关 |
Host: www.baidu.com | 请求的web页面地址 |
Upgrade-Insecure-Requests: 1 | 在进行访问时将http升级为https |
User-Agent: | 客户端通过什么程序来进行访问的,通常为浏览器类型 |