字节跳动抖音研发---测试开发三面---面经(附答案)【接口 自动化 web】测试面试题_抖音接口测试

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

五、HTTPS 和 HTTP 的区别:

六、HTTPS 的优点

七、HTTPS 的缺点

八、http 切换到 HTTPS 如何实现

九、网站从 http 过度到 https 需要注意的几个小问题

十、POST 和 GET 的区别

十一、HTTP 常见状态码介绍

十二、什么是泛型?

十三、IO 密集型与 CPU 密集型操作

十四、什么是多态?为什么使用多态?

十五、动态内存回收对程序员有什么好处

十六、浏览器、安卓、ios 系统之间的区别

十七、什么是幂等性?

十八、在 TCP/IP 协议有四层。

十九、http 协议中的信息头 header 包含什么

二十、TCP 的优点


一:前言

嗨咯铁汁们,很久不见,我还是你们的老朋友凡叔,因为看到最近很多的看凡叔文章的小伙伴都在面试,这里给大家出了一篇关于字节的面试题总结,当然也结合了常见的测试面试题,因为篇幅的原因这篇文章只有【1.2w字】但是!注意但是

【文章的末尾给大家留下了大量的福利哦。】

当然大量的大厂面试全套福利肯定少不了。废话少说咱们直接上干货。

一、为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当
Server
端收到
Client
端的
SYN(
同步序列编号
)
连接请求报文后,可以直接发送

SYN+ACK
报文。其中
ACK
报文是用来应答的,
SYN
报文是用来同步的。但是关闭连接时,当

Server
端收到
FIN
报文时,很可能并不会立即关闭
SOCKET
,所以只能先回复一个
ACK
报文,

告诉
Client
端,
"
你发的
FIN
报文我收到了
"
。只有等到我
Server
端所有的报文都发送完了,

我才能发送
FIN
报文,因此不能一起发送。故需要四步握手。

1.1传输层
TCP
传输报文

位于传输层的
TCP
协议为传输报文提供可靠的字节流服务。它为了方便传输,将大块的数

据分割成以报文段为单位的数据包进行管理,并为它们编号,方便服务器接收时能准确地还

原报文信息。
TCP
协议通过

三次握手

等方法保证传输的安全可靠。

客户端发送一个带有
SYN
标志的数据包给服务端,在一定的延迟时间内等待接收的回复。

服务端收到后,回传一个带有
SYN/ACK
标志的数据包以示传达确认信息,最后客户端再回

传一个带
ACK
标志的数据包,代表握手结束,连接成功。

SYN

Synchronize Sequence Numbers
)同步序列编号

ACK (Acknowledgement
)确认字符

FIN

Finish
)结束标志

发送端发送一个
SYN=1

ACK=0
标志的数据包给接收端,请求进行连接,这是第一次握手;

接收端收到请求并且允许连接的话,就会发送一个
SYN=1

ACK=1
标志的数据包给发送端,

告诉它,可以通讯了,并且让发送端发送一个确认数据包,这是第二次握手;最后,发送端

发送一个
SYN=0

ACK=1
的数据包给接收端,告诉它连接已被确认,这就是第三次握手。之

后,一个
TCP
连接建立,开始通讯。

下图也可以这么理解:

客户端:

你好,在家不,有你快递。
”—SYN

服务端:

在的,送来就行。
”-----SYN/ACK

客户端:

好嘞。
”-----ACK
关闭
TCP
连接

为了避免服务器与客户端双方的资源占用和损耗,当双方没有请求或响应传递时,任意一方都可以发起关

闭请求。与创建
TCP
连接的
3
次握手类似,关闭
TCP
连接,需要
4
次握手。

SYN

Synchronize Sequence Numbers
)同步序列编号

ACK (Acknowledgement
)确认字符

FIN

Finish
)结束标志

4
次握手

上图可以这么理解:

客户端:

兄弟,我这边没数据要传了,咱关闭连接吧。
”----FIN

服务端:

收到,我看看我这边有木有数据了。
”----ACK

服务端:

