课程链接 web protocols
Timestamp:起始于2022.4.29<br /> Motivation:对于web协议的了解限于http/2.0,TCP/IP,且较为浅显和碎片化,对SSL/TLS协议完全不了解。
应用层
HTTP/1.1
浏览器发起HTTP请求典型场景
总结:
- 以chrome为例,浏览器内置有轻量级数据库。用户在地址栏输入url时会查询并auto-complete。
- 以访问网站为例,第一个请求index.html返回后,浏览器解析DOM结构。之后根据html中的cdn,js、图片、视频请求等超链接
继续发起http请求
。 - HTTP 特点:无状态、自描述(self-descriptive)、
基于ABNF定义HTTP消息格式
HTTP协议格式
GET / HTTP/2.0
HOST: 121.5.43.28
为什么网络要分层?
- 分层可以解耦层次
- 由IPv4到IPv6的过程由于商业原因,阻力大,但工作在网络层之上的应用层协议HTTP却可以更新迭代,就是因为每层较为独立
- TCP/IP模型
HTTP解决了什么问题?
- 在 Internet 环境下,提供人与机器与人交流的协议规范
- 让 Hypertext Information 如视频、音频、图片等在HTTP协议下高性能传输
- 由于 Internet 环境下无法预测的负载,需要一个 stateless 的协议,而HTTP恰好无状态。
- 无状态:客户端和服务器端都不能保持对方的信息,否则会因大流量而过载。
URI基本格式
仍旧利用 ABNF 元定义符,
- scheme://username:password@host:port/path?query#fregment
- scheme: http / ftp / mailto
- port= *(digit)
- path = *(“/“path)
- ….
- 对URI编码:利用百分号编码方式,十六进制表示。
- 作用:排除uri的path或query中包含 uri语法关键字的影响
HTTP请求行
- start-line
- request-line: Method SP path SP HTTP/x.x
- response-line:HTTP/x.x SP status SP message
- body
跨代理服务器的长短链接
- 长连接:可复用,减少TCP握手次数。
短连接:以一次请求为单位的TCP连接。
问题描述 | 当
user agent
和origin server
之间有proxy
的时候,可能会出现connection连接方式沟通出错的问题原因 | 在于旧版代理服务器无法识别keep-alive。
解决方案 | 当使用代理服务器的时候,在
user agent
和proxy
之间用Proxy-connection代替connection。
HTTP请求在服务器端的路由
通过头部中 host 信息mapping对应的虚拟主机来处理请求
**注意** | 服务器内部当然会有权限校验,并发连接数限制。并且用PF(Pipe and Filter)架构来处理请求生成响应
Proxy转发消息的X-xx头部
请求与响应上下文
请求上下文
- Referer:引用源url
- 服务器端常用于 统计分析、缓存优化、防盗链等功能。
- User-Agent:在服务端常用于 根据客户端浏览器指定HTTP版本选择策略。
响应上下文
- server: CLOUD ELB 1.0.0 为客户端提供服务器信息
内容协商与资源表述
内容协商
- 请求:
- Accept: text/*
- Accept-Language:en
- Accept-Encoding:gzip,br,deflate
- Content-Type:br,gzip;q=0.8
响应:
- Content-Type: text/html
- Content-Language:en
Content-Encoding:br
encoding用作压缩格式内容协商
内容协商决定服务器生成不同的http包体传输给浏览器
HTTP包体:消息内容
请求或响应都可以携带包体
- HTTP消息格式:HTTP-message = start-line (header-field CRLF) CRLF *[message-body].
注 | message-body是一串 二进制字节流.
定长包体
发送HTTP请求时已经可以确定消息长度,
需要使用Content-Length头部指明包体长度。
Content-Length = 1*DIGIT (Bytes)
不定长包体chunk传输
- Transfer-Encoding = chunked
- chunk = chunk-size [chunk.ext] CRLF chunk-data CRLF
- chunk-size = 1*HEXDIG
- chunk-data = 1*OCTET
- last-chunk = ….
HTTP请求全过程
- 客户端浏览器向DNS服务器解析域名,mapping得到IP地址
- 通过IP地址向服务器80端口发起TCP连接请求,三次握手建立TCP请求
- 客户端发送HTTP请求行、头
- 服务器处理请求并返回响应行、头、[体] <—-ABNF semantic
- 客户端浏览器接收处理响应
- 服务器关闭或保持TCP连接(一般情况为长连接,会保持)。
注:connection : Keep-Alive 需要客户端和服务器 共同 在头部做协商。