其他分享
首页 > 其他分享> > 后端面经整理(2)

后端面经整理(2)

作者:互联网

Network

TCP/IP分为几层

重定向转发区别

重定向resp,请求转发req

请求转发:request.getRequestDispatcher("/test.jsp").forword(request,response);

重定向:response.sendRedirect("/test.jsp");

1、请求次数:重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;

2、地址栏不同:重定向地址栏会发生变化,转发地址栏不会发生变化;

3、是否共享数据:重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);

4、跳转限制:重定向可以跳转到任意URL,转发只能跳转本站点资源;

5、发生行为不同:重定向是客户端行为,转发是服务器端行为;

OSI七层模型

https://blog.csdn.net/yaopeng_2005/article/details/7064869

路由器、集线器、交换机

http://www.nowamagic.net/academy/detail/72150314

集线器属于OSI的第一层物理层设备,交换机属于OSI的第二层数据链路层设备。路由器一开始就设计工作在OSI模型的网络层(第三层),可以得到更多的协议信息,路由器可以做出更加智能的转发决策。 

交换机是利用物理地址或者说MAC地址来确定转发数据的目的地址。路由器是利用不同网络的ID号(即IP地址)来确定数据转发的地址。

状态码:302/301和302的区别,见到这些错误之后的排查思路

 

TCP和UCP协议

TCP是怎么进行流量控制的? 答:滑动窗口,巴拉巴拉。。。 追问:滑动窗口是由什么决定的?

 

为何三次握手?四次挥手2MSL

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

http报文结构:https://www.cnblogs.com/ldq2016/p/9055933.html

这里写图片描述

输入url然后回车发生了什么:https://www.cnblogs.com/jin-zhe/p/11586327.html

  • URL 解析:首先判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动完成、字符编码等操作。

  • DNS 查询

  • TCP 连接

  • 处理请求

假如服务器配置了 HTTP 重定向,就会返回一个 301永久重定向响应,浏览器就会根据响应,重新发送 HTTP 请求(重新执行上面的过程)。

  • 接受响应

       浏览器接收到来自服务器的响应资源后,会对资源进行分析。

  首先查看 Response header,根据不同状态码做不同的事(比如上面提到的重定向)。

  接下来,根据响应资源里的 MIME[3] 类型去解析响应内容(比如 HTML、Image各有不同的解析方式)。

  • 渲染页面

http1.1的请求队列相对于http1.0设计的好处

http会被坏人拦截吗

http协议属于明文传输协议,交互过程以及数据传输都没有进行加密,通信双方也没有进行任何认证,通信过程非常容易遭遇劫持、监听、篡改,严重情况下,会造成恶意的流量劫持等问题,甚至造成个人隐私泄露(比如银行卡卡号和密码泄露)等严重的安全问题。

比如常见的,在http通信过程中,“中间人”将广告链接嵌入到服务器发给用户的http报文里,导致用户界面出现很多不良链接; 或者是修改用户的请求头URL,导致用户的请求被劫持到另外一个网站,用户的请求永远到不了真正的服务器。这些都会导致用户得不到正确的服务,甚至是损失惨重。

DNS请求阶段的具体协议

应用层和协议

CSRF攻击


你听说过CSRF攻击吗,因为跟session有关。(攻击者获取到了用户的session,然后伪造用户请求。他说不太准确。事后查了一下:要让客户访问虚假网站,然后浏览器默认会带上cookie,虚假网站再直接向正规网站提交,伪造用户请求)

Http和Https的区别:http://blog.sina.com.cn/s/blog_603fcfae0102xjeh.html

https://blog.csdn.net/wnx_52055/article/details/8835531

1. https协议需要到CA申请证书,大多数情况下需要一定费用

2. Http是超文本传输协议,信息采用明文传输,Https则是具有安全性SSL加密传输协议

3. Http和Https端口号不一样,Http是80端口,Https是443端口

4. Http连接是无状态的,而Https采用Http+SSL构建可进行加密传输、身份认证的网络协议,更安全。

5. Http协议建立连接的过程比Https协议快。因为Https除了Tcp三次握手,还要经过SSL握手。连接建立之后数据传输速度,二者无明显区别。

http默认端口为80,https默认端口为443

HTTPS的缺点:

1.HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电;

2.HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;

3.SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。

4.SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。

5.HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。

Https建立连接的过程

  1. 客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
  2. Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。在客户端收到证书后,对证书的证书所有者、有效期等信息进行一一校验。
  3. 客户端根据双方同意的安全等级选择加密算法和密钥,然后利用公钥将会话密钥加密,并传送给服务端。
  4. Web服务器利用自己的私钥解密出会话密钥。
  5. 客户端以对称加密的方与向Web服务器发送请求;
  6. 服务端收到后,利用对称密钥给客户端回复请求内容;
 

服务器启动监听端口为1234的应用,客户端无法连接。如何排错

SSL握手和工作流程,SSH/SSL的区别,详细说明/    ssl/tsl握手过程

对称加密和非对称加密

md5的原理

DNS劫持

拥塞控制

http是有状态还是无状态?是有连接还是无连接?

无状态、无连接

操作系统

假设操作系统内存是4GB,其中有2.5GB被A进程占用了,操作系统本身占用0.5GB内存,这时候如果fork了这个进程,是否能成功,为什么?

答:可以,答了copy on write

一开始问有没有见过进程的Z状态,没答出来就问了,进程有哪些状态:

答 新建 阻塞 运行 就绪 终结

说说epoll和select 

线程进程的区别 协程

进程是资源分配的最小单位,线程是程序执行的最小单位

线程和CPU核的关系

核心数是指物理上,也就是硬件上存在几个核心。比如双核就是包括两个相对独立的CPU核心单元组。
线程数是一个逻辑上的概念,就是模拟出的CPU核心数,比如可以通过一个实际的CPU核心单元组模拟出2线程的CPU,一个实体核心,两个逻辑线程,这个单核心的CPU就被模拟成一个类似双核心CPU的功能,可以同时处理两个线程的工作。从任务管理器的性能标签页中看到的就是两个CPU。这种模拟技术被叫做超线程技术。
常说的四核八线,四核指该CPU有四个实体核心,八线指每个CPU运行两个逻辑线程,总共八个线程。
对于CPU来说,线程数 >= 核心数。在不引入超线程技术时,一个核心对应一个线程。通过超线程技术可以使一个核心对应两个线程,也就是说它可以同时运行两个线程。

进程线程通信方式

进程通信

管道(pipe)

管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

有名管道 (namedpipe)

有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

信号量(semaphore)

信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

消息队列(messagequeue)

消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息。

信号 (sinal)

信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的。

共享内存(shared memory)

共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。

套接字(socket)

套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同设备及其间的进程通信。

线程间的通信方式https://blog.csdn.net/jisuanji12306/article/details/86363390

https://zhuanlan.zhihu.com/p/129374075

https://blog.csdn.net/u011514810/article/details/77131296

临界区:通过多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问;

互斥量Synchronized/Lock:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问

信号量Semphare:为控制具有有限数量的用户资源而设计的,它允许多个线程在同一时刻去访问同一个资源,但一般需要限制同一时刻访问此资源的最大线程数目。

事件(信号),Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作

 

方式一:使用 volatile 关键字(内存共享)

基于 volatile 关键字来实现线程间相互通信是使用共享内存的思想,大致意思就是多个线程同时监听一个变量,当这个变量发生变化的时候 ,线程能够感知并执行相应的业务。这也是最简单的一种实现方式

方式二:使用Object类的wait() 和 notify() 方法

众所周知,Object类提供了线程间通信的方法:wait()notify()notifyaAl(),它们是多线程通信的基础,而这种实现方式的思想自然是线程间通信。

注意: wait和 notify必须配合synchronized使用,wait方法释放锁,notify方法不释放锁

方式三:使用JUC工具类 CountDownLatch

jdk1.5之后在java.util.concurrent包下提供了很多并发编程相关的工具类,简化了我们的并发编程代码的书写,***CountDownLatch***基于AQS框架,相当于也是维护了一个线程间共享变量state

方式四:使用 ReentrantLock 结合 Condition

方式五:基本LockSupport实现线程间的阻塞和唤醒

线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。

进程的调度算法

linux用户态内核态

linux常用命令,linux会哪些命令,介绍10个 查看内存、查看内核、查看磁盘等

Linux的文件系统

I/O复用

select、poll、epoll源码说一下

零拷贝

虚拟地址空间转换

线程和CPU核的关系

虚拟内存实现机制

用户级线程和内核级线程

用户级线程的实现

如何看线程的运行情况

Linux cpu占用率 内存占用率,还有剩余内存 网络带宽怎么看,压测怎么对他们进行调整

Cpu和内存占用率和剩余内存我答的用top,网络带宽占用了多少。

框架

spring的创建初始化一个bean对象的流程

spring是怎么解析json的,说说你用过的json解析器

SpringAOP实现原理

讲讲你使用了Spring哪些注解

说到了Autowired,讲一下Spring IOC的过程

假如让你用aop来做事务应该注意哪些点

前端给你传一个请求过来服务器是怎么处理的,流程

项目

登录功能,怎么维护登录状态

过滤器,监听器:

CharacterEncodingFilter implements Filter

登录功能: 1.LoginServlet extends HttpServlet,判断用户名密码 2. 进入主页的时候,要判断用户是否已经登录(判断usersession是不是null)(在过滤器中实现)

3.注销功能,删除session信息

JDBC:

forname反射加载驱动,DriverManager.getConnection获取数据库connection,用connection.createStatement()得到statement,执行SQL(查询)返回一个resultSet,关闭连接,释放资源

session机制是怎么实现的?有哪两种实现方式 

session是以cookie或URL重写为基础的,默认使用cookie来实现

https://www.jianshu.com/p/d788ecba9514?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

1. 通过cookie 
Cookie是保存在客户端的一小段信息,服务器在响应请求时可以将一些数据以“键-值”对的形式通过响应信息保存在客户端。当浏览器再次访问相同的应用时,会将原先的Cookie通过请求信息带到服务器端。

2. url重写 

通过cookie可以很好地实现session,但是如果客户端由于某些原因(比如出于安全考虑)而禁用cookie,在这种情况之下,为了使session能够继续生效,可以采用url重写。url重写很简单,比如我要从1.jsp页面跳转到2.jsp,采用超链接的方式,可以用两种方式:一种如下所示: 
<a href="2.jsp">2.jsp</a> 
另一种是<a href="<%=response.encodeURL("2.jsp")%>">2.jsp</a>  

https://blog.csdn.net/shenquanxi/article/details/6690140

session cookie(json)

 https://www.cnblogs.com/lion88/p/4213783.html

session共享的四种方法

(1)基于Cookie的Session共享

其原理是将全站用户的Session信息加密、序列化后以Cookie的方式统一种植在根域名下(如.host.com)。当浏览器访问该根域名下的所有二级域名站点时,将与域名相对应的所有Cookie内容的特性传递给它,从而实现用户的Cookie化Session在多服务间的共享访问

这个方案的优点是无需额外的服务器资源;缺点是由于受HTTP协议头信息长度的限制,仅能够存储小部分的用户信息,同时Cookie化的Session内容需要进行安全加解密(如采用DES、RSA等进行明文加解密,再由MD5、SHA-1等算法进行防伪认证),另外它也会占用一定的带宽资源,因为浏览器会在请求当前域名下的任何资源时将本地Cookie附加在http头中传递到服务器上

(2)基于数据库的Session共享

把session信息存储在数据库中,通常使用内存表,以提高Session操作的读写效率

这个方案的实用性比较强,应用较为普遍。缺点在于Session的并发读写能力取决于MySQL数据库的性能,同时需要我们自己来实现Session淘汰逻辑,以便定时从数据表中更新、删除Session记录,当并发过高时容易出现表锁,对数据库造成较大压力

(3)基于Memcache的Session共享

Memcache是一款基于Libevent的多路异步I/O技术的内存共享系统,简单的Key+Value数据存储模式使其代码逻辑小巧高效,因此在并发处理能力上占据了绝对优势

分页,下拉列表

1)导入分页的工具类:pagesupport文件

2)用户列表页面导入:userlist.jsp

从前端获取数据  
获取用户列表,在dao得到一个userlist 
获取用户的总数count(1)
控制首页和尾页,如果页面小于1,就显示第一页的东西
获取用户列表展示,get一页的用户对象,

limit性能问题:偏移量会越来越大,效率极低。采用基于索引的子查询或者join。

对limit的优化,不是直接使用limit,而是首先获取到offset的id,然后直接使用limit size来获取数据。

另一种方法:拦截器  https://www.iteye.com/blog/elim-1851081#_Toc354330568

拦截所有以ByPage结尾的查询语句,并且利用获取到的分页相关参数统一在sql语句后面加上limit分页的相关语句,一劳永逸。不再需要在每个语句中单独去配置分页相关的参数了。

利用拦截器实现Mybatis分页的一个思路就是拦截StatementHandler接口的prepare方法,然后在拦截器方法中把Sql语句改成对应的分页查询Sql语句,之后再调用StatementHandler对象的prepare方法,即调用invocation.proceed()。

秒杀怎么设计

怎么实现验证码功能(session)

 

项目中遇到的困难

密码修改:

Dao层实现类用prestatement实现sql语句执行,service层用connection,

设计模式

手写单例问题

 

生产者消费者(虚假唤醒)

虚假唤醒:if 改为 while 判断

降低耦合 

支持并发 生产者把制造出来的数据往缓冲区一丢,就可以再去生产下一个数据。基本上不用依赖消费者的处理速度。

leetcode

链表反转

两个单链表是否交叉及是否有环

二叉树转化成双向链表

最大的子序列和

LRU缓存

合并有序链表   (经典高频题了)  追问:如果链表降序还是增序的还未定,要求按照原本链表的增降序来合并 。追问2:链表有重复节点,怎么合并,要求去重

Leetcode138. 复制带随机指针的链表

标签:请求,报文,端面,进程,线程,https,整理,CPU
来源: https://blog.csdn.net/qq_43378019/article/details/112381662