【网络通信 -- 直播】IM 学习系列 -- 网络通信协议简介(HTTP 协议 五)

【网络通信 -- 直播】IM 学习系列 -- 网络通信协议简介(HTTP 协议 五)

【1】HTTP 的 Cookie 机制

【1.1】Cookie 的工作过程
涉及到响应头字段 Set-Cookie 和请求头字段 Cookie;
当用户通过浏览器第一次访问服务器的时候,服务器不知道用户的身份,需要以“key=value”格式创建一个独特的身份标识数据,然后放进 Set-Cookie 字段里,随着响应报文一同发给浏览器;浏览器收到响应报文,确定里面有 Set-Cookie,便可确定这是服务器给的身份标识,于是就保存起来,下次再请求的时候就自动把这个值放进 Cookie 字段里发给服务器;由于第二次请求里面有了 Cookie 字段,服务器就知道这个用户不是新人,就可以拿出 Cookie 里的值,识别出用户的身份,然后提供个性化的服务;通常,服务器会在响应头里添加多个 Set-Cookie,存储多个“key=value”,但浏览器发送时不需要用多个 Cookie 字段,只要在一行里用“;”隔开就行;

【网络通信 -- 直播】IM 学习系列 -- 网络通信协议简介(HTTP 协议 五)_第1张图片

Cookie 是由浏览器负责存储的,是“浏览器绑定”的,只能在本浏览器内生效;

【1.2】Cookie 的属性
1. Cookie 的生存周期,即有效期,一旦超过这个期限浏览器就认为是 Cookie 失效,在存储里删除,也不会发送给服务器;Cookie 的有效期可以使用 Expires 和 Max-Age 两个属性来设置,“Expires”俗称“过期时间”,用的是绝对时间点,可以理解为“截止日期”(deadline);“Max-Age”用的是相对时间,单位是秒,浏览器用收到报文的时间点再加上 Max-Age,就可以得到失效的绝对时间;Expires 和 Max-Age 可以同时出现,两者的失效时间可以一致,也可以不一致,但浏览器会优先采用 Max-Age 计算失效期;
2. Cookie 的作用域,让浏览器仅发送给特定的服务器和 URI,避免被其他网站盗用;“Domain”和“Path”指定了 Cookie 所属的域名和路径,浏览器在发送 Cookie 前会从 URI 中提取出 host 和 path 部分,对比 Cookie 的属性,如果不满足条件,就不会在请求头里发送 Cookie;使用这两个属性可以为不同的域名和路径分别设置各自的 Cookie,通常 Path 就用一个“/”或者直接省略,表示域名下的任意路径都允许使用 Cookie,让服务器自行选择;
3. Cookie 的安全性,尽量不要让服务器以外的人看到;属性“HttpOnly”会告诉浏览器,此 Cookie 只能通过浏览器 HTTP 协议传输,禁止其他方式访问,浏览器的 JS 引擎就会禁用 document.cookie 等一切相关的 API,脚本攻击也就无从谈起了;属性“SameSite”可以防范“跨站请求伪造”(XSRF)攻击,设置成“SameSite=Strict”可以严格限定 Cookie 不能随着跳转链接跨站发送,而“SameSite=Lax”则略宽松一点,允许 GET/HEAD 等安全方法,但禁止 POST 跨站发送;属性“Secure”,表示这个 Cookie 仅能用 HTTPS 协议加密传输,明文的 HTTP 协议会禁止发送,但 Cookie 本身不是加密的,浏览器里还是以明文的形式存在;

【1.3】Cookie 的应用
1. Cookie 最基本的一个用途就是身份识别,保存用户的登录信息,实现会话事务;
2. Cookie 的另一个常见用途是广告跟踪;

【2】HTTP 的缓存控制

【2.1】服务器的缓存控制

缓存的运行机制

【网络通信 -- 直播】IM 学习系列 -- 网络通信协议简介(HTTP 协议 五)_第2张图片


1. 浏览器发现缓存无数据,于是发送请求,向服务器获取资源;
2. 服务器响应请求,返回资源,同时标记资源的有效期;
3. 浏览器缓存资源,等待下次重用;

