1.状态码
1. 1XX 提示信息,意思是处理中 还有后续的操作;
1. 101 客户端使用upgrade字段,要求在http的基础上改为其他协议例如websocket来继续进行通信,服务器如果同意 就会发送101状态码
2. 2XX 成功,报文已经收到并被成功处理;
1. 200 一切正常。
2. 204 一切正常。没有返回body数据
3. 200 一切正常。分块下载和断点续传, 通常还伴随着字段content-range 表示传输整体body字节的范围 例如 100-200
3. 3XX 重定向,资源位置发生变化需要重新发送请求;
1. 301 永久重定向。资源地址永久改变了到了某个地址(如网站迁移),有服务器发起
2. 302 临时重定向。资源地址临时改变了到了某个地址(如服务器维护),有服务器发起,cdn不会做缓存优化
1. 304 重定向到了缓存的文件(例如cdn缓存的文件)。
4. 4XX 客户端错误 服务器无法处理;
1. 400 一个比较笼统的错误码,一般是参数错误。
2. 401 登录过期
3. 403 无权限访问
4. 404 没有找到资源,但是已经被用烂了
5. 405 请求方法错误
6. 406 资源不能满足客户端需求,例如 只有中文资源,请求的是英文
7. 408 请求超时了 服务器处理了太长时间
8. 409 多个请求并发应引起了竟态 冲突
9. 413 body传输的字节太多例如图片上传过大
10. 414 请求行的url 太大 超过了最大的长度
11. 429 客户端发送了太多的请求, 通常是服务器的限连策略。
12. 431 请求头head 某个字段过大或者整体过于大
5. 5XX 服务端错误 服务器内部发生了错误;
1. 500 一个比较笼统的错误码,服务端错误。 可以防止黑客分析
2. 501 功能尚未开发, 敬请期待
3. 502 网关错误 或者代理错误 例如nginx错误
4. 503 比较当前服务器很忙, 但是待会儿可能就可以正常访问了 通常还有一个retry-after字段,表示这个待会儿的具体时间
2.http特点
1. 灵活可扩展
head 可以扩展大量字段来支持各种定制 ;body也不限制txt,html,也可以传输图片 音频视频等数据;
2. 可靠传输
tcp/ip协议是一个可靠地传输协议,依赖它可以在下层使用多种手段保证数据保证能够完整的送达。
3. 应用层
http是一个应用层的协议, 但是基本上是一个“万能”的协议。
4. 请求-应答
请求-应答模式是http协议的根本的通信模型
请求方和应答方的角色也不是绝对的,例如1,服务器担任了代理服务器的角色,就可以扮演两个角色;2,服务器推送,也可以颠倒角色。
5. 无状态
没有记忆功能, 这次的请求和上次请求没有一点关系
只能借助于head中cookie等缓存手段来解决这个问题
3.http有哪些优点和缺点
优点 :
- 1 . 简单灵活可扩展
- 2 . 应用广泛,环境成熟
- 3 . 无状态 服务器压力小
缺点 :
- 1 . 无状态 导致没有上下文,无法记录用户的信息 解决方案:cookie session token
- 2 . 不安全 明文传输没有加密,无法验证身份和完整性校验 解决方案:https
- 3 . 性能 不算差 不够好 有队头阻塞问题 解决方案:http2 http3
4. http的实体数据
1-1. 数据类型和编码
1. 多用途互联网邮件扩展 MIME 是个很大的数据类型标准,http只顺手牵羊去了其中一部分,就是 MIME type; 列举几个:
- 1 . text: text/plain text/css text/javascript
- 2 . image: image/gif image/jpeg image/png
- 3 . audio/video: audio/mpeg video/mp4
- 4 . application: 数据格式不确定 必须有上层应用程序来决定 有,application/json application/javascript application/pdf
application/octet-stream 不知道是什么数据类型 即不透明的二进制数据
2.Encoding type 文本压缩的格式 需要用什么方式解码 常见的有三种:
- 1 . gzip GUNzip 压缩格式 最常用
- 2 . deflate 仅次于gzip
- 3 . br 专门为http优化的新压缩算法
1-2.数据类型使用的头字段
http协议为了数据类型和编码 定义了两个Accept 请求头字段和两个Content响应实体头字段
1.客户端 Accept 请求头字段
- 1 . Accept 客户端接收什么类型的编码
- 2 . Accept-Encoding 客户端接收什么压缩格式
2.服务端 Content响应实体头字段
- 1 . Content 服务端发送什么类型的编码
- 2 . Content-Encoding 服务端发送什么压缩格式
2-1. 语言类型和编码
解决了国际化的问题 引入了两个概念 : 语言类型和字符集
1.语言类型 en en-US en-GB
2.字符集
早期世界各地的人们各自为政, 发明了很多的编码来处理文字,例如 英文:ASCll,汉语GBK,BIG5 日语 SHIFt_JIS
最后出现了统一世界的语言Unicode 和改进版本utf-8 ,utf-8已经统一世界了。
2-2. 语言类型使用的头字段
1. Accept-Language 用来表示客户端可以理解的自然语言
2. Content-language 表示服务端实体数据实际返回使用的自然语言
3. Accept-Charset 用来表示客户端可以理解的字符集
4. 用来表示服务端的返回内容使用的字符集 是Content-type的第二段说明 例如 Content-type:text/css; charset=utf-8
3-1,内容协商的质量值
使用q值来说明权重 优先级
例如 Accept: text/html, application/xml;q=0.9, /;q=0.8 分为了三段,1,html默认不写q为1;2,其次xml为0.9; 3,再其次*为0.8
3-2. 内容协商的结果
内容协商时不透明的,服务器会在响应头里多加一个vary字段来说明是依据哪几个字段来返回了报文,例如:
Vary: Accept-Encoding,User-Agent,Accept 服务端根据这三个字段返回了报文
5. http 传输大文件的方法
1. 数据压缩
Accept-Encoding和Content-Encoding决定了那种压缩格式
不过这个方法也有缺点 只能压缩文本,图片 音频 视频本身就是高度压缩的,如果使用gzip甚至还会增大一点。
2. 分块传输
使用chunked 来分成小块传输 浏览器收到在组装复原,状态码为206 ,报文字段为Transfer-Encoding: chunked;
无法使用Content-Length字段 ,和Transfer-Encoding是互斥的.
3. 范围请求
在视频技术里,可以根据时间点首先先请求一小节的视频观看,然后快播放完的时候在去发请求下一小节的内容, 这个时候就是范围请求应用的时候
请求字段: Range:bytes=0-31
响应字段 Content-Range: bytes 0-31/96 ;Content-Length:32 ;Accept-Range: bytes
成功状态码为206,范围不合法会返回416断点续传也是基于此技术
4. 多段数据
范围请求一次只支持获取一个片段, 其实还可以在请求头里Range使用多个x-y,一次获取多个片段数据
这个时候需要一个特殊的MIME类型 multipart/byteranges 并且还要使用一个参数 boundary=xxx给出段分隔标记
请求字段: Range:bytes=0-31,100-131
响应字段 Content-type: multipart/byteranges boundary=00000001 ;Content-Length:64 ;Accept-Range: bytes; Connection:keep-alive