概念
HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
网络模型
为了给网络协议的设计提供一个结构,网络设计者以分层(layer)的方式组织协议,每个协议属于层次模型之一。每一层都是向它的上一层提供服务(service),即所谓的服务模型(service model)。每个分层中所有的协议称为 协议栈(protocol stack)。因特网的协议栈由五个部分组成:物理层、链路层、网络层、运输层和应用层。我们采用自上而下的方法研究其原理,也就是应用层 -> 物理层的方式。
URL
比起http协议,我们更熟悉 URL(Uniform Resource Locator,统一资源定位符)。URL 正是使用 Web 浏览器等访问 Web 页面时需要输入的网页地址。
注意: 使用http:/https:等协议名访问获取资源时,需要指定协议类型,不区分大小写,协议名后附上一个:号即可。
HTTP协议
请求方法
HTTP协议规定,请求从客户端发出,最后服务器端响应请求并返回。
实例:
请求:
GET / index.htm / HTTP /1.1
Host : hackr.jp
分析:
GET
表示请求访问服务器的类型,称为方法(method)/index.htm
指明了请求的资源对象,也叫做请求的URL(request-URL)HTTP /1.1
是HTTP的版本号,用来提示客户端使用HTTP协议功能
综合上述:
请求报文的构成:请求方法(GET /POST)、请求URL(地址)、协议版本、可选的请求首部字段、内容实体构成
响应
分析:
HTTP/1.1
表示服务器对应的HTTP版本200 ok
表示处理结果的状态码(status code)和原因短语(reason-phrase)Date: Tue, 10 Jul 2012 06:50:15 GMT
显示创建响应的日期时间,是首部字段(header field)内的一个属性- 接着一个空行,之后是资源实体主体(entity body)
综合上述:
响应报文结构(响应成功返回页面:text/html):协议版本、状态码(请求成功或失败的数字代码)、解释状态码的原因短语、可选的响应首部字段、实体主题
HTTP是一种不保存状态的协议
- HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是不做持久化处理。
- HTTP协议每当有新的请求发送时,就会对应新响应产生。
- 协议本身不保留之前一切的请求或响应报文的信息。这是为了尽快的处理特大事务,确保协议可伸缩性。
HTTP采用url定位资源
因为http采用url定位资源,所以可以访问到互联网任何位置的资源。
HTTP请求方法
下面是HTTP/1.1中可以使用的请求方法(GET/POST)
GET: 方法(获取资源)
说明: GET方法用来请求访问已被URI识别的资源。指定资源经过服务器解析后返回响应内容。若为文本原样返回,如果是程序执行输出。
例子:
请求:
GET /index.html HTTP/1.1
响应:返回 index.html 的页面资源
请求:
GET /index.html HTTP/1.1
Host: www.hackr.jp
If-Modified-Since: Thu, 12 Jul 2012 07:30:00 GMT
响应:仅返回2012年7月12日7点30分以后更新过的index.html页面资源。 如果未有内容更新,则以状态码304 Not Modified作为响应返回
POST:方法(传输实体主体)
说明: POST方法用来传输实体主体。
例子:
请求:
POST /submit.cgi HTTP/1.1 Host: www.hackr.jp Content-Length: 1560(1560字节的数据)
响应:返回submit.cgi接收数据的处理结果
PUT:方法(传输文件)
说明:
- PUT方法用来传输文件。就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。
- 因为HTTP/1.1没有验证机制,所以要配合其他验证机制进行验证
例子:
请求:
PUT /example.html HTTP/1.1 Host: www.hackr.jp Content-Type: text/html Content-Length: 1560(1560字节的数据)
响应:响应返回状态码204 No Content(比如 :该html已存在于服务器上)
HEAD:方法(获得报文首部)
说明: HEAD方法和GET方法一样,只是不返回报文主体部分。用于确认URI的有效性及资源更新的时间日期
例子:
请求:
HEAD /index.html HTTP/1.1 Host: www.hackr.jp
响应:返回index.html有关的响应首部
DELETE:方法(删除文件)
说明:
- DELETE方法用来删除文件,是与PUT相反的方法。DELETE方法按请求URI删除指定资源。
- HTTP/1.1的DELETE同样没有验证机制
例子:
请求:
DELETE /example.html HTTP/1.1 Host: www.hackr.jp
响应:响应返回状态码204 No Content(比如 :该html已从该服务器上删除)
OPTIONS:方法(询问支持的方法)
说明: OPTION方法用来查询针对URI指定资源支持的方法。
案例:
请求:
OPTIONS * HTTP/1.1 Host: www.hackr.jp
响应:
HTTP/1.1 200 OK Allow: GET, POST, HEAD, OPTIONS (返回服务器支持的方法)
TRACE:方法(追踪路径)
说明:
- TRACE方法是让web服务器端将之前的请求通信环会给客户端的方法。
- 发送请求时,在 Max-Forwards 首部字段中填入数值,每经过一个 服务器端就将该数字减 1,当数值刚好减到 0 时,就停止继续传输,最 后接收到请求的服务器端则返回状态码 200 OK 的响应。 客户端通过 TRACE 方法可以查询发送出去的请求是怎样被加工修 改 / 篡改的。这是因为,请求想要连接到源目标服务器可能会通过代理 中转,TRACE 方法就是用来确认连接过程中发生的一系列操作。(容易引发跨站追踪攻击)
例子:
请求:
TRACE / HTTP/1.1
Host: hackr.jp
Max-Forwards: 2
响应:
HTTP/1.1 200 OK
Content-Type: message/http
Content-Length: 1024
TRACE / HTTP/1.1
Host: hackr.jp
Max-Forwards: 2(返回响应包含请求内容)
CONNECT:方法(要求用隧道协议链接代理)
说明:
- CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL和TLS协议把通信内容加密后经网络隧道传输。
- CONNECT方法的格式如下图所示。
CONNECT 代理服务器名:端口号 HTTP版本
例子:
请求:
CONNECT proxy.hackr.jp:8080 HTTP/1.1 Host: proxy.hackr.jp
响应:
HTTP/1.1 200 OK(之后进入网络隧道)
HTTP所有方法总结
方法 | 说明 | 支持HTTP协议的版本 |
---|---|---|
GET | 获取资源 | 1.0、1.1 |
POST | 传输实体主体 | 1.0、1.1 |
PUT | 传输文件 | 1.0、1.1 |
HEAD | 获得报文首部 | 1.0、1.1 |
DELETE | 删除文件 | 1.0、1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
CONNECT | 要求用隧道协议连接代理 | 1.1 |
LINK | 建立和资源之间的联系 | 1.1 |
UNLINE | 断开连接关系 | 1.1 |
注意: LINK
和UNLINK
已被HTTP/1.1废弃
HTTP性能优化
由于HTTP协议最初版本,每进行一层HTTP通信都要断开一次TCP链接。
但因为当年的传输都是文本传输量小,没存在什么问题,但随着HTTP的发展web页面中可能包含大量的图片、视频,导致每次都会多次断开TCP链接,增加服务器的通信开销。
方法一:(持久连接
)
在 HTTP/1.1 中,所有的连接默认都是持久连接,但在 HTTP/1.0 内 并未标准化。客户端和服务器端都要支持才可以。
特点:
只要任意一端没有明确断开连接,则保持TCP连接状态。需要请求断开。
优点:
- 减少重复建立连接的额外开销,减轻服务器端的负载
- 减少开销那部分时间,web页面响应速度提高。
方法二:(管线化
)
- 持久连接使得
管线化(pipeliing)
成为可能。 - 管线化技术的特点是不用等待响应就可以直接发送下一个请求,这样就可以同时发送多个请求而不需要一个接一个的等待响应了。
- 管线化技术比持久连接还要快,请求数量越多时间差越明显。
方法三:(使用Cookie的状态管理
)
- HTTP是无状态协议,由于不保存之前的状态和响应所以减少了资源消耗。可如果碰到需要身份验证的web页面岂不是要每一次都要重新验证,所以人们应用了Cokie技术。
- Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端状态。
- Cookie会根据响应报文内一个叫Set-Cookie的首部字段通知客户端保存Cookie。下次发送请求会携带Cookie值发送出去。
- 服务器发现cookie值后,会检查那个客户端发来的请求然会对比服务器的记录找到之前的状态。
HTTP和HTTPS的区别及优缺点
1.信息传输方式:HTTP采用明文传输,HTTPS采用加密传输
- http是超文本传输协议,信息是明文传输
- https协议要比http协议安全,https是具有安全性的ssl加密传输协议,可防止数据在传输过程中不被窃取、改变、确保数据的完整
2.端口号:HTTP80端口,HTTPS443端口
- http协议的默认端口为80端口
- https的默认端口为443端口
3.页面加载时间不同
- http的连接很简单,是无状态的
- https握手阶段比较费时,会使页面加载时间延长50%,增加10%~20%的耗电
4.HTTPS需要证书
- htttps协议需要ca证书,费用较高,功能越强大的证书费用越高
浏览器-渲染引擎的解析流程
浏览器渲染:客户端(浏览器)解析HTML内容并渲染出来,浏览器接收到的数据包后的解析流程为:
- 构建ODM树:词法分析然后解析成DOM树(dom tree),是由dom元素及属性节点组成,树 的更是document对象构成
- 构建css规则树:生成css规则树(css Rule Tree)
- 构建render树:Web浏览器将DOM树和CSSOM树结合,并构建出渲染树(render tree)
- Layout布局:计算出每一节点在屏幕中的位置
- 绘制(Painting):即遍历render树,并使用UI后端层绘制每一个节点
浏览器的-重排与重绘
重排:
- 当DOM的变化影响了元素的几何信息,浏览器需要重新计算元素的几何属性,将其安放在界面中的正确位置,这个过程叫做重排。表现为重新生成布局,重新排列元素。
重绘:
- 当一个元素的外观发生改变,但没有改变布局,重新把元素外观绘制出来的过程,叫做重绘。表现为某些元素的外观被改变。
规则:
- 单单改变元素外观,肯定不会引起网页的重新生成布局,但当浏览器完成重排之后,将会重新绘制受到此次重排影响的部分。
- 重排和重绘的代价是高昂的,它们会破坏用户体验,并且让UI表示非常迟缓,而相比之下重排的性能影响更大,在两者无法避免的情况下,一般我们宁可选择代价更小的重绘。
【重绘不一定出现重排,重排必然会出现重绘】