HTTP协议

110 阅读10分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

1 概念

HTTP协议(Hyper Text Transfer Protocol):浏览器和Web Server之间通信的协议是应用层协议
目标: 是处理客户端和服务端之间的通信
是Web应用载体

  • 小程序
  • 公众号
  • 桌面应用

2 请求/返回

请求和返回都是纯文本格式,分成头(Header)和体(Body)。

3 网址

URL(Uniform Resource Locator):用于在互联网上定位一个资源。也称之为网址。

image.png

  • 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的分级缓存策略

  1. 先查询浏览器的本地缓存(通常在内存中)
  2. 本地没缓存,查找操作系统的hosts文件,该文件在linux 中在 /etc/hosts
  3. 上述步骤没有找到,DNS会查询本地服务提供商(ISP)
  4. ISP没找到,请求指向Root根服务器,返回顶级域名服务器地址
  5. 浏览器发送请求给顶级域名服务器,返回权威域名服务器地址
  6. 浏览器发送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:这个字段可以帮助统计客户端用了什么浏览器、操作系统等

image.png

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)

image.png

  • */*代表所有类型(默认)
  • 多个类型用逗号隔开例如: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 缓存的工作原理

image.png

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协议的方式。让客户端和服务器之间保持很长时间的连接且不中断