1.OSI有哪几层?其中http协议在哪一层?
应用层
网络服务与最终用户的一个接口。
协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
表示层
数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
格式有,JPEG、ASCll、DECOIC、加密格式等
会话层
建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
对应主机进程,指本地主机与远程主机正在进行的会话
传输层
定义传输数据的协议端口号,以及流控和差错校验。
协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层
网络层
进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP
数据链路层
建立逻辑连接、进行硬件地址寻址、差错校验 [2] 等功能。(由底层网络定义协议)
将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
物理层
建立、维护、断开物理连接。(由底层网络定义协议)
TCP/IP 层级模型结构,应用层之间的协议通过逐级调用传输层(Transport layer)、网络层(Network Layer)和物理数据链路层(Physical Data Link)而可以实现应用层的应用程序通信互联。
2.简述一下三次握手过程?
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
SYN:同步序列编号(Synchronize Sequence Numbers)
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手.
3.数据库索引的实现一般有哪些数据结构?
树结构 B+树,红黑树等等
4.描述一下数据库乐观锁的使用场景
加锁:同一时刻只能有一个访问
悲观锁:一段执行逻辑加上悲观锁,不同线程同时执行时,只能有一个线程执行,其他的线程在入口处等待,直到锁被释放.通过配置加锁,开销大
乐观锁:一段执行逻辑加上乐观锁,不同线程同时执行时,可以同时进入执行,在最后更新数据的时候要检查这些数据是否被其他线程修改了(版本和执行初是否相同),没有修改则进行更新,否则放弃本次操作.通过设计实现。
两种锁各有优缺点,读取频繁使用乐观锁(但是可能出现“脏”读),写入频繁使用悲观锁(上下文切换开销大,但是保证没有“脏”数据)
5.数据库中,什么是最左原则?
顾名思义是最左优先,以最左边的为起点任何连续的索引都能匹配上。
在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边
个人认为,所谓最左前缀原则就是先要看第一列,在第一列满足的条件下再看左边第二列,以此类推。
6.哪些sql语句会破坏索引,导致全表扫描?回答至少两种
1.模糊查询(like)
like ‘ a%’ 这种查询是可以使用索引的
like'%a' 这种查询索引是会失效的
所以尽量避免不要使用2个百分号一起查询。
2.select count(*) from table;
这样不带任何条件的count会引起全表扫描
7.数据库表建立索引后,对表数据的增删改查分别有什么影响?
坏处:对数据库做增删改 比较慢··因为索引结构是 会物理排序,你改了索引字段 的值时 这条记录会重新去排列
好处:排列好了 所以查询速度很快
HashMap增删改查都还是很快,但是有数据倾斜风险
8.Hash拉链结构
底层是数组,首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每个集合中的元素通过一个单链表链接起来,各链表的头结点存储在数组中。增删改查都基于此实现。
9.磁盘不能存数组,那么如何存储Hash拉链结构?
磁盘都是以文件形式操作,可以把数组写入文件中
10.列式数据库为什么增查数据快?
列式数据库以列式存储,所以数据有相似性,用类似哈夫曼编码的方法将数据压缩到一块空间。比如普通数据库存储数据要100MB,我压缩后只需要10MB就可以了,大大加快了IO读取速度。增加时也只需要找到那一块的起始地址,直接插入就可以。但如果是删改,因为数据压缩的原因,还要还原成原数据,之后还要再压缩,就很慢。
11.linux中模糊查询名字为“mmnnkk”的进程,并将进程杀死,请写出思路,以及linux命令。
ps -aux|grep mmnnkk
killall -9 NAME
12.父类声明的变量用final修饰可以继承和重写吗?
final 类不能继承
final 方法不能重新override,可以继承
final 成员变量可以继承,可以覆盖
13.String a="abc",String b="a"+"bc; a==b?
true
14.0.6332 的数据类型是什么
默认不可能为包装类,因为小数默认类型是double,想要转换需要在小数后面加上f或者F的后缀才能转换为flaot类型。
15.描述一下四次挥手
由于TCP连接是全双工(通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)。指A→B的同时B→A,是瞬时同步的。)的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端。
(4) 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。