自整理面试题

1.TCP/IP协议群做了哪些事情?

1.报文拆分 2.增加协议头 3.数据传输 4.路由和寻址 5.数据重组

2.TCP协议为什么是3次握手4次挥手?

三次握手

image.png

四次挥手

image.png

3.IPv4和Ipv6的区别
  • 地址不同(Ipv4 32位、Ipv6 128位)-> 地址空间、数目不同
  • 地址分配不同(IPv4资源是稀缺的,分配需要竞争;IPv6可以给每个人分配很多地址)
  • 寻址方式不同:IPv4通过子网掩码计算网络地址;IPv6有固定的计算方式划分网络。
  • 地址解析策略不同(IPv4需要ARP,IPv6通过无状态的邻居发现)
  • DNS不同(IPv4是A记录,IPv6是AAAA记录)

4.TCP和UDP的区别
  • 面向流 vs 面向报文
  • 会话 vs 无会话
  • 头(大 vs 小)
  • TCP保证正确性(可靠性),UDP不保证
  • UDP实现广播成本低

5.TCP如何确保数据顺序
  • 为什么需要保证:TCP拆分封包的时候是顺序拆分的,但是包会无序的到达目的地
  • 方法:利用(Seq, ACK)编号确定封包的唯一性
  • 方法:利用滑动窗口存放没有排好序的封包,直到窗口中完全有序才发送ACK。如果有包丢失,就会一直不发ACK。 如果窗口大小是4,发送ABCD,如果只有BD到目的地,那么滑动窗口中是_B_D

6.如果网络延迟是30ms,那么Ping一个网站需要多少ms?如果请求一个HTTPS协议的网站,TTFB至少ms?

image.png

60ms 180ms

7.LRU是什么?

image.png

缓存置换:缓存满了后,每次创建新的缓存条目,就会删除旧的缓存条目

8.什么是https中间人攻击?

image.png

9.NIO有什么优势?
  • Reactive模型+非阻塞(减少线程切换)
  • 内核级别拷贝内存到JVM(减少系统调用)
  • 缓冲区增加数据处理的灵活性(clear/flip等操作),处理I/O场景有明显性能优势

10.一次DNS查询最快和最慢差距有多大?
  • 最快命中本地浏览器缓存
  • 最慢需要到服务商(ISP)-> Root服务器 -> 顶级域名服务器 -> 权威服务器 链路很长
  • DNS是分级缓存策略,每级缓存都非常强大

11.HTTPkeep-alive和http2.0的多路复用有什么区别?
  • keep-alive : 复用TCP连接发送请求,节省了握手时间,本质还是串行
  • http2.0 多路复用: 数据被打散成为小块,本质是并行

12.强制缓存和协商缓存的区别
  • 强制缓存强制执行,强制缓存不需要再发送请求给服务端
  • 协商缓存需要发送请求给服务端验数据版本,如果有新版本的数据就需要重新下发数据,如果没有就返回304 Not Modified
  • Etag
  • Last-Modified

13.正向代理和反向代理的区别

正向代理:客户端无法直接访问服务器,找一台代理服务器,作为中间桥梁跟服务器交互数据。客户端是清楚目标服务器的地址的,而目标服务器是不清楚来自客户端,它只知道来自哪个代理服务器,所以正向代理可以屏蔽或隐藏客户端的信息

反向代理:代理服务器对外屏蔽服务器信息,客户端发来请求,由反向代理服务器按一定规则分发到每个服务器,客户端不知道是哪台服务器

参考文章:https://www.cnblogs.com/taostaryu/p/10547132.html

14.浏览器发数据为什么不用80端口

80是接受数据用的

常见面试题

1.为什么TCP连接的时候是3次?2次不可以吗?

因为需要考虑连接时丢包的问题,如果只握手2次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据,而客户端一直没收到服务端的确认报文,所以客户端就不知道服务端是否已经准备好了(可以理解为客户端未连接成功),这种情况下客户端不会给服务端发数据,也会忽略服务端发过来的数据

如果是三次握手,即便发生丢包也不会有问题,比如如果第三次握手客户端发的确认ack报文丢失,服务端在一段时间内没有收到确认ack报文的话就会重新进行第二次握手,也就是服务端会重发SYN报文段,客户端收到重发的报文段后会再次给服务端发送确认ack报文

2.为什么TCP连接的时候是3次,关闭的时候却是4次?

