GitHub:https://github.com/AFITS/TestGuide.git
整理内容包含字节、阿里、腾讯等一线大厂的测试、测试开发的常见面试题,同时也是对自我的一种基础总结。
Author : UUT
测试/测试开发工程师最常遇见的知识点就是计算机网络,频率仅次于项目经历。
应表会传网数物
应用层:HTTP(超文本)、DNS(域名系统)、SMTP(邮件传输)
表示层
会话层
传输层:TCP(传输控制协议)、UDP(用户数据协议)
网络层:IP
数据层
物理层:TCP/IP
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rWrQ3yWs-1651679328364)(C:\Users\smart\AppData\Roaming\Typora\typora-user-images\image-20220402013919134.png)]
1、特点
面向链接:TCP提供面向链接的服务,在传输数据之前必须先建立链接,数据传送结束后要释放链接;UDP是无连接的。
传输可靠性:TCP传递之前的三次握手来建立链接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,数据传输完成后,会断开连接来节约资源。
传输形式:TCP为字节流、UDP为数据报文段
2、性能
3、应用场景
UDP经常使用在即时通信方向,要求速度快。如:语音、直播等场景
TCP经常在文件传输、发送和接收邮件、远程登录,要求可靠性。
换一种问法,为什么是三次握手而不是四次或者两次?
0、三次收发确认双方收发过程正常,两次不满足,四次没必要
1、第一次,客户端发送SYN,什么都无法确认,服务端接受SYN,证明对方发送正常,自己接收正常
2、第二次,服务端发送SYN/ACK,客户端接收到后,知道:自己发送、接受正常,对方发送、接受正常
3、第三次,客户端发送ACK,服务端接受后,知道:自己发送、接受正常,对方发送、接受正常
1、任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另⼀方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。
2、可以理解为打电话,A跟B说A不再说了,但是B可能还会说,A还在接受;只有B也说不说啦,才会结束。(两次结束确认)
3、四次握手过程
客户端发送一个FIN,用来关闭客户端到服务端的数据传输
服务端收到后,返回ACK,确认序号为收到序号+1
服务端关闭链接,服务端发送一个FIN给客户端
客户端收到后返回ACK,确认序号为收到序号+1
FIN-WAIT1、FINWAIT2、TIME、WAIT、CLOSE
CLOSE-WAIT、LAST-ACK、CLOSE
建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
TCP头部序号的位数
1、 应⽤数据被分割成 TCP 认为最适合发送的数据块。
2、TCP 给发送的每⼀个包进⾏编号,接收⽅对数据包进⾏排序,把有序数据传送给应⽤层。
3、校验和:TCP 将保持它⾸部和数据的检验和。这是⼀个端到端的检验和,⽬的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报⽂段和不确认收到此报⽂段。
4、TCP 的接收端会丢弃重复的数据。
5、流量控制:TCP 连接的每⼀⽅都有固定⼤⼩的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收⽅来不及处理发送⽅的数据,能提示发送⽅降低发送的速率,防⽌包丢失。TCP 使⽤的流量控制协议是可变⼤⼩的滑动窗⼝协议。 (TCP 利⽤滑动窗⼝实现流量控制)
6、拥塞控制: 当⽹络拥塞时,减少数据的发送。
7、ARQ协议:也是为了实现可靠传输的,它的基本原理就是每发完⼀个分组就停⽌发送,等待对⽅确认。在收到确认后再发下⼀个分组。
8、超时重传:当 TCP 发出⼀个段后,它启动⼀个定时器,等待⽬的端确认收到这个报⽂段。如果不能及时收到⼀个确认,将重发这个报⽂段
慢开始:开始发送时,避免一下大量数据字段涌入导致网路阻塞。由小到大逐渐增大拥塞窗口数值。cwnd(拥塞)初始值为1,每经过⼀个传播轮次,cwnd加倍。
拥塞避免:拥塞避免算法的思路是让拥塞窗口cwnd缓慢增⼤,即每经过⼀个往返时间RTT就把发送放的cwnd加1。
快重传与快恢复(FRR):没有FRR,当丢包时,TCP会暂停传输;有FRR,当存在不按顺序的数据段,会给发送机发送一个重复确认,若收到三个3个连续确认,则重新传输。
UDP的可靠性传输其实就是借鉴TCP的思路。保证可靠性传输可以围绕以下几个方面:ACK机制、重传机制、序号机制、重排机制、窗口机制。
1、ACK机制:接收到包之后即发送ACK进行确认。
2、重传机制
(1)停等协议
1、浏览器查找域名的IP
2、浏览器向WEB服务器发送一个HTTP请求
3、WEB服务器处理相应请求
4、服务器返回一个HTML相应
5、浏览器显示HTML
可以理解为打车去买菜:DNS就是车,资源就是菜
5XX:服务器
4XX:服务器无法处理请求(客户端)
HTTP与HTTPS区别
端口
安全性和资源消耗
Https加密的过程
1.1 和 1.0
长链接
节约带宽
HOST域
缓存处理
错误通知
1.1 和 2.0
多路复用
数据压缩
服务端推送
短连接
长链接
怎么实现
token
cookie
类型
用法
格式
session
定义
Session(会话):用来在<服务端>记录用户状态
Session会有一定的时间限制
理解
Session机制的存在就是为了解决HTTP无状态问题
在添加商品到购物车时,系统不知道是哪个用户操作的,因为HTTP是无状态的,所以服务端给特定用户添加Session可以表示并跟踪用户。
安全性问题
如果禁用cookie会怎样?
隐藏通信细则,无需直接处理Socket和HTTP
RPC和HTTP的差异
协议
效率
物理层
多个线程共享进程的堆和方法区(JDK1.8后),但是每个线程有自己的程序计数器、虚拟机栈和本地方法栈
线程是进程划分的更小运行单位,一个进程在执行过程中可以产生多个线程。
进程和线程最大区别是,进程运行是独立的,但是线程运行则不一定,因为同一进程中的线程极有可能会相互影响。线程开销小, 但是不利于资源的管理和保护,进程正相反。
初始、运行、阻塞、等待、超时等待、终止态
创建、就绪、运行、阻塞、结束
1、先到先服务
2、短作业优先
3、时间片轮转调度
4、多级反馈队列调度
锁分为线程锁&分布式锁。线程锁常考问题为:产生死锁条件、避免死锁、实现锁;分布式锁常考问题为:什么是分布式锁、如何实现分布式锁。
1、互斥
2、不可剥夺
3、请求保持
4、循环等待
面了几家大厂中,基本问的很少,当然这也看面试官的喜好。把常用的命令记住就可以了,列出几道题作参考。
运行时,编译源码(.java)为字节码(.class),虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转化解析和初始化,最终形成虚拟机可以用的java类型,这就是虚拟机的类加载机制。
加验准解初使卸,类加载机制必须包含:加载、验证、准备、解析、初始化五步
字节流:通过全限定类名来获取定义此类的二进制字节流。
数据结构:将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
数据入口:在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。
为类的静态变量赋予正确的初始值(上述过程中的静态变量都是虚拟机设置的默认值,此处赋予的才是程序员真正赋予的值),执行静态代码块
到初始化阶段,才真正开始执行类中定义的 Java 程序代码,此阶段是执行 () 方法的过程。
JVM提供3种类加载器(Class Loader),还可以用户自定义加载UserClassLoader
1、应用:(AppClassLoader)
2、扩展(ExtClassLoader)
3、启动:Bootstrap ClassLoader
4、用户自定义:UserClassLoader
1、自底向上看是否加载过
2、自顶向下依次加载
1、安全性,避免用户定义的类替换了核心类,如String类的替换(阿里面试题)
2、避免限定命名的类重复加载,findLoadClass(),判断当前类是否已经加载
如何自己写一个String类,并进行替换?
JDK1.6和JDK1.8的内存结构是不一样的,主要体现在方法区的变化。
网吧网管,记录游戏存档,对应的也是记录线程执行位置。
为了线程切换后能恢复到正确的执⾏位置,每条线程都需要有⼀个独⽴的程序计数器,各 线程之间计数器互不影响,独⽴存储,我们称这类内存区域为“线程私有”的内存。
从上面的介绍中我们知道程序计数器主要有两个作⽤:
1、虚拟机栈又称作栈,用于存基础类型,如boolean、byte、char、integer等等类型。
2、在线程共享中的堆中,用来存储新建的对象,如String或者是其他class生成的对象,堆中的对象会调用虚拟机栈中的基础类型(堆调用栈)。
当然还有如变量表、操作数栈、常量引用池等等信息,从发发调用直到引用完成。
本地方法的栈,包含其他语言编写的,被Native修饰的方法
本地方法栈用来存储一些Native定义的方法,之前在JVM中,在1.8之后被放在内存中
转换为元空间之后,其上限就是计算机内存的大小,但是同时可以用参数限制,如
存放方法区常量和类元数据信息等等
说明
栈是线程私有的,栈的最小单位是栈帧,栈帧中包含,局部变量表、操作数栈、动态链接栈、方法出口
局部变量表
操作数栈
动态链接
方法出口
为何要有栈帧
类似于页面切换,每个方法作为一个帧,有利于资源及时释放,并且对操作记录,方法为单位
分配策略
1、对象优先在Eden区分配
2、大对象直接进入老年代
3、长期存活的对象将进⼊老年代
作用
优点
存储
GC的模式
分代式
YoungGC
Full GC
频繁FullGC的原因
准确分类
Partial GC
Full GC
Collection中包含
常见的容器类
map和haspmap以及并发安全性
继承
封装
多态
定义
我们在程序中定义的引用变量所指向的具体类型和通过该引用变量的方法调用在编程的时候并不确定,当处于运行期间才确定。就是这个引用变量究竟指向哪一个实例对象,在编译期间是不确定的,只有运行期才能确定,这样不用修改源码就可以把变量绑定到不同的类实例上,让程序拥有了多个运行状态,这就是多态。
实现
继承父类
实现接口
优点
字节特别喜欢考的SQL
1、什么是事务,事务的四大特征
事务:是逻辑上的一组操作,要么都执行,要么都不执行
2、并发事务带来的问题?
1、脏读
2、丢失修改
3、不可重复读
4、幻读
举个项目中的例子说明事务,如银行转账
1、左连接、右链接、全连接、内连接
on 和 where
驱动表(主表)
链接
内连接
外连接
2、order by desc/asc
3、distinct
limit 1,1
常见函数
ifNull()
核心技术
测试
数据访问
Web支持
为什么用消息中间件?
用MQ不用RPC的原因
MQ解耦
RPC响应
MQ测试点(字节)
中间件的测试要根据他的特点来测试,RocketMQ具有发布和订阅消息的
消费场景
正常的参数是否可以推送到指定TOPIC下
异常逆向参数是否有处理
多次发送消息,是否重复消费
pull和push的消费类型
消费顺序
消费可靠
查看数据存储,数据持久化时间
数据丢失过程中的消息补发机制(网络等)
消费堆积,验证可用性
集群中一个Broker挂掉,验证可用
1、Kafka是什么?主要应用场景
是一个分布式流式处理平台
关键功能
应用场景
2、与其他消息队列相比,kafka的优势?
3、队列模型了解么?kafka的消息模型知道么?
1、队列模型
使用队列(Queue)作为消息通信载体,满足生产者消费者模式,一条消息只能被一个消费者使用,未被消费的消息在队列中保留到直被超时。
队列模型问题
2、kafka消息模型
kafka使用的是发布-订阅模型
使用主题(Topic)作为消息通信的载体,类似于光布,发布一条消息,消息通过主题传递给所有订阅者(未订阅是受不到的)
可以兼容队列模型,当只有一个订阅者时,在功能层面与队列模型相同
4、什么是Product、Consumer、Broker、Topic、Partition?
broker(代理),单独的kafka实例,多个kafka Broker组成一个kafka Cluster。
partition(分区),Partition属于Topic的一部分,一个topic可以有多个partition,并且同一个Topic下的Partition可以分布在不同的Broker下,也就表明一个Topic可以横跨多个Broker。
5、kafka多副本机制解么?有什么好处
kafka为分区partition引入了多副本(Replica)机制。区分Partition中的多个副本之间会有一个leader跟多个其他副本follower,为我们发送的消息会被发送到leader副本,然后follower拉取leader副本中的消息同步。
生产者和消费者至于leader副本交付,其他副本为leader副本的拷贝。当leader发生故障时,会从follower中选取一个leader。
多分区(Partition)、多副本(Replica)机制好处
6、zookeeper中的kafka中的作用
1、需要自己搭建一套
主要事情
8、kafka如何保证消息的消费顺序
如何保证消息不丢失
如何保证消息不重复消费
1、什么是Netty
1、是一个基于NIO的Client-Server(客户端服务端)框架,可以快速简单开发网络应用程序
2、它极大的优化了TCP和UDP套接字服务器等网络编程,并且性能以及安全性很多方面更好
3、支持多协议 如FTP、SMTP、HTTP以及各种二进制和基于文本的传统协议
总结:Netty成功的找到了一种在不妥协可维护性和性能的情况下易于开发、性能、稳定性和灵活性的方法。
子主题 2
主流程
边界值
混合参数
异常场景
性能测试
RPC接口和HTTP接口
12306买票系统,查处车次,车站,车站名称和地点不能相关
微信红包的测试用例设计
定义
场景
避免方式
token机制
唯一索引
删除delete
查询Select
悲观锁
乐观锁
分布式锁