兄弟,我这边也没数据要传你了,咱可以关闭连接了。
”----FIN

客户端:

好嘞。
”----ACK

二、TCP 连接为 什么 C lient 会在发送出 ACK 之后进入到 TIME_WAIT

状态需要经过 2MSL(最大报文段生存时间)才能返回到 CLOSE 状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入
CLOSE
状态了,但是我们必须假

象网络是不可靠的,有可能最后一个
ACK
丢失。所以
TIME_WAIT
状态就是用来重发可能丢

失的
ACK
报文。在
Client
发送出最后的
ACK
回复,但该
ACK
可能丢失。
Server
如果没有收


ACK
,将不断重复发送
FIN
片段。所以
Client
不能立即关闭,它必须确认
Server
接收到了


ACK

Client
会在发送出
ACK
之后进入到
TIME_WAIT
状态。
Client
会设置一个计时器,等


2MSL
的时间。如果在该时间内再次收到
FIN
,那么
Client
会重发
ACK
并再次等待
2MSL

所谓的
2MSL
是两倍的
MSL(Maximum Segment Lifetime)

MSL
指一个片段在网络中最大的存

活时间,
2MSL
就是一个发送和一个回复所需的最大时间。如果直到
2MSL

Client
都没有再

次收到
FIN
,那么
Client
推断
ACK
已经被成功接收,则结束
TCP
连接。

三、为什么不能用两次握手进行连接?

答:
3
次握手完成两个重要的功能,既要双方做好发送数据的准备工作
(
双方都知道彼此已

准备好
)
,也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机
S

C
之间的通信,假定
C

S
发送一个连接请求分组,
S
收到了这个分组,并发 送了确认应答

分组。按照两次握手的协定,
S
认为连接已经成功地建立了,可以开始发送数据分组。可是,

C

S
的应答分组在传输中被丢失的情况下,将不知道
S
是否已准备好,不知道
S
建立什么

样的序列号,
C
甚至怀疑
S
是否收到自己的连接请求分组。在这种情况下,
C
认为连接还未

建立成功,将忽略
S
发来的任何数据分组,只等待连接确认应答分组。而
S
在发出的分组超

时后,重复发送同样的分组。这样就形成了死锁。

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

Server

端怎么处理?

TCP
心跳包的发送,通常有两种技术:

应用层自己实现的心跳包

由应用程序自己发送心跳包来检测连接是否正常,服务器每隔一定时间向客户端发送一个短

小的数据包,然后启动一个线程,在线程中不断检测客户端的回应, 如果在一定时间内没

有收到客户端的回应,即认为客户端已经掉线;同样,如果客户端在一定时间内没有收到服

务器的心跳包,则认为连接不可用。

使用
SO_KEEPALIVE
套接字选项


TCP
的机制里面,本身是存在有心跳包的机制的,也就是
TCP
的选项
.
不论是服务端还是

客户端,一方开启
KeepAlive
功能后,就会自动在规定时间内向对方发送心跳包, 而另一方

在收到心跳包后就会自动回复,以告诉对方我仍然在线。因为开启
KeepAlive
功能需要消耗

额外的宽带和流量,所以
TCP
协议层默认并不开启默认的
KeepAlive
超时需要
7,200

000
MilliSeconds
, 即
2
小时,探测次数为
5
次。对于很多服务端应用程序来说,
2
小时的空闲

时间太长。因此,我们需要手工开启
KeepAlive
功能并设置合理的
KeepAlive
参数

五、HTTPS 和 HTTP 的区别:

https
协议需要到
ca
申请证书,一般免费证书很少,需要交费。

http
是超文本传输协议,信息是明文传输。

https
是一种通过计算机网络进行安全通信的传输协议,经由
http
进行通信,利用

ssl/tls
建立全信道,加密数据包。

tls
是传输层加密协议,前身是
ssl
协议,由网景公司
1995

年发布,有时候两者不区分。

http

https
使用的是完全不同的连接方式用的端口也不一样,
http

80

https


443

http
是一个基于请求与响应,无状态的,应用层的协议,常基于
tcp
/
ip
协议传输数

