无状态协议HTTP
HTTP是无状态协议,即不保存请求和响应之间的通信状态。这是为了更快处理大量事物,确保协议的可伸缩性,也能减少服务器的 CPU 及内存资源的消耗。而这也导致无法用上一个请求状态来处理下一次的请求。
但是无状态会导致一个用户在一个页面登录后,跳转到其他页面就没有登录信息需要再次登录。所以引入了cookie,再使用HTTP通信,就可以管理登录状态。
Cookie技术通过在请求和响应的报文中写入Cookie信息来控制客户端的登录状态。
Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie 值后发送出去。
服务端发现客户端发送的请求中带有cookie,就会检查是哪个客户端的cookie,从而检查其状态。
图文介绍
Cookie、Set-Cookie的字段含义
由前面的图可知,响应的Set-Cookie字段中包含有path,Domain等属性,下面来介绍一下。
- NAME=VALUE:赋予cookie的名称和值,必填项
- expires=DATE:cookie的有效期,不指定则默认是浏览器关闭后(一旦服务中存储了cookie值,就无法实际地删除cookie,但可以覆盖已经过期的cookie)
- path=PATH:将服务器上的文件目录作为cookie的适用对象,不指定则默认是文档所在的文件目录
- domain:域名,cookie适用对象的域名,不指定则是服务器的域名(通过domain指定的域名可做到与服务器尾部保持匹配。比如domain指定baidu.com, 那么www.baidu.com 和www2.baidu.com都可以发送cookie),不指定会显得比较安全
- secure:仅在https安全通信时才会发送cookie,当省略secure时,http和https都会回收cookie
- HttpOnly:加限制,使cookie不能被js脚本访问
Cookie: status=enable
Set-Cookie: name=value; domain=aaa.com; HttpOnly; secure
HTTP的一些方法
HTTP的长连接
http1.1(不含1.1)以前默认是短连接,每次通信都要建立连接然后断开。涉及三次握手四次挥手。
如果通信时传输的内容比较少,所以没什么影响,但如果传输的数据长度较长,比如存在多张图片,多个音视频等,在请求html页面时,也会请求html上的资源,就会有很多tcp连接然后断开,增加了通信量的消耗。
就类似于下面这种情况:
- 请求html:三次握手建立tcp连接,http的请求与响应,四次挥手断开TCP连接
- 获取html的第一张图片:三次握手建立tcp连接,http的请求与响应,四次挥手断开TCP连接
- 获取html的第二张图片:三次握手建立tcp连接,http的请求与响应,四次挥手断开TCP连接
- ……
后面引入了长连接,即keep-alive, 只要一方没有提出断开连接,则会保持TCP连接状态
所以请求一个html页面就变成下面的情况:
- 请求html:建立tcp连接,http的请求与响应
- 获取html的第一张图片: http的请求与响应
- 获取html的第二张图片: http的请求与响应
- ……
- 四次挥手断开连接
持久连接的好处在于减少了TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。另外,减少开销的那部分时间,使 HTTP 请求和响应能够更早地结束,这样 Web 页面的显示速度也就相应提高了。
管线化
持续连接使请求以管线化的方式发送成为可能
以前的请求要等到响应之后才能发送下一个请求,管线化使得可以一次性发送多个请求,不用等待前面的响应结束。
管线化使得页面的响应更加快速。
管线化类似于下面的情况:
- 三次握手建立TCP连接
- 请求1
- 请求2
- 响应1
- 响应2
- 四次挥手断开TCP连接