HTTP连接管理
客户端与服务器的整个连接过程很短暂,不会与服务器保持长时间的连接状态,因此被称为“短连接”。
长连接也叫持久连接
服务器会发送Connection:keep-alive字段表示启用了长连接
报文头里如果有Connection:close意味着长连接即将关闭

TCP连接长时间不关闭,服务器必须在内存中保存其状态,这就占用了服务器的资源,如果有大量的空闲长连接只连接不发,就会很快耗尽服务器的资源,导致服务器无法真正为有需要的用户提供服务。所以长连接需要在恰当的时间关闭,在客户端的请求头上加上Connection:close字段告诉服务器关闭连接,服务器一般不会主动关闭连接,可以使用一些策略关闭,以nginx为例:
1、使用keepalive_timeout指令设置长连接的超时时间,如果在一段时间内连接上没有任何数据收发就主动断开连接,避免占用系统资源
2、使用keepalive_requests指令,设置长连接上可以发送的最大请求次数,超过后主动断开连接。
队头阻塞
HTTP规定报文必须是“一发一收”,这就形成了一个先进先出的“串行”队列,如果队首的请求因为处理的太慢耽误了时间,那么队列里后面的所有请求也不得不跟着一起等待,

解决方法:
1、并发连接:同时对同一个域名发起多个长连接,用数量解决质量问题。但应限制单个客户端的并发数
2、域名分片:多开几个域名
HTTP的重定向和跳转
1、重定向是服务器发起的跳转,要求客户端改用新的URI重新发送请求,通常会自动进行,用户无感知。
2、响应头字段Location指示了要跳转的URI,可以用绝对或相对的形式
3、重定向可以把一个URI指向另一个URI,
4、使用重定向时需要当心性能损耗,还要避免出现循环跳转。
HTTP的Cookie机制
响应头字段:Set-Cookie 和请求头字段:Cookie。
用户第一次访问服务器时,创建一个身份标识器,格式为“key=value”,放入Set-Cookie字段中,随着响应报文一同发给浏览器。
浏览器收到响应报文,看到Set-Cookie,会保存起来,下次请求的时候自动把这个值放进Cookie字段里发给服务器。
Cookie是由浏览器负责存储的,Cookie中的数据通常是用户的关键识别信息,需要一些方法来保护,防止外泄或者窃取,
- 首先,设置Cookie的生存周期,即有效期,可以使用
Expires和Max-Age两个属性设置。Expires:绝对时间点,“截止日期”。Max-Age:相对时间,单位是秒,浏览器用收到报文的时间再加上Max-Age德达失效的绝对时间。浏览器会优先采用Max-Age计算失效期。 - 其次,设置Cookie的作用域,让浏览器仅发送给特定的服务器和URI,避免被其他网站盗用。
Domain和Path指定了Cookie所属的域名和路径,浏览器在发送Cookie前会从URI中提取出host和path部分,对比Cookie的属性,如果不满足条件,就不会再请求头里发送cookie - 最后,Cookie的安全性,
HttpOnly会告诉浏览器,此Cookie只能通过浏览器HTTP协议传输,禁止其他方式访问。SameSite可以防范XSRF攻击,设置SameSite=Strict可以严格限定Cookie不能随着跳转链接跨站发送,
HTTP的缓存控制
使用数据缓存技术,可以避免多次请求-应答的通信成本,节省网络带宽,加快响应速度。
基于“请求-应答”模式的特点,大致分为客户端缓存和服务端缓存。
服务端缓存
1、浏览器发现缓存无数据,于是发送请求,向服务器获取资源;
2、服务器响应请求,返回资源,同时标记资源的有效期
3、浏览器缓存资源,等待下次重用。
max-age是HTTP缓存控制最常用的属性,设定生存时间。no-store:不允许缓存,用于某些变化非常频繁的数据no-cache:可以缓存,但是在使用之前必须要去服务器验证是否过期,是否有最新的版本。must-revallidate:如果缓存不过期就可以继续使用,但是过期了必须去服务器验证。

