【字节跳动】一面凉经-答案参考

原文面经:
【字节跳动】——后端研发实习生Java 一面 凉经

本文答案均来自笔者自己寻找的答案,不具权威性,如有更好答案,欢迎下方留言!!!

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

答:一个完整的http请求应该包括以下基本流程
域名解析——》TCP三次握手建立连接——》发起http请求——》服务端接受请求并作出响应——》浏览器收到响应并解析html代码——》TCP四次挥手断开连接——》浏览器渲染页面呈现给用户
---------------------------------------
部分原理补充解释:
1)为了将消息从你的PC上传到服务器上,需要用到IP协议、ARP协议和OSPF协议。
IP协议:主要包括寻址和分段应用于网际层(TCP/IP模型中,和OSI七层模型中的网络层相似)。IP可以根据数据包包头中包括的目的地址将数据包传送到目的地址,在此过程中IP负责选择传送的道路,这种选择道路称为路由功能。如果有些网络内只能传送小数据包,IP可以将数据包重新组装并在报头域内注明
ARP协议:是数据链路层协议(OSI七层模型中),用来进行本网段内主机ip和mac地址的对应
OSPF协议:路由选择协议,他是链路状态型
2)域名解析的详细内部过程
如上图是基本流程,本地域名服务器最终将得到的IP返回给操作系统,同时将它缓存起来,操作系统再将IP地址返回给浏览器,浏览器也将他缓存起来。这样,浏览器就得到了最终的IP地址。

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

答:实际下载速度=带宽/8,这是理论上的值。所以10M的带宽的下载速度是 10M/8=1.25M/S,也就是最大下载速度1.25MB

4.tcp与udp的区别概述

答:
UDP TCP
是否连接 无连接 面向连接
是否可靠 不可靠,没有确认机制、流量控制和拥塞控制 可靠,有确认机制、流量控制和拥塞控制
连接对象个数 支持一对一,一对多,多对一和多对多交互通信 只支持一对一通信
传输方式 面向报文 面向字节流
首部开销 首部开销小,固定8字节 首部开销较大,最小20字节,最大60字节
适用场景 适用于实时应用(IP电话、视频会议、直播等) 适用于要求可靠传输的应用,如文件传输等

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


建立三次握手主要是因为A发送了再一次的确认,那么A为什么会再确认一次呢,主要是为了防止已失效的连接请求报文段又突然传送给B,从而产生了错误。
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。


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

答:dns解析有两种查询方式,分为递归查询和迭代查询。一般的主机向本地域名服务器的查询使用递归查询,本地域名服务器向根域名服务器查询使用迭代查询。它使用的是UDP协议,原因是性能更好,查询时间更短,如果发生数据丢失,重传一个就好了,不需要建立连接


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

答:rpc是可以使用tcp/udp/http,但是一般都用的tcp。至于原因,以及tcp性能更好,我实在不知道!!


8.udp如何做到可靠传输

答:最简单的方式是在应用层模仿传输层TCP的可靠性传输。下面不考虑拥塞处理,可靠UDP的简单设计。

  • 1、添加seq/ack机制,确保数据发送到对端
  • 2、添加发送和接收缓冲区,主要是用户超时重传。
  • 3、添加超时重传机制。


9.tcp的拥塞控制

答:实现的算法主要有四种:1.慢开始、2.拥塞避免、3.快重传、4.快恢复。
  • 慢开始由小到大逐渐增大发送窗口(例如:发送方此时可以连续发送两个数据报文段,接收方收到该数据报文段后,给发送方一次发回2个确认报文段,发送方收到这两个确认报文后,将拥塞窗口的值加2变为4,发送方此时可连续发送4个报文段,接收方收到4个报文段后,给发送方依次回复4个确认报文,发送方收到确认报文后,将拥塞窗口加4,置为8,发送方此时可以连续发送8个数据报文段,接收方收到该8个数据报文段后,给发送方一次发回8个确认报文段,发送方收到这8个确认报文后,将拥塞窗口的值加8变为16)
  • 拥塞避免:也就是每个传输轮次,拥塞窗口cwnd只能线性加一,而不是像慢开始算法时,每个传输轮次,拥塞窗口cwnd按指数增长。
  • 快重传:就是尽快进行重传,而不是等超时重传计时器超时再重传

  • 快恢复:当检测到丢包时,TCP 会触发快速重传并进入降窗状态。该状态下 cwnd 会通过快速恢复算法降至一个合理值