https
协议是由
ssl+http
协议构建的可进行加密传输、身份认证的网络协议,要比
http

协议安全。

HTTPS

HTTP
的区别主要如下:

1

https
协议需要到
ca
申请证书,一般免费证书较少,因而需要一定费用。

2

http
是超文本传输协议,信息是明文传输,
https
则是具有安全性的
ssl
加密传输协

议。

3

http

https
使用的是完全不同的连接方式,
http
基于
tcp/ip
协议构建的,
https

协议是由
ssl+httpP
协议构建的,
用的端口也不一样,前者是
80
,后者是
443

4

http
的连接很简单,是无状态的;
HTTPS
协议是由
SSL+HTTP
协议构建的可进行加密

传输、身份认证的网络协议,比
http
协议安全。

六、HTTPS 的优点

尽管
HTTPS
并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻

击,但
HTTPS
仍是现行架构下最安全的解决方案,主要有以下几个好处:


1
)使用
HTTPS
协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;


2

HTTPS
协议是由
SSL+HTTP
协议构建的可进行加密传输、身份认证的网络协议,要比
http

议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。


3

HTTPS
是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成

本。


4
)谷歌曾在
2014

8
月份调整搜索引擎算法,并称

比起同等
HTTP
网站,采用
HTTPS
加密的

网站在搜索结果中的排名将会更高

七、HTTPS 的缺点

虽然说
HTTPS
有很大的优势,但其相对来说,还是存在不足之处的:


1

HTTPS
协议握手阶段比较费时,会使页面的加载时间延长近
50%
,增加
10%

20%
的耗电;


2

HTTPS
连接缓存不如
HTTP
高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受

到影响;


3

SSL
证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。


4

SSL
证书通常需要绑定
IP
,不能在同一
IP
上绑定多个域名,
IPv4
资源不可能支撑这个消耗。


5

HTTPS
协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不

到什么作用。最关键的,
SSL
证书的信用链体系并不安全,特别是在某些国家可以控制
CA
根证书的情况

下,中间人攻击一样可行。

八、http 切换到 HTTPS 如何实现

如果需要将网站从
http
切换到
https
到底该如何实现呢?

这里需要将页面中所有的链接,例如
js

css
,图片等等链接都由
http
改为
https
。例如:

http://www.baidu.com
改为
https://www.baidu.com

BTW
,这里虽然将
http
切换为了
https
,还是建议保留
http
。所以我们在切换的时候可以做
http

https
的兼容,具体实现方式是,去掉页面链接中的
http
头部,这样可以自动匹配
http
头和
https
头。

例如:将
http://www.baidu.com
改为
//www.baidu.com
。然后当用户从
http
的入口进入访问页面时,

页面就是
http
,如果用户是从
https
的入口进入访问页面,页面即使
https
的。

九、网站从 http 过度到 https 需要注意的几个小问题

9.1、nginx 配置同时访问 http 和 https

监听
80
端口和
443ssl
端口。 重定向是
rewrite
关键字,直接改变浏览器地址栏的值;
转发是
proxy_pass
关键字,表示转发,浏览器地址栏不变。

9.2、https 协议下,不允许请求 http 协议的资源

https
协议的网站,不支持请求
http
协议的资源(如
js

css
,视频等),所以,从
http
过度


https
的时候,需要注意协议问题。有一个巧妙的方法是,请求资源的时候可以采用相对

协 议 。 比 如 , 本 来 是
https://www.xxx.com/js/1.js

, 此 时 可 以 改 为 相 对 协 议

//www.xxx.com/js/1.js
。这样一来,无论用户访问的是哪一种协议的网站,都会成功。因为,

当遇到相对协议的时候,浏览器会补上协议头(根据访问当前网站的协议)。当然,前提是,

1.js
所在的域名要同时支持
http

https
协议,不然就瞎搞了。

9.3、https 协议下播放 http 协议的视频

如果引入的视频只有
http
能访问(如优酷),那在
https
环境下,则无法播放。解决办法:

