字节后端java一面整理2021/02/22

字节跳动后端研发java-一面

1.自我介绍

2.从浏览器输入一个URL到返回响应的完整过程

第一步:浏览器会先判断这个URL是否需要进行重定向,如果需要就会跳转到重定向页面,不需要则进入下一步。判断这个URL是否有缓存,如果有魂村,则从缓存读取数据,没有则进入下一步。

答:首先完成URL的解析,通过DNS得到目标服务器地址的IP,得知IP后将请求生成http报文。

​ 操作系统将http报文交给协议栈。http协议是基于tcp的可靠连接,所以需要tcp协议完成数据的分割,以及加上tcp头部,生成tcp报文。

​ 在tcp部分完成以后,所有的发送操作都是基于IP模块完成的,因此还需要在tcp报文前面加上IP头部,形成IP报文【IP头部+TCP头部+http报文】

​ 还需要在IP包的前面加上MAC头部来实现两点之间的传输,mac地址可以通过arp协议来获得,arp协议的工作方式是广播。

​ 然后从网卡发送数据。网卡将ip包复制缓存,在开头加上报头和起始帧界符,在结尾加上检测锁雾的帧校验序列。

3.网络带宽网速计算,10m带宽的实际下载速度

答:国内运行商所说的带宽是,单位为bit。所以换算成字节,其理论下载速度是1.25MB/s。受限于我们实际的通信环境,大概为1MB/s左右。

4.tcp与udp的区别概述

答:(1)TCP是面向连接的,需要经过三次握手确认连接,UDP是无连接的,发送数据前不需要建立连接

​ (2)TCP提供可靠的服务,通过TCP连接传送的数据无差错,不丢失,不重复,且按序到达。而UDP是尽最大努力交付,不保证可靠交付。

​ (3)传输效率。TCP的传输效率较低,UDP的传输效率高,适用于对高速传输和实时性有较高的通信或者广播通信。

​ (3)连接对象数量的区别。TCP连接只能是点到点,一对一的。UDP支持一对一,一对多,多对一的交互通信。

5.tcp的三次握手与四次挥手的过程及其原因

答:三次握手:为了防止服务器端开启一些无用连接增加服务端开销以及防止已经失效的连接请求报文段又突然传送到了服务端,因而产生错误。

三次握手:(1)客户端向服务端发送请求连接报文【标记位为SYN,序列号Seq=x】,然后客户端进入SYN-SENT阶段。(2)服务端接收到来自客户端的TCP报文,结束对端口的监听,并返回一段TCP报文【标记位SYN与ACK,Seq=y,ack=x+1】,服务端进入SYN-RCVD,表示确认客户端的报文Seq有效,且服务器已经接收到了来自客户端的报文,同意客户端发送新数据。(3)客户端接收到服务端的确认收到的TCP报文,明确了通道连接正常,结束SYN-SENT阶段,并返回最后一段TCP报文。【标志位ACK=y+1,Seq=x+1】表示收到了确认号ACK,随后客户端进入ESTABLISHED阶段。

四次挥手:不妨假设客户端想要释放连接。

(1)客户端向服务器发送一点TCP报文【标记为为FIN,Seq=U】随后客户端进入FIN-WAIT-1阶段,并且停止往服务器发送数据【确认报文还是可以发】。(但是客户端仍然能够接受从服务器发送来的数据)。(2)服务端接收到后,确认了客户端想要释放连接,随后服务器端结束ESTABLISHED阶段,进入CLOSE-WAIT阶段,并返回报文【标记位为ACK=U+1,Seq = V】。(3)服务端发出ACK确认报文以后,经过了CLOSE-WAIT阶段,做好了释放准备(处理完了所有数据),再次向客户端发送一段TCP报文【标记为FIN,ACK=U+1,Seq=W】,随后服务端结束CLOSE-WAIT阶段,进入LAST-ACK阶段,并且停止在服务器端到客户端方向发送数据。(4)客户端接收到了服务器的确认报文以后,结束FIN-WAIT-1阶段,进入FIN-WAIT-2阶段。当客户端接收到服务端的TCP报文,确认服务端已经做好了释放连接的准备,结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,并向服务器发送一段报文。【标记位置为ACK = W+1,Seq = U+1】,随后客户端开始在TIME-WAIT阶段等待2MSL后断开连接,进入CLOSED阶段。服务器收到这段报文以后,也结束LAST-ACK,进入CLOSED。

**为什么握手需要三次而挥手需要四次?**因为在建立连接时,双方不需要做准备,而在挥手的时候,客户端需要等待服务端处理完数据,先返回ACK确认接收报文,再发送TCP报文,告诉客户端服务端已经做好释放连接的准备。

