知识整理

250 阅读8分钟

原文日期:2017-06-29


http和tcp/ip

Http状态码1xx,2xx,3xx,4xx,5xx分别代表什么含义,301、302、304分别代表什么。

1字头表示消息已被接收,正在处理。它是临时过渡的响应状态。
2字头表示消息已被服务器成功接收,并处理。
3字头表示客户端还需要进一步操作才能完成请求,比如重定向。
4字头表示请求错误,服务器无法处理。
5字头表示服务器处理请求发生异常。
301永久url跳转,302临时跳转,304资源未改变。

cookie和session区别与联系。

cookie保存在客户端,session保存在服务端。cookie规定有容量大小限制,而session没有这个限制,它只占用服务器空间。
由于http的无状态特性,因此如果为了识别客户端的身份,需要在客户端的cookie保存一个服务器的标识(如session_id),之后客户端每次请求都带上这个标识,这样服务器就能识别到客户端身份。
cookie常用使用场景:

  1. 记住密码
  2. 类似购物车记录
  3. 客户端身份标识

如何保证cookie只在https协议下生效,在http协议下不生效。

设置cookie的secure属性为true时,cookie只会在https安全协议下传输。

http keep-alive实现原理。

http keep-alive是相对短连接而言,在http1.0版本,默认是短连接,http1.1版本默认为长连接。建立一个http连接需要进行tcp三次握手,释放则需要进行四次挥手过程,因此每建立和释放一个连接所带来的开销比较大。当我们访问一个网站时,会对该网站发起大量的js、css、html、xhr的请求,如果使用短连接,可能会导致服务器Cpu使用率暴涨,吐吞量下降,甚至宕机。使用长连接代替短连接,将会极大减少http连接数,降低http请求开销,提升系统吐吞量。使用长连接的方式:在请求头中加入Connection:keep-alive即可,http1.1默认使用长连接。

tcp keepalive:和http的keep-alive不一样,tcp的keepalive主要是为了检测死连接。每个一段时间tcp会发送一个消息给对方,根据响应消息来判断对方是否已死,从而对该连接进行相应的处理。

http缓存机制

http缓存分两大类:强制缓存和对比缓存。强制缓存会在本地记录数据缓存到期时间,所以如果本地有未失效的数据,则不会向服务器发起请求;而对比缓存是会将缓存标识发送给服务器发,然后由服务器决定是否要使用缓存,如果使用缓存则返回304,否则返回200+数据。

强制缓存

客户端第一次访问时,服务器会返回Expires或者Cache-Control标识在响应头中,客户端缓存数据和失效日期,下次访问通过判断失效日期来决定是否要向服务器发送请求。

Expires:为服务端返回的到期时间,是http1.0的属性,被http1.1的Cache-Control替代。
Cache-Control:设置max-age值表示数据可以缓存多少秒。

对比缓存

对比缓存主要分为两种标识传递,分别是Last-Modified/If-Modified-Since和Etag/If-None-Match,并且后者的优先级高于前者。

Last-Modified/If-Modified-Since:服务器第一次响应请求时,将资源最后修改时间放在Last-MOdified属性上;客户端再次请求时会将上次的最后修改时间放到请求头的If-Modified-Since属性上;服务器根据客户端传来的时间与当前资源的最后修改时间对比,如果小于当前修改时间则返回304,否则返回200+数据。
Etag/If-Modified-Since:Etag标识和Last-Modified的处理过程基本一样。唯一不一样的时Etag存储的可能不一定是资源最后修改时间,它可以时服务器定义的一个唯一标识信息。

参考Http缓存机制

tcp三次握手和四次挥手。

三次握手时序图 三次握手

四次挥手时序图 四次握手

三次握手可以保证双方的发送和接收功能都正常,两次的话无法保证服务端的发送功能是否正常,四次的话有些多余。

四次挥手可以保证被关闭方数据完全接收完毕再进行关闭。

time_wait:为了保证B能够接收到A发送的确认应答。如果A立马进入closed状态,那么如果该应答丢失,则B等待超时后再重新发送fin请求将无效,因为A已经关闭了,无法响应。

