后端开发面试基础

以下提纲参考 敖丙
本文内容从各地搜集整合而来
不专注背题记答案,和实际结合

  • 设计模式:单例、工厂等,最好能手写单例
  • Redis、Mysql。结构、用户,索引,sql优化、数据如何持久化、备份等
  • RabbitMQ队列,模式,用法
  • Dubbo
  • Zookeeper
  • 线程、进程、线程池
  • http请求,三次握手、四次挥手的过程,https和http的区别,MVC请求过程,路由解析
  • GC,垃圾回收机制的几种算法
  • 二叉树、平衡二叉树、B树、B+树、红黑树
  • 多线程、并发,锁,锁升级过程
  • 事务、隔离级别等
  • 常见算法
  • Linux常见语法

计算机网络

一、http请求
(一)http协议简称“超文本传输协议”
(二) 什么是无状态协议? 怎么解决Http协议是无状态协议?
  • 无状态协议对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。也就是说,当客户端一次HTTP请求完成以后,客户端再发送一次HTTP请求,HTTP并不知道当前客户端是一个”老用户“。

  • 解决方法:
    一、可以使用Cookie来解决无状态的问题,Cookie就相当于一个通行证,第一次访问的时候给客户端发送一个Cookie,当客户端再次来的时候,拿着Cookie(通行证),那么服务器就知道这个是“老用户”。
    二、通过Session会话保存

(三) Http协议中有哪些请求方式

GET\POST\PUT\HEAD\DELETE\OPTIONS

【GET与POST的区别】

  • 传送方式:get通过地址栏传输,post通过报文传输
  • 传送长度:get参数有长度限制(受限于url长度),而post无限制
  • GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据),简言之,POST请求有一个验证的过程第一次发送验证,再决定是否发送第二次请求。
  • POST相比GET更加安全。Get是不安全的,因为在传输过程,数据被放在请求的URL中;Post的所有操作对用户来说都是不可见的。 但是这种做法也不时绝对的,大部分人的做法也是按照上面的说法来的,但是也可以在get请求加上 request body,给 post请求带上 URL 参数。
(四) 长连接和短连接
  • HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
  • 而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
    Connection:keep-alive

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
关于长连接、短连接

二、三次握手,四次挥手

参考连接(出处)
通过三次握手建立一个连接,四次挥手关闭一个连接

三次握手(建立连接)
  • 第一次握手:客户端向服务端发起请求(标志: SYN = 1(发起一个新连接)),客户端随机生成一个起始序列号100。
    那客户端向服务端发送的报文段包含SYN标志位(也就是SYN=1),序列号seq=100
  • 第二次握手:服务端收到客户端发过来的报文后,发现SYN=1,知道这是一个连接请求,于是将客户端的起始序列号100存起来,也随机生成一个起始序列号如300(服务端起始序列号)。然后给客户端回复一段报文
    回复报文包含SYN、ACK标志(SYN=1,ACK=1)、序列号seq=300、确认号ack=101(客户端发过来的序列号+1)
  • 第三次握手:客户端收到服务端的回复后发现ACK=1并且ack=101,于是知道服务端已经收到了序列号为100的那段报文;同时发现SYN=1,知道了服务端同意了这次连接。于是将服务端的序列号300给存下来,然后再回复一段报文给服务端
    报文:ACK=1、ack=301(服务端序列号+1)、seq=101(第一次握手时发送报文是占据一个序列号的,所以这次seq就从101开始,需要注意的是不携带数据的ACK报文是不占据序列号的,所以后面第一次正式发送数据时seq还是101)

当服务端收到报文后发现ACK=1并且ack=301,就知道客户端收到序列号为300的报文了,就这样客户端和服务端通过TCP建立了连接。

四次挥手(关闭连接)

客户端初始化的序列号为100,服务端初始化的序列号300。TCP连接成功后客户端共发送了1000个字节的数据,服务端在客户端发FIN报文前总共回复了2000个字节的数据。

  • 第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文(FIN=1)(数据没发完时也可以发送连接释放报文并停止发送数据)
    释放连接报文:FIN标志位(FIN=1)、序列号seq=1101(100+1+1000,100初始化序列号+建立连接序列号+数据长度)。
    需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个序列号与SYN一样,而不携带数据的ACK报文是不占据序列号的。
  • 第二次挥手服务端收到客户端发的FIN报文后给客户端回复确认报文
    确认报文:ACK标志位(ACK=1)、确认号ack=1102(客户端序列号1101+1)、序列号seq=2300(服务端初始化序列号300+数据长度2000)。
    此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。
  • 第三次挥手服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文
    报文:FIN和ACK标志位(FIN=1,ACK=1)、确认号和第二次挥手一样ack=1102、序列号seq=2350(2300+50)。
  • 第四次挥手客户端收到服务端发的FIN报文后,向服务端发出确认报文
    确认报文:ACK标志位(ACK=1)、确认号ack=2351、序列号seq=1102。

注意:客户端发出确认报文后不是立马释放TCP连接,而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。

三、浏览器输入www.baidu.com 后执行的全过程

参考连接

与网络协议有关,OSI七层协议 / TCP/IP协议