**为什么客户端在TIME-WAIT阶段需要等待2MSL?**为了确保服务端收到了最后的ACK确认报文。(MSL Maximum Segment Lifetime)【一段报文在传输过程中所能保持有效的最大时长。】

6.DNS解析原理,使用的底层协议

答:DNS:domain name system。解决了IP地址与域名之间的映射关系。

(1)第一步检查缓存中有没有该域名对应的ip,如果没有,则向本地域名解析服务器LDNS发起解析请求

(2)如果没有找到,向根域名解析服务器发起请求

(3)根域名解析服务器返回通用顶级域名解析器地址

(4)再由LDNS向通用顶级域名服务器发起解析请求,并根据你的域名,找到对应的Name Server服务器。

(5)Name Server服务器会查询存储的域名和IP的映射关系表。

7.网络情况良好的情况下,分布式项目的rpc远程调用使用的是tcp还是udp?此时tcp性能更加,为什么

RPC:remote procedure Call,

8.udp如何做到可靠传输

答:UDP在应用层模仿传输层TCP的可靠性传输,如果不考虑拥塞控制,可靠UDP的简单设计如下:

(1)添加Seq/ack机制,确保数据发送到对端。

(2)添加发送和接收缓冲区,主要是用户超时重传

(3)添加超时重传机制。

原理:发送端发送数据时,生成一个随机seq=x,然后每一片按照数据大小分配seq,数据到达接收端后放入缓存,并发送一个ack=x的包,表示已经收到了数据。发送端收到ack包后,删除缓冲区对应的数据,时间到后,定时任务检查是否需要重传数据。

开源程序利用UDP实现可靠的数据传输:RUDP,RTP,UDT

9.tcp的拥塞控制

答:TCP的四种拥塞控制算法

发送方维护一个叫做拥塞窗口cwnd的状态变量,其值取决于网络的拥塞成程度,并且动态变化。

维护原则:只要网络没有出现拥塞,拥塞窗口就增大一些,一旦出现拥塞,窗口就减少一下。判断是否出现网络拥塞的依据:没有按时收到应当到达的确认报文【发生重传】.

(1)慢开始:假设当前发送方拥塞窗口cwnd,而发送窗口swnd等于拥塞窗口cwnd。因此发送方只能发送一个数据报文段,接收方收到该数据报,回复确认报文。发送方收到该确认报文,将cwnd修改为2。

发送方此时可以连续发送两个报文段,接收方收到后一次性回复两个确认报文段,cwnd从2变到4,依次cwnd从4变到8,再变到16。

(2)拥塞避免:每个轮次拥塞窗口只能线性加1,而不像慢开始,按照指数增长。在拥塞避免阶段,cwnd按照线性规律增长

(3)快重传:就是让发送方尽快重传,而不是等超时重传计时器超时再重传。一旦收到3个连续的重复确认,就将相应的报文段立即重传。

(4)快恢复:一旦收到3个重复确认,就知道只是丢失了个别报文段,于是不启动慢开始算法,而执行快恢复算法。将 cwnd调整为当前窗口的一半,并开始执行拥塞避免算法。

10.http使用的是tcp还是udp

答:基于TCP的可靠传输。

11. https与http的区别,https是如何做到安全性的

答:HTTP是超文本传输协议,信息是明文传输的,存在安全风险问题。HTTPS解决了HTTP不安全的缺陷,在TCP和HTTP网络层之间加入了SSL/TLS安全协议,使得报文能够加密传输。

​ HTTP的连接相对简单,只需要完成TCP的三次握手过程便可进行HTTP的明文传输,而HTTPS还需要进行SS/TLS握手过程,才可以进行加密报文传输。

​ 端口号:HTTP的端口号是80,HTTPS的端口号是443。

12.https是否可以抓包?如果能,那么如何分析包中内容

**HTTPS的传输过程:**客户端发起HTTPS请求,服务端返回证书,客户端对证书进行验证,验证通过后本地生成用于改造对称加密算法的随机数,通过证书中的公钥对随机数进行加密传输到服务端,服务端接收后用私钥解密得到的随机数,之后的数据交互通过对称加密算法进行加解密。

答:HTTPS的数据时加密的,常规下的抓包工具代理请求后抓到的包是加密状态,无法直接进行查看,浏览器会提示安全风险,如果用户授权仍然你可以继续访问网站完成请求。因此客户端使我们自己的终端,我们授权的情况下,便可以组建中间人网络,而抓包工具便是作为中间人的代理。

