总结
Go
计网
https的创建连接的过程 为什么使用对称加密 对称加密和非对称加密的优缺点
1.客户端向服务器发送请求,同时发送客户端支持的一套加密规则(包括对称加密、非对称加密、摘要算法);
2.服务器从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥(用于非对称加密),以及证书的颁发机构等信息(证书中的私钥只能用于服务器端进行解密);
3客户端验证服务器的合法性,包括:证书是否过期,CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配;
4.如果证书受信任,或者用户接收了不受信任的证书,浏览器会生成一个随机密钥(用于对称算法),并用服务器提供的公钥加密(采用非对称算法对密钥加密);使用Hash算法对握手消息进行摘要计算,并对摘要使用之前产生的密钥加密(对称算法);将加密后的随机密钥和摘要一起发送给服务器;
5.服务器使用自己的私钥解密,得到对称加密的密钥,用这个密钥解密出Hash摘要值,并验证握手消息是否一致;如果一致,服务器使用对称加密的密钥加密握手消息发给浏览器;
6.浏览器解密并验证摘要,若一致,则握手结束。之后的数据传送都使用对称加密的密钥进行加密
非对称加密的加解密效率是非常低的,而 http 的应用场景中通常端与端之间存在大量的交互,非对称加密的效率是无法接受的。
另外:在 HTTPS 的场景中只有服务端保存了私钥,一对公私钥只能实现单向的加解密,所以 HTTPS 中内容传输加密采取的是对称加密,而不是非对称加密。
对称:
优点:速度快,对称性加密通常在消息发送方需要加密大量数据时使用,算法公开、计算量小、加密速度快、加密效率高。缺点:在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。
非对称:
优点:安全。
缺点:速度较慢。
用了 HTTPS 会被抓包吗?
HTTPS 的数据是加密的,常规下抓包工具代理请求后抓到的包内容是加密状态,无法直接查看。
但是,正如前文所说,浏览器只会提示安全风险,如果用户授权仍然可以继续访问网站,完成请求。因此,只要客户端是我们自己的终端,我们授权的情况下,便可以组建中间人网络,而抓包工具便是作为中间人的代理。通常HTTPS抓包工具的使用方法是会生成一个证书,用户需要手动把证书安装到客户端中,然后终端发起的所有请求通过该证书完成与抓包工具的交互,然后抓包工具再转发请求到服务器,最后把服务器返回的结果在控制台输出后再返回给终端,从而完成整个请求的闭环。
既然 HTTPS 不能防抓包,那 HTTPS 有什么意义?
HTTPS可以防止用户在不知情的情况下通信链路被监听,对于主动授信的抓包操作是不提供防护的,因为这个场景用户是已经对风险知情。要防止被抓包,需要采用应用级的安全防护,例如采用私有的对称加密,同时做好移动端的防反编译加固,防止本地算法被破解
http1.1与2.0的区别。TCP如何保证有序。TCP的流量控制(拥塞窗口,和慢开始等算法)。TCP序号最大值。
网络攻击的手段
讲讲TIME_WAIT,如果这个值是0会发生什么?大量Time_wait?
第5点
HTTP的无状态了解吗?说说在实际中无状态是如何解决的?
无状态,就是http协议本身是无法在浏览器与服务器上留下数据,没有数据就无法区分一系列请求是有联系的。
cookie和session机制去实现。
http请求头
HTTP的chunk
Keepalive
udp如何实现可靠性传输?
操作系统
线程安全
当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的。
点击跳转
多线程了解到什么程度?
多线程就是指从软件或者硬件上实现多个线程并发执行的技术,具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。
死锁是什么?死锁产生的原因?如何解决死锁问题?
io复用应用场景
大端小端的规则
小端,起始地址存放低位字节(little-endian)
大端,起始地址存放高位字节(big-edian)
常用的X86结构是小端模式
数据库
数据库分表、分区?读写分离?
数据库事务隔离级别,每个隔离级别的特点,为什么要有隔离级别
联合索引是什么?联合索引在B+树中会引起什么问题?
MySQL中B+树相对于红黑树在查找上为什么更占优势?
树高和磁盘两个角度。
MySQL什么时候用行锁,什么时候用表锁?
只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁
如何优化一条Select语句
- 避免使用 SELECT * FROM TABLE,用具体的列替换,避免全表扫描。
- WHERE子句使用 IN或 NOT IN的优化(有索引,那么会用这条索引)
- 避免在WHERE子句中对字段进行表达式操作,会导致引擎放弃使用索引而进行全表扫描。
- 避免在WHERE子句中对字段进行函数操作,会导致引擎放弃使用索引而进行全表扫描。
算法
topK,时间复杂度 nlogk大还是klogn大
海量数据取topK,用小顶堆还有快排
git
git把一个远程的仓库拉到本地用什么命令?答了git pull,又问如果本地不存在这个代码呢?git clone
如果现在我想提交一次改动并保存,但不想push远程仓库免得污染,只想保存一个快照到本地用什么命令?git commit
如果想从远程仓库把一个代码拉到本地但是不与本地合并用什么命令?git fetch
git rebase 和 git merge 的区别
主要区别在于git log上:是否保留分支的commit提交节点 。
其他
Linux常用命令
设计一个高考成绩查询系统。
多个用户随机抽10道题怎么实现,让这10道题打乱顺序
用户密码是如何保存在数据库中的?如何在用户登录时验证身份信息?如何防止登录请求报文被窃取?
海量QQ号,怎么设计hash算法,使hash后结果尽量均匀?
提示对QQ号加上salt值,使其更加具有随机性。
hash后在桶上形成链表,怎么优化?
如果不用红黑树,怎么把hash后桶上的链表存入到磁盘空间内,要怎么设计 磁盘内的存储方式?
桶上的链表再进行一次hash。
这样划分磁盘的存储空间,使记录hash后的值时先在最大的那块记录,有冲突就往第二大的快记录。使最大的磁盘块能直接返回值,防止hash冲突。
红黑树的原理及与其他二叉树的区别。
1、红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。
2、平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。
设计模式:解释一下proactor。
不用±*/实现加法运算
1000苹果10个箱子
为什么hashmap产生冲突时超过8后用红黑树,不用B+树
之所以选择红黑树是为了解决二叉查找树的缺陷二叉查找树在特殊情况下会变成一条线性结构(这就跟原来使用链表结构一样了,造成很深的问题),遍历查找会非常慢。而红黑树在插入新数据后可能需要通过左旋,右旋、变色这些操作来保持平衡,引入红黑树就是为了查找数据快,解决链表查询深度的问题,我们知道红黑树属于平衡二叉树,但是为了保持“平衡”是需要付出代价的,但是该代价所损耗的资源要比遍历线性链表要少,所以当长度大于8的时候,会使用红黑树,如果链表长度很短的话,根本不需要引入红黑树,引入反而会慢。
B+树在数据库中被应用的原因就是B+树比B树更加“矮胖”,B+树的非叶子结点不存储数据,所以每个结点能存储的关键字更多。所以B+树更能应对大量数据的情况jdk1.7中的HashMap本来是数组+链表的形式,链表由于其查找慢的特点,所以需要被查找效率更高的树结构来替换。如果用B+树的话,在数据量不是很多的情况下,数据都会“挤在”一个结点里面。这个时候遍历效率就退化成了链表
bitmap
在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数
解法一:将bitmap扩展一下,采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存2432*2bit=1GB内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。
解法二:也可采用进行划分小文件的方法。然后在小文件中找出不重复的整数,并排序。然后再进行归并,注意去除重复的元素。
一个千万级的大V发了微博,怎么通知粉丝?
分布式id生成器
(nginx)负载均衡的几种方式
如何计算一个城市有多少下水道井盖数?
可以在市政部门去查。
两个井盖间的距离基本是固定的,查询到一个城市的道路总长后相除可得大概。
一个城市设置下水道井盖的不外乎气、水、电等几个设置公共基础设施的部门,而这些部门在设置每一条下水道及添置井盖时都要有具体数据并经过市政有关部门的审批,所以要知道这个城市的下水道井盖数,只需要对有关文件材料数据统一相加即可
Redis MySQL数据一致性
堆和栈的区别
单例模式
确保某个类在系统中仅有一个实例,并提供一个访问它的全局访问点
例1: 在多个功能模块里都需要写log。为了把log集中处理,便于分析与运维,log对象可以是单例的。
例2: 有一个配置文件,很多功能模块都会需要其中的一部分数据,模块1需要A部分,模块2需要B部分。配置文件对象可以是单例的。
例3: 有一个通用的计算模块,它总是根据传进来的参数算出结果。这个通用模块会被很多类调用。那么它也可以是单例的。