大话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次挥手,完成关闭连接。


相关文章
|
9天前
|
存储 缓存 网络协议
说说 HTTP1.0/1.1/2.0 的区别?
HTTP协议从1.0到1.1再到2.0不断发展,提升了性能和效率。HTTP1.0每次请求需新建TCP连接,而1.1默认保持长连接,允许多个请求复用一个连接,减少延迟。HTTP2.0引入多路复用,允许同时发送多个请求和响应,避免队头堵塞;采用二进制分帧,提高解析效率;并使用首部压缩减少数据传输;此外,服务器推送功能允许预加载资源,优化加载速度。
|
22天前
|
安全 网络协议 前端开发
< 了解 HTTP 这一篇就够了 :什么是 HTTP ?HTTP 和 HTTPS 有什么区别 ? >
在前端开发中,是和浏览器打交道最为频繁的行业之一。但是大部分卷王们,可能仅仅是知道如何使用浏览器,只是知道 URL 跳转到浏览器变成一个完整的网页。 本篇文章将讲述 什么是HTTP、 HTTP 和 HTTPS的区别 及 URL 是如何渲染到页面。 那么到这里,肯定会有人问: 那我们为什么要学习这个呢 ? 问得好,这个分为两方面: 一是学习上述内容,能够厚实我们的理论基础。有些内容,虽然用的不多,但是技多不压身,道理懂吧? 二是学习这个,对我们后续的性能优化、排查浏览器上某些错误 的能力都有提升!
< 了解 HTTP 这一篇就够了 :什么是 HTTP ?HTTP 和 HTTPS 有什么区别 ? >
|
22天前
|
JSON 安全 算法
HTTP与HTTTPS的区别
HTTP与HTTTPS的区别
|
11月前
|
存储 缓存 网络协议
Http1.0和Http1.1的区别?Http1.1和Http2.0的区别
Http1.0和Http1.1的区别?Http1.1和Http2.0的区别
80 1
|
22天前
|
索引
[网络] 字节一面~ 2. HTTP 2 与 HTTP 1.x 有什么区别
[网络] 字节一面~ 2. HTTP 2 与 HTTP 1.x 有什么区别
|
22天前
|
网络协议 算法
HTTP/1.1和HTTP/2.0有什么区别
HTTP/1.1和HTTP/2.0有什么区别
|
22天前
|
缓存 网络协议
HTTP/1.0和HTTP/1.1有什么区别
HTTP/1.0和HTTP/1.1有什么区别
|
缓存 网络协议 开发者
HTTP1.0、HTTP1.1 、HTTP2.0和HTTP3.0 的区别【面试题】
HTTP1.0、HTTP1.1 、HTTP2.0和HTTP3.0 的区别【面试题】
757 0
HTTP1.0、HTTP1.1 、HTTP2.0和HTTP3.0 的区别【面试题】
|
存储 缓存 网络协议
|
缓存 网络协议 开发者
HTTP1.0、1.1、2.0、3.0的区别
HTTP1.0、1.1、2.0、3.0的区别
193 0
HTTP1.0、1.1、2.0、3.0的区别

热门文章

最新文章