​ HTTPS只防止用户在不知情的情况下通信被监听,如果用户主动授信,是可以构建“中间人”网络,代理软件可以对传输内容进行解密。

13.get与post请求的区别,post的安全性体现在那里,是否可以发现他的请求内容

答:HTTP请求方式有get,post,put,delete。最常用的就是get和post。

get一般用于请求获取数据,post一般作为发送数据到后台时使用。

**区别:**get请求也可以传参数到后台,但是其参数在url中可见,所以隐私性较差,且参数长度有限制。

​ post请求传递参数放在request body内,不会在url中显示,比get要安全,且参数长度无限制。

post与get底层实现都是基于TCP/IP协议,但是get产生一个tcp数据包,post产生两个tcp数据包。

14.进程与线程的区别,为什么要有进程与线程的区分,协程

答:进程是操作系统分配资源的最小单位,线程是cpu程序执行流的最小单位,也是系统调度和分配cpu的最小单位。

进程是指运行着的应用程序,而现线程是进程内部的单向流通,是进程的一部分。一个进程可以包括多个线程。

进程的独立性强于线程,不同进程之间不能共享资源数据,但是同一进程中的线程可以共享数据。

线程与资源的分配无关,它属于某一个进程,并与进程内的其余进程一起共享进程资源。

创建线程开销更少,一个进程内的线程通信要比进程之间的通信更加快速、有效。

**协程:**协程是比线程更小的一种执行单元,可以认为是轻量级的线程。因为协程所持有的栈比线程要小很多。线程的调度是在操作系统中进行的,而协程的调度则是在用户空间进行的。协程是基于线程实现的,协程的创建、切换、销毁都是在某个线程中进行的。

15.进程的上下文切换

答:上下文切换,也称作进程切换或任务切换,是指CPU从一个进程或线程切换到另外一个进程或线程。

​ 上下文切换包括保存当前任务的运行环境,恢复将要运行任务的运行环境。进程上下文用进程的PCB表示,它包括进程状态,CPU寄存器的值等。

​ 上下文切换过程中,CPU会停止处理当前运行的程序,并保存当前程序运行的具体位置以便之后继续运行。

16.进程的状态

答:运行态,就绪态,阻塞(等待)态。

17.线程通信的方式

线程通信的三种方式:

(1)共享内存volatile:线程之间共享程序的公共状态,线程之间通过读-写内存中的公共状态。

(2)消息传递wait/notify等待通知方式:线程之间没有公共状态,必须通过明确的消息显示来进行通信。

(3)管道流:管道输入/输出流的形式。

18.socket编程,分为客户端和服务端分别说

答:

服务端:建立socket,申明自身的port和IP,并绑定到socket,使用listen监听,然后不断用accept去查看是否有连接。如果有,捕获socket,并通过recv获取消息的内容,通信完成后调用closeSocket关闭这个对应accept到的socket。如果不需要等待任何客户端连接,那么用closeSocket直接关闭自身的socket。

客户端:建立socket,通过端口号和地址确定目标服务器,使用Connect连接到服务器,send发送消息,等待处理,通信完成后调用closeSocket关闭socket

19.jvm内存里的堆和栈的区别和特点,栈针

20.如何应对高并发

21.Redis如何实现分布式锁,及其原理

22.Redis如何实现缓存

23.当一条数据通过Redis和数据库都没有命中时你是如何处理的,如果它重复发过来你怎么处理

24.项目亮点概述

25.{编程}–写一个单例模式,懒汉加载

26{编程}–从100000000个无序浮点数中找到10000个最大的数,要求时间复杂度最低

参考Letcode topK的问题。

class Solution{
public:
    static bool cmp(pair<int,int>&m,pair<int,int>&n){
        return m.second>n.second;
    }

vector<int> topKFrequent(vector<int>&nums,int k){
    unordered_map<int,int>occ;
    for(auto &v:nums){
        occ[v]++;
    }
    //pair pair<int,int>第一个数字代表num,第二个数字代表出现的次数
    priority_queue<pair<int,int>, vector<pair<int,int>>, decltype(&cmp)> q(cmp);
    for(auto &[num,count]:occ){
        if(q.size()==k){
        	if(q.top().second<count){
            	q.pop();
                q.emplace(num,count);
        		}
    		}
        else
            q.emplace(num,count);
    }
    vector<int>ret;
    while(!q.empty()){
        ret.emplace_back(q.top().first);
        q.pop();
    }
    return ret;
    }
};

27.Connections.sort()方法的时间复杂度是多少

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值