执行过程
  1. 客户端浏览器通过DNS解析到www.baidu.com的IP地址202.108.22.5,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到202.108.22.5,然后通过TCP进行封装数据包,输入到网络层。
  2. 在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端
  3. 客户端的网络层不用关心应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,我不作过多的描述,无非就是通过查找路由表决定通过那个路径到达服务器。
  4. 客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址
顺序
  1. 浏览器获取输入的域名www.baidu.com
  2. 浏览器向DNS请求解析www.baidu.com的IP地址
  3. 域名系统DNS解析出百度服务器的IP地址
  4. 浏览器发出HTTP请求,请求百度首页
  5. 浏览器与该服务器建立TCP连接(默认端口号80)
  6. IP的重要功能是寻址和路由
  7. 定义了通过物理网络输出数据所需的协议与硬件要求,服务器通过HTTP响应把首页文件发送给浏览器
  8. TCP连接释放
  9. 浏览器将首页文件进行解析,并将Web页显示给用户。
涉及的协议
  1. 点击网址后,应用层的DNS协议会将网址解析为IP地址;在应用层,浏览器会给web服务器发送一个HTTP请求;
  2. 传输层,(上层的传输数据流分段)HTTP数据包会嵌入在TCP报文段中;TCP报文段需要设置端口,接收方(百度)的HTTP端口默认是80,本机的端口是一个1024-65535之间的随机整数,这里假设为1025,这样TCP报文段由TCP首部(包含发送方和接收方的端口信息)+ HTTP数据包组成。
  3. 网络层中,TCP报文段再嵌入IP数据包中;IP数据包需要知道双方的IP地址,本机IP地址假定为192.168.1.5,接受方IP地址为220.181.111.147(百度),这样 IP数据包由IP头部(IP地址信息)+TCP报文段组成。
  4. 网络接口层,IP数据包嵌入到 数据帧(以太网数据包)中在网络上传送;数据帧中包含源MAC地址和目的MAC地址(通过ARP地址解析协议得到的)。这样 数据帧由头部(MAC地址)+IP数据包组成。
  5. 数据包经过多个网关的转发到达百度服务器,请求对应端口的服务;
    服务接收到发送过来的以太网数据包开始解析请求信息,从以太网数据包中提取IP数据包—>TCP报文段—>HTTP数据包,并组装为有效数据交与对应线程池中分配的线程进行处理,在这个过程中,生成相应request、response对象。
  6. 请求处理完成之后,服务器发回一个HTTP响应;请求处理程序会阅读请求及它的参数和cookies。它会读取也可能更新一些数据,并将数据存储在服务器上。处理完毕后,数据通过response对象给客户输出信息,输出信息也需要拼接HTTP协议头部分,关闭后断开连接。断开后,服务器端自动注销request、response对象,并将释放对应线程的使用标识(一般一个请求单独由一个线程处理,部分特殊情况有一个线程处理多个请求的情况)。
  7. 浏览器以同样的过程读取到HTTP响应的内容(HTTP响应数据包),然后浏览器对接收到的HTML页面进行解析,把网页显示出来呈现给用户。
    客户端接收到返回数据,去掉对应头信息,形成也可以被浏览器认识的页面HTML字符串信息,交与浏览器翻译为对应页面规则信息展示为页面内容。

HTTP 协议是一种基于 TCP/IP 的应用层协议,进行 HTTP 数据请求必须先建立 TCP/IP 连接

四、https和http的区别
  1. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
  2. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  3. http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
  4. https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用

设计模式

一、单例模式的几种写法

二、工厂模式

Dubbo

一、Zookeeper宕机,Dubbo还能继续使用吗

可以,注册中心宕机后,服务提供者和服务消费者能通过本地缓存通讯
Dubbo可以不通过注册中心,指定url调用消费者,url指向服务提供者地址和端口,一般本地测试时使用

消费者
@DubboReference(check = false, timeout = 100000, url = "dubbo://127.0.0.1:21883")

服务提供者
@DubboService(register = false) 不注册到注册中心

二、Dubbo底层

Dubbo底层是RPC框架

Dubbo底层客户端、服务端通信使用netty框架,netty基于java的nio。

Linux

一、基础语法
  1. 找到被占用端口的进程 lsof -i:端口号
  2. 杀死某个进程 kill -9 进程号
  3. 根据项目名杀死某一进程
    kill -9 $(ps -ef|grep xxx(项目名) |gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ') || true
    || true,表示如果前面kill -9不成功执行返回true
    如果不加 || ture,前面已经删除过的项目再次删除会报错
  4. 与1相关的则是项目后台运行
    nohup java -Dserver.port=8080 -jar xxx.jar > server.log 2>&1 & ,> 表示覆盖之前的server.log ,与此相对的,是>>,表示追加
  5. 查看正在更新的日志
    tailf 日志名
  6. sudo 某命令 // 以管理员的身份执行
  7. chmod a+x 目录 给所有用户添加可执行权限
    a 所有; u 表示“用户(user)”,即文件或目录的所有者;g 表示“同组(group)用户”;o 表示“其他(others)用户”。
    r 读,w 写,x 可执行
  8. touch touch用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件
  9. 复制文件到当前文件夹 cp -r [需要复制的文件夹所在路径] ./
  10. 根据关键词搜索日志,并打印出日志的前后n行cat server.log | grep -n "关键词"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值