一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情。
1 概念
HTTP协议(Hyper Text Transfer Protocol):浏览器和Web Server之间通信的协议是应用层协议
目标: 是处理客户端和服务端之间的通信
是Web应用载体
- 小程序
- 公众号
- 桌面应用
2 请求/返回
请求和返回都是纯文本格式,分成头(Header)和体(Body)。
3 网址
URL(Uniform Resource Locator):用于在互联网上定位一个资源。也称之为网址。
- scheme:用来描述协议 常用的有https、http、smtp、ftp
- host:代表主机,使用DNS look up能通过这个网址找到地址,也就是主机
- port:代表端口
- path:代表资源在服务器上的目录
- query:代表查询条件
- fragment:代表一个二级的分类,通常是给前端用的,比如用作网页定位
4 DNS
4.1 DNS - 工作原理
DNS(Domain Name System):域名解析系统。
用户访问网址的时候,都是先去DNS服务器上查询,DNS返回地址,然后用户以这个地址建立TCP请求,发送http请求
4.2 DNS Query的分级缓存策略
- 先查询浏览器的本地缓存(通常在内存中)
- 本地没缓存,查找操作系统的hosts文件,该文件在linux 中在 /etc/hosts里
- 上述步骤没有找到,DNS会查询本地服务提供商(ISP)
- ISP没找到,请求指向Root根服务器,返回顶级域名服务器地址
- 浏览器发送请求给顶级域名服务器,返回权威域名服务器地址
- 浏览器发送Lookup请求给权威域名服务器,找到具体DNS记录,返回给浏览器
4.3 DNS记录
DNS的数据以记录形式存储,就叫DNS记录。DNS记录的种类非常多, 有30多种。每条DNS记录描述了网址(URL)的一种关系。
4.3.1 A记录
功能:定义主机的IP地址
4.3.2 AAAA记录
功能:定义主机的IPv6地址
4.3.3 CNAME记录(Canonical Name Record)
功能:定义域名的别名
4.3.4 MX记录(Mail exchanger record)
功能:定义邮件服务器所在的位置。
4.3.5 NS记录(Name Server Record)
功能:定义DNS信息服务器所在的位置。
4.3.6 SOA记录(Start of Authority Record)
功能:定义在多个ns服务器中哪个是主服务器。
4.3.7 TXT记录
功能:提供一个文本信息。
5 内容分发网络(CDN)
CDN(Content Delivery Network):将请求分散到全世界各地,分发流量,加快访问速度。
CDN上无法部署业务逻辑,更新慢,无法保证一致性,比较适合纯的静态资源,比如图片、视频、脚本文件、样式文件等。
6 常见头部字段介绍
6.1 Content-Length
Content-Length:发送/接收Body内容的字节数。
6.2 User-Agent
User-Agent:这个字段可以帮助统计客户端用了什么浏览器、操作系统等
6.3 Content-Type
Content-Type:请求的时候,告知服务端数据的媒体类(MediaType/MIME Type)。返回的时候告知客户端,数据的媒体类型。
- text/html:HTML格式
- text/css:css文本
- application/json: JSON数据格式
- image/jpeg:jpg图片格式
- text/plain:纯文本格式
6.4 Origin
描述请求来源地址
- 例如:scheme://host:port
- 不含路径
- 可以是null
6.5 Accept
Accept:是HTTP协议协商能力的体现,用于建议服务端返回何种媒体类型(MIME Type)
- */*代表所有类型(默认)
- 多个类型用逗号隔开例如:text/html, application/json
- Accept-Encoding:建议服务端发送哪种编码(压缩算法)
- deflate, gzip;q=1.0, *;q=0.5
- Accept-Language:建议服务端传递哪种语言
- Accept-Language:fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5
6.6 Referer
告诉服务端打开当前页面的上一张页面的URL
非浏览器环境有时候不发送Referer(或者虚拟Referer,通常是爬虫)
常用于用户行为分析
6.7 Connection
Connection:决定HTTP连接(不是TCP连接)是否在当前事务完成后关闭。
- Http1.0 默认是 close
- Http1.1 后默认是 keep-alive
7 HTTP的方法
7.1 HTTP的方法
- GET:从服务器获取资源
- POST:在服务器创建资源(幂等性)
- PUT:在服务器修改资源
- DELETE:在服务器删除资源
- OPTION :客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。请求的响应不能缓存
- TRACE :用于显示调试信息 多数网站不支持
- CONNECT: 代理部分相关
- PATCH :对资源进行部分更新(极少用)
7.2 状态码
- 1xx:提供信息
- 100 continue 101 切换协议(switch protocol)
- 2xx:成功
- 3xx:重定向
- 4xx:客户端错误
- 5xx:服务端错误
7.3 2xx状态码
- 200 – OK
- 201 – Created 已创建
- 202 – Accepted 已接收
- 203 – Non-Authoritative Information 非权威内容
- 204 – No Content 没有内容
- 205 – Reset Content 重置内容
- 206 – Partial Content 服务器下发了部分内容(range header)
7.4 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 永久重定向
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重定向资源
7.5 4xx状态码
- 400 – Bad Request 请求格式错误
- 401 – Unauthorized 没有授权
- 402 – Payment Required 请先付费
- 403 – Forbidden 禁止访问
- 404 – Not Found 没有找到
- 405 – Method Not Allowed 方法不被允许
- 406 – Not Acceptable 服务端可以提供的内容和客户端期待的不一样
但是多数服务端开发已经不遵循状态码
7.6 5xx状态码
- 500 – Internal Server Error(内部服务器错误)
- 501 – Not Implemented(没有实现)
- 502 – Bad Gateway(网关错误)
- 503 – Service Unavailable(服务不可用)
- 504 – Gateway Timeout(网关超时)
- 505 – HTTP Version Not Supported(版本不支持)
8 HTTP缓存
传统的HTTP协议层网络结构的三种实体:
- Web服务器
- 资源保存在Web服务器中
- 浏览器
- 代理
什么是缓存?
存储将被用到的数据,提升访问速度
8.1 缓存的工作原理
8.2 缓存的优势
成本低(速度快,时间少)
可以有选择性存储数据
8.3 缓存条目
缓存条目:通常是Key/Value结构。如HTTP缓存,通常以Key为URL;Value通常不仅仅只包括数据,还会包括一些描述字段,比如缓存的失效时间等。
8.4 缓存置换
缓存置换:缓存满了后,每次创建新的缓存条目,就会删除旧的缓存条目。
LRU(LRU-Least recently used)缓存置换算法:清理时间上最早的条目
8.5 HTTP缓存
HTTP缓存最重要的配置项为Cache-Control HTTP 返回头。 不仅浏览器可以缓存,浏览器和服务器之间的HTTP代理服务器也可以缓存。
8.6 什么是代理服务器?
代理服务器接收一个请求,然后把请求转发给另一个服务器;从另一个服务器接收结果,然后再返回给请求方。根据工作方式的不同,分成正向代理和反向代理。
8.7 正向代理
定义:把要请求的网址(资源)发送给代理服务器,由代理服务器向目标发送请求后获取资源再返回给请求方。
8.8 反向代理
定义:当请求方向一个网址发送一个请求的时候,请求方意识不到,请求的其实是一个反向代理服务器,这个代理服务器将请求代理给了内部的网络。
8.9 强制缓存
强制缓存行为是强制执行的,在缓存到期前,一定会使用浏览器的缓存。
Cache-Control:public,max-age:10000
- public:允许所有中间方缓存
- max-age:10000:缓存10000s。超过时间就再次去服务器拿数据
基于确定时间的强制缓存:
Cache-Control:public Expires: Fri, 16 Oct 2020 02:31:07 GMT
超过Expires限定的日期缓存就会失效
如果 max-age 和 Expires 都有, Expires 会被忽略。
8.10 协商缓存
协商缓存的行为是基于变更协商的。在缓存条目对应的资源发生生变化前,都使用浏览器缓存。因此协商缓存必须每次都请求服务端.
8.11 Etag
服务端想实现协商缓存时可返回ETag,资源不变,ETag的数值也不会改变。
浏览器保存服务端的E-Tag后缓存资源:ETag: 33a64df551425fcc55e4d42a148795d9f25f89d4
下次请求时带上该E-Tag(服务器匹配成功后返回304 Not Modified):If-Match: 33a64df551425fcc55e4d42a148795d9f25f89d4
8.12 Last-Modifed(Depreciated)
Last-Modifed(Depreciated):基于变更时间的协商缓存方案。
服务器返回资源时返回一个 Last-Modifed 头:Last-Modified:Wed, 21 Oct 2015 07:28:00 GMT
浏览器收到后,进行缓存,保存该时间。 下次发请求时,带上该数据:If-Modifed-Since: Wed, 21 Oct 2015 07:28:00 GMT
在实际之后资源后更新,则返回新资源,若无更新,就返回304 Not Modifed 。
9 其他前端缓存
- LocalStorage
- SessionStorage
- Android利用端能力
10 HTTP连接
10.1 keep-alive
Keep-Alive:多次请求复用一个TCP连接。
Keep-Alive: timeout=5, max=1000
为什么要keep-alive?
- TCP三次握手
- 证书和协商秘钥的传递
- 为了节省网络成本,会考虑多个请求复用一个TCP连接
10.2 keep-alive的断开
- 单个请求:请求完成后,在timeout时间内没第二个请求进来则会关闭。
- 多个请求:在一个请求响应之后,在 timeout 时间内有另一个请求进来,就会利用相同的 TCP 连接继续响应这个请求,直到没有更多请求进来,可以通过 max 字段设定最多响应的请求数。
10.3 keep-alive是不是长连接?
keep-alive并不是长连接
WebSocket:长连接,提供在HTTP协议退化成TCP协议的方式。让客户端和服务器之间保持很长时间的连接且不中断