参考文档:
1,http协议
超文本传输协议。
什么是超文本?
包含了文字、图片和视频,里面的超链接可以从一个超文本跳到另外一个超文本。
1,URI
统一资源标识符。URI包括URL和URN.
URL称为统一资源定位符。
1,URI编码
URI只支持ASCII编码,其他的字符不显示。
2,http报文结构
起始行 + 头部 + 空行 + 实体
1,起始行
在起始行中,每两个部分之间用空格隔开,最后一个部分之后是回车。
1,请求报文
方法+路径+http版本
1,请求方法
http/1.1规定的请求方法(方法名都是大写):
- GET
- POST
- PUT
- DELETE
- OPTIONS
列出可对资源使用的请求方法,预检请求,用来跨域请求 - TRACE
追踪请求响应的传输路径 - HEAD
获取资源的元信息 - CONNECT
建立连接隧道,用于代理服务器
get方法和post方法的区别:
- get方法传送的数据量小,不能大于2KB。post方法传送的数据量大,一般不受限制。
- get传送数据的方式不安全。post方法较为安全。
2,响应报文
响应报文的起始行也叫做状态行。
http版本+状态码+原因
1,状态码
- 1,1xx
提示信息。
协议处理中的中间状态,需要进一步的操作。 - 2,2xx
请求成功。
200:最常见的成功状态码,表示一切正常,除了HEAD请求,body中都会有数据。
204:与200基本相同,但是响应的body中没有数据。
206:body中返回的数据是所有内容的一部分。 - 3, 3xx
重定向,资源位置发生变化,需要客户端重新发送请求。
301:永久重定向,URL指向的资源已经不存在了,需要新的URL.
302: 临时重定向,请求的资源还在,但是需要使用新的URL.301和302都会在响应头中使用Location,指明后续需要跳转的URL。
304:缓存重定向,资源没有修改。 - 4, 4xx
客户端错误,请求报文有误。
400: 客户端请求的报文有错误。
403 Forbidden:服务器禁止访问资源。
404 Not Found: 请求的资源不存在。 - 5, 5xx
500 Internal Server Error: 服务器内部错误。
501 Not Implemented: 功能未实现。
502 Bad Gateway:
503 Service Unavailable: 服务器当前很忙,暂时无法响应。
2,头部
请求头
响应头
头部常见字段
1,Host
客户端发送请求时,指定服务器的域名。可以将请求发往同一服务器的不同域名。
2,Content-Length
服务器返回数据时,表明此次返回数据的长度。单位为字节。
3,Connection
客户端要求服务器使用TCP持久连接,以便其他请求复用。
Connection: keep-alive
4,Content-Encoding
说明数据的压缩方式,表明服务器返回的数据采用了什么压缩格式。
对应的客户端使用Accept-Encoding表明自己能够接收的压缩方式。
常用的压缩方式:
- gzip,最流行的压缩格式
- deflate
- br, 专门为HTTP发明的压缩算法
5,Content-Type
服务器告诉客户端,本次数据是什么格式。
对应的客户端使用Accept来表明自己能够接收的数据格式。
常见的媒体格式类型:
- text/html html 格式
- text/plain 纯文本格式
- text/XML XML格式
- image/gif
- image/jpeg
- image/png 以application开头的媒体格式类型:
- application/json
- application/pdf
6,Content-Language
服务器发送的内容所采用的语言。
对应的客户端使用Accept-Language表明自己能够接收的语言。
7,Content-Charset
字符集
服务器将这个内容放在了Content-Type中,以charset属性指定。
对应的客户端的字段是Accept-Charset.
3,空行
用来区分头部和实体
4,实体
请求体
响应体
3,具体场景
1,http如何传输定长和不定长的数据
1,定长数据
响应行只设置了Content-Length,表明返回的数据时定长数据。
Content-Length的长度与实际返回的报文长度不一致的时候会出现问题。
2,不定长数据
响应行设置了下面这个字段:
Transfer-Encoding: chunked
// Transfer-Encoding: chunked
// Transfer-Encoding: compress
// Transfer-Encoding: deflate
// Transfer-Encoding: gzip
// Transfer-Encoding: identity
// Several values can be listed, separated by a comma
// Transfer-Encoding: gzip, chunked
表示分块传输数据,有两个作用:
- Content-Length字段失效
- 基于长连接持续推送动态内容
2,HTTP处理大文件的传输
3,代理服务器
功能
- 负载均衡 客户端的请求会先到达代理服务器,代理服务器通过特定的算法将请求分发给不同的源服务器。这样的算法包括:随机算法、轮询、一致性hash、LRU(最近最少使用)。
- 保障安全 利用心跳机制监听后台服务器,一旦发现故障机就将其剔除集群。并且对上下行的数据进行过滤,对非法IP限流。
- 缓存代理 将内容缓存到代理服务器。
相关头部
- via 源服务器收到的请求:
Via: proxy_server1, proxy_server2
客户端收到的请求:
Via: proxy_server2, proxy_server1
via中代理的顺序即为HTTP传输中保温传递的顺序
- X-Forward-For
意思是为谁转发,记录的请求方的IP。
这个字段带来的问题:
由于记录的是请求方法IP,所以每经过一个不同的代理,这个字段的名字都要变,这会导致两个问题: 1,需要解析HTTP报文头,转发的性能下降。2,在https通信加密中,原始报文是不允许修改的。
解决方法:
在HTTP请求行上增加代理协议:
// PROXY + TCP4/TCP6 + 请求方地址 + 接收方地址 + 请求端口 + 接收端口
PROXY TCP4 0.0.0.1 0.0.0.2 1111 2222
GET / HTTP/1.1
- X-Real-IP 记录最初的客户端的IP
- X-Forward-Host 最初的客户端的域名
- X-Forword-Proto 最初的客户端的协议名
4,HTTP1.1
1,HTTP1.1的优点
- 简单
- 灵活和易于拓展
- 应用广泛和跨平台
2,HTTP1.1的缺点
- 无状态 无状态的好处是减轻服务器的负担,缺点是服务器没有记忆能力,完成关联性的操作时比较复杂。
- 明文传输
- 不安全
通信使用明文。
不验证通信方的身份。
无法验证报文的完整性。
3,SSL和TLS
SSL和TLS是同一个东西的不同叫法。
SSL称为安全套接层,在上世纪90年代有网景公司设计,在OSI模型中处于会话层(第五层)。
TLS称为传输层安全协议。
TLS1.0 = SSL3.1.
4,HTTP1.1的性能
HTTP1.0的时候每发起一次HTTP请求时,都要新建一次TCP连接,而且时串行请求,TCP不断的建立连接和断开,增加了通信开销。
- 长连接
也称为持久连接,好处在于减轻重复建立和断开TCP连接的服务器开销。
持久连接的一个特点时只要有一方没有提出断开连接,则保持TCP连接状态。
并发连接,对于一个域名可以同时有六个连接。通过域名分片,可以突破六个连接的限制。 - 管道网络传输
由于采用了长连接的方式,所以可以采用管道网络传输。
管道网络传输就是,客户端可以发起多个请求,不必等待上一个请求的返回,就可以发出下一个请求。 - 队头阻塞 虽然采用了管道网络传输,请求可以并发的发出,但是服务器还是按照顺序处理请求,如果前面的请求很费时间,后面的请求就需要一直等待,这种情况称为队头阻塞。
5,HTTP1.1相对于HTTP1.0的改进
- 使用长连接改善了HTTP1.0短链接的服务器开销。
- 使用管道网络传输,减少整体响应时间。
6,HTTP1.1的性能瓶颈
- 头部未经压缩就发送了,只压缩了body部分。
- 头部内容冗余
- 队头阻塞
- 没有请求优先级控制
- 只能有客户端发起,没有服务端推送。
5,HTTP2.0
- 压缩头部
在压缩头部的同时,还会除去重复的头部。
在客户端和服务端维护了一张一样的头部信息表,所有的字段都会存入这个表,生成一个索引号,后续的请求就不用发送头部了,只需要发送索引号就可以。 - 报文采用二进制
头部和body均采用二进制,并且统称为帧:头信息帧和数据帧。
虽然对人不友好,但是方便计算机。计算机不用将明文的报文转为二进制,增加数据传输的效率。 - 数据流
- 多路复用 一个TCP连接可以处理多个请求,即多个HTTP请求复用一个TCP连接,解决了队头阻塞问题。
- 服务器推送 服务器不再被动响应,也可以主动向客户端发送消息。
6,HTTPS
1,HTTPS与HTTP的区别
- HTTP的端口号时80,HTTPS的端口号是443.
- HTTP明文传输,HTTPS是加密传输。
2,HTTPS特点
- 混合加密 在建立通信之前使用非对称加密,建立通信之后使用对称加密。从而保证报文不被窃取。
- 摘要算法 通过摘要算法对报文进行处理,得到摘要1。将报文和摘要一同发给客户端,客户端使用相同的摘要算法处理报文,得到摘要2,比对摘要1和摘要2,就能知道报文是否被修改。通过这个方法保证报文不被修改。
- 数字证书
数字证书认证机构向客户端发送一个经过认证的服务端的数字证书,证书中包含了服务端的公钥。
数字证书认证机构本身的数字证书是事先置入到浏览器或者操作系统中的,这个是可信的。通过它的公钥可以确认服务端的数字证书是可信的。
2,TCP
1,三次握手四次挥手
1,为什么需要四次挥手
TCP是全双工信道,客户端好服务端建立了两条通道,客户端的输入连接服务端的输出,客户端的输出连接服务端的输入。