因为只有在客户端和服务端都没有数据要发送的时候才能断开TCP。而客户端发出FIN报文时只能保证客户端没有数据发了,服务端还有没有数据发客户端是不知道的。而服务端收到客户端的FIN报文后只能先回复客户端一个确认报文来告诉客户端我服务端已经收到你的FIN报文了,但我服务端还有一些数据没发完,等这些数据发完了服务端才能给客户端发FIN报文(所以不能一次性将确认报文和FIN报文发给客户端,就是这里多出来了一次)

3.为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?

这里同样是要考虑丢包的问题,如果第四次挥手的报文丢失,服务端没收到确认 ack报文就会重发第三次挥手的报文,这样报文一去一回 长时间就是2MSL,所以需要等这么长时间来确认服务端确实已经收到了

4.如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP设有一个保活计时器,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

5.什么是HTTP,HTTP 与 HTTPS 的区别?

HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范

区别 HTTP HTTPS
协议 运行在 TCP 之上,明文传输,客户端与服务器端都无法验证对方的身份 身披 SSL( Secure Socket Layer )外壳的 HTTP,运行于 SSL 上,SSL 运行于 TCP 之 上, 是添加了加密和认证机制的 HTTP。
端口 80 443
资源消耗 较少 由于加解密处理,会消耗更 多的 CPU 和内存资源
开销 无需证书 需要证书,而证书一般需要向认证机构购买
加密机制 共享密钥加密和公开密钥加密并用的混合加密机制
安全性 由于加密机制,安全性强

6.常用HTTP状态码

HTTP状态码表示客户端HTTP请求的返回结果、标识服务器处理是否正常、表明请求出现的错误等

类别 原因短语
1XX Informational(信息性状态码)接受的请求正在处理
2XX Success(成功状态码)请求正常处理完毕
3XX Redirection(重定向状态码)需要进行附加操作以完成请求
4XX Client Error(客户端错误状态码)服务器无法处理请求
5XX Server Error(服务器错误状态码)服务器处理请求出错
2XX 成功(这系列表明请求被正常处理了)
200 OK,表示从客户端发来的请求在服务器端被正确处理
204 No content,表示请求成功,但响应报文不含实体的主体部分
206 Partial Content ,进行范围请求成功
3XX 重定向 (表明浏览器要执行特殊处理)
301 moved permanently,永久 性重定向,表示资源已被分配了新的 URL
302 found,临时性重定向,表示资源临时被分配了新的 URL
303 see other,表示资源存在着另一个 URL, 应使用 GET 方法获取资源 (对于 301/302/ 303响应,几乎所有浏览器都会删除报文主体并 自动用 GET重新请求)
304 not modified ,表示服务器允许访问资源,但请求未满足条件的情况(与重定向无关)
307 temporary redirect,临时重定 向,和302 含义类似,但是期望客户端保持请求方法不变向新的地址发出请求
4XX 客户端错误
400 bad request,请求报文存在语法错误
401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
403 forbidden ,表示对请求资源的访问被服务器拒绝,可在实体主体部分返回原因描述
404 not found,表示在服务器上没有找到请求的资源
5XX 服务器错误
500 internal sever error,表 示服务器端在执行请求时发生了错误
501 Not Implemented,表示服务器不支持当前请求所需要的某个功能
503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求

7.介绍GET和POST

说道GET和POST,就不得不提HTTP协议,因为浏览器和服务器的交互是通过HTTP协议执行的,而GET和POST也是HTTP协议中的两种方法

HTTP全称为Hyper Text Transfer Protocol,中文翻译为超文本传输协议,目的是保证浏览器与服务器之间的通信。HTTP的工作方式是客户端与服务器之间的请求-应答协议

HTTP协议中定义了浏览器和服务器进行交互的不同方法,基本方法有4种,分别是GET,POST,PUT,DELETE。这四种方法可以理解为,对服务器资源的查,改,增,删

  • GET:从服务器上获取数据,也就是所谓的查,仅仅是获取服务器资源,不进行修改
  • POST:向服务器提交数据,这就涉及到了数据的更新,也就是更改服务器的数据
  • PUT:英文含义是放置,也就是向服务器新添加数据,就是所谓的增
  • DELETE:从字面意思也能看出,这种方式就是删除服务器数据的过程

8.GET和POST区别

1.Get是不安全的,因为在传输过程,数据被放在请求的URL中;Post的所有操作对用户来说都是不可见的。 但是这种做法也不时绝对的,大部分人的做法也是按照上面的说法来的,但是也可以在get请求加上 request body,给 post请求带上 URL 参数

