收集:面经 里也有一部分知识点
网络
TCP的11种状态转换 TCP三次握手和四次挥手的过程
TCP异常断开的分析 http://www.cnblogs.com/yuxingfirst/p/3170333.html
TCP中异常关闭连接的意义 异常关闭的情况 http://blog.csdn.net/yusiguyuan/article/details/22515921
MSS与MTU:MSS是TCP报文的最大分段大小,MTU是链路层最大传输单元。以太网MTU通常为1500,MSS为1460,TCP头部20字节和IP头部20字节。
- TCP为什么存在TIME_WAIT状态
存在的理由:
1.可靠地实现TCP全双工连接的终止(无法保证你最后发送的ACK报文会一定被对方收到);
2. 允许老的重复分节在网络中消逝;
http://yaocoder.blog.51cto.com/2668309/1338567
通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。
TIME_WAIT确保有足够的时间让对端收到了ACK,如果被动关闭的那方没有收到Ack,就会触发被动端重发Fin,一来一去正好2个MSL
最长分节生命期(maximum segment lifetime,MSL) MSL是任何IP数据包能够在因特网中存活的最长时间。停留在TIME_WAIT状态的持续时间是MSL的两倍,称为2MSL。
- TCP 与 UDP 的区别,以及各自的用途
TCP有连接(面向连接,建立连接再发送数据)、UDP无连接;TCP提供可靠连接( 确认、序列号、RTT估算、超时和重传等机制)、UDP只确保数据发送;TCP提供流量控制(拥塞控制)、UDP无;共同点:UDP和TCP都可以是全双工的
用途:TCP适合可靠性高、对传输时间要求不高的应用:如文件传输;UDP适合快速、高效的传输应用但准确性要求不高,如:游戏、视频聊天
- TCP为什么是三次握手?
客户端发出的第一个连接请求SYN报文,在网络中延迟到达服务端,而服务端已经由重新发送的第二个请求连接报文建立了连接。如果没有三次握手,那么服务端会由这个无效的延迟到达的连接请求报文,错误地建立一个新的连接。但是此时客户端没有发出新连接建立的请求,所以不会响应服务端建立请求的报文,导致服务端一直在等待请求的恢复。采用三次握手就能防止该情况的发生。
三次握手保证建立的连接是可靠的,三次是最少的次数。
http://www.cnblogs.com/TechZi/archive/2011/10/18/2216751.html
- TCP为什么是四次挥手?
因为TCP是全双工模式,接收和发送需要分别关闭。
http://www.voidcn.com/blog/xifeijian/article/p-633810.html
- TCP 流量控制与拥塞控制
TCP利用滑动窗口实现流量控制。
设A向B发送数据。在连接建立时,B告诉了A:“我的接收窗口是 rwnd = 400 ”(这里的 rwnd 表示 receiver window)。因此,发送方的发送窗口不能超过接收方给出的接收窗口的数值。请注意,TCP的窗口单位是字节,不是报文段。
从图中可以看出,B进行了三次流量控制。第一次把窗口减少到 rwnd = 300 ,第二次又减到了 rwnd = 100 ,最后减到 rwnd = 0 ,即不允许发送方再发送数据了。这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。B向A发送的三个报文段都设置了 ACK = 1 ,只有在ACK=1时确认号字段才有意义。
TCP为每一个连接设有一个持续计时器(persistence timer)。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口控测报文段(携1字节的数据),那么收到这个报文段的一方就重新设置持续计时器。
拥塞控制常用算法:慢开始、拥塞避免、快重传、快恢复。
拥塞窗口(cwnd) 接收端窗口(rwnd) 慢开始门限(ssthresh)
慢开始:
在执行慢开始算法时,拥塞窗口 cwnd的初始值为 1,发送第一个报文段。当发送端收到来自接收端的ACK之后,拥塞窗口开始以1、2、4这样的指数形式增长。当拥塞窗口cwnd增长到慢开始门限值 ssthresh 时,就改为执行拥塞避免算法,拥塞窗口按线性规律增长。
拥塞避免:
当达到慢开始门限值,开始进入拥塞避免阶段,拥塞窗口开始加法增加。这样就可以避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值。
快重传与快速恢复:
当发送方连续收到三个重复的ACK之后,TCP会进入快速重传、快速恢复的阶段。
为什么叫快速重传呢?如果当发送端接收到三个重复的确认ACK时,则断定分组丢失,立即重传丢失的报文段,而不必等待重传计时器超时,相比之下,前者速度更快。
http://blog.csdn.net/yechaodechuntian/article/details/25429143
http://www.jianshu.com/p/eab86c0d1612
HTTP协议
关于HTTP协议,一篇就够了- 简书
参考:http://www.jianshu.com/p/80e25cb1d81a
HTTP之请求消息Request
请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
HTTP之响应消息Response
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
301
永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302
临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
Http会话的四个过程:
建立连接,发送请求,返回响应,关闭连接。
===============================================
哈弗结构和冯诺依曼结构
哈佛结构,指令和数据分开存放 冯诺依曼结构,指令和数据放在一起
哈佛结构设计复杂,但效率高。冯诺依曼结构则比较简单,但也比较慢。
实际上在内存里,指令和数据是在一起的。而在CPU内的缓存中,还是会区分指令缓存和数据缓存,最终执行的时候,指令和数据是从两个不同的地方出来的。你可以理解为在CPU外部,采用的是冯诺依曼模型,而在CPU内部用的是哈佛结构。
线程、进程
基本概念
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
区别
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
死锁产生的条件
1)互斥条件
2)请求和保持条件
3)不剥夺条件
4)环路等待条件
死锁产生的原因
1)竞争资源引起进程死锁
2)可剥夺资源和不可剥夺资源
3)竞争不可剥夺资源
4)竞争临时资源
解决死锁的方法
银行家算法:避免死锁
资源有序分配法:预防死锁
资源分配图化简法:检测死锁
撤销进程法:解决死锁
银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。
资源有序分配法系统要求申请进程:
1、对它所必须使用的而且属于同一类的所有资源,必须一次申请完;
2、在申请不同类资源时,必须按各类设备的编号依次申请。
资源分配图化简法 如果一个图可完全简化,则不会产生死锁;如果一个图不可完全简化(即:图中还有“边”存在),则会产生死锁。这就是“死锁定理”。
参考: http://blog.csdn.net/coding1994/article/details/52474731
撤销进程法:通过撤销一些进程使系统恢复
数据库
1 数据库三范式
第一范式:每一列都是不可分割的原子数据项 原子性
第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性 局部依赖
第三范式:何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
巴斯-科德范式(BCNF):在1NF基础上,任何非主属性不能对主键子集依赖(在3NF基础上消除对主码子集的依赖)
第一范式(1NF):属性不可分
(1NF是对属性的原子性约束,要求属性具有原子性,不可再分解)
第二范式(2NF):符合1NF,并且非主属性完全依赖于码,没有局部依赖。
(2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性,更通俗说有主键ID)
第三范式(3NF):符合2NF,并且,消除传递依赖。
(3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余)
BCNF:符合3NF,并且,主属性不依赖于主属性。
第四范式:要求把同一表内的多对多关系删除。
第五范式:从最终结构重新建立原始结构。
候选键,又称候选码,候选关键字,码 ,candidate key。通俗地说就是,能够确定全部属性的某个属性或某组属性,称为候选键。若候选键多于一个,则选定其中一个作为主键。
主属性,包含在任何一个候选键中的属性,叫做主属性(Prime attribute),不包含在任何候选键中的属性称为非主属性或非键属性或非关键字段。
范式越高,数据的冗余度越小。其实没有冗余的数据库设计是可以做到的。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。
讲解:第一范式要求数据库表的字段不能够再分割。第二范式要求非主属性完全依赖于主关键字,比如:学生、课程、教材字段,课程决定教材,(学生,课程)是个主关键字,课程单独决定教材,这就是不完全依赖,局部依赖。需要把课程、教材拆成一个表。第三范式要求没有传递依赖,比如:学生、课程、老师、老师职称字段,老师职称依赖于老师字段,老师依赖于(学生,课程)码,因此需要把老师、老师职称拆成一张表。不满足范式,会造成修改、删除、插入异常。
2 数据库事务 ACID
事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性。
原子性(Atomicity):指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency):事务必须使数据库从一个一致性状态变换到另外一个一致性状态。转账前和转账后的总金额不变。
隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability):指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
3 事务的隔离级别
赃读:指一个事务读取了另一个事务未提交的数据。
不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同,一个事务读取到了另一事务提交后的数据(update)
虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。(insert)
如果读到对方提交的update语句的结果,是不可重复读。如果读到对方insert后的结果,是虚读。
数据库通过设置事务的隔离级别防止以上情况的发生:
- READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。
- READ COMMITTED: 避免赃读。 不可重复读、虚读都有可能发生。(oracle默认的)
- REPEATABLE READ:避免赃读、不可重复读。 虚读有可能发生。(mysql默认)
- SERIALIZABLE: 避免赃读、不可重复读、虚读。
级别越高,性能越低,数据越安全
4 SQL:Structure Query Language
DDL 数据定义语言 CREATE ALTER DROP
DML 数据操纵语言 SELECT INSERT UPDATE DELETE
DQL 数据查询语言 SELECT
DCL 数据控制语言 GRANT DENY REVOKE
5 超键、候选键、主键、外键分别是什么?
菜鸟学数据库(四)——超键、候选键、主键、外键
http://blog.csdn.net/liushuijinger/article/details/12832017
超键(super key): 在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。
候选键(candidate key): 不含有多余属性的超键称为候选键
主键(primary key): 用户选作元组标识的一个候选键程序主键
外键(foreign key) 如果关系模式R1中的某属性集不是R1的主键,而是另一个关系R2的主键则该属性集是关系模式R1的外键。
6 drop,delete与truncate的区别
drop 直接删掉表 。
truncate 删除表中数据,再插入时自增长id又从1开始 。
delete 删除表中数据,可以加where字句。
7 MySQL 索引原理
参考: 整理:数据结构、算法题练习 里的树结构
MySQL索引背后的数据结构及算法原理
http://blog.codinglabs.org/articles/theory-of-mysql-index.html
MySQL存储引擎中的MyISAM和InnoDB
https://www.zybuluo.com/phper/note/78781
7.1 MyISAM
MyISAM引擎使用B+Tree作为索引结构
MyISAM索引文件和数据文件是分离的,叶节点的data域存放的是数据记录的地址。
在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。
因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。
MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。
允许没有主键和索引的表存在
7.2 InnoDB
InnoDB也使用B+Tree作为索引结构
第一个重大区别是InnoDB的数据文件本身就是索引文件
这棵树的叶节点data域保存了完整的数据记录
索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
叶节点包含了完整的数据记录。这种索引叫做聚集索引
InnoDB的所有辅助索引都引用主键作为data域
请尽量在InnoDB上采用自增字段做主键
7.3 区别
- InnoDB提供事务支持事务,外部键(foreign key)等高级数据库功能,MyISAM不支持。
- Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高
- InnoDB是聚集索引,数据文件是和索引绑在一起的。MyISAM是非聚集,索引保存的是数据文件的指针。
- InnoDB不保存表的具体行数,MyISAM用一个变量保存了整个表的行数
7.4 是不是只要是查询语句需要,就建上索引?
不是,因为索引虽然加快了查询速度,但索引也是有代价的:索引文件本身要消耗存储空间,同时索引会加重插入、删除和修改记录时的负担,另外,MySQL在运行时也要消耗资源维护索引,因此索引并不是越多越好。一般两种情况下不建议建索引。
第一种情况是表记录比较少
另一种不建议建索引的情况是索引的选择性较低。所谓索引的选择性(Selectivity),是指不重复的索引值(也叫基数,Cardinality)与表记录数(#T)的比值:Index Selectivity = Cardinality / #T