HTTP 中缓存字段及其属性
服务器标记资源有效期使用的头字段是“Cache-Control”
“max-age=30”就是资源的有效时间,max-age 是“生存时间”,时间的计算起点是响应报文的创建时刻,而不是客户端收到报文的时刻,即包含了在链路传输过程中所有节点所停留的时间;
no-store 不允许缓存,用于某些变化非常频繁的数据;
no-cache 可以缓存,但在使用之前必须要去服务器验证是否过期,是否有最新的版本;
must-revalidate 如果缓存不过期就可以继续使用,但过期了如果还想用就必须去服务器验证;

【网络通信 -- 直播】IM 学习系列 -- 网络通信协议简介(HTTP 协议 五)_第3张图片

【2.2】客户端的缓存控制

当点击“刷新”按钮的时候,浏览器会在请求头里加一个“Cache-Control: max-age=0”,浏览器就不会使用缓存,而是向服务器发请求,服务器看到 max-age=0,也就会用一个最新生成的报文回应浏览器;
Ctrl+F5 的“强制刷新”其实是发了一个“Cache-Control: no-cache”,含义和“max-age=0”基本一样,就看后台的服务器怎么理解,通常两者的效果是相同的;
“前进”“后退”“跳转”这些重定向动作中浏览器只用最基本的请求头,没有“Cache-Control”,所以就会检查缓存,直接利用之前的资源,不再进行网络通信;

【2.3】条件请求

HTTP 协议就定义了一系列“If”开头的“条件请求”字段,专门用来检查验证资源是否过期,从而把两个请求才能完成的工作合并在一个请求,验证的责任也交给服务器;

条件请求一共有 5 个头字段,最常用的是“if-Modified-Since”和“If-None-Match”,需要第一次的响应报文预先提供“Last-modified”和“ETag”,然后第二次请求时就可以带上缓存里的原值,验证资源是否是最新的,如果资源没有变,服务器就回应一个“304 Not Modified”,表示缓存依然有效,浏览器就可以更新一下有效期,然后使用缓存;

【网络通信 -- 直播】IM 学习系列 -- 网络通信协议简介(HTTP 协议 五)_第4张图片

“Last-modified”即文件的最后修改时间;ETag 即“实体标签”(Entity Tag)的缩写,是资源的一个唯一标识,主要是用来解决修改时间无法准确区分文件变化的问题;比如,一个文件在一秒内修改了多次,但因为修改时间是秒级,所以这一秒内的新版本无法区分;再比如,一个文件定期更新,但有时会是同样的内容,实际上没有变化,用修改时间就会误以为发生了变化,传送给浏览器就会浪费带宽;使用 ETag 就可以精确地识别资源的变动情况,让浏览器能够更有效地利用缓存;ETag 还有“强”“弱”之分,强 ETag 要求资源在字节级别必须完全相符,弱 ETag 在值前有个“W/”标记,只要求资源在语义上没有变化,但内部可能会有部分发生了改变(例如 HTML 里的标签顺序调整,或者多了几个空格);

【3】HTTP 的代理服务

【网络通信 -- 直播】IM 学习系列 -- 网络通信协议简介(HTTP 协议 五)_第5张图片

链条的起点还是客户端(也就是浏览器),中间的角色被称为代理服务器(proxy server),链条的终点被称为源服务器(origin server),意思是数据的“源头”“起源”;

【3.1】代理服务

“代理服务”就是指服务本身不生产内容,而是处于中间位置转发上下游的请求和响应,具有双重身份,面向下游的用户时,表现为服务器,代表源服务器响应客户端的请求;而面向上游的源服务器时,又表现为客户端,代表客户端发送请求;

【3.2】代理的作用
1. 负载均衡
2. 健康检查,使用“心跳”等机制监控后端服务器,发现有故障就及时“踢出”集群,保证服务高可用;
3. 安全防护,保护被代理的后端服务器,限制 IP 地址或流量,抵御网络攻击和过载;
4. 加密卸载,对外网使用 SSL/TLS 加密通信认证,而在安全的内网不加密,消除加解密成本;
5. 数据过滤,拦截上下行的数据,任意指定策略修改请求或者响应;
6. 内容缓存,暂存、复用服务器响应;

【3.3】代理相关头字段