2.Get请求提交的url中的数据 多只能是2048字节,这个限制是浏览器或者服务器给添加的,http协议并没有对url长度进行限制,目的是为了保证服务器和浏览器能够正常运行,防止有人恶意发送请求。Post请求则没有大小限制

3.Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集

4.Get执行效率却比Post方法好。Get是form提交的默认方法

5.GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)

9.什么是对称加密与非对称加密

对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密

由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,非常的慢

10.什么是HTTP2

HTTP2 可以提高了网页的性能

HTTP1 浏览器限制了同一个域名下的请求数量(Chrome 下一般是六个),当在请求很多资源的时候,由于队头阻塞当浏览器达到 大请求数量时,剩余的资源需等待当前的六个请求完成后才能发起请求

HTTP2 中引入了多路复用的技术,这个技术可以只通过一个 TCP 连接就可以传输所有的请求数据。多路复用可以绕过浏览器限制同一个域名下的请求数量的问题,进而提高了网页的性能

11.Session、Cookie和Token的主要区别

HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份

什么是cookie

cookie是由Web服务器保存在用户浏览器上的小文件(key-value格式),包含用户相关的信息。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户身份

什么是session

session是依赖Cookie实现的。session是服务器端对象

session 是浏览器和服务器会话过程中,服务器分配的一块储存空间。服务器默认为浏览器在cookie中设置 sessionid,浏览器在向服务器请求过程中传输 cookie 包含 sessionid ,服务器根据 sessionid 获取出会话中存储的信息,然后确定会话的身份信息

cookie与session区别

存储位置与安全性:cookie数据存放在客户端上,安全性较差,session数据放在服务器上,安全性相对更高;

存储空间:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点多保存20个cookie,session无此限制

占用服务器资源:session一定时间内保存在服务器上,当访问增多,占用服务器性能,考虑到服务器性能方面,应当使用cookie

什么是Token

Token的引入:

Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生

Token的定义:

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。使用Token的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮

Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位 session与token区别

  • session机制存在服务器压力增大,CSRF跨站伪造请求攻击,扩展性不强等问题
  • session存储在服务器端,token存储在客户端
  • token提供认证和授权功能,作为身份认证,token安全性比session好
  • session这种会话存储方式方式只适用于客户端代码和服务端代码运行在同一台服务器上,token适用于项目级的前后端分离(前后端代码运行在不同的服务器下)

12.Servlet是线程安全的吗

Servlet不是线程安全的,多线程并发的读写会导致数据不同步的问题。解决的办法是尽量不要定义name属性,而是要把name变量分别定义在doGet() 和doPost()方法内。虽然使用synchronized(name){}语句块可以解决问题,但是会造成线程的等待,不是很科学的办法

注意:

多线程的并发的读写Servlet类属性会导致数据不同步。但是如果只是并发地读取属性而不写入,则不存在数据不同步的问题。因此Servlet里的只读属性最好定义为final类型的

13.Servlet接口中有哪些方法及Servlet生命周期探秘

在Java Web程序中,Servlet主要负责接收用户请求HttpServletRequest,在 doGet(),doPost()中做相应的处理,并将回应HttpServletResponse反馈给用户。Servlet可以设置初始化参数,供Servlet内部使用

Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关:

  • void init(ServletConfig config) throws ServletException
  • void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException
  • void destory()
  • java.lang.String getServletInfo()
  • ServletConfig getServletConfig()

生命周期:

Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其 init()方法进行Servlet的初始化;请求到达时调用Servlet的service()方法,service()方法会根据需要调用与请求对应的doGet或doPost等方法;当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet 的destroy()方法

init方法和destory方法只会执行一次,service方法客户端每次请求Servlet都会执行。Servlet中有时会用到一些需要初始化与销毁的资源,因此可以把初始化资源的代码放入init方法中,销毁资源的代码放入destroy方法中,这样就不需要每次处理客户端的请求都要初始化与销毁资源。

13.如果客户端禁止 cookie 能实现 session 还能用吗?

Cookie 与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案

但为什么禁用Cookie就不能得到Session呢?

因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了

假定用户关闭Cookie的情况下使用Session,其实现途径有以下几种:

  • 手动通过URL传值、隐藏表单传递Session ID
  • 用文件、数据库等形式保存Session ID,在跨页过程中手动调用