使用
iframe
。利用
iframe
标签,可以在里面放置一个
http
页面(播放
http
视频),直接引入

就好。(这个暂时没有实践过,目前只有理论,以后找个时间试试)

十、POST 和 GET 的区别

GET
提交的数据放在
URL
中,
POST
则不会。这是最显而易见的差别。这点意味着
GET
更不

安全(

POST
也不安全,因为
HTTP
是明文传输抓包就能获取数据内容,要想安全还得加密)

GET
回退浏览器无害,
POST
会再次提交请求(
GET
方法回退后浏览器再缓存中拿结果,
POST

每次都会创建新资源)

GET
提交的数据大小有限制(是因为浏览器对
URL
的长度有限制,
GET
本身没有限制),
POST

没有

GET
可以被保存为书签,
POST
不可以。这一点也能感受到。

GET
能被缓存,
POST
不能

GET
只允许
ASCII
字符,
POST
没有限制

GET
会保存再浏览器历史记录中,
POST
不会。这点也能感受到。

GET
在浏览器回退时是无害的,而
POST
会再次提交请求。

GET
产生的
URL
地址可以被
Bookmark
,而
POST
不可以。

GET
请求会被浏览器主动
cache
(缓存),而
POST
不会,除非手动设置。

GET
请求只能进行
ASCII
编码,而
POST
支持多种编码方式。

URL
编码是一种浏览器用来打包请求参数及表单参数的格式
,
参数和参数之间使用
&
分割,


ASCII
码使用
%

16
进制编码替换

如:
https://www.sojson.com/open/api/weather/json.shtml?city=
北京

编码后为:

https://www.sojson.com/open/api/weather/json.shtml?city=%E5%8C%97%E4%BA%AC

GET
请求参数会被完整保留在浏览器历史记录里,而
POST
中的参数不会被保留。

GET
请求在
URL
中传送的参数是有长度限制的,而
POST
么有。

对参数的数据类型,
GET
只接受
ASCII
字符,而
POST
没有限制。

GET

POST
更不安全,因为参数直接暴露在
URL
上,所以不能用来传递敏感信息。

GET
参数通过
URL
传递,
POST
放在
Request body
中。

GET

POST
都是
TCP
链接。
GET
产生一个
TCP
数据包;而
POST
会产生两个
TCP
数据包。
原因:
Get
,浏览器会把
http header

data
一并发送,服务器返回
200

Post
,浏览器先发送
header
,服务器响应
100
,在发送
data
,服务器响应
200

十一、HTTP 常见状态码介绍

200
:请求成功

301
:请求重定向到另外一个接口,资源(网页等)被永久转移到其它
URL

302
:请求重定向到另外一个接口,资源(网页等)临时转移到其它
URL

304
:请求被重定向到客户端本地缓存

400
:客户端请求语法错误(

post
请求用
get
方法)

401
:客户端请求没有经过授权

403
:客户端请求资源没有访问权限,拒绝访问

404
:客户端请求的资源(网页等)不存在(有可能是请求
url
错误或参数不正确)

405
:请求方法不被允许(比如接口只允许
Post,
使用
Get
请求接口)

415

content-type
不正确

500
:服务器内部错误(通常是服务器挂了或接口
Bug)

502
:网关失效

503
:服务端发生临时错误

504
:网关请求超时

分类

分类描述

1**

信息,服务器收到请求,需要请求者继续执行操作

2**

成功,操作被成功接收并处理

3**

重定向,需要进一步的操作以完成请求

4**

客户端错误,请求包含语法错误或无法完成请求

5**

服务器错误,服务器在处理请求的过程中发生了错误

十二、什么是泛型?

泛型将接口的概念进一步延伸,

泛型

的字面意思就是广泛的类型。类、接口和方法代码可

以应用于非常广泛的类型,代码与它们能够操作的数据类型不再绑定在一起,同一套代码可

以用于多种数据类型,这样不仅可以复用代码,降低耦合性,而且还提高了代码的可读性以

及安全性。

十三、IO 密集型与 CPU 密集型操作

