HTTP:超文本传输协议,用于在浏览器和web服务器之间传输超文本页面。
HTTP的版本
HTTP1.0到HTTP1.1有哪些改进?
(1)虚拟主机:在一个Web服务器中并存多个站点
如何区分网站:在请求头里面有Host,保存要访问的域名。
(2)持久连接
在HTTP1.0中,浏览器访问服务器的内容每次只能获得一个资源,在HTTP1.1中,建立连接后可以获得多个资源。通过Connection:keep-alive,一次请求完成后不要马上断开,在保持一会儿。
(3)代理连接:客户端可以通过代理服务器间接访问目标服务器。
Proxy:XXXX。
HTTP1.1的缺点:
1)在传输中会出现对首阻塞问题
2)响应不分轻重缓急,只会按先来后到的顺序执行
3)并行通信需要建立多个TCP连接
4)服务器不能主动推送客户端想要的资源,只能被动地等待客户端发起的请求
5)由于HTTP是无状态的,所以每次请求和响应都会携带大量冗余信息。
HTTP2.0和HTTP1.1相比的新特性?
1)二进制分帧层
二进制分帧层是HTTP2.0性能增强的关键,它改变了通信两端交互数据的方式,原先都是以文本传输,现在要先对数据进行二进制编码,再把数据分成一个一个的帧,接着把帧送到数据流中,最后对方接收帧并拼成一条消息,再处理请求。在2.0版本中,通信的最小单位是帧(frame),若干个帧组成一条消息,若干个消息在数据流中传输,一个TCP连接可以分出若干条数据流,因此HTTP2.0只要建立一次TCP连接就能完成所有传输。
2)多路通信
通信两端对请求或响应的处理都是串行的,也就是按顺序一个个处理,虽然在HTTP1.1中新增了管道化的概念,让客户端能一下发送多个请求,减少了不必要的网络延迟,但那只是将请求的队列顺序迁移到服务器中,服务器处理还是得按顺序来,所以本质上响应还是串行的。如果一定要实现并行通信,那么必须建立多条TCP连接,多个请求分别在不同的TCP通道中传输,间接实现并行通信。
TCP是一种可靠的通信协议,中途如果出现丢包,发送方就会根据重发机制再发一次丢失的包,由于通信两端都是串行处理请求的,所以接收端在等待这个包到达之前,不会在处理后面的请求,这种现象称为对首阻塞。
HTTP2.0不但解决了对首阻塞问题,还将TCP建立次数降低到1次。通信两端只需将消息分解为独立的帧,然后在多条数据流中乱序发送,最后在接收端把帧重新组合成消息,并且各条消息的组合互不干扰,这就实现了真正意义上的并行通信,达到了多路复用的效果。
3)请求优先级
客户端对请求资源的迫切度都是不同的,例如在浏览器的网页(即HTML文档)中,像CSS、JavaScript这些文件传的越快越好,而像图像则可以稍后再传。在HTTP1.1中,只能是谁先请求,谁就先处理,不能显式地标记请求的优先级。而在HTTP2.0中,每条数据流都有一个31位的优先值,值越小优先级约大(0 的优先级最高)。有了这个优先值,相当于能随时建立一条绿色通道,通信两端可以对不同数据流中的帧采取不同的策略,这样能更好地分配有限的带宽资源。
4)服务器推送
HTML文档中的资源可以从服务器中拉取,也可以经过编码后直接嵌入。嵌入虽然可以减少一次请求,但同时会让HTML文档体积膨胀,降低压缩效率,破坏资源缓存。虽然有种种不足,但减少服务器的请求,这种思路还是值得借鉴。
HTTP2.0支持服务器主动推送,简单地说就是一次请求返回多个响应,这也是一种减少请求的方法。服务器除了处理最初的请求,还会额外推送客户端想要的资源,无需客户端发出明确的请求。主动推送的资源不但可以缓存,而且还能压缩,客户端也可以主动拒绝推送过来的资源。
5)首部压缩
HTTP是无状态的,为了准确地描述每次通信,通常都会携带大量的首部,例如Connection、Accept或Cookie,而这些首部每次会消耗上百甚至上千字节的带宽。为了降低这些开销,HTTP2.0会先用HPACK算法压缩首部,再进行传输。
HPACK算法会让通信两端各自维护一张首部字典表,表中包含了首部名和首部值,其中首部名要全部小写,并用伪首部表示。每次请求都会记住已发送哪些首部,下一次只需传输不同的数据,相同的数据传索引就行。
HTTP2.0:是HTTP1.1的扩展版本主要基于Google发布的SPDY协议,引入了全新的二进制分帧层,保留了http1.1的大部分语义,例如请求方法、状态码和首部等,由互联网工程任务组为2.0版本实现标准化。2.0版本从协议层面进行改动,目标是优化应用、突破性能限制,改善用户在浏览器Web页面时的速度体验。
为什么HTTP是超文本协议,要强调文本,而不是图片、视频什么的?
因为早期的网页只有简单的h1-h6、p等几个简单的文本元素,只能放文本。超文本是在文本之间有超链接,可以相互跳转。
HTTP协议的具体内容规定了如下两种消息的格式:
(1)请求消息:客户端发给服务器的消息
(2)响应消息:服务器发给客户端的
请求和响应的过程:
请求消息:
(1)第一行是:请求起始行(Start Line)
包括请求方法、空格、请求URI(请求地址报过URL和URN)、空格、协议版本
请求方法:
GET:表示客户端想获得服务器上的资源(无请求主体)
POST:表示客户端想传递数据给服务器(有请求主体)
PUT:表示客户端想放置文件到服务器上(有请求主体)
DELETE:表示客户端想删除服务器上的指定文件(无请求主体)
HEAD:表示客户端想获得服务器上指定资源的响应头部,不要资源本身(无请求主体)
CONNECT:连接测试
TRACT:追踪
OPTIONS:选项,保留以后使用
(2)请求头(header)从第二行开始有若干
<1>请求消息的专用头:
Host:easybug.org 告诉服务器请求的是哪一个虚拟机
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 告诉服务器自己可以接收响应内容类型
Origin: http://easybug.org 来源,告诉服务器当前请求来源于哪个域名
Referer: http://easybug.org/Home/Index 引用页 告诉服务器当前请求来源于哪个域名
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 客户端在告诉服务器自己的类型
Accept-Encoding: gzip, deflate 客户端在告诉服务器自己在接收的响应数据编码类型
Accept-Language: zh-CN,zh;q=0.9 告诉服务器自己接收的自然语言
<2>请求/响应消息通用头
Connection:keep-alive 告诉对方启用持久链接
Cache-Control:no-cache 告诉对方如何缓存当前消息主体中的内容
Pragma:no-cache HTTP/1.0版本的Cache-Control
Date: Wed, 28 Nov 2018 03:33:52 GMT 消息创建的时间
<3>请求主体描述头
Content-Length:54 描述请求主体的长度
Content-Type: 描述请求主体的内容类型,可以是一下几种:
application/x-www-form-urlencoded请求主体是经过编码后的表单数据
或text/plain请求数据是普通文本未经编码,有的服务器直接拒绝接收!
或multipart/form-data 表单中包含上传的文件数据
<4>客户端自定义头部
(3)CRLF(是一个空行)
(4)请求主体(Body)
客户端想给服务器传递的数据
响应消息:
(1)第一行是:响应起始行(Start Line)
包括协议版本、空格、响应状态码、空格、原因短句(描述给你的状态码的原因)
状态码:
1XX 提示性信息 100 Continue 信息进行分份传送,收到一部分继续传送。101 Switching Protocols http协议切换到https协议
2XX 成功的响应 200 ok 201 Created (put请求的时候)
3XX 需要客户端重定向 301永久重定向 请求的链接永久移走了 302临时重定向 303 See Other 304 Not Modified缓存数据库中的数据有效,从缓存数据库中取数据。
4XX 客户端错误 400Bad Request 无效的请求 请求消息不符合要求的格式401 请求要求身份验证。对于需要登录的网页,服务器可能返回此响应402为了将来可能需求预留的 403 Forbidden 禁止访问 404 Not Found 请求的东西不存在 405 Method Not Allowed 408 Request Timeout请求超时
5XX服务器端运行错误 500 Internal Server Error 服务器内部错误 501 Not Implemented 502 Bad Gataway网络错误 503 Service Unavailable 服务不可用 504 Gateway网关超时
(2)响应头(Headers)从第二行开始有若干
<1>响应消息的专用头:
Server: nginx/1.13.8 告诉客户端自己的服务器类型
Last-Modified: Tue, 16 Dec 2014 03:50:51 GMT 指定资源的最后一次修改时间
Content-Encoding: gzip告诉客户端内容经过压缩
<2>请求/响应消息通用头
Connection:keep-alive 告诉对方启用持久链接
Cache-Control:no-cache 告诉对方如何缓存当前消息主体中的内容
Pragma:no-cache HTTP/1.0版本的Cache-Control
Date: Wed, 28 Nov 2018 03:33:52 GMT 消息创建的时间
<3>响应主体描述头
Content-Length:141 描述响应主体内容的长度
Content-Type: 响应主体的内容类型有上百种 text/html; charset=utf-8
text/plain
text/html
text/css
application/javascript
application/xml
application/json
image/jpeg
audio/mpeg3......
<4>服务器自定义头部
(3)CRLF(是一个空行)
(4)响应主体(Body)在Response中 就是客户端的请求内容
常见的HTTP请求方法有哪些?各表示客户端的何种意图?
见上边
get请求与post请求的比较:
GET | POST | |
如何发起请求 | 浏览器中输入URL回车、超链接跳转、JS跳转、SRC/HREF属性请求、GET方式提交表单、AJAX-GET | POST方式提交表单、AJAX-POST |
请求数据的位置 | 追加在URI后,作为查询字符串,以?开头 | 放在请求主体中 |
请求数据的类型 | 只能是文本符 | 可以是任意类型,如包括图片、视频等 |
能否上传文件 | 否 | 能 |
请求数据的数据长度 | 有,浏览器/服务器对请求URI有限制,数据是连接在URL后面(如1KB、4KB等) | 数据放在请求主体里面 |
请求数据需要编码吗 | 需要,一个UTF-8汉字编码为9个字节 | 需要,一个UTF-8汉字编码为9个字节 |
表达的语义 | 表示客户端想获取 | 表示客户端想传递 |
如何精准的描述一段数据的内容类型:
不要使用后缀名(太多,太杂乱、不可靠)
.html、.xhtml、.htm 、.jpg、.jpeg、.mp3、.mpeg3
可以借鉴MIME中定义的文件类型名称:
text/html、html/css、application/javascript......
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
缓存工作原理:
最上面的一条线是第一次请求,最下面一条线是第二次请求,缓存消息没过期是新鲜数据获取数据,中间的判断数据是否过期。
Cache-Control:max-age=3600;表示数据缓存的最大有效时间
Expires指定缓存数据的确切的过期时间
如何修改响应消息的头部:
(1)修改Web服务器的配置文件,设置默认响应头部(比较复杂,有些情况下无法修改,如新浪云服务器)
(2)配置每个HTML文件的HTTP-RQUIV标签控制缓存
若响应文件是HTML,则可以声明<meta http-equiv=“响应头部”>仅适用于HTML文件,且只是“等价物”,并非真正的响应头部。
http-equiv:http等价物
(3)使用动态语言的代码来控制响应消息头部
如PHP:设置一个响应消息头部
header('Cache-Control:no-cache');
header('Content-Type:image/png');
HTTP存在的问题:
1.容易被监听。2.数据可能被篡改。3.容易假冒服务器
解决方法:
HTTPS:数据加密+网站认证+完整性验证+HTTP
HTTPS就是在HTTP传输协议的基础上对网站进行认证,给予它独一无二的身份证明,再对网络数据进行加密,并对数据进行完整性验证。
HTTP协议是明文传输,可能被窃听和篡改。
HTTPS协议将数据发送给TCP层之前,先经过一个安全层(由SSl或TLS实现)负责对消息进行加密和解密操作。
TCP/IP的四层协议需要多一层安全层变成五层
HTTP | HTTPS | ||
应用层 | HTTP | 应用层 | HTTP |
安全层 | SSL/TLS | ||
传输层 | TCP | 传输层 | TCP |
网络层 | IP | 网络层 | IP |
数据链路层 | 网络接口 | 数据链路层 | 网络接口 |