因为读者里有不少刚入门测试的同学,这两天抽空整理了一份字节测开实习的面试题答案,说实话这个题目真挺简单的,如果你面大厂碰到此类面试题,也算是运气很好啦。大家也可以先自测一下,看看自己能不能答上来。
如果觉得有些知识点只是了解,但一问又说不上来的话,建议面试前去补补基础。我高中数学老师的口头禅就是:“半懂不懂,就是不懂。”
HTTP 协议传输的数据都是未经加密的,即明文的,因此使用 HTTP 协议传输隐私信息不安全。
为了保证隐私数据能够加密传输,于是使用SSL 协议用于对 HTTP 协议传输的数据进行加密,即 HTTPS;
HTTPS 协议是 HTTP + SSL 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 更加安全。
HTTP和HTTPS两者的区别主要有:
HTTPS 需要到 CA 申请证书,一般免费证书较少,因此需要一定费用;
HTTP 是超文本传输信息,信息是明文传输;HTTPS 是具有安全性的 SSL 加密传输协议;
HTTP 和 HTTPS 使用的是完全不同的连接方式,HTTP 默认使用 80 端口,而 HTTPS 默认使用 443 端口;
HTTP 的连接简单,是无状态的;而 HTTPS 是 SSL + HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全;
HTTP状态码大致分类如下:
较为常见的几种状态码:
【1xx】
100 -(Continue):
客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。
101 -(Switching Protocols):
切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议。
【2xx】
200 -(OK):请求已成功,请求所希望的响应头或数据体将随此响应返回。
201 -(Created):已创建。成功请求并创建了新的资源。
【3xx】
301 -(Moved Permanently):
永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替。
302 -(Found):
临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI。
304 -(Not Modified):
未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源。
【4xx】
400 -(Bad Request):客户端请求的语法错误,服务器无法理解。
403 -(Forbidden):服务器理解请求客户端的请求,但是拒绝执行此请求。
404 -(Not Found):服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面。
【5xx】
500 -(Internal Server Error):服务器内部错误,无法完成请求。
502 -(Bad Gateway):充当网关或代理的服务器,从远端服务器接收到了一个无效的请求。
503 -(Service Unavailable):由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中。
504 -(Gateway Time-out):充当网关或代理的服务器,未及时从远端服务器获取请求。
大多数情况是运营商HTTP劫持。
当我们使用HTTP请求请求一个网站页面的时候,网络运营商会在正常的数据流中插入精心设计的网络数据报文,让客户端(通常是浏览器)展示“错误”的数据,通常是一些弹窗,宣传性广告或者直接显示某网站的内容。
HTTP 劫持的实现原理
用户的浏览器访问网页,发送HTTP请求,运营商的路由器会在TCP链接中,过滤出HTTP请求,并进行标识。
随后,抢在被访问的网站正常响应前,对此次浏览器发起的请求进行重定向,然后将被访问的网站正常响应数据包丢弃掉;
或者是运营商路由器接收了网站正常响应,然后对响应的HTML代码进行“加工修改”,比如:加了一段恼人的广告,然后再把修改后的HTML代码扔给浏览器进行渲染。(其实跟中间人代理的原理差不多)
从上述原理中看出,如果需要进行HTTP劫持,首先需要进行标记:如果是HTTP协议,那么进行劫持,否则不进行劫持。
进程是资源分配的最小单位,线程是程序执行的最小单位。
进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。
而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很位。
线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据。而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
锁机制:包括互斥锁、条件变量、读写锁。
互斥锁:提供了以排他方式防止数据结构被并发修改的方法。
读写锁:允许多个线程同时读共享数据,而对写操作是互斥的。
条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
信号量机制(Semaphore):包括无名线程信号量和命名线程信号量。
信号机制(Signal):类似进程间的信号处理。
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。
JAVA多线程实现方式主要有四种:
继承Thread类;
实现Runnable接口;
实现Callable接口通过FutureTask包装器来创建Thread线程;
使用ExecutorService、Callable、Future实现有返回结果的多线程。
其中前两种方式线程执行完后都没有返回值,后两种是带返回值的。
题目不太明确,这里给出一些测试点,大家可以再进行扩充。
图片
定位测试:
确认网络环境是否正常
抓包看接口返回
查看服务端日志
HTTP:应用层
TCP:传输层
IP:网络层
图片
本题应该考察的是Java的知识点:
类的不同:
sleep() 来自 Thread。wait() 来自 Object。
释放锁:
sleep() 不释放锁;wait() 释放锁。
用法不同:
sleep() 时间到会自动恢复;wait() 可以使用 notify() / notifyAll()直接唤醒。
使用方法范围不同:
sleep可以使用在任何代码块 。wait必须在同步方法或同步代码块执行。
生命周期:
当线程调用wait()或者join时,线程都会进入到waiting状态,当调用notify或notifyAll时,或者join的线程执行结束后,会进入runnable状态。当线程调用sleep(time),或者wait(time)时,进入timed waiting状态。
浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝(例:assign())
深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝。(例:JSON.parse()和JSON.stringify(),但是此方法无法复制函数类型)
JDK:JAVA开发工具包
JRE:JAVA运行环境
图片
本题为剑指offer(57)原题。
图片
leetcode链接:
https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof/solution/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-by-3zqv5/
一面部分到此结束
如果你也在准备字节跳动的面试,那么祝你早日顺利上岸!
这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。
关注我的微信公众号:【程序员二黑】免费获取~
我的学习交流群:642830685 群里有技术大牛一起交流分享~
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
高薪程序员也躲不过35岁这一关…当能力与年龄脱节,我们该如何自救
大学毕业开始销售…不甘于现状,转行测试的自救之路
从销冠到失业,最后选择软件测试,回头看看这段路,我很幸运!