C/C++
如何定义一个只能在堆上(栈上)生成对象的类?
只能在堆上:
将析构函数私有化,C++是静态绑定语言,编译器管理栈上对象的生命周期,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性。若析构函数不可访问,则不能在栈上创建对象。
只能在栈上:
将new和delete重载为私有,在堆上生成对象,使用new关键词操作,其过程分为两段:第一段,使用new在堆中找到一块内存分配给对象,第二段调用构造函数生成对象。将new操作设置为私有,那么第一阶段就无法完成,就不能够在堆上生成对象。
网络
TLS建立四步:
①:ClientHello 客户端向服务器发起加密通信请求(TLS协议版本、Client Random)
②:ServerHello 服务端向客户端发出响应(确认TLS、Server Random、服务器的数字证书)
③:客户端回应 浏览器或者操作系统中的 CA 公钥,确认服务器的数字证书的真实性,然后从数字证书中取出服务器公钥,加密报文(随机数pre-master key,加密通信算法改变,
客户端握手结束通知)
④:服务器的最后回应
服务器和客户端有了这三个随机数(Client Random、Server Random、pre-master key),接着就用双方协商的加密算法,各自生成本次通信的「会话秘钥」。
HTTPS一定是安全的吗
这个问题的场景是这样的:客户端通过浏览器向服务端发起 HTTPS 请求时,被「假基站」转发到了一个「中间人服务器」,于是客户端是和「中间人服务器」完成了 TLS 握手,然后这个「中间人服务器」再与真正的服务端完成 TLS 握手。
从客户端的角度看,其实并不知道网络中存在中间人服务器这个角色。那么中间人就可以解开浏览器发起的 HTTPS 请求里的数据,也可以解开服务端响应给浏览器的 HTTPS 响应数据。相当于,中间人能够 “偷看” 浏览器与服务端之间的 HTTPS 请求和响应的数据。
但是要发生这种场景是有前提的,前提是用户点击接受了中间人服务器的证书。
HTTP/1.1协议优化
①:避免HTTP请求:缓存技术;
②:减少HTTP请求次数:减少从定向;合并请求,延迟发送。
③:减小HTTP发送次数:压缩,无损压缩、有损压缩。
第一个思路是,通过缓存技术来避免发送 HTTP 请求。客户端收到第一个请求的响应后,可以将其缓存在本地磁盘,下次请求的时候,如果缓存没过期,就直接读取本地缓存的响应数据。如果缓存过期,客户端发送请求的时候带上响应数据的摘要,服务器比对后发现资源没有变化,就发出不带包体的 304 响应,告诉客户端缓存的响应仍然有效。
第二个思路是,减少 HTTP 请求的次数,有以下的方法:
- 将原本由客户端处理的重定向请求,交给代理服务器处理,这样可以减少重定向请求的次数;
- 将多个小资源合并成一个大资源再传输,能够减少 HTTP 请求次数以及 头部的重复传输,再来减少 TCP 连接数量,进而省去 TCP 握手和慢启动的网络消耗;
- 按需访问资源,只访问当前用户看得到/用得到的资源,当客户往下滑动,再访问接下来的资源,以此达到延迟请求,也就减少了同一时间的 HTTP 请求次数。
第三思路是,通过压缩响应资源,降低传输资源的大小,从而提高传输效率,所以应当选择更优秀的压缩算法。
HTTP/2提升性能
①:对于常见的HTTP头部通过静态表和Huffman编码的方式,将体积压缩了近一半,而且针对后续的请求头部,还可以建立动态表,将体积压缩近90%。
②:实现stream并发,多个Stream只需要复用一个TCP连接,节约了TCP和TLS握手时间。另外可以设置Stream的优先级。
③:服务器支持主动推送资源,大大提升了消息的传输性能。
操作系统
数据库
手撕
合并K个有序链表:
shared_ptr实现:
string类实现:
搜索旋转矩阵: