其他知识点:
http协议面试:
http定义:
1.http协议就是客户端和服务器端进行数据传输格式规范,格式简称为“超文本传输协议”
什么是Http无状态协议,怎么解决Http协议无状态协议
1.无状态协议对于事务处理没有记忆能力,后续操作无法知道前面操作的信息
解决方案:
2.通过1、cookie 2、通过Session会话保存
get和post两种请求方式的区别:
1.get请求传递数据都是拼接在请求地址的后面,post请求是放在http协议的请求实体里面
2.get请求一次传递的数据有大小限制,而对于post请求没有
3.get请求侧重于向服务器端获取资源,而post请求这是重点是向服务器发送数据
4.get安全性没有post的高
5.get方式只能支持ASCII码,向服务器传递中文字符,可能会乱码,
post支持标准的字符集,可以正确传递中文字符
session和cookie区别
1、cookie存储在客户端,session存储在服务端
2、cookie和session的生命周期不一样
3、cookie存储有大小限制,一般在4kb左右,而且只能存储assic字符,如果有中文还需要编码,而session可以存储任意数据
4、cookie安全性比session低
引用场景
cookie
(1)判断用户是否登陆过网站,以便下次登录时能够直接登录。如果我们删除cookie,则每次登录必须从新填写登录的相关信息。
(2)“购物车”中类的处理和设计
session
(1)保存登录用户的信息,在当前会话中
http请求报文和响应报文格式
请求报文包含:
1.请求行:包含请求方法,URI、HTTP版本信息
2.请求首部字段
3.请求内容实体
响应报文包含三部分:
1.状态行:包含HTTP版本、状态码、状态码的原因短语
2.响应首部字段
3.响应内容实体
状态码:
100-199:表示成功接收到请求,要求客户端继续提交一次请求,才处理完成整过处理过程
200-299:表示成功接收 请求并已经完整处理过程 经典:200 响应吗
300-399:表示完成请求,客户需要进一步细化请求。例如请求资源已经移动到一个新地址
经典:302 重定向 服务器返回一个头部信息,包含一个location字段,内容为重定向url
400-499:客户端请求错误 404:地址错误 400:报文有语法错误 403:禁止访问
500-599:服务器端错误 经典:500 服务器端内部错误,503:服务器端正忙 502:网关错误 504 网关超时
抓包工具:Wireshark
Tcp/UDP协议
TCP:面向连接,可靠
三次握手:
x=1999
客户端: 第一次发送的时候都会有一个SYN=1 seq=x 客户端进入syn_send状态
服务端: 发送 seq=y ack=x+1 syn=1 ACK=1 SYN+ACK表示服务端给客户端的应答 第二次回应第一次信息没有丢失 进入syn_recv状态
客户端: 发送 ACK =1 seq=x+1 ack=y+1; 第三次握手主要是确认第二次信息没有丢失 都进入ESTABLISHED状态
四次挥手:
客户端先发一个关闭连接请求(FIN=1 ACK=1 seq=x ack=z),带有FIN附加标记 进入FIN_WAIT_1
服务端先发一个确认消息(ACK=1 seq=z ack=x+1),我收到了,这个确认消息里面没有FIN,做一些最后准备工作 进入CLOSE_WAIT 此时客户端进入FIN_WAIT_2
服务端在发送一个带有FIN的报文(FIN=1 ACK=1 seq=Y ack=x+1) 进入LAST_ACK
客户端回应一下(ACK=1 seq=x+1 ack=Y+1) 进入TIME_WAIT 这里需要等待2MSL,因为有可能出现丢包,这时候服务端会在发起一个带有FIN的报文,
这时候,才有时间去响应,并且重新来再等2MSL
1.tcp是一个面向连接的协议,不支持广播通讯,
2.根据tcp协议的格式,里面有一个URG的标示,提供了紧急数据传送功能,当有紧急数据发送时,接收方收到后会优先读取紧急数据
3.能够探知到接收方处理能力,当接收方大量数据未接收时,会停止继续发送新数据
4.TCP连接是全双工的,因此每个方向都必须单独进行关闭
ip协议:
IP分片发生在IP层,不仅源端主机会进行分片,中间的路由器也有可能分片,因为不同的网络的MTU是不一样的,
如果传输路径上的某个网络的MTU比源端网络的MTU要小,
路由器就可能对IP数据报再次进行分片。而分片数据的重组只会发生在目的端的IP层。
ip地址计算题:
首先ip地址由网络号+主机号组成
10.174.20.176/28 这个就是代表有28位网络剩下四位主机号
ip地址是32位每8位为一组的二进制码,
由题10.174.20.176/28,指前28位不变,
即(10.174.20.不变,还有4位不变,这四位的二进制根据176知位1011),
对此网段的有效ip为:10.174.20.1011 0000~10.174.20.1011 1111,
排出全0和全1不能用,
则ip为:10.174.20.177~10.174.20.190(去掉.176和.191).
网络层的消息叫做数据报(datagram)
UDP:不面向连接,不可靠,基于数据报
WebService :
SOA(Service Oriented Architecture):面向服务的架构
核心:一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来
SOAP(Simple Object Access Protocal):简单对象访问协议,基于XML和HTTP的一种通信协议
WSDL(Web Service Definition Language):web service的定义(描述)语言
WSDL文档功能:
1.基于xml格式,描述服务器端暴露出来的接口函数,包括函数名字,函数参数,函数返回值......
2.程序猿可以根据文档了解接口组成,更好的调用生成的代码
3.通过java提供的命令,生成对应的客户端代码
开发WebService流程:
1.服务器端利用CXF框架+Spring框架+Maven进行发布接口
(1)定义服务接口,使用了WebService注解
import javax.jws.WebService;
@WebService
public interface HelloWorld {
public String sayHello();
}
(2)实现接口同样适用了WebService方法
@WebService
public class HelloWorldImpl implements HelloWorld{
public String sayHello(){
return "Hello world!";
}
}
(3)利用maven导入CXF框架需要的jar
(4)在spring配置文件中导入CXF文件和注册发布服务的类
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<jaxws:endpoint id="helloWorld" implementor="com.test.HelloWorldImpl" address="/HelloWorld"/>
对应的路径:http://host:port/{WebAPPName}/HelloWorld?wsdl
(5)配置web.xml文件来注册CXF提供的Servlet
<servlet>
<description>Apache CXF Endpoint</description>
<display-name>cxf</display-name>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
2.客户端两种方式导入
(1)利用wsimport命令根据提供的url生成对应代码
(2)Spring+CXF方式,注册两个bean
<!-- START SNIPPET: beans -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws" <!--这里这个名称空间需要导入,对应下面的也需要导入jaxws的,服务端也是如此-->
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schema/jaxws.xsd">
<bean id="helloworld" class="com.test.HelloWorld"
factory-bean="clientFactory" factory-method="create"/>
<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="com.test.HelloWorld"/>
<property name="address" value="http://localhost:8080/test/HelloWorld"/>
</bean>
</beans>
什么是Restful(Resource Representational State Transfer ) 表现层状态转移
REST是一种架构风格,其核心是面向资源;而webService底层SOAP协议,主要核心是面向活动
安全方面:Restful风格走http容易被截获,分析里面的内容,但是wsdl风格的走的是SOAP协议,对Http进行了封装,所以安全些
REST描述的是在网络中client和server的一种交互形式;REST本身不实用,实用的是如何设计 RESTful API(REST风格的网络接口)
SQL:
给你一个表只有一列name~~有重复的name, 然后求出前十个name数最大的
select name,count(name) as number from table group by name order by number desc limit 0,10
select name,count(name) as number from table group by name desc limit 0,10
Linux面试:
查看进程端口的命令:ps -aux|grep tomcat 或者 ps -ef|grep xxx
-a 参数。-a 代表 all。同时加上x参数会显示没有控制终端的进程
在需要查看特定用户进程的情况下,我们可以使用 -u 参数
如果想要看到更多的细节,我们可以使用-f参数来查看格式化的信息列表
参数 -e 显示所有进程信息
查看网络状态:netstat
一、查看哪些IP连接本机
netstat -an
查看日志的命名:tail 参数 -n 100 表示查看最后100行的记录
tail -n 5 log2014.log 查看log2014.log最后五行数据
Linux权限:
修改权限的命名 chmod [who] [+ | - | =] [mode]
u 表示“用户(user)”,即文件或目录的所有者。
g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
o 表示“其他(others)用户”。
a 表示“所有(all)用户”。它是系统默认值。
+ 添加某个权限。
- 取消某个权限。
= 赋予给定权限并取消其他所有权限(如果有的话)。
设置mode所表示的权限可用下述字母的任意组合:
r 可读。w 可写。x 可执行。
数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。
所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)
Linux下如何快速查找某个文件
查找的是脚本文件(执行文件)which filename
查找的是二进制的文件(执行文件)whereis -b filename
查找特定文件 whereis filename (利用数据库来查找)
上面所说的利用数据库查找,所说的数据库是你电脑上一个拥有所有文件的文件,是不是很清楚了
也就是文件/var/lib/mlocate
当你记不清文件的全名时 利用locate ;当然也可以用查找命令加上通配符*
例如查找 文件yum.conf
whereis yum.*
也可以使用find,这个是直接硬盘查找,比如查找拥有特定权限文件、某个用户的文件.....
Linux下如何设置环境变量
主要的文件是 /etc/proifle 在里面配置好了之后,需要source /etc/profile 命令进行更新
硬连接和软连接的区别
硬链接: 与普通文件没什么不同,inode 都指向同一个文件在硬盘中的区块
软链接: 保存了其代表的文件的绝对路径,是另外一种文件,在硬盘上有独立的区块,访问时替换自身路径。
查找最大文件
du -h * | sort -n | head -n 1
大公司面试经典题:
1.分布式系统如何负载均衡 或者这样问:如何确定访问的资源在哪个服务器上?
这里核心就是实现负载均衡的策略
1.轮询 2.随机 3.响应时间最小 4.最小并发数 5.一致性hash
2.设计一个分布式负载均衡缓冲系统,如何快速定位到是那个服务器
1.key分段
2.一致性hash
3.如何保证缓冲区和数据库之间的强一致性(使用加锁)
写流程:(1)先淘汰cache(2)再写db
读流程:(1)先读cache,如果数据命中hit则返回 (2)如果数据未命中miss则读db(3)将db中读取出来的数据入缓存
4.HashMap高并发情况下会出现什么问题,
(扩容问题),导致死循环
5.1.进程间共享内存的方式有哪些?线程之间的通信有哪些(8种)
进程:无名管道,有名管道,高级管道,信号量,消息队列,共享内存,套接字。
线程:锁机制
6.用过哪些容器?(tomcat)对比过Tomcat与其他服务器的区别吗?比如nginx?
(1)nginx常用做静态内容服务和代理服务器,Tomcat能够动态的生成资源并返回到客户端。
(2)Nginx 应该叫做「HTTP Server」;而 Tomcat 则是一个「Application Server」,或者更准确的来说,是一个「Servlet/JSP」应用的容器;
(3)虽然Tomcat也可以认为是HTTP服务器,但通常它仍然会和Nginx配合在一起使用:
比如实现如下需求:
动静态资源分离——运用Nginx的反向代理功能分发请求:
所有动态资源的请求交给Tomcat,而静态资源的请求(例如图片、视频、CSS、JavaScript文件等)则直接由Nginx返回到浏览器,这样能大大减轻Tomcat的压力。
负载均衡,当业务压力增大时,可能一个Tomcat的实例不足以处理,那么这时可以启动多个Tomcat实例进行水平扩展,
而Nginx的负载均衡功能可以把请求通过算法分发到各个不同的实例进行处理。
7.分布式锁
定义:控制分布式系统之间同步访问共享资源的一种方式
8.servlet和filter的区别
(1)servlet是一种运行服务器端的java应用程序
(2)Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求
(3)filter是一个可以复用的代码片段,不能产生一个请求或者响应
Filter主要是对用户的请求做预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理
10.线程池有哪些参数
java.util.concurrent.ThreadPoolExecutor 就是这样的线程池
public ThreadPoolExecutor(
int corePoolSize, //保留的线程池大小
int maximumPoolSize, //线程池的最大大小
long keepAliveTime, //空闲线程结束的超时时间
TimeUnit unit, //unit 是一个枚举,表示 keepAliveTime 的单位
BlockingQueue<Runnable> workQueue,//存放任务的队列
RejectedExecutionHandler handler)//线程池对拒绝任务的处理策略
这里谈及到了拒绝策略,就想到了线程池采用了策略设计模式,RejectedExecutionHandler这是个接口,下面有不同的实现类
使用的时候new对应实现了,就可以达到切换不同处理逻辑
线程池按以下行为执行任务
1.当线程数小于核心线程数时,创建线程。
2.当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
3.当线程数大于等于核心线程数,且任务队列已满
(1)若线程数小于最大线程数,创建线程
(2)若线程数等于最大线程数,抛出异常,拒绝任务就是执行handler里面rejectedExecution方法
执行一个任务:threadPoolExecutor.execute(myTask1);
这里任务就是实现了runnale接口的线程类
线程池可以实现异步执行任务的方式 线程池的submit方法就是异步执行的,返回一个Future对象
使用线程池的优势:
(1)降低资源消耗。通过重复利用已创建的线程降低线程创建、销毁线程造成的消耗。
(2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
(3)提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、调优和监控。
线程池的使用场合:
(1)单个任务处理的时间比较短;
(2)需要处理的任务数量大;
11.B+tree和B-tree区别
B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。
B+树还有一个重要的特点就是所有叶子节点会连成一个链表
Mysql采用的是B+树结构,减少了对磁盘io的访问
mongdb采用的是B-树,可以更快的在内存里面读取到数据
12.redis怎么实现分布式集群和分布式锁
首先redis是采用单进程单线程的模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系。
实现分布式锁重要的函数
SETNX key value (SET if Not eXists)
功能:
当且仅当 key 不存在,将 key 的值设为 value ,并返回1;若给定的 key 已经存在,则 SETNX 不做任何动作,并返回0。
GETSET命令
语法:
GETSET key value
功能:
将给定 key 的值设为 value ,并返回 key 的旧值 (old value),当 key 存在但不是字符串类型时,返回一个错误,当key不存在时,返回nil。
SETNX 可以直接加锁操作,比如说对某个关键词foo加锁,客户端可以尝试
SETNX foo.lock <current unix time>
如果返回1,表示客户端已经获取锁,可以往下操作,操作完成后,通过
DEL foo.lock
命令来释放锁。
这样会有可能找出死锁,为了避免这种情况发生 ,
我们在加锁时,把当前时间戳作为value存入此锁中,通过当前时间戳和Redis中的时间戳进行对比,
如果超过一定差值,认为锁已经时效,防止锁无限期的锁下去
但是不能简单的del foo.lock
13.CDN的全称是Content Delivery Network,即内容分发网络
内容更新:主动拉去,或者定时更新
14.从输入URL到浏览器显示页面发生了什么
1、解析这个url,得到里面的域名
2、应用层DNS解析域名 先查询浏览器本身的缓存,在查询系统文件host(windows下面)、
最后请求本地区的DNS服务器,如果本地区的没有就发给根域名服务器,
根域名服务器会返回给本地区域名服务器一个所查询域的国际顶级域名服务器(gTLD)
国际顶级域名服务器会返回本地区域名服务器一个此域名服务器的Name Server服务器,这个服务器一般就是你注册的那个域名服务器
3、应用层客户端发送HTTP请求
4、传输层基于tcp协议建立三次握手(这里又可以扩展),传输报文,将大块的数据分割成以报文段为单位的数据包进行管理,
并为它们编号,方便服务器接收时能准确地还原报文信息
5、网络层IP协议查询MAC地址 ARP协议可以将IP地址解析成对应的MAC地址
6、找到对方的MAC地址后,就将数据发送到数据链路层传输
7、链路层接收到数据包,再层层向上直到应用层。这过程中包括在运输层通过TCP协议讲分段的数据包重新组成原来的HTTP请求报文
8、服务端在从应用层依次下层传递数据,客户端从链路层依次向上层传递数据,最后进行html渲染
15简单叙述一下HTTP请求的基本流程
1、建立TCP连接
2、浏览器向服务端发送请求命令
3、浏览器向服务端发送请求头信息
4、服务端应答
5、服务器发送应答头信息
6、Web服务器向浏览器发送数据
7、服务端关闭连接,如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive,tcp连接不会断开,仍然保持打开状态
16什么是jdbc?
通俗的说:JDBC是java和关系数据库的之间的桥梁
JDBC有两部分组成:JDBC API和JDBC Driver Interface.
JDBC API:是提供给开发者的一组独立于数据库的API,对任何数据库的操作,都可以用这组API来进行,这个api是有DriverManager来得到的
那么要把这些通用的API翻译成特定数据库能懂的"指令",就要由JDBC Driver Interface来实现了;
JDBC Driver Interface 是面向JDBC驱动程序开发商的编程接口,它会把我们通过JDBC API发给数据库的通用指令翻译给他们自己的数据库.
JDBC工作原理主要分3个步骤:1、加载数据库驱动(这个就是数据库供应商提供的)。2、获取数据库连接。3、发送sql语句访问数据库
1、加载数据驱动:使用Class.forName方法,调用这个方法会加载数据库驱动com.mysql.jdbc.driver。
(Class.fromName在加载一个类的时候,会执行类的静态代码块,DriverManager.registerDriver(new xxxDriver()),这样就是所说的加载)
关于数据库驱动的理解,其实是sun公司给了一个Driver的接口,然后各个数据厂商根据自己的数据库
来实现这个接口。当要访问数据库的时候,需要引入这个第三方类库。类的加载主要分为5个部分,
加载、验证、准备、解析、初始化。在初始化的部分用到了DriverManager.registerDriver()方法,将
自己注册给DriverManager的Driver接口。这个地方体现了多态。这个时候就可以使用Driver了。
2、获取数据库连接DriverManager.getConnection()。这个方法主要调用driver的connect()方法
返回一个实现了Connection接口的对象。
3、然后利用Connection对象创建Statement,发送sql语句访问数据库。
核心类:
<1>. 结构:
DriverManager (是一工厂实现类,用了工厂方法模式)
|
Dirver (是驱动程序对象的接口,指向具体数据库驱动程序对象=DriverManager.getDriver(String URL))
|
Connection (是连接对象接口,指向具体数据库连接对象=Drivermanager.getConnection(String URL))
|
Statement (执行静态SQL语句接口,=Connection.CreateStatement())
|
ResultSet (是指向结果集对象的接口,=Statement.excuteXXX())
17.数据库连接池
应用程序在使用连接池的时候。连接池相当于一个工厂,产生连接给你用,使用了工厂模式,如果是连接池的实现,我觉得使用了装饰者模式
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,
当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接
网友评论