IO
密集型,主要涉及到网络、硬盘
IO
的任务,这类任务消耗
cpu
操作很少,任务大部分时
间都在等待
IO
操作的完成,对于
IO
密集型任务,任务越多,
CPU
效率越高,但也有一个限

度。常见的大部分任务都是
IO
密集型任务,比如
Web
应用。对于
IO
密集型操作,对于语

言的运行效率不高,所以一般追求开发效率,使用
python
等脚本语言,

cpu
密集型操作,消耗
CPU
资源,比如计算圆周率、对视频进行高清解码等等,全靠
CPU

的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换

的时间就越多,
CPU
执行任务的效率就越低,所以,要最高效地利用
CPU
,计算密集型任务

同时进行的数量应当等于
CPU
的核心数。对于
CPU
密集型操作,一般使用
C
等效率高的语

言。

十四、什么是多态?为什么使用多态?

父类类型的变量指向子类创建的对象,使用该变量调用父类中一个被子类重写的方法,则父

类中的方法呈现出不同的行为特征,这就是多态。

简单的来说编译时方法行为表现的是父类中的方法,运行时方法行为表现的是子类中重写该

方法的行为特征

二、为什么使用多态?

1
、实现代码的复用,避免代码的冗余;

2
、减少代码之间的关联性,即耦合度,方便后期对代码的修改,功能的改善,不必牵

一发而动全身,减少不必要的麻烦;

3
、能够通过重写子类的方法,使不同的对像具有不同的功能,扩展了功能。

重载、接口、继承三种方法实现多态

十五、动态内存回收对程序员有什么好处

所谓动态内存分配,就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的

方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储回空间,而是由系

统根据程序的需要即时分配,且分配的大小就是程序要求的大小。动态内存的答好处是归纳


8
个字:用时分配,不用释放!

十六、浏览器、安卓、ios 系统之间的区别

浏览器:现在有四大渲染引擎在线:
WebKit

Blink

Trident

Gecko

1
、使用
Trident(
三叉戟
)
内核的浏览器:
IE

Maxthon

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

操作的完成,对于
IO
密集型任务,任务越多,
CPU
效率越高,但也有一个限

度。常见的大部分任务都是
IO
密集型任务,比如
Web
应用。对于
IO
密集型操作,对于语

言的运行效率不高,所以一般追求开发效率,使用
python
等脚本语言,

cpu
密集型操作,消耗
CPU
资源,比如计算圆周率、对视频进行高清解码等等,全靠
CPU

的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换

的时间就越多,
CPU
执行任务的效率就越低,所以,要最高效地利用
CPU
,计算密集型任务

同时进行的数量应当等于
CPU
的核心数。对于
CPU
密集型操作,一般使用
C
等效率高的语

言。

十四、什么是多态?为什么使用多态?

父类类型的变量指向子类创建的对象,使用该变量调用父类中一个被子类重写的方法,则父

类中的方法呈现出不同的行为特征,这就是多态。

简单的来说编译时方法行为表现的是父类中的方法,运行时方法行为表现的是子类中重写该

方法的行为特征

二、为什么使用多态?

1
、实现代码的复用,避免代码的冗余;

2
、减少代码之间的关联性,即耦合度,方便后期对代码的修改,功能的改善,不必牵

一发而动全身,减少不必要的麻烦;

3
、能够通过重写子类的方法,使不同的对像具有不同的功能,扩展了功能。

重载、接口、继承三种方法实现多态

十五、动态内存回收对程序员有什么好处

所谓动态内存分配,就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的

方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储回空间,而是由系

统根据程序的需要即时分配,且分配的大小就是程序要求的大小。动态内存的答好处是归纳


8
个字:用时分配,不用释放!

十六、浏览器、安卓、ios 系统之间的区别

浏览器:现在有四大渲染引擎在线:
WebKit

Blink

Trident

Gecko

1
、使用
Trident(
三叉戟
)
内核的浏览器:
IE

Maxthon

[外链图片转存中…(img-k3CnSzmu-1715804679790)]
[外链图片转存中…(img-Tr5zW1Uw-1715804679790)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值