http与https的区别?
http通过明文传输,不提供任何方式的加密,所以不是那么的安全,而https是带有ssl的http。增加了加密和认证机制,所以更加安全。http的端口号是80,https的端口号是443。https需要购买证书,并且https会消耗更多资源
tcp三次握手,为什么是三次?
第一次握手:客户端发送带有syn的数据包给服务端请求建立连接。(假设syn=j),此时客户端进入syn_sent状态
第二次握手:服务端收到客户端的syn后,设置自己的ack为j+1,syn为k,然后将带有ack和syn的数据包回传给客户端,自己进入syn_recv状态
第三次握手:客户端收到服务端的数据包后,对其进行验证,然后设置ack为k+1,再将ack发送给服务端,自己进入establish状态,服务端收到ack后也进入establish状态
为什么是三次,主要有三个原因:
1.避免旧的连接重复建立:假如由于网络原因,导致旧的报文先于新的报文到达服务端,这个时候服务端是会向客户端返回syn和ack的,客户端可以通过检查ack来确认是否是历史连接,而两次握手不能
2.同步双方的初始化序列号:客户端和服务端双方都维护了一个序列号,通过这个序列号可以对数据进行去重,还可以使数据包按顺序到达,两次握手只能保证其中一方的序列号被对方成功接收。而另一方在回传时是将ack和syn一起回传的因此也就不需要4次而是只需要3次就行了
3.避免资源浪费:假如是两次握手,那么客户端发送syn后可能会阻塞在网络中,客户端收不到服务端的syn和ack后就会重复发送syn,而当恢复后syn都到达服务端,由于没有三次握手,所以服务端无法确定客户端是否收到了自己的ack,因此每收到一个客户端的syn后都会尝试主动建立起连接
四次挥手?
第一次挥手:客户端发送fin给服务端请求断开客户端与服务端的连接。客户端进入fin_wait_1状态
第二次挥手:服务端收到客户端的fin后,确认客户端的请求,发送ack给客户端,此时服务端进入close_wait状态,客户端收到ack后进入fin_wait_2状态,此时tcp连接处于半连接状态
第三次挥手:服务端向客户端发送fin请求关闭服务端与客户端的连接,服务端进入last_ack状态
第四次挥手:客户端收到服务端的fin后,回复一个ack给服务端,客户端进入time_wait状态,服务端接收到ack后进入close状态,客户端等待2msl时间后也进入close状态
为什么是四次挥手?
因为tcp连接的全双工的,客户端发送fin,服务端回复ack只是代表客户端与服务端的连接关闭了,而服务端和客户端的连接并没有关闭,服务端可能还会继续向客户端发送数据,等到发送完成后才发送fin,所以fin和ack是分开发送的,因此也就需要四次挥手了
query搜索速度慢,怎么优化query语句?
尽量避免select * 而是只查询自己需要的column(列)
看索引是否失效,比如是否以%开头
尽量避免复杂的join和子查询
join语句时用小的结果集驱动大的结果集
索引的优点与缺点?
优点:大大减少需要扫描的数据量 帮助服务器减少排序和临时表 将随机io变为顺序io
缺点:创建索引也需要花费时间,索引也需要维护,并且会减慢数据修改的速度
全局变量和局部变量的区别?
存储区域不同:全局变量存放在方法区中,局部变量存放在栈中,new的对象放在堆中
生命周期不同:类加载的时候全局变量就会被创建,生命周期和类相同,较长。局部变量在方法被调用时创建,方法结束消失
作用域不同:全局变量作用于整个类,局部变量作用于一个局部区域,比如一个方法内
页面较长时间出现空白的可能原因?
客户端方向:可能是js出现了异常 或者该请求是无效请求
服务端方向:反向代理服务器出现了异常 服务器宕机(502错误)
网络方向:dns解析异常 请求资源太大导致连接超时 cdn服务器异常
慢查询是什么?
就是运行时间超过long_query_time的sql语句,如果开启慢查询日志的话就会将这样的语句记录到慢查询日志中。接下来可以通过慢查询日志来进行分析优化,比如利用explain分析,如果type为index或all那么就真的要优化了,这个时候可以看下是否sql语句以%开头,看下索引是否生效,然后优化数据库的结构比如拆表
聚簇索引和非聚簇索引?
聚簇索引的叶子结点是数据,而非聚簇索引(也叫作二级索引)的叶子结点依然是索引节点,只不过有指向对应数据块的指针
一张表只能有一个聚簇索引,但是可以有多个非聚簇索引
聚簇索引将数据和索引放在一起,因此查询效率更高,但是它的更新代价较高,可能发生页分裂,而且插入速度严重依赖于插入顺序,还有可能导致全表扫描变慢,因为可能会将物理上相隔较远的页加载到内存中
而非聚簇索引的维护代价更低,当数据行更新时,由于非聚簇索引的叶子结点只是存储的主键值,而不是行指针,所以当数据移动或者发生页分裂时非聚簇索引不受影响。缺点就是非聚簇索引需要两次查询,所以速度没有聚簇索引快
Linux中在文件中查找字符串,查看资源使用情况?
查找字符串:grep "要查找的字符串" 文件名
查看资源使用情况:top
http1.0,1.1,2.0的区别?
1.1引入了更多的控制缓存策略和更多的错误状态响应码,并且默认是长连接,还支持host头域
2.0支持多路复用,数据压缩(通过hpack算法)和服务器推送
private可以修饰类吗?
可以的,但是只能用来修饰内部类,如果修饰的是外部类的话那么会直接报错
mysql什么时候触发行锁,什么时候触发表锁?
首先,InnoDB支持行锁,myisAM只支持表锁。InnoDB的行锁是通过索引上的索引项实现的,因此只有通过索引条件来检索数据时才会使用行锁,否则依然是使用的表锁。行级锁不是直接锁住记录,而是锁住索引。
只有明确指定的主键才会执行行锁,否则依然是表锁。
如果mysql的优化器发现即使使用了索引,还是要做全表扫描,那么就会放弃索引,也就不会使用行锁而是使用表锁了
mysql的一致性与CAP理论中的一致性的区别?
mysql的一致性:就是事务执行前后数据库从一种正确的一致性状态转换到另一种正确的一致性状态,它一方面依赖于数据库的保证(比如原子性),一方面也依赖于业务特性和业务层代码的实现
cap中的一致性:也叫作外部一致性,它所关注的是物理时间上先后发生的事物间的关系,也就是说当一个节点的数据发生改变时对于其他节点来说要是立即可见的
如何理解分布式?
分布式就是一台机器无法完成某个计算任务,所以要用多台机器去共同完成一个任务,它分为横向分布式和纵向分布式,其中横向分布式使用多台机器完成一个共同的任务然后将结果合并,纵向分布式将上游机器的输出作为下游机器的输入
进程的状态以及状态之间的转换?
就绪状态 运行状态 阻塞状态
转换过程:当cpu空闲时会选择一个就绪进程运行,运行时间片到了的话就会又由运行态转换为就绪态,如果出现了等待事件那么会由运行态转换为阻塞态,当等待事件结束后由等待态转换为就绪态
static关键字?
在一个类中,如果用static来修饰变量,那么这个变量就是一个静态成员变量,它的生命周期和类相同
static修饰的成员变量和方法是属于类的,而普通变量和方法属于对象,并且静态方法不能调用非静态成员
被static修饰的方法和变量不需要依赖于对象,只要类被加载了就可以通过类名进行访问
综上:1.static修饰方法:该方法就是静态方法,不依赖于任何对象就可以直接访问
2.static修饰变量:该变量被所有对象共享,在内存中只有一个副本,在类初次加载时才会初始化
3.static块:用于类的初始化操作,能够提升程序性能
重定向和转发的区别?
转发是在服务端进行的,重定向是在浏览器进行的
转发的效率更高
转发后url不变,重定向url会发生变化
转发只能在同一url中进行,而重定向可以到达任何url
转发是同一次请求,重定向是两次不同的请求
基本数据类型和引用数据类型的区别?
基本数据类型的访问是按值访问的,它的比较是值的比较,并且基本数据类型的变量是放在栈里面的
引用数据类型在被创建时首先要在栈上给引用分配一块内存,对象的具体信息再存储在堆内存上,然后由栈上面的引用指向堆中对象的地址
散列表接解决哈希冲突的办法?
1.拉链法:将具有同一散列地址的记录存储在一条线性链表中
2.开放寻址法:当发生冲突时,按照某种方法继续探测哈希表中的其他存储单元直到找到空位置位置(方法有线性探测法,二次探测法,随机探测法)
优缺点:
1.开放寻址法:对cpu缓冲友好,易于序列化,当数据量和装载因子小的时候适合该方法,但是容易产生堆积问题,不适合大规模的数据存储。
2.拉链法:处理冲突简单,没有堆积现象,平均查找长度短,比较适合存储大对象,大数据量的散列表
网络四层模型和层上的协议?
应用层 传输层 网络层 数据链路层
应用层:http ftp dns https smtp
传输层: tcp udp
网络层: ip icmp igmp
数据链路层: 以太网 wifi
拥塞控制?
拥塞控制主要是为了防止大量的数据注入到网络中从而导致网络拥塞。它的策略有慢开始,拥塞避免,快重传,快恢复
慢开始与拥塞避免:一开始时,cwnd=1,每一次收到确认后cwnd变为两倍,直到cwnd=慢开始门限,这个时候每一次收到确认cwnd+1,当网络连接超时时慢开始门限变为cwnd的一半,然后cwnd为1,开始慢开始算法
快重传:接收端在收到发送端的失序的报文段后立即发送重复确认,只有发送方一连收到三个重复确认就会立即重传对方未接收到的报文段
快恢复:当发送方连续收到3个重复确认后执行乘法减少算法,把ssthresh减半,再把cwnd设置为ssthresh的大小,执行拥塞避免算法
多进程的通信机制,多线程的同步机制?
多进程:管道 消息队列 共享内存 信号量
多线程:互斥量(synchronized,lock) 信号量 事件(wait/notify)
阻塞io和非阻塞io?
阻塞IO:资源不可用时,IO请求一直阻塞,直到有数据或者超时
非阻塞IO:资源不可用时,IO请求立即返回而不会在这里阻塞
select和epoll?
这是多路复用IO中的两重方式
select:select有最大并发连接的限制,每次调用select时都会发生内存的拷贝并且还需要遍历
epoll:没有最大并发连接的限制,并且只管活跃的连接而与连接总数无关,内存上使用的是共享内存所以也不存在内存拷贝
epoll的lt和et?
lt:水平触发,只要有数据可读,就会发送可读信号,只要有空间可写,就会发送可写信号
et:边缘触发,在读内核缓冲区由空变为非空时才生出可读信号,在写内核缓冲区由满变为非满时才会发出可写信号
MyisAM和InnoDB的区别?
innoDB:支持事务,支持外键,支持行级锁
MyisAM:不支持事务,只支持表级锁,但是支持全文索引
数据库隔离级别?
未提交读 提交读 可重复读 可串行化
主键索引和非主键索引的区别?
主键索引也被称为聚簇索引,它的叶子结点存放的是整行数据,而非主键索引也被称为二级索引,叶子结点存放的是主键的值。索引通过主键索引查找只需要一次查找,而非主键索引需要两次,主键索引的效率更高
各种排序算法的使用场景?
1.若n比较小(n<50),采用插入排序
2.若文件初始状态基本有序,选择插入或者冒泡排序
3.若n比较大,采用快速排序或者堆排
close_wait?
在被动关闭连接的情况下,接收方已经收到fin,但是还没有发送自己的fin时,这个时候处于close_wait状态
出现大量close_wait的原因主要是某种情况下对方关闭了socket连接,但是我方忙于读或者写,没有关闭连接。代码需要判断socket,一旦读到0,就断开连接,如果read返回负,检查一下error,如果不是again,也断开连接
数据库的主键为什么是自动递增的,如果不是自动递增的会有什么影响?
自动递增是为了保证程序的正确性,主键首先具有唯一性,设置自动递增的话那么在传入的时候就不需要传入id值了,数据库会自动根据最后一个id值增加1,保证了数据库主键不重复而且调用更为高效
如果没有设置自动增长,那么在写入值时需要人为传递id值,并且还要手动保证id的唯一性