一、HTTP 概述
中文名称:超文本传输协议。
HTTP 是一个在OSI模型中位于第七层的协议。
是一个使用纯文本的传输协议。
主要版本
http1.0 :完全无状态、无连接的协议,一次tcp请求只会来回一次数据。
http1.1:优化了tcp长连接,极大的提高的性能。优化了大数据的多包传输。优化了缓存机制。
http/2:多路复用。服务器推送。TLS优先。HPACK头部压缩。二进制分帧。
二、HTTP 语法语义与时序交互
1、语法
HTTP的协议体由两部分组成:Header 和 Body,Header和Body由\r\n
分割,Body的结束符根据服务器的实现有很多种方案。
2、语义
主要讲Header部分
Header每一行一个参数,参数名称与参数值由:
冒号加一个空格分割,一个参数有多个值使用 ;
分号分割,最后使用\r\n
结束。
请求和应答的第一行都表示HTTP请求的核心内容
请求
GET / HTTP/1.1
请求方法 路径 协议版本
请求方法:
GET 向Web服务器请求一个文件
POST 向Web服务器发送数据让Web服务器进行处理
PUT 向Web服务器发送数据并存储在Web服务器内部
HEAD 检查一个对象是否存在
DELETE 从Web服务器上删除一个文件
路径:
是URL(统一资源定位符)中的路径部分
应答
HTTP/1.1 200 OK
版本 应答状态 描述文字
主要的头部参数
基础的:
Host: www.baidu.com\r\n 请求的主机名称(请求中)
Content-Type: text/html;charset=utf-8\r\n 请求参数中Body的数据格式(请求与应答中)MimeType
Content-Length: 123456\r\n Body的数据长度(请求与应答中),如果请求是单次的,该参数很重要
和浏览器有关的:
Accept: text/html\r\n 浏览器想要的数据类型
Accept-Language: zh-cn,zh\r\n 浏览器语言
Accept-Encoding: gzip,deflate\r\n 支持的压缩算法,可以使用算法压缩Body数据
Accept-Charset: gb2312,utf-8\r\n 可用的字符集
Referer: <URL>\r\n 上一个URL地址
User-Agent: Chrome88.123\r\n 使用的客户端、操作系统的版本等信息
和会话有关的:
Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1\r\n 服务器将数据设置到浏览器中
Cookie: UserID=JohnDoe\r\n 浏览器将对应域下的Cookie反馈给服务器
鉴权相关的:
Authorization: 鉴权类型 字符串\r\n 主要用于提供账号密码或者Token
重定向相关的:
Location: <URL>\r\n 如果应答状态码是 302 或者 304 则使用该参数告知浏览器自动跳转,很常用
和底层TCP协议有关的:
Connection: keep-alive\r\n 在请求后保持TCP连接继续打开以备后续,HTTP/1.1协议中新增功能
Connection: close\r\n 关闭TCP连接,主要是由服务器端发出
Keep-Alive: 300\r\n TCP连接超时时间
缓存相关的:
Cache-Control:no-cache\r\n 对于当前请求的内容,是否可以缓存及哪种类型的缓存
Expires: Thu, 01 Dec 2010 16:00:00 GMT\r\n 当前请求的内容过期的时间
3、分段应答
如果应答头部中存在 Transfer-Encoding:chunked
参数,则应答Body的数据格式将变化。(即可舍去计算Content-Length长度,达到流式返回数据的目的)
第一个应答块:
Transfer-Encoding:chunked
\r\n
3\r\n Body 的第一行将会是本次请求块数据的长度,以16进制表示
ABC\r\n
...
第N个应答块:
\r\n
0\r\n 第一行如果是0则表示该应答数据结束
\r\n
chunked 的拖挂
在拖挂中可以包含附带的首部字段,除了 Transfer-Encoding
、Trailer
以及 Content-Length
首部之外,其他 HTTP 首部都可以作为拖挂发送。
4、HTTPS 协议握手
HTTPS 主要的交互手段,是使用服务器端的非对称秘钥进过协商后,生成一个对称加密的会话秘钥的过程。
客户端发送ClientHello请求到服务端,这个请求会发送一个随机数和浏览器支持的加密套件列表
服务端接收到客户端的hello请求后,会发送两个请求,首先是ServerHello请求,这个会发送服务端从客户端传来的加密套件中选择的加密套件和一个随机数,还有一个请求会发送证书(公钥)
客户端拿到证书后;先去验证证书;验证通过后;再生成一个随机数(预主密钥),并使用公钥加密;然后把加密的预主密钥发送给服务端,服务端用私钥解密拿到预主密钥,这样客户端和服务端都有三个相同的随机数了,在通过同样的方法使用这三个随机数生成主密钥(会话密钥)
这样客户端服务端就可以通过主密钥进行加密解密操作传递数据了。
三、HTTP/2
四、HTTP协议在TCP上的应用
CDN系统:浏览器、CDN中心、缓存软件、源数据 可以通过HTTP的头部控制参数相互配合调度缓存数据,达到在很大的地理区间中极高的数据分发效率。
HTTP 七层代理:可以在不请求原始地址的情况下,根据配置读取到真实服务器的数据,用于跨地区访问、VPN隧道、负载均衡、TLS终止等功能。
文件下载服务器:利用断点功能可以高效的对一个资源进行多线程分块下载、甚至提供断线重连继续下载。
WebSocket:使用HTTP请求升级协议到WebSocket,可以实现全双工的网站访问。
五、扩展阅读
HTTP 状态码
SPDY 协议 QUIC 协议 KCP 协议
MDN总结:https://developer.mozilla.org/zh-CN/docs/Web/HTTP
RFC相关定义文档: rfc1945 HTTP1.0 https://www.rfc-editor.org/rfc/rfc1945.html
rfc2068,
RFC2616 http1.1 https://www.rfc-editor.org/rfc/rfc2068.html
rfc2817 https https://www.rfc-editor.org/rfc/inline-errata/rfc2817.html
RFC5246 传输层安全协议 TLS12 https://www.rfc-editor.org/rfc/rfc5246.html
rfc3143 HTTP代理和缓存协议 https://www.rfc-editor.org/rfc/rfc3143.html
RFC723[0,1,2,3,4,5] HTTP协议
RFC7230:Transfer-Encoding: chunked rfc4229 http header参数 https://www.rfc-editor.org/rfc/rfc4229.html
RFC5988 http header link参数格式协议 RFC7301 TLS-ALPN 应用层协商协议 https://tools.ietf.org/html/rfc7301
rfc7540 HTTP/2 https://www.rfc-editor.org/rfc/rfc7540.html
rfc7541 HTTP HPACK:Header Compression https://www.rfc-editor.org/rfc/rfc7541.txt HTTP2 帧格式详解 https://blog.csdn.net/makenothing/article/details/53241399?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-7&spm=1001.2101.3001.4242
HTTP/2 C库:https://nghttp2.org/
WireShark使用Firefox和Chrome秘钥记录,自动解密TLS数据export SSLKEYLOGFILE=~/path/to/sslkeylog.log