10.http使用的是tcp还是udp

答:http底层用什么协议得分版本,http1.0和http2.0都是基于tcp;http3.0是基于udp的,利用介于传输层和应用层之间的一个协议QUIC协议保证可靠传输

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

答:区别:
1、加密:http协议对传输的数据不进行加密;https协议对传输的数据***L安全协议进行加密,https加密需要CA签发的证书。
2、端口:http协议使用TCP的80端口;https协议使用TCP的443端口
3、网络分层模型:http可以明确是位于应用层;https是在http的基础上加上了SSL安全协议,而SSL是运输层协议,所以https是应用层和传输层的结合
https通过SSL安全协议来保障安全性。具体体现在密钥和证书验证上。
密钥
1、服务端生成一对公钥和私钥,将公钥和证书发送给客户端;
2、客户端验证证书通过后生成一个对称加密的密钥,并使用服务器生成的公钥加密,发送给服务器;
3、服务器使用私钥解密获得对称加密密钥。
4、客户端和服务器相互发送消息认可对称加密密钥,至此加密通道建立。
5、开始数据传输,在检验数据完整性的基础上,使用对称加密密钥进行加密解密。
证书验证
一般来说浏览器都内置了权威CA的根证书,客户端使用根证书的密钥对服务器发来的证书进行解密验证,若域名、有效期、签发机关等验证项符合则通过,否则认定证书无效,断开连接。

另外,目前的https基本都是使用TSL了,参考博客 https://blog.csdn.net/liuchaoxuan/article/details/81878219


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

答:可以抓包,具体过程参考这篇博客 https://www.jianshu.com/p/870451cb4eb0

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

答:区别
1. GET把参数包含在URL中,POST通过request body传递参数
2. GET请求会被浏览器主动cache,而POST不会,除非手动设置。
3. GET产生一个TCP数据包;POST产生两个TCP数据包。
4. GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
5. GET请求只能进行url编码,而POST支持多种编码方式
6. GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
7. GET产生的URL地址可以被Bookmark,而POST不可以
8. GET在浏览器回退时是无害的,而POST会再次提交请求
9 由于(主流)浏览器的一些限制,导致get请求所传输的数据长度和字符编码(ASCII)受到一些限制,但是post请求一般未对其进行限制,所以支持更多的编码和数据长度
post的安全性主要体现在上面的2,4,5,6点。可以通过抓包的形式获取到他的请求内容,不过,可能需要进行转码,解密。


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

答:
1、进程资源分配的最小单位线程程序执行的最小单位资源调度的最小单位
2、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。
线程共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
3、线程之间的通信更方便同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
4、但是多进程程序更健壮多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
协程
英文Coroutines,是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。

15.进程的上下文切换

答:   操作系统内核使用一种称为上下文切换的较高层形式的控制流来实现多任务。内核为每一个进程维持一个上下文。上下文就是内核重新启动一个被抢占的进程所需的状态。
参考博客 https://blog.csdn.net/lixungogogo/article/details/52202714

16.进程的状态

答:

17.进程,线程通信的方式

答:
线程通信
volatile,等待/通知机制,join方式,threadLocal
进程通信
管道,消息队列,共享内存,信号量,socket,信号,文件锁

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

答:参考博客 https://blog.csdn.net/qianqian_blog/article/details/85480456

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


