2025/2/25,字节跳动后端开发一面面经
一、双方简单自我介绍
面试官先自我介绍,之后属于面试官看简历过程,基本不听。
二、实习中遇到最难的事情,怎么解决的
主要问的还是实习中做过的项目,项目难点在哪里(自己参与的地方),面对困难是怎么思考,怎么实际操作解决的。
三、项目实现细节
掌握自己项目的实现细节,否则容易让面试官怀疑项目的真实性。
四、八股
1、浏览器从输入网址到呈现整个流程
键盘输入
输入键盘字符后键盘就会产生扫描数据,并将其缓冲存在寄存器中,然后键盘通过总线给 CPU 发送中断请求。CPU 收到中断请求后,操作系统会保存被中断进程的 CPU 上下文,然后调用键盘的中断处理程序。键盘中断处理函数从键盘的寄存器的缓冲区读取扫描码,再根据扫描码找到用户在键盘输入的字符的ASCII 码。然后把 ASCII 码放到读缓冲区队列,显示器会定时从读缓冲区队列读取数据放到写缓冲区队列,最后把写缓冲区队列的数据一个一个写入到显示器的寄存器中的数据缓冲区,最后将这些数据显示在屏幕里。
URL解析
浏览器会首先从缓存中找是否存在域名,如果存在就直接取出对应的ip地址,如果浏览器缓存和操作系统缓存中没有该域名对应的IP地址记录,则发起DNS查询来获取目标服务器的IP地址。这包括检查本地DNS解析器、向本地DNS服务器请求、递归查询根DNS服务器、顶级域名服务器(TLD)以及权威DNS服务器。
TCP连接
在URL解析过程中得到真实的IP地址之后,会调用Socket函数建立TCP连接。
HTTP请求
浏览器向服务器发起一个 HTTP请求,HTTP协议是建立在TCP协议之上的应用层协议,其本质是建立起的 TCP连接中,按照 HTTP协议标准发送一个索要网页的请求。请求包含请求行、请求头、请求体三个部分组成,有GET、POST等主要方法。
浏览器接收响应
服务器在收到浏览器发送的HTTP请求之后,会将收到的HTTP报文封装成HTTP的Request对象,并通过不同的Web服务器进行处理,处理完的结果以HTTP的Response对象返回,主要包括状态码,响应头,响应报文三个部分。
页面渲染
浏览器根据响应开始显示页面,首先解析 HTML文件构建DOM树,然后解析CSS文件构建渲染树,等到渲染树构建完成后,浏览器开始布局渲染树并将其绘制到屏幕上。
断开连接
客户端和服务器通过四次挥手终止TCP连接。
2、DNS流程
DNS将人类可读的域名转换为计算机网络通信所需的IP地址。
1. 浏览器缓存检查
本地缓存:当用户尝试访问一个网站时,浏览器首先会检查其自身的DNS缓存,看是否已经存储了该域名对应的IP地址。如果有,直接使用该IP地址进行连接,无需进一步查询。
2. 操作系统缓存检查
如果浏览器缓存中没有找到相应的记录,则操作系统会在其DNS缓存中查找。如果找到了匹配项,同样可以直接使用而不必发起新的DNS查询。
3. 查询本地DNS解析器
若上述两个层级的缓存都没有命中,操作系统将向配置的本地DNS解析器发送请求。这个解析器通常是用户的ISP(互联网服务提供商)提供的DNS服务器,或者是用户手动设置的一个公共DNS服务器(如Google DNS、Cloudflare DNS等)。
4. 递归查询(从大往小查,从粗往细查)
查询根域名服务器:本地DNS解析器若未在自己的缓存中找到答案,则会执行递归查询。首先联系根域名服务器(Root DNS Servers)。全球共有13组这样的服务器,它们不直接提供具体的域名到IP地址的映射,而是指向更具体的顶级域名(TLD)服务器。
查询顶级域名服务器(TLD):根据要查询的域名后缀(例如.com、.org),根域名服务器返回负责该TLD的权威DNS服务器的信息。然后,本地DNS解析器继续向这些TLD服务器发出查询。
查询权威域名服务器:TLD服务器返回管理特定域名的权威DNS服务器的地址。最后,本地DNS解析器向这些权威DNS服务器发起最终查询以获取确切的IP地址信息。
5. 返回结果
权威DNS服务器响应本地DNS解析器的查询,提供目标域名对应的IP地址。然后,这个IP地址被传递回给操作系统,并由操作系统转发给应用程序(如浏览器)。
应用程序使用获得的IP地址建立与目标服务器的TCP/IP连接,从而完成整个域名解析过程并开始数据传输。
6. 缓存结果
在上述过程中,每一步得到的结果通常都会被缓存起来,以便于后续相同域名的查询能够快速响应。缓存的时间长度由DNS记录中的TTL(Time To Live)字段决定。
3、TCP和UDP的应用
TCP 的典型应用场景
TCP 是面向连接、可靠、有序 的协议,适用于对数据完整性要求高、需要保证传输可靠性的场景:
-
网页浏览(HTTP/HTTPS)
- 浏览器与服务器之间的页面请求和资源传输(如HTML、图片)需要可靠传输,确保数据不丢失、不乱序。
-
文件传输(FTP、SFTP)
- 文件传输协议(FTP)依赖TCP确保文件内容完整无误地传输,避免数据损坏。
-
电子邮件(SMTP、IMAP/POP3)
- 邮件发送(SMTP)和接收(IMAP/POP3)需要可靠传输,确保邮件内容不丢失。
-
远程登录(SSH、Telnet)
- 远程终端连接(如SSH)需要逐字节的可靠传输,避免指令乱序或丢失。
-
数据库连接(MySQL、PostgreSQL)
- 数据库操作对数据一致性要求极高,TCP的可靠性确保SQL查询和事务的正确执行。
-
即时通讯(微信、QQ消息)
- 文字聊天、文件传输等需要保证消息不丢失且按顺序到达。
UDP 的典型应用场景
UDP 是无连接、不可靠、快速 的协议,适用于对实时性要求高、延迟低、能容忍少量丢包的场景:
-
实时音视频通信(VoIP、直播)
- 如Zoom、Skype的语音通话和视频会议,使用UDP(RTP协议)减少延迟,容忍偶尔的丢包。
- 直播平台(如Twitch、YouTube Live)通过UDP传输实时视频流,避免TCP重传导致的卡顿。
-
在线游戏
- 游戏中的实时位置更新、玩家动作同步(如《王者荣耀》《CS:GO》)使用UDP,低延迟比完美可靠性更重要。
-
DNS查询
- 域名解析通常使用UDP(端口53),因为请求和响应数据包较小,且可以接受偶尔的重试。
-
网络广播/多播
- 如实时股票行情推送、局域网内的流媒体广播(UDP支持一对多传输)。
混合使用场景
某些应用会结合TCP和UDP的优势: