原文日期: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常用使用场景:
- 记住密码
- 类似购物车记录
- 客户端身份标识
如何保证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已经关闭了,无法响应。
tcp和udp区别,tcp又是如何保证消息可靠。
tcp
可靠、低效、耗资源。tcp是通过三次握手和四次挥手进行连接建立和释放,同时在数据传递过程中,还有确认、窗口、重传、拥塞控制机制。
udp
不可靠、高效、暂用资源比较少。udp基于无连接方式去发送消息,不需要tcp的三次握手和四次挥手,因而速度快,占用资源少。
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个字节)。
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