参考三次握手四次挥手
time_wait问题

tcp和udp区别,tcp又是如何保证消息可靠。

tcp

可靠、低效、耗资源。tcp是通过三次握手和四次挥手进行连接建立和释放,同时在数据传递过程中,还有确认、窗口、重传、拥塞控制机制。

udp

不可靠、高效、暂用资源比较少。udp基于无连接方式去发送消息,不需要tcp的三次握手和四次挥手,因而速度快,占用资源少。

参考tcp和udp区别

xss和csrf分别指什么,攻击原理。

xss:跨站脚本攻击(Cross Site Script,由于和css样式冲突,所以缩写成xss),它指注入js脚本进行攻击用户操作。比如攻击者往自己的博文里嵌入恶意js脚本,当用户浏览攻击者的博文时,脚本会自动执行,以达到攻击用户的目的。
防止xss:用户信息进行xss转义或者过滤。

csrf:跨站请求伪造。攻击者通过诱导可信任用户去向服务器发起合法请求,造成用户利益受损,达到攻击用户的目的。比如用户正在浏览某网站,攻击者将带有修改用户信息的连接发送给用户,当用户点击时,网站服务器会修改用户信息(删除博客,转账等)。
防止csrf:Referer检查,增删改请求必须不为Get。

数据库

char、varchar、text区别,char针对少于指定字节数的数据,如何填充多余的字节。

char长度是固定的,varchar是可变的,text一般用于存储大文本字段。当字段长度少于char指定长度时,将会通过往右边填充空格,以达到指定长度。

utf-8和unicode关系。

unicode:所有字符都包含2个字节,对于类似包含大多数单字节字符(比如ascii字符)来说,会浪费大量存储。
utf-8:单字节依然占一个字节,多字节的占多个字节(比如中文汉字有2个字节变成3个字节)。

utf8和unicode关系

X表有id、A、B、C、四个字段,其中id是主键,key(A,B)是组合索引。有如下sql,哪几个sql会使用到索引,1和5有什么区别?

1.select A,B,C from X where A=? and B=?
2.select A,B,C from X where A=? or B=?
3.select A,B,C from X where A>? and B=?
4.select A,B,C from X where A>? and B>?
5.select id,A,B from X where A=? and B=?
只有第2个sql不会用到索引,其他都会使用到索引。
第5个查询语句会更快,它会使用覆盖索引。
注意:这里只建立了(A,B)组合索引,mysql innodb会在一般索引下加入主键id,即其实是(A,B,id)组合索引。

数据插入时为什么要做到主键有序。

主键是一个特殊索引,如果无序的话,会触发索引重排序导致磁盘的移动。

聚集索引和覆盖索引。

非聚集索引指索引值顺序与实际存储顺序无关,一个表中可以包含多个非聚集索引。
覆盖索引是指查询列正好包含于索引列中,不需要再去关联原表。

联合索引结构

索引数据结构和原理 联合索引数据结构

sql慢查询分析

解释执行器分析,加索引,尽量使用扩展索引

mysql主从复制机制

java

java的hash和btree结构有什么不一样。

b+tree的结构

hashmap底层结构,jdk7和jdk8实现有什么区别

map实现类哪些是有序的,原理是什么

LinkedHashMap,TreeMap

aop原理

jdk动态代理和cglib的区别

jvm调优

假设文件有n行,每行有一个单词,请编程写出出现次数量前10的单词。

编程实现一个缓存池,存储key、value元素,容量最大100,当元素超过100时自己实现一种淘汰算法淘汰多余的元素,要求有set(key,value,ttl)和get(key)方法,在ttl时间内还未完成插入,则停止插入。

接口耗时统计

服务注册与发现原理

redis缓存失效机制

redis主从复制的方式

怎样快速从十亿个key中找出快实效的那个

说一下你最近这个项目碰到最复杂的技术难点,你是怎么解决的

如果让你设计一套分布式RPC调用框架,该如何设计