原创

【终极面试实战 三】网络基础&数据库

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://tianmaolin.blog.csdn.net/article/details/77882614

##学过计算机网络基础这门课么
###说说计算机网络的分层模型,每层是干嘛的
分层模型,七层(OSI)和五层(TCP/IP)

物理层:通过媒介传输比特,确定机械及电气规范(比特Bit)
数据链路层:将比特组装成帧和点到点的传递(帧Frame)
网络层:负责数据包从源到宿的传递和网际互连(包PackeT)
传输层:提供端到端的可靠报文传递和错误恢复(段Segment)

会话层:建立、管理和终止会话(会话协议数据单元SPDU)
表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)
应用层:允许访问OSI环境的手段(应用协议数据单元APDU)
###在浏览器里输入一个网址执行流程是怎样的
1,在应用层,客户端浏览器通过DNS解析到www.baidu.com的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.161.27.48,然后通过TCP进行封装数据包,输入到网络层。
2,在运输层,客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。
3,在网络层,客户端的网络层不用关心应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,不作过多的描述,无非就是通过查找路由表决定通过那个路径到达服务器。
4,在数据链路层客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。
5,在物理层被封装成比特流传送
###说说三次握手
这里写图片描述

  • 首先Client端发送连接请求报文,A发送后A进入SYN-SENT状态

  • Server段接受连接后回复ACK报文,并为这次连接分配资源,B发送后B进入SYN-RCVD状态

  • Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源。A发送后A进入ESTAB-LISHED状态,B收到后也进入该状态,这样TCP连接就建立了。
    ###为什么不用两次握手
    **为什么要三次握手:防止失效的连接请求报文段突然又传送到主机B。**在只有两次“握手”的情形下,假设Client想跟Server建立连接,但是却因为中途连接请求的数据报丢失了,故Client端不得不重新发送一遍;这个时候Server端仅收到一个连接请求,因此可以正常的建立连接。但是,有时候Client端重新发送请求不是因为数据报丢失了,而是有可能数据传输过程因为网络并发量很大在某结点被阻塞了,这种情形下Server端将先后收到2次请求,并持续等待两个Client请求向他发送数据…问题就在这里,Cient端实际上只有一次请求,而Server端却有2个响应,极端的情况可能由于Client端多次重新发送请求数据而导致Server端最后建立了N多个响应在等待,因而造成极大的资源浪费!所以,“三次握手”很有必要!,如果有了三次握手,client只要没有给server再次确认,该连接就不能建立成功
    ###四次挥手
    这里写图片描述

开始的时候A和B都处于ESTAB-LISHED状态

  • 假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说”我Client端没有数据要发给你了”,但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。A发完后A进入FIN-WAIT-1状态
  • 所以你先发送ACK,”告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息”。B收到后向A发送ack,B发完后B进入COLSE-WAIT状态
  • A收到B的确认后进入FIN-WAIT-2状态
  • 当B确定数据已发送完成,则向A发送FIN报文,”告诉Client端,好了,我这边数据发完了,准备好关闭连接了”。A收到B的ack就进入Client端收到FIN报文后, “就知道可以关闭连接了。B发完后B进入 LAST-ACK状态
  • 但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,”就知道可以断开连接了”。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!
    ###tcp的拥塞控制怎么实现的
    说说慢开始,拥塞避免,快重传,拥塞避免
    ###http的状态码
  • 1XX Informational(信息性状态码)
  • 2XX Success(成功状态码)。例如:200 OK 表示从客户端发来的请求在服务器端被正常处理了。
  • 3XX Redirection(重定向状态码)
  • 4XX Client Error(客户端错误状态码)。例如:404 Not Found 该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
  • 5XX Server Error(服务器错误状态码)。例如:500 Internal Server Error 该状态码表明服务器端在执行请求时发生了错误。

###get和post的区别

  • Get是从服务器上获取数据,是安全的和幂等的,POST是修改服务器上的数据

    所谓 安全的 意味着该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
    幂等 的意味着对同一URL的多个请求应该返回同样的结果。

  • GET请求的数据会附在URL之后,POST把提交的数据则放置在是HTTP包的包体中。POST的安全性更高

  • GET方式提交的数据最多只能是1024字节,理论上POST没有限制,可传较大量的数据**

##数据库部分
###数据库的事务概念
事务体现出整体的概念,要么事务中的操作全部成功,要么全部失败。体现在数据库sql里就是逻辑上相互依赖的一组sql语句
###有哪些特性ACID
####原子性(Atomicity)

**原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,**因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
####一致性(Consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
####隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。
####持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
###并发的常见错误,说说有哪些
####脏读(dirty reads)
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据针对修改
####不可重复读(non-repeatable reads)
不可重复读(针对修改)是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
####虚读(幻读)phantom read
幻读是事务非独立执行时发生的一种现象。针对插入。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
###事务的隔离级别
####Read uncommitted (读未提交)

写事务阻止其他写事务,避免了更新遗失。但是没有阻止其他读事务。
存在的问题:脏读。即读取到不正确的数据,因为另一个事务可能还没提交最终数据,这个读事务就读取了中途的数据,这个数据可能是不正确的。

解决办法就是下面的“可读取确认”。
####Read committed (读已提交)

写事务会阻止其他读写事务。读事务不会阻止其他任何事务。
存在的问题:不可重复读。即在一次事务之间,进行了两次读取,但是结果不一样,可能第一次id为1的人叫“李三”,第二次读id为1的人就叫了“李四”。因为读取操作不会阻止其他事务。
解决办法就是下面的“可重复读”。
####Repeatable read (可重复读)

写事务会阻止其他读写事务,读事务会阻止其他写事务,但是不会阻止其他读事务。
存在的问题:幻读。可重复读阻止的写事务包括update和delete(只给存在的表加上了锁),但是不包括insert(新行不存在,所以没有办法加锁),所以一个事务第一次读取可能读取到了10条记录,但是第二次可能读取到11条,这就是幻读。

解决办法就是下面的“串行化”。
Serializable (串行化)

读加共享锁,写加排他锁。这样读取事务可以并发,但是读写,写写事务之间都是互斥的,基本上就是一个个执行事务,所以叫串行化。

###谈谈你了解的存储引擎和使用场景,优缺点
###了解索引么
说说order by和hash的区别

文章最后发布于: 2017-09-07 16:48:02
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie

分享到微信朋友圈

×

扫一扫,手机浏览