客户端缓存
当在浏览器点击‘刷新’按钮的时候,浏览器会在请求头里加一个“Cache-Control:max-age=0”。而ctrl+F5 强制刷新,其实是发送了一个Cache-Control:no-cache
条件请求
if-Modified-Since 和if-None-Match,需要第一次的响应报文预先提供Last-modified和ETag,然后第二次请求时就可以带上缓存里的原值,验证资源是否是最新的。如果资源没有改变,服务器就回应一个304 Not Modified表示缓存依然有效,浏览器可以更新有效期,使用缓存。

Last-modified:文件的最后修改时间ETag:实体标签,资源的唯一标识,用来修改时间无法准确区分文件变化的问题。比如,一个文件在一秒内修改了很多次,一秒内的版本无法区分,或者一个文件定期更新,但有时是同样的内容,实际上没有变化,用修改时间会误以为发生变化,传送给浏览器会浪费带宽。
验证资源是否失效需要使用“条件请求”:if-Modified-Since和if-None-Match,收到304就可以复用缓存里的资源
验证资源是否被修改的条件有两个:Last-Modified和“ETag”,需要服务器预先在响应报文里设置,搭配条件请求使用。
HTTP 的代理服务

代理服务:也是一台服务器,服务本身不生产内容,而是出于中间位置转发上下游的请求和响应,具有双重身份,面对下游的用户时,表现为服务器,代表源服务器响应客户端的请求,面向上游的源服务器时,表现为客户端,代表客户端发送请求。
代理处在HTTP通信的中间位置,相应地对上屏蔽了真实的客户端,对下屏蔽了真实的服务器,为HTTP协议增加了更多的灵活性。
代理最基本的一个功能是负载均衡,
代理服务还可以提供的功能:
**健康检查:**使用“心跳”等机制监控后端服务器,发现有故障的时候及时踢出集群,保证服务的高可用性
**安全防护:**保护被代理的后端服务器,限制IP地址或浏览,抵御网站攻击和过载
**加密卸载:**对外网使用SSL/TLS加密通信认证,而在安全的内网不加密,消除加解密成本。
**数据过滤:**拦截上下行的数据,任意指定策略修改请求或者相应。
**内容缓存:**暂存,复用服务器响应
代理服务器需要使用“Via”标记自己的身份,多个代理会形成一个列表
如果想知道客户端的真实ip地址,可以使用字段X-Forward-For和X-Real-IP。
HTTP缓存代理
缓存代理即支持缓存控制的代理服务。
HTTP的服务器缓存功能主要由代理服务器来实现(缓存代理),而源服务器系统内部虽然也经常有各种缓存,但与HTTP没有太多的关系。

在没有缓存的时候,代理服务器每次都是直接转发客户端和服务器的报文,中间不会存储任何数据,只有最简单的中转功能。加入了缓存后,代理服务收到源服务器发来的响应数据后需要做两件事,一是把报文转发给客户端,二是把报文存入自己的Cache里。下一次再有相同的请求,代理服务器就可以直接发送304或者二缓存数据,节约了源服务器的网络带宽。
要区分客户端上的缓存和代理上的缓存,可以使用private和public。private表示缓存只在客户端保存,public表示缓存完全开发,谁都可以存,谁都可以用。
本文详细介绍了HTTP的连接管理,包括短连接与长连接,以及如何处理队头阻塞问题。接着讨论了HTTP的重定向与跳转机制,重定向通常由服务器发起,并通过Location字段指示新的URI。接着,文章讲解了HTTP的Cookie机制,包括如何设置和管理Cookie,以及Cookie的安全性措施。此外,还深入探讨了HTTP的缓存控制,包括服务端与客户端缓存的工作原理,以及如何利用条件请求验证资源是否过期。最后,提到了HTTP代理服务的作用,如负载均衡、安全防护和内容缓存等。
HTTP-进阶篇&spm=1001.2101.3001.5002&articleId=105938496&d=1&t=3&u=384fbc6495a54c6388368ef09f04ab4f)
3645

被折叠的 条评论
为什么被折叠?



