大话http(二)(下)

简介: 大话http(二)

session


网络异常,图片无法展示
|


网络异常,图片无法展示
|


如何传递sessionId呢?


  • cookie。当再次发送请求时,会扫描符合条件的cookie,并自动携带到服务端。 有些浏览器禁用了cookie。所以我们就可以通过url重写。将sessionId拼接到url后面进行传递。


  • 隐藏表单。表单提交时,增加一个字段,将sessionId加入。


session过期时间


网络异常,图片无法展示
|


cookie和session的比较


网络异常,图片无法展示
|


http缓存


缓存应该只缓存更新频率不高的静态资源(css, js, image等资源)。


几种缓存字段


expires:值是一个JMP格式的时间。


网络异常,图片无法展示
|


max-age 是“生存时间”(又叫“新鲜度”“缓存寿命”,类似 TTL,Time-To-Live),时间的计算起点是响应报文的创建时刻(即 Date 字段,也就是离开服务器的时刻),而不是客户端收到报文的时刻,也就是说包含了在链路传输过程中所有节点所停留的时间。


no-cache。是把资源进行了本地缓存,在浏览器使用缓存之前,会使用last-Modified和Etag往返浏览器进行对比,判断时间和唯一标识符和服务器的是否一致,一致的话304使用缓存,不一致的话请求服务器。


其实不止服务器可以发“Cache-Control”头,浏览器也可以发“Cache-Control”,也就是说请求 - 应答的双方都可以用这个字段进行缓存控制,互相协商缓存的使用策略。

当你点“刷新”按钮的时候,浏览器会在请求头里加一个“Cache-Control: max-age=0”。Ctrl+F5 的“强制刷新”,其实是发了一个“Cache-Control: no-cache”,含义和“max-age=0”基本一样,就看后台的服务器怎么理解,通常两者的效果是相同的。但只会在请求网页HTML时添加,HTML解析渲染时遇到的图片等资源还是会使用本地缓存资源。


那何时才使用缓存的资源呢?


在“前进”“后退”“跳转”这些重定向动作中浏览器不会“夹带私货”,只用最基本的请求头,没有“Cache-Control”,所以就会检查缓存,直接利用之前的资源,不再进行网络通信。


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


Etag也有强弱之分。


  • 强 ETag 要求资源在字节级别必须完全相符。


  • 弱 ETag 在值前有个“W/”标记,只要求资源在语义上没有变化,但内部可能会有部分发生了改变(例如 HTML 里的标签顺序调整,或者多了几个空格)。


缓存的工作原理


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


但是如果cache-control和expires未到过期时间,那么将不会发送请求。可能资源已经更新,那么这时候将如何发送请求获取更新的资源呢?


网络异常,图片无法展示
|


浏览器操作对于缓存的影响


网络异常,图片无法展示
|


http协议之身份认证


  • BASIC认证(基本认证) 明文传输(base64编码),不安全。


网络异常,图片无法展示
|


  • DIGEST认证(摘要认证) 可能会被伪装。


网络异常,图片无法展示
|


  • SSL 客户端认证


网络异常,图片无法展示
|


  • FormBase 认证(基于表单认证)


网络异常,图片无法展示
|


http中介之代理


代理最基本的一个功能是负载均衡。 因为在面向客户端时屏蔽了源服务器,客户端看到的只是代理服务器,源服务器究竟有多少台、是哪些 IP 地址都不知道。于是代理服务器就可以掌握请求分发的“大权”,决定由后面的哪台服务器来响应请求。


代理服务器需要用字段“Via”标明代理的身份。Via 是一个通用字段,请求头或响应头里都可以出现。 每当报文经过一个代理节点,代理服务器就会把自身的信息追加到字段的末尾。


网络异常,图片无法展示
|


Via 字段只解决了客户端和源服务器判断是否存在代理的问题,还不能知道对方的真实信息。


通常客户端不应该知道服务器的ip地址。但是服务器需要知道客户端真实的ip地址,方便做访问控制、用户画像、统计分析。


X-Forwarded-For的字面意思是“为谁而转发”,形式上和“Via”差不多,也是每经过一个代理节点就会在字段里追加一个信息。但 “Via”追加的是代理主机名(或者域名),而“X-Forwarded-For”追加的是请求方的 IP 地址。 所以,在字段里最左边的 IP 地址就是客户端的地址。


X-Real-IP是另一种获取客户端真实 IP 的手段,它的作用很简单,就是记录客户端 IP 地址,没有中间的代理信息。直接保存的就是客户端的ip地址。


也可以通过专门的代理协议在不改变原始报文的情况下传递客户端的真实ip地址。


网络异常,图片无法展示
|


http中介之网关


扮演着协议转换器角色。


网络异常,图片无法展示
|


网络异常,图片无法展示
|


一些思考题


  • 试着解释一下这个请求头“Accept-Encoding: gzip, deflate;q=1.0, *;q=0.5, br;q=0”,再模拟一下服务器的响应头。 我这个请求最希望服务器给我返回的编码方式是gzip和deflate,他们俩在我这是最优的地位,我不接受br的编码方式,如果还有其他的编码方式的话对我来说权重0.5。


服务器可能的响应头是


HTTP/1.1 200 OK


Content-Encoding: gzip


  • 假设你要使用 POST 方法向服务器提交一些 JSON 格式的数据,里面包含有中文,请求头应该是什么样子的呢? 请求头可能是


POST /serv/v1/user/auth HTTP/1.1 
Content-Type: application/json 
Accept-Language: zh-CN, zh 
Accept-Charset: gbk, utf-8 
Content-language: zh-cn, zh;


但是我经过测试发现,即使传入的数据有中文,并且指定的content-language为en,服务端也能正确的编码获取body。但是服务端最好在解析body是给出encoding(charset)。


以nodejs为例。默认情况下,没有分配编码,流数据将作为 Buffer 对象返回。 设置编码会导致流数据作为指定编码的字符串而不是 Buffer 对象返回。


  • 试着用快递发货收货比喻一下 MIME、Encoding 等概念。 MIME类比快递的话就是你要快递的物品(衣服,食物等),Encoding就是快递你这个物品的包装方式,如果是衣服可能就随意一点一个袋子,如果是食物担心腐烂给你放个冰袋进去 不知道回答的对不对,请老师指正


  • 分块传输数据的时候,如果数据里含有回车换行(\r\n)是否会影响分块的处理呢? 分块传输中数据里含有回车换行(\r\n)不影响分块处理,因为分块前有数据长度说明。


  • 如果对一个被 gzip 的文件执行范围请求,比如“Range: bytes=10-19”,那么这个范围是应用于原文件还是压缩后的文件呢? range是针对原文件的。


  • 在开发基于 HTTP 协议的客户端时应该如何选择使用的连接模式呢?短连接还是长连接? 根据请求的频繁程度来选择连接模式。一次性的请求用短链接,频繁与服务端交互的用长连接。


  • 应当如何降低长连接对服务器的负面影响呢? 长连接会长期占用服务器资源,根据服务器性能设置连接数和长连接超时时间,保证服务器TCP资源使用处于正常范围。


  • 外部重定向和内部重定向的区别? 外部重定向,服务器会把重定向的地址给浏览器,然后浏览器再次的发起请求,地址栏的地址变化了


