HTTP协议(Hyper Text Transfer Protocol): 应用层协议
目标: 是处理客户端和服务端之间的通信
请求(Request):一次请求,分成头(Header)和体(Body)
返回(Response):一次返回,也同样分(Header)和体(Body)
网址:
URL(Uniform Resource Locator):用于在互联网上定为一个资源,URL也称为网址,比如我们输入的网址。
DNS(Domain Name System):域名解析系统
DNS Query的分级缓存策略:
先查询浏览器的本地缓存(通常在内存中)
本地没缓存,查找操作系统的hosts文件,该文件在linux 中在 /etc/hosts里
上述步骤没有找到,DNS会查询本地服务提供商(ISP)
ISP没找到,请求指向Root根服务器,返回顶级域名服务器地址
浏览器发送请求给顶级域名服务器,返回权威域名服务器地址
浏览器发送Lookup请求给权威域名服务器,找到具体DNS记录,返回给浏览器
DNS记录:
DNS的数据以记录形式存储,就叫DNS记录。DNS记录的种类非常多, 有30多种。每条DNS记录描述了网址(URL)的一种关系。
A记录:定义主机的IP地址
AAAA记录:定义主机的IPv6地址
CNAME记录(Canonical Name Record):定义域名的别名
MX记录(Mail exchanger record):定义邮件服务器所在的位置
NS记录(Name Server Record):定义DNS信息服务器所在的位置
SOA记录(Start of Authority Record):定义在多个ns服务器中哪个是主服务器
TXT记录:提供一个文本信息
内容分发网络(CDN) :
CDN(Content Delivery Network):将请求分散到全世界各地,分发流量,加快访问速度。
CDN上无法部署业务逻辑,更新慢,无法保证一致性,比较适合纯的静态资源,比如图片、视频、脚本文件、样式文件等。
请求头和返回头:HTTP协议通过请求头和返回头控制协议工作,无论是请求头还是返回头都是Key/Value的形式。
常见头部介绍:
Content-Length:发送/接收Body内容的字节数
User-Agent:这个字段可以帮助统计客户端用了什么浏览器、操作系统等
Content-Type:请求的时候,告知服务端数据的媒体类(MediaType/MIME Type),返回的时候告知客户端,数据的媒体类型
Origin:描述请求来源地址
Accept:是HTTP协议协商能力的体现,用于建议服务端返回何种媒体类型(MIME Type)
Referer:告诉服务端打开当前页面的上一张页面的URL,非浏览器环境有时候不发送Referer(或者虚拟Referer,通常是爬虫),并且常用于用户行为分析
Connection:决定HTTP连接是否在当前事务完成后关闭
HTTP常用的方法:
GET:从服务器获取资源
POST:在服务器创建资源(幂等性)
PUT:在服务器修改资源
DELETE:在服务器删除资源
状态码:
1xx:提供信息
2xx:成功
- 200 – OK
- 201 – Created 已创建
- 202 – Accepted 已接收
- 203 – Non-Authoritative Information 非权威内容
- 204 – No Content 没有内容
- 205 – Reset Content 重置内容
- 206 – Partial Content 服务器下发了部分内容(range header)
3xx:重定向
- 300 – Multiple Choices 用户请求了多个选项的资源(返回选项列表)
- 301 – Moved Permanently 永久转移
- 302 – Found 资源被找到(以前是临时转移)
- 303 – See Other 可以使用GET方法在另一个URL找到资源
- 304 – Not Modified 没有修改
- 305 – Use Proxy 需要代理
- 307 – Temporary Redirect 临时重定向
- 308 – Permanent Redirect 永久重定向
4xx:客户端错误
- 400 – Bad Request 请求格式错误
- 401 – Unauthorized 没有授权
- 402 – Payment Required 请先付费
- 403 – Forbidden 禁止访问
- 404 – Not Found 没有找到
- 405 – Method Not Allowed 方法不被允许
- 406 – Not Acceptable 服务端可以提供的内容和客户端期待的不一样
5xx:服务端错误
- 500 – Internal Server Error(内部服务器错误)
- 501 – Not Implemented(没有实现)
- 502 – Bad Gateway(网关错误)
- 503 – Service Unavailable(服务不可用)
- 504 – Gateway Timeout(网关超时)
- 505 – HTTP Version Not Supported(版本不支持)
301和308:
共同点:资源被永久移动到新的地址
差异:客户端收到308请求后,延用旧的method(POST/GET/PUT)到新地址,客户端收到301请求后,通常用户会向新地址发起GET请求
302/303/307:
共同点:资源临时放到新地址
差异:302是http1.0提出的,最早叫做Moved Temporarily; 很多浏览器实现的时候没有遵照标准,把所有请求都重定向为GET。1999年标准委员会增加了303和307,并将302重新定义为Found。 303告诉客户端使用GET方法重定向资源,307告诉客户端使用原请求的method重定向资源
HTTP缓存:
传统的HTTP协议层网络结构的三种实体:Web服务器、浏览器、代理
缓存:存储将被用到的数据,提升访问速度
缓存的优势:成本低(速度快,时间少)、有选择性存储数据
缓存条目:通常是Key/Value结构。如HTTP缓存,通常以Key为URL;Value通常不仅仅只包括数据,还会包括一些描述字段,比如缓存的失效时间等。
缓存置换:缓存满了后,每次创建新的缓存条目,就会删除旧的缓存条目(时间上最早的条目)。
HTTP缓存最重要的配置项为Cache-Control HTTP 返回头,不仅浏览器可以缓存,浏览器和服务器之间的HTTP代理服务器也可以缓存。
代理服务器:代理服务器接收一个请求,然后把请求转发给另一个服务器;从另一个服务器接收结果,然后再返回给请求方。根据工作方式的不同,分成正向代理和反向代理。
正向代理:把要请求的网址(资源)发送给代理服务器,由代理服务器向目标发送请求后获取资源再返回给请求方
反向代理:当请求方向一个网址发送一个请求的时候,请求方意识不到,请求的其实是一个反向代理服务器,这个代理服务器将请求代理给了内部的网络
强制缓存:强制缓存行为是强制执行的,在缓存到期前,一定会使用浏览器的缓存
协商缓存:协商缓存的行为是基于变更协商的,在缓存条目对应的资源发生生变化前,都使用浏览器缓存,因此协商缓存必须每次都请求服务端
Etag:服务端想实现协商缓存时可返回ETag,资源不变,ETag的数值也不会改变
Last-Modifed(Depreciated):基于变更时间的协商缓存方案
HTTP连接:
为了节省网络成本,会考虑多个请求复用一个TCP连接
Keep-Alive:多次请求复用一个TCP连接
keep-alive的断开:单个请求:请求完成后,在timeout时间内没第二个请求进来则会关闭。 多个请求:在一个请求响应之后,在 timeout 时间内有另一个请求进来,就会利用相同的 TCP 连接继续响应这个请求,直到没有更多请求进来,可以通过 max 字段设定最多响应的请求数。
keep-alive是不是长连接?
keep-alive并不是长连接,WebSocket:长连接,提供在HTTP协议退化成TCP协议的方式,让客户端和服务器之间保持很长时间的连接且不中断