1. Http(超文本传输协议)是什么
- HTTP 是一个用在计算机世界里的协议。它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范,以及相关的各种控制和错误处理方式(协议)。
- HTTP 是一个在计算机世界里专门用来在两点之间传输数据的约定和规范(传输)。
- 超文本:就是“超越了普通文本的文本”,它是文字、图片、音频和视频等的混合体,最关键的是含有“超链接”,能够从一个“超文本”跳跃到另一个“超文本”,形成复杂的非线性、网状的结构关系。
2. 正向与反向代理
- 正向代理:代理客户端,替客户端进行发送请求,接收响应,运用场景:翻墙
- 反向代理:代理服务器,替服务器进行接收请求,发送响应,运用场景:nginx反向代理,负载均衡
3. 输入URL回车之后发生的事情
4. Http协议的特点
-
灵活可扩展性
http协议现在不但能够传输txt,html等文本文件,也可以传输图片,音频,视频等二进制文件,来源其强大的扩展性。
-
可靠传输
传输层基于TCP协议,所以其为可靠传输服务
-
请求-应答式
http协议为"一发一收"的,请求方需主动建立TCP连接发送http请求,响应方只能被动监听并进行响应
-
无状态
5. http1.1 pipeline与Http2.0 multiplexing
http1.1 pipeline允许发送多个http请求,但必须按照顺序依次响应,所以会有队首阻塞问题。
而http2.0则允许进行响应以任何顺序
6. 头部Accept与Content字段
- Accept:客户端告诉服务器,自己需要什么类型的数据
- Accept-Encoding:客户端告诉服务器自己可以接受的压缩格式
- Content-Type:服务器/客户端 实际发送的数据实体的数据类型
- Content-Encoding:告诉对方报文实体的压缩格式
7. Transfer-Encoding与Content-Length
这两个头部字段是互斥的,前者表示长度未知,所以进行分块(trunk)传输,后者长度已知。
Trunk:报文格式
8. 范围请求
-
服务器需要告知客户端自己接受范围请求,添加响应头部Accept-Ranges:bytes,如果不支持,则需告知Accept-Ranges:none
-
范围请求报文需添加头部字段Range: byte=x-y 表示目标文件的[x,y]范围的字节数。
-
服务器接受到范围请求后,需检验范围是否合法,若不合法,则响应416状态码,表示范围请求有误,若正确,则返回206状态码表示成功获取部分数据,对应的服务器需要添加响应头:
Content-Range:byte x-y/{文字总字节数}
-
-
一次获取多个片段数据,Range头部字段中有多个 x-y,此时服务器返回的MIME类型为multipart/byteranges,和一个分解符boundary
9. Http连接管理
-
短连接
http/1.0默认,服务器对请求处理完成,发送响应之后就断开TCP连接
-
长连接
http/1.1默认,服务器会保持TCP连接,用来进行多次交互,通过头部Connection: keep-alive,如需断开连接,使用Connection: close关闭连接
-
由于大量的长连接会消耗大量的服务器资源,所以应设置keepalive-timeout超时参数,来避免Dos攻击(拒绝服务攻击)
-
由于http基于请求-响应式,当http/1.1同时在一个TCP连接发送多个请求时,必须依次按顺序进行响应,如果第一个请求处理较慢,或因为网络原因导致客户端一直收不到响应,就会造成"队首阻塞"问题。
缓解方案(由于http本质为请求-响应,所以在http/1.1中无法解决)
- 并发连接,创建多个TCP连接进行并发请求(流量器有限制,Google chrome对同一域名最多建立6个TCP连接)
- 域名划分:使多个域名同时(DNS cname)指向一个域名(ip),来建立更多的连接
10. 重定向
- 重定向是服务器发起的,要求客户端用新的URL进行请求,通常会自动进行,用户无感知。
- 301:永久重定向;302:临时重定向
- 响应报文指定Location头部字段指定重定向到的URL
- 重定向本质发送了两次http请求(性能下降,降低用户体验),还需要避免循环跳转
11. Cookie
- 服务器存储在客户端的少量数据(key-value)
- 属性
- Expire or Max-Age:前者为截止日期,后者为过期时间(浏览器收到Cookie的时间+max-age),后者优先级更高。
- httponly:禁用js脚本的document.cookie等api操作cookie数据,保证安全
- domain+path:cookie的作用路径(包括子路径),即会携带此cookie的URL路径
12. 缓存控制
-
服务器响应报文Cache-Control
- max-age:max-age=30,指服务器产生响应开始计时,即不包括网络传输的时间
- no-store:不允许缓存,适合频繁改变的页面
- no-cache:表示可以使用缓存,但必须去服务器进行验证是否有更新的数据
- must-revalidate:若缓存未过期,则使用,若过期还需使用的话,需去服务器验证
-
客户端缓存控制
-
浏览器也可以通过Cache-Control头部字段对缓存进行控制
-
浏览器验证缓存是否有效,常使用if-modified-since和if-none-match字段,使用这个两个字段需要第一次响应报文预先带有Last-Modified和ETag,之后请求就可以带上缓存里的原值,验证资源是否是最新的。若未改变,则服务器响应304 not modified
[外链图片转存失败(img-Nzgp4Lq4-1566366035271)(C:\Users\xy\AppData\Roaming\Typora\typora-user-images\1566142892594.png)]
-
13. http代理
[外链图片转存失败(img-Uj9S5dYE-1566366035273)(C:\Users\xy\AppData\Roaming\Typora\typora-user-images\1566203297004.png)]
- 代理相关头部字段
- X-forwarded-for:为"谁"转发(指源客户端)
- X-real-ip:源客户端ip地址
- proxy protocol:在http请求报文上添加一行PROXY [client_ip] [server_ip] [client_port] [server_port]标识源客户端ip与端口
- Via:如上图,显示途中经过哪些代理。
14. Http/2.0
- HTTP 协议取消了小版本号,所以 HTTP/2 的正式名字不是 2.0;
- HTTP/2 在“语义”上兼容 HTTP/1,保留了请求方法、URI 等传统概念;
- HTTP/2 使用“HPACK”算法压缩头部信息,消除冗余数据节约带宽;
- HTTP/2 的消息不再是“Header+Body”的形式,而是分散为多个二进制“帧”;
- HTTP/2 使用虚拟的“流”传输消息,解决了困扰多年的“队头阻塞”问题,同时实现了“多路复用”,提高连接的利用率;
- HTTP/2 也增强了安全性,要求至少是 TLS1.2,而且禁用了很多不安全的密码套件。
Header+Body”的形式,而是分散为多个二进制“帧”; - HTTP/2 使用虚拟的“流”传输消息,解决了困扰多年的“队头阻塞”问题,同时实现了“多路复用”,提高连接的利用率;
- HTTP/2 也增强了安全性,要求至少是 TLS1.2,而且禁用了很多不安全的密码套件。
- HTTP/2也增加服务器推送的功能