内部重定向,服务器会直接把重定向的资源返给浏览器,不需要再次在浏览器发起请求,地址栏的地址不变


  • 如果 Cookie 的 Max-Age 属性设置为 0,会有什么效果呢? max-age=0是指不能缓存,但在会话期间是可用的,浏览器会话关闭之前可以用cookie记录用户的信息。但是经过测试,他确实不会保存在浏览器上啊。并且再次发送请求,也不会携带cookie。


  • 你觉得cookie有什么缺点呢? (1) 不安全。如果被中间人获取到 Cookie,完全将它作为用户凭证冒充用户。解决方案是使用 https 进行加密。 (2)有数量和大小限制。另外 Cookie 太大也不好,传输的数据会变大。 (3)客户端可能不会保存 Cookie。比如用 telnet 收发数据,用户禁用浏览器 Cookie 保存功能的情况。


  • Cache 和 Cookie 都是服务器发给客户端并存储的数据,你能比较一下两者的异同吗?


  1. Cookie 会随请求报文发送到服务器,而 Cache 不会,但可能会携带 if-Modified-Since(保存资源的最后修改时间)和 If-None-Match(保存资源唯一标识) 字段来验证资源是否过期。


  1. Cookie 在浏览器可以通过脚本获取(如果 cookie 没有设置 HttpOnly),Cache 则无法在浏览器中获取(出于安全原因)。


  1. Cookie 通过响应报文的 Set-Cookie 字段获得,Cache 缓存的是完整的报文。


  1. 用途不同。Cookie 常用于身份识别,Cache 则是由浏览器管理,用于节省带宽和加快响应速度。


  1. Cookie 的 max-age 是从浏览器拿到响应报文时开始计算的,而 Cache 的 max-age 是从响应报文的生成时间(Date 头字段)开始计算。


  • 即使有“Last-modified”和“ETag”,强制刷新(Ctrl+F5)也能够从服务器获取最新数据(返回 200 而不是 304)。 强制刷新是因为请求头里的 If-Modified-Since 和 If-None-Match 会被清空所以会返回最新数据。


  • http缓存详答? 浏览器拿到一个网址的时候,先判断是否允许缓存,允许会先查看本地缓存:1.有缓存并在缓存可用期那直接拿来用。2.缓存不存在或者不可用 那需要请求。 浏览器拿到host,判断:1.ip+port 那直接请求对应的服务器 2.域名 那开展一系列的dns递归查询:先拿dns缓存,没有缓存->本地dns服务器->根dns服务器->顶级dns服务器->权威dns服务器->GSLB,查到ip返回最优ip组实现负载均衡,浏览器随机或者轮询取一个ip开始它的http请求之旅。 浏览器判断该网页是否允许缓存,然后添加Cache-Control的各种字段no-store是否允许缓存/no-cache缓存必须进行验证/noly-if-cached只接受代理的缓存等,max-age最大生存时间 max-stale 短时间过期可用 min-fresh 最短有效时间等。If-Modified-Since/if-None-Match/Last-modified/ETag等字段用于判断服务端是否有更新。然后将请求发给代理服务器。请求代理服务器,如果是第一次,要经历浏览器和代理服务器的3次tcp握手进行连接,连接成功,发送http请求。 代理服务器拿到请求,首先查看是否允许缓存,允许那就查看自己本地缓存有没有,通过查看max-age/max-stale/min-fresh等信息判断是否过期,没有过期直接拿来用,将数据返回给客户端。如果过期了,代理服务器将用客户端的请求,再次像真实服务器进行请求。如果也是第一次连接,需要经历代理服务器和真实服务器的3次tcp握手,连接成功,发送请求。 真实服务器收到请求之后,通过if-Modified-Since/Last-Modified/if-None-Match/ETag等字段判断是否有更新,没有更新,直接返回304。如果有更新,则将数据打包http response 返回。返回头字段会添加Cache-Control字段,用来判断缓存的控制策略以及生存周期,no-store不允许缓存/no-cache使用缓存必须先验证/must-revalidate缓存不过期可用过期必须重新请求验证/proxy-revalidate缓存过期只要求代理进行请求验证 private不能在代理层保存只能在客户端保存/public缓存完全开放 s-maxage缓存在代理上可以缓存的时间 no-transform不允许代理对缓存做任何的改动。然后根据业务需求判断该地址是不是需要重定向,如果需要是短期的重定向还是永久的重定向,按需将状态码修改为301或者302。最后真实服务器将数据打包成http相应 回给代理服务器。 代理服务器收到真实服务器的回应数据,首先会查看Cache-Control里的字段,是否允许它进行缓存,如果是private,代理服务器不进行缓存,直接返回给客户端。public则根据s-maxage/no-transform进行缓存,如果可以优化并且代理服务器需要优化,那可能会先优化数据,否则同时将数据回发给客户端。 客户端收到数据,如果是304,则直接拿缓存数据进行渲染,并修改相关缓存变量,比如时间,以及缓存使用策略。如果收到了301或者302,那么客户端会再次发起新的url请求,进行跳转到最终的页面。 最后,底层tcp 经过4次挥手,完成关闭连接。


相关文章
|
5天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
16天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1317 7
|
3天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
15天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1375 87
|
3天前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
5天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
216 82
2025年阿里云域名备案流程(新手图文详细流程)