1. 代理服务器需要用字段“Via”标明代理的身份;Via 是一个通用字段,请求头或响应头里都可以出现,每当报文经过一个代理节点,代理服务器就会把自身的信息追加到字段的末尾,如果通信链路中有很多中间代理,就会在 Via 里形成一个链表,这样就可以知道报文究竟走过了多少个环节才到达了目的地;

【网络通信 -- 直播】IM 学习系列 -- 网络通信协议简介(HTTP 协议 五)_第6张图片

例如图中有两个代理:proxy1 和 proxy2,客户端发送请求会经过这两个代理,依次添加就是“Via:proxy1, proxy2”,等到服务器返回响应报文的时候就要反过来走,头字段就是“Via:proxy2,  proxy1”;

2. “X-Forwarded-For”即“为谁而转发”,每经过一个代理节点就会在字段里追加一个信息;“X-Forwarded-For”追加的是请求方的 IP 地址,在字段里最左边的 IP 地址就是客户端的地址;
3. “X-Real-IP”获取客户端真实 IP 的手段,作用是记录客户端 IP 地址,没有中间的代理信息;

【3.4】代理协议

代理协议 V1 版本
开头是“PROXY”五个大写字母,然后是“TCP4”或者“TCP6”,表示客户端的 IP 地址类型,再后面是请求方地址、应答方地址、请求方端口号、应答方端口号,最后用一个回车换行(\r\n)结束;

【4】HTTP 的缓存代理

【4.1】缓存代理服务

代理服务收到源服务器发来的响应数据后需要做两件事;
1. 把报文转发给客户端,2. 把报文存入自己的 Cache 里,下一次再有相同的请求,代理服务器就可以直接发送 304 或者缓存数据,不必再从源服务器那里获取,从而降低了客户端的等待时间,同时节约了源服务器的网络带宽;
在 HTTP 的缓存体系中,缓存代理的身份十分特殊,它“既是客户端,又是服务器”,同时也“既不是客户端,又不是服务器”;说它“即是客户端又是服务器”,是因为它面向源服务器时是客户端,在面向客户端时又是服务器,所以它既可以用客户端的缓存控制策略也可以用服务器端的缓存控制策略;但缓存代理也“即不是客户端又不是服务器”,因为它只是一个数据的“中转站”,并不是真正的数据消费者和生产者,所以还需要有一些新的“Cache-Control”属性来对它做特别的约束;

代理服务器的缓存控制
1. 使用属性“private”和“public”区分客户端上的缓存和代理上的缓存;
“private”表示缓存只能在客户端保存,是用户“私有”的,不能放在代理上与别人共享;“public”表示缓存完全开放;
2. 缓存失效后的重新验证也要区分开(即使用条件请求“Last-modified”和“ETag”),“must-revalidate”是只要过期就必须回源服务器验证,而新的“proxy-revalidate”只要求代理的缓存过期后必须验证,客户端不必回源,只验证到代理这个环节就行了;
3. 使用属性“s-maxage”(s 是 share 的意思,注意 maxage 中间没有“-”)表示缓存的生存时间,只限定在代理上能够存多久,而客户端仍然使用“max-age”;
4. 使用属性“no-transform”禁止代理对缓存数据的优化处理,比如把图片生成 png、webp 等几种格式,方便今后的请求处理;

完整的服务器端缓存控制策略,可以同时控制客户端和代理

【网络通信 -- 直播】IM 学习系列 -- 网络通信协议简介(HTTP 协议 五)_第7张图片

客户端的缓存控制

【网络通信 -- 直播】IM 学习系列 -- 网络通信协议简介(HTTP 协议 五)_第8张图片

“max-stale”表示如果代理上的缓存过期了也可以接受,但不能过期太多,超过 x 秒也会不要;
“min-fresh”表示缓存必须有效,而且必须在 x 秒后依然有效;
“only-if-cached”表示只接受代理缓存的数据,不接受源服务器的响应;如果代理上没有缓存或者缓存过期,就应该给客户端返回一个 504(Gateway Timeout);

参考致谢
本博客为博主的学习实践总结,并参考了众多博主的博文,在此表示感谢,博主若有不足之处,请批评指正。

【1】透视HTTP协议

你可能感兴趣的:(流媒体)