20.如何应对高并发
21.Redis如何实现分布式锁,及其原理
22.Redis如何实现缓存

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

答:这里说的就是缓存穿透的处理,一般使用布隆过滤

25.{编程}--写一个单例模式,懒汉加载
26{编程}--从100000000个无序浮点数中找到10000个最大的数,要求时间复杂度最低

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

答:nlogn

还有很多问题暂时没有回答,后面会继续更新,或者有大佬知道答案,欢迎评论下方留言,后面将好的回答复制上来!!!!!
#字节跳动校招抖音内推头条内推字节跳动内推##实习##面经##字节跳动##Java工程师#
全部评论
不是代码的题,记住背就可以了,八股文,很多公司都会考。
6 回复 分享
发布于 2021-03-21 16:56
楼主第十条错了哦,http底层用什么协议得分版本,抛开版本来讲都是不严谨的,http1.0和http2.0都是基于tcp,http3.0是基于udp的,利用介于传输层和应用层之间的一个协议QUIC协议保证可靠传输
2 回复 分享
发布于 2021-03-21 18:57
计算机网络我是看小林的😁
2 回复 分享
发布于 2021-03-21 23:55
周四下午要面试的我看到心慌慌😥
1 回复 分享
发布于 2021-03-22 10:04
你是真的强,昨天对着你的面经找答案,找了一半,今天你就快找完了!!!你这应该可以啊,找得这么快说明之前还是有基础的,面试应该答出了现在的大部分吧,剩下的redis和高并发只要你没在你简历上写出会这些应该问题不大吧
点赞 回复 分享
发布于 2021-03-21 13:24
楼主tql
点赞 回复 分享
发布于 2021-03-21 15:38
26题,要求的是时间复杂度最低。开那么大一个数组,然后按照大小放进对应下标里,倒序输出最后要求的个数----考研舍友说是数据结构的原题
点赞 回复 分享
发布于 2021-03-21 15:55
进程和线程通信写反了
点赞 回复 分享
发布于 2021-03-21 16:28
有些问题虽然找到答案了,但也打算放弃了,因为太多太复杂,例如那个https抓包,被问到只能说不会了😌
点赞 回复 分享
发布于 2021-03-21 16:50
26题是top K问题吧,用最小堆来做应该是On最小的了
点赞 回复 分享
发布于 2021-03-21 17:44
楼主一面了多久啊
点赞 回复 分享
发布于 2021-03-21 18:03
想知道楼主投的是字节的什么部门?就是好奇~
点赞 回复 分享
发布于 2021-03-21 18:57
哈啰出行春招补录开始: https://www.nowcoder.com/discuss/618847
点赞 回复 分享
发布于 2021-03-21 20:04
get请求不是一个http包吧?
点赞 回复 分享
发布于 2021-03-21 20:29
请问Connections.sort()是哪个方法呀,是Collections.sort()吗
点赞 回复 分享
发布于 2021-03-21 21:47
问get post有区别的都是没水平的 本质没区别
点赞 回复 分享
发布于 2021-03-22 00:57
第13条,get 并不能模糊的说只支持 ASCII 字符,而是浏览器的地址栏那一块为了兼容性使用了 percent encoding,所以才会有 Get 只支持 ASCII 的说法(长度也类似,浏览器不同限制不同),实际上自己构造请求符合 HTTP 的请求支持中文,也不限制长度的
点赞 回复 分享
发布于 2021-03-22 09:29
我想问一下,春招的结果会影响秋招吗
点赞 回复 分享
发布于 2021-03-22 10:02
借楼,社招校招都可,美团到家团好货用户组招聘,欢迎骚扰
点赞 回复 分享
发布于 2021-03-22 10:48
哈啰出行春招补录开始: https://www.nowcoder.com/discuss/618847
点赞 回复 分享
发布于 2021-03-22 12:33

相关推荐

头像
11-21 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
186 1209 评论
分享
牛客网
牛客企业服务