HTTP是什么
HTTP全称为HyperText Transfer Protocol,译为超文本传输协议(规则的集合)。
HTTP是一种“客户端——服务器”的数据交换协议,请求通常是由客户端率先发起的。
HTTP历史与标准
请求与响应
- 由客户端向服务端发送的消息称为请求(request)
- 由服务端回应的消息称为响应(response)
基于HTTP的组件系统
请求通过一个实体发出,实体也就是用户代理(浏览器)。
客户端
user-agent(http请求头中存在该信息)就是任何能够为用户发起行为的工具,通常是浏览器,也可以是工程师使用的程序,以及Web开发人员调试应用程序。
客户端与服务端的交互流程
浏览器首先发送一个请求来获取HTML页面,再解析文档中的资源信息发送其他请求,获取可执行脚本或CSS样式来进行页面布局渲染,以及一些其他页面资源(如图片或资源)。然后,浏览器将这些资源整合到一起,展现出一个完整的页面。
Web服务器
服务器只是虚拟意义上代表一个机器:它可以是共享负载(负载均衡)的一组服务器组成的计算机集群,也可以是一种复杂的软件,通过向其他计算器发起请求来获取部分或全部资源。
Web服务器不一定是一台机器,但一台机器上可以开启多个服务。
HTTP的基本特性
-
HTTP是简单的
虽然下一代HTTP2协议将HTTP消息封装到了帧中,HTTP大体上还是被设计得简单易懂。
-
HTTP是可扩展的
主要指扩展headers
-
HTTP是无状态,有会话的
两次请求之间没关系
-
HTTP和连接
一个连接是由传输层来控制的,这从根本上不属于HTTP的范围
HTTP能控制什么
-
缓存
-
开放同源限制
-
认证
基本的认证功能可以直接通过HTTP提供,或者通过Cookie
-
代理和隧道
通常情况下,服务器/客户端是处于内网的,对外网隐藏真实IP地址。因此HTTP请求就要通过代理越过这个网络屏障
-
会话
HTTP报文
HTTP报文,又称HTTP消息,是服务器和客户端之间交换数据的方式,分为请求和响应。
HTTP消息采用ASCII编码的多行文本构成。
HTTP请求报文
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ukvWyXVF-1598323635790)(https://s1.ax1x.com/2020/08/18/dnbHp9.md.png)]
HTTP报文结构
- start line:一行起始行用于描述要执行的请求,或者对应的状态,成功或失败。这个起始行总是单行的
- HTTP headers:一个可选的HTTP头集合指明请求或描述消息正文
- empty line:一个空行指示所用关于请求的元数据已经发送完毕
- body:一个可选的包含请求相关的数据的正文或相应相关的文档,正文的大小由起始行的HTTP头来指定
起始行和HTTP消息中的HTTP头统称为“请求头”,而其有效负载被称为“消息正文”
HTTP响应报文
请求方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YAdepv7q-1598323635814)(https://s1.ax1x.com/2020/08/18/dnXmtO.md.png)]
请求头与请求主体
请求头
请求头允许客户端向服务端传递附加信息。请求头由键值对组成。
根据不同上下文,可将请求头分为:
- 通用头:同时使用于请求和响应消息,但与最终消息主体中传输的数据无关的消息头
- 请求头:包括更多有关要获取的资源或客户端本身信息的消息头
- 实体头:包含有关实体主体的更多信息,比如主体长度(Content-Lenghth)或其他MIME类型
状态行与状态码
HTTP响应消息的起始行被称作状态行,包含以下信息:
- 协议版本
- 状态码
- 状态文本
状态码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hgWi3ZHw-1598323635821)(https://s1.ax1x.com/2020/08/18/duSaOH.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9IXnT8e7-1598323635827)(https://s1.ax1x.com/2020/08/18/duS00A.png)]
MIME类型
MIME类型全称为Multipurpose Internet Mail Extensions,被译为多用途Internet邮件扩展类型,是一种标准化的方式来表示文档的性质和格式。
HTTP1.x的缺点
- 消息头不想消息主体一样会被压缩
- 两个报文之间的header通常非常相似,但它们仍然在连接中重复传输
- 无法复用。当在同一个服务器打开几个连接时,TCP热连接比冷连接更加有效。
缓存机制是什么
缓存是一种保存并在下次请求是直接使用该副本的技术。当web缓存发现请求的资源已经被储存,它会拦截请求,返回该资源的拷贝,而不会去源服务器重新下载。
缓存需要合理配置,因为并不是所有资源都是永久不变的。重要的是对一个资源的缓存应截止到其下一次发生改变(既不能缓存过期的资源)。
缓存的优势
- 缓解服务器的资源消耗和运行压力,提升服务器的整体性能
- 减少服务器资源加载的延迟,进而减少显示某个资源所用的时间
- 减少对宽带造成的压力,避免网络阻塞问题的出现
- Web站点变得更具有响应性
缓存应用
常见的HTTP缓存只能存储GET响应,对于其他类型的响应则无能为力:
- 检索请求的成功响应,状态码为200,则表示为成功。包含例如HTML文档,图片,或者文件的响应
- 不变的重定向:响应状态码为301
- 错误响应:状态码为404
- 不完全的响应:状态码为206
- 除了GET请求外,如果匹配到作为一个已被定义的cache键名的响应
缓存机制
私有缓存
私有缓存只能用于单独用户。浏览器缓存拥有用户通过HTTP下载的所有文档。这些缓存为浏览过的文档提供向后/向前导航、保存页面、查看源码等功能,可以避免再次向服务器发起多余的请求。他同样可以提供缓存内容的离线预览。
Cache-Control:private
共享缓存
共享缓存可以被多个用户使用。例如,ISP或所在的公司可能会架设一个web代理来作为本地网络基础的一部分提供给用户。这样热门的资源就会被重复使用,减少网络拥堵与延迟。
Cache-Control:public
缓存控制
Cache-Control头
-
禁止进行缓存
Cache-Control:no-store Cache-Control:no-cache,no-store,must-revalidate
-
强制确认缓存
Cache-Control:no-cache
-
缓存过期机制
Cache-Control:max-age=[毫秒值]
-
缓存验证确认
Cache-Control:must-revalidate
pragma头
用于向前兼容HTTP/1.0客户端,响应头不支持该属性
Pragma:no-cache
Cookie是什么
Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,会在浏览器下次向同一服务器再发起请求时会携带Cookie。
Cookie的作用域
Domain和Path标识定义了Cookie的作用域,即Cookie应该发送给哪些URL
- Domain标识指定了哪些主机可以接收Cookie
- 如果不指定,默认为当前文档的主机(不包含子域名)
- 如果指定了Domain,则一般包含子域名。例如,如果设置
Domain=baidu.com
,则Cookie也包含在子域名下
- Path标识指定了主机下哪些路径可以接受Cookie
Cookie的有效期
Max-Age和Expires标识定义了Cookie的有效期,即Cookie的生命周期
Cookie的应用
- 会话状态管理
- 个性化设置
- 浏览器行为跟踪
访问与更新Cookie
创建Cookie
document.cookie = "键=值&键=值"
这种方法不会覆盖原有的Cookie,而是会向后追加
读取Cookie
document.cookie上存储了所有的cookie
删除Cookie
document.cookie="username=;expires=[过期时间]"
HTTP中的Cookie
Set-Cookie响应头
服务器使用该响应头向用户代理发送Cookie信息
Set-Cookie:[键]=[值]