一些面经(1)---计算机网络、操作系统、测试


OSI七层模型


一台计算机是如何找到另外一台计算机并且把数据发送给另一台计算机的

应用层;向应用程序提供(统一)网络接口,直接向用户提供服务;HTTP/HTTPS
表示层:数据格式标识、基本压缩加密;把数据转换成兼容另⼀个系统能识别的格式;
会话层:应用程序之间;不同软件数据分发给不同软件;建⽴、管理和终⽌表示层实体之间的通信会话;
传输层:端到端;TCP/UDP——段
网络层:IP编址、路由功能;不同设备的数据转发、分片、DNS服务器——包
数据链路层:数据基本格式、如何传输、标识,封帧、差错检测、MAC寻址(广播);网卡MAC地址——帧
物理层:网线、网卡——比特流
网络协议

HTTP 如何实现长连接?

1.http长连接,建立在tcp协议的基础上。客户端和服务端建立一次tcp连接之后,该传输层连接不再进行释放,供应用层反复使用,可以在这条连接上进行多次请求/响应操作。
2.http长连接可以在首部字段中设置过期时间,也可以设置永久有效。
3.不再需要该连接的时候,主动调用该连接的close()方法,才会关闭该连接。


TCP三次握手


建立一个连接需要三次握手

刚开始客户端处于 closed 的状态,服务端处于 listen 状态。然后
1、第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN©。此时客户端处于 SYN_Send 状态
2、第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s),同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_RCVD 的状态
3、第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 established 状态
4、服务器收到 ACK 报文之后,也处于 established 状态,此时,双方以建立起了链接

状态说明:

LISTEN – 侦听来自远方TCP端口的连接请求;
SYN-SENT -在发送连接请求后等待匹配的连接请求;
SYN-RECEIVED – 在收到和发送一个连接请求后等待对连接请求的确认;
ESTABLISHED- 代表一个打开的连接,数据可以传送给用户;

三次握手的作用

1、确认双方的接受能力、发送能力是否正常。
2、指定自己的初始化序列号,为后面的可靠传送做准备,让对方知道接下来接收数据的时候如何按序列号组装数据;如果ISN是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的

第一次、第二次握手不可以携带数据(让服务器更加容易受到攻击了),而第三次握手是可以携带数据的(建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了)

半连接队列

服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列。当然还有一个全连接队列,就是已经完成三次握手,建立起连接的就会放在全连接队列中。如果队列满了就有可能会出现丢包现象

SYN-ACK 重传次数

服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同,一般会是指数增长,例如间隔时间为 1s, 2s, 4s, 8s


TCP四次挥手


终止一个连接要经过四次挥手

刚开始双方都处于 establised 状态,假如是客户端先发起关闭请求,则:
1、第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态
2、第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 + 1 作为 ACK 报文中的ack值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT状态
3、第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态
4、第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 + 1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态
5、服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态

状态说明

FIN-WAIT-1 – 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
CLOSE-WAIT – 等待从本地用户发来的连接中断请求;
LAST-ACK – 等待原来发向远程TCP的连接中断请求的确认;
TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认;
CLOSED – 没有任何连接状态

TIME_WAIT 状态

为什么客户端发送 ACK 之后不直接关闭,而是要等一阵子才关闭
要确保服务器是否已经收到了我们的 ACK 报文,如果没有收到的话,服务器会重新发 FIN 报文给客户端,客户端再次收到 FIN 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK 报文
TIME_WAIT 持续的时间至少是一个报文的来回时间。一般会设置一个计时,如果过了这个计时没有再次收到 FIN 报文,则代表对方成功接收 ACK 报文,此时处于 CLOSED 状态

为什么 TIME-WAIT 状态必须等待 2MSL 的时间

1、为了保证A发送的最后一个ACK报文段能够到达B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内(超时+1MSL传输)收到这个重传的FIN+ACK报文段。接着A重传—次确认,重新启动2MSL计时器。最后,A和B都正常进入到CLOSED状态。如果A在TIME-WAIT状态不等待一段时间,而是在发送完ACK报文段后立即释放连接,那么就无法收到B重传的FIN +ACK报文段,因而也不会再发送一次确认报文段,这样,B就无法按照正常步骤进入CLOSED状态。
2、防止已失效的连接请求报文段出现在本连接中。A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个连接中不会出现这种l旧的连接请求报文段。


TCP拥塞控制


原因是有可能整个网络环境特别差,容易丢包,那么发送端就应该注意了。
主要用三种方法:慢启动阈值 + 拥塞避免、快速重传、快速恢复

慢启动阈值 + 拥塞避免

对于拥塞控制来说,TCP主要维护两个核心状态:
1.拥塞窗口(cwnd)
2.慢启动阈值(ssthresh)
在发送端使用拥塞窗口来控制发送窗口的大小
然后采用一种比较保守的慢启动算法来慢慢适应这个网络,在开始传输的一段时间,发送端和接收端会首先通过三次握手建立连接,确定各自接收窗口大小,然后初始化双方的拥塞窗口,接着每经过一轮RTT(收发时延),拥塞窗口大小翻倍,直到达到慢启动阈值。
然后开始进行拥塞避免,拥塞避免具体的做法就是之前每一轮RTT,拥塞窗口翻倍,现在每一轮就加一个。

快速重传

在TCP传输过程中,如果发生了丢包,接收端就会发送之前重复ACK,比如第5个包丢了,6、7达到,然后接收端会为5,6,7都发送第四个包的ACK,这个时候发送端受到了3个重复的ACK,意识到丢包了,就会马上进行重传,而不用等到RTO (超时重传的时间)
选择性重传:报文首部可选性中加入SACK属性,通过left edge和right edge标志那些包到了,然后重传没到的包

快速恢复

如果发送端收到了3个重复的ACK,发现了丢包,觉得现在的网络状况已经进入拥塞状态了,那么就会进入快速恢复阶段:
1.会将拥塞阈值降低为拥塞窗口的一半
2.然后拥塞窗口大小变为拥塞阈值
3.接着拥塞窗口再进行线性增加,以适应网络状况


TCP、UDP


TCP

(1)TCP是面向连接的传输层协议;所谓面向连接就是双方传输数据之前,必须先建立一条通道,例如三次握手就是建议通道的一个过程,而四次挥手则是结束销毁通道的一个其中过程。
(2)每一条TCP连接只能有两个端点(即两个套接字),只能是端到端的
(3)TCP提供可靠的传输服务。传送的数据无差错、不丢失、不重复、按序到达;
(4)TCP提供全双工通信。允许通信双方的应用进程在任何时候都可以发送数据,因为两端都设有发送缓存和接受缓存;
(5)面向字节流。虽然应用程序与TCP交互是一次一个大小不等的数据块,但TCP把这些数据看成一连串无结构的字节流,它不保证接收方收到的数据块和发送方发送的数据块具有对应大小关系,例如,发送方应用程序交给发送方的TCP10个数据块,但就受访的TCP可能只用了4个数据块久保收到的字节流交付给上层的应用程序,但字节流完全一样。

TCP的可靠性原理

可靠传输有如下两个特点:
a.传输信道无差错,保证传输数据正确;——有状态是指 TCP 会确认发送了哪些报文,接收方受到了哪些报文,哪些没有收到,保证数据包按序到达,不允许有差错
b.不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据;——可控制的是指,如果出现丢包或者网络状况不佳,则会跳转自己的行为,减少发送的速度或者重发
(1)首先,采用三次握手来建立TCP连接,四次挥手来释放TCP连接,从而保证建立的传输信道是可靠的
(2)其次,TCP采用了连续ARQ协议(回退N,Go-back-N;超时自动重传)来保证数据传输的正确性,使用滑动窗口协议来保证接方能够及时处理所接收到的数据,进行流量控制。
(3)最后,TCP使用慢开始、拥塞避免、快重传和快恢复来进行拥塞控制,避免网络拥塞

UDP协议特点

1.UDP是无连接的传输层协议;
2.UDP使用尽最大努力交付,不保证可靠交付;
3.UDP是面向报文的,对应用层交下来的报文,不合并,不拆分,保留原报文的边界;
4.UDP没有拥塞控制,因此即使网络出现拥塞也不会降低发送速率;
5. UDP支持一对一一对多多对多的交互通信;
6. UDP的首部开销小,只有8字节.

TCP和UDP的区别

(1)TCP是可靠传输,UDP是不可靠传输;
(2)TCP面向连接,UDP无连接;
(3)TCP传输数据有序,UDP不保证数据的有序性;
(4)TCP不保存数据边界,UDP保留数据边界;
(5)TCP传输速度相对UDP较慢;
(6)TCP有流量控制和拥塞控制,UDP没有;
(7)TCP是重量级协议,UDP是轻量级协议;
(8)TCP首部较长20字节,UDP首部较短8字节;

基于TCP和UDP的常用协议

HTTP、HTTPS、FTP、TELNET(用于远程登陆的协议)、SMTP(简单邮件传输协议)协议基于可靠的TCP协议。
DNS、DHCP、TFTP(简单文件传输协议)、SNMP(简单网络管理协议)、RIP基于不可靠的UDP协议

TCP 和 UDP 应用场景

TCP:
效率要求相对低,但对准确性要求相对高的场景。
因为传输中需要对数据确认、重发、排序等操作,相比之下效率没有UDP高。
例:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、远程登录。

UDP:
效率要求相对高,对准确性要求相对低的场景。
例:QQ聊天、在线视频、网络语音电话(即时通讯,速度要求高,但是出现偶尔断续不是太大问题,并且此处完全不可以使用重发机制)、广播通信(广播、多播)、音频和视频的传输


url


url格式

统一资源定位符,简洁表示可以从互联网上得到的资源的位置和访问方法。
<协议>://<用户名>:<密码>@<主机域名或者ip地址><端口号>/<路径>;<参数>?<查询>#<片段>
协议:最常用HTTP,从Web中取回的是HTML文档。此外还有ftp、gopher、telnet
主机域名或者ip地址:有时,在主机名前也可以包含连接到服务器所需的用户名和密码
端口号:省略时使用方案的默认端口,如http的默认端口为80。
路径:一般用来表示主机上的一个目录或文件地址。
绝对URL:显示文件的完整路径,URL本身所在的位置与被引用的实际文件的位置无关,
相对URL:以包含URL本身的文件夹的位置为参考点,描述目标文件夹位置。文件名和扩展名,子目录名

输入url到出现内容的过程

1.浏览器的地址栏输入URL并按下回车。
2.浏览器查找当前URL是否存在缓存,并比较缓存是否过期。没过期则读缓存.过期了则访问web服务器,即DNS 域名解析.
3.DNS解析URL对应的真实IP。根据IP向服务器发起请求建立TCP连接(三次握手)。
HTTP发起请求。
服务器处理请求,处理完成后返回数据( HTML、JS、CSS 、图象等)
浏览器接收HTTP响应。对加载到的资源( HTML、JS、CSS 等)进⾏语法解析渲染页面。
关闭TCP连接(四次挥手)。


IP地址有哪些分类?


A类地址(1-126):网络号占前8位,以O开头,主机号占后24位。
B类地址(128-191):网络号占前16位,以10开头,主机号占后16位。
C类地址(192-223):网络号占前24位,以110开头,主机号占后8位。
D类地址(224-239):以1110开头,保留位多播地址。
E类地址(240-255):以1111开头,保留位今后使用


TCP/IP


IP协议是TCP/IP协议族的核心协议,其主要包含两个方面:
1.IP头部信息。出现在每个IP数据报中,用于指定IP通信的源端IP地址、目的端IP地址,指导IP分片和重组,以及指定部分通信行为。
2.IP数据报的路由和转发。发生在除目标机器之外的所有主机和路由器上。它们决定数据报是否应该转发以及如何转发。

IP数据报的路由请添加图片描述

从右往左分析上图,当IP模块接收到来自数据链路层的IP数据报是,它首先对该数据报的头部做CRC校验,确认无误之后就分析其头部的具体信息。
如果该IP数据报的头部设置了源站选路选项(松散源路由选择或严格源路由选择),则IP模块调用数据报转发子模块来处理该数据报。如果该IP数据报的头部中目标IP地址是本机的某个IP地址,或者是广播地址,即该数据是发送给本机的,则IP模块就根据数据报头部中的协议字段来决定将它派发给哪个上层应用。如果IP模块发现这个数据报不是发送给本机的,则也调用数据报转发子模块来处理该数据报。
数据报转发子模块将首先检测系统是否允许转发,如果不允许,IP模块就将数据报丢弃。如果允许,数据报转发子模块将对该数据报执行一些操作,然后将它交给IP数据报输出子模块。
IP数据报应该发送至哪个下一跳路由(或者目标主机),以及经过哪个网卡来发送,就是IP路由过程,即图中“计算下一跳路由”子模块。IP模块实现数据报路由的核心数据结构是路由表。这个表按照数据报的目标IP地址分类,同一类型的IP数据报将被发往相同的下一跳路由器(或者目标主机)。
IP输出队列中存放的是所有等待发送的IP数据报,其中除了需要转发的IP数据报外,还包括封装了本机上层数据(ICMP报文、TCP报文和UDP数据报)的IP数据报。
图中的虚线箭头显示了路由表更新的过程。这一过程是指通过路由协议 或者route命令调整路由表,使之更适应最新的网络拓扑结构,成为IP路由策略。

IP转发

对于允许IP数据报转发的系统,数据报转发子模块将对期望转发的数据报执行如下操作:
1.检查数据报头部的TTL值。如果TTL值已是0,则丢弃该数据报。
2.查看数据报头部的严格源路由选择选项。如果该选项被设置,则检查数据报的目标IP地址是否是本机的某个IP地址。如果不是,则发送一个ICMP源站选路失败报文给发送端。
3.如果有必要,则给源端发送一个ICMP重定向报文,以告诉它一个更合理的下一跳路由器。
4.将TTL值减1
5.处理IP头部选项。
6.如果有必要,则执行IP分片操作。

IPv4和IPv6之间的区别

IPv4和IPv6用于用户标识和Internet上不同设备之间的通信。IPv4是32位IP地址,而IPv6是128位IP地址。IPv4是数字地址,用点分隔。IPv6是一个字母数字地址,用冒号分隔。

1.地址类型。IPv4具有三种不同类型的地址:多播,广播和单播。IPv6还具有三种不同类型的地址:任意广播,单播和多播。
2.数据包大小。对于IPv4,最小数据包大小为576字节。对于IPv6,最小数据包大小为1208字节。
3.header区域字段数。IPv4具有12个标头字段,而IPv6支持8个标头字段。
4.可选字段。IPv4具有可选字段,而IPv6没有。但是,IPv6具有扩展header,可以在将来扩展协议而不会影响主包结构。
5.配置。在IPv4中,新装的系统必须配置好才能与其他系统通信。在IPv6中,配置是可选的,它允许根据所需功能进行选择。
6.安全性。在IPv4中,安全性主要取决于网站和应用程序。它不是针对安全性而开发的IP协议。而IPv6集成了Internet协议安全标准(IPSec)。IPv6的网络安全不像IPv4是可选项,IPv6里的网络安全项是强制性的。
7.与移动设备的兼容性。IPv4不适合移动网络,因为正如我们前面提到的,它使用点分十进制表示法,而IPv6使用冒号,是移动设备的更好选择。
8.主要功能。IPv6允许直接寻址,因为存在大量可能的地址。但是,IPv4已经广泛传播并得到许多设备的支持,这使其更易于使用。


进程和线程的区别


1.进程:进程是系统进行资源分配和调度的一个独立单位,是系统中的并发执行的单位。
线程:线程是进程的一个实体,也是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,有时又被称为轻权进程或轻量级进程。
2.创建进程或撤销进程,系统都要为之分配或回收资源,操作系统开销远大于创建或撤销线程时的开销;
3.不同进程地址空间相互独立,同一进程内的线程共享同一地址空间。一个进程的线程在另一个进程内是不可见的;
4.进程间不会相互影响,而一个线程挂掉将可能导致整个进程挂掉;


常用的数据结构


数组、链表、栈、队列、树、堆、图、哈希表。

堆和栈“先进后出”

堆可以被看做是一棵树的数组对象堆总是一棵完全二叉树。
堆中某个节点的值总是不大于或不小于其父节点的值;
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。


static关键字相关、作用


大大提高程序的模块化特性,有利于扩展和维护。
1.隐藏。
当我们同时编译多个文件时,所有未加 static 前缀的全局变量和函数都具有全局可见性。
2.保持变量内容的持久。
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和 static 变量,只不过和全局变量比起来,static 可以控制变量的可见范围
3.默认初始化为 0。
其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是 0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置 0,然后把不是 0 的几个元素赋值。如果定义成静态的,就省去了一开始置 0 的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加 \0 太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是 \0 。


被static修饰的局部变量生命周期是整个程序,但是作用域是和局部变量一样的,从定义开始,到最近的花括号结束。只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。


c语言中const的修饰作用


关键字const常常被用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变。
与预编译指令(#define用来宏定义一些变量)相比,const修饰符有以下的优点:
1.const常量有数据类型,宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换(对值进行简单的替换),没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。
2.可以保护被修饰的东西,防止程序员编程中的意外修改,从而起到增强程序的健壮性。
3.编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没了存储与读内存的操作,使得它的效率也很高。
4.与宏定义一样可以很方便地进行参数的调整和修改,一改全改。

const的用法:

一,修饰局部变量(表示局部变量不能被修改了),一定要进行初始化
二,修饰全局变量
全局变量的作用域是整个文件,我们应该尽量避免使用全局变量,因为一旦有一个函数改变了全局变量的值,它也会影响到其他引用这个变量的函数,导致除了bug后很难发现,如果一定要用全局变量,我们应该尽量的使用const修饰符进行修饰,这样防止不必要的人为修改,使用的方法与局部变量是相同的。
三,常量指针与指针常量
区分常量指针和指针常量的关键就在于星号的位置,我们以星号为分界线,如果const在星号的左边,则为常量指针,如果const在星号的右边则为指针常量。如果我们将星号读作‘指针’,将const读作‘常量’的话,内容正好符合。
常量指针是指 针指向的内容是常量。
1.常量指针说的是不能通过这个指针改变变量的值,但是还是可以通过其他的引用来改变变量的值的。
2.常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变,常量指针可以指向其他的地址。
指针常量是指 指针本身是个常量,不能在指向其他的地址。指针常量指向的地址不能改变,但是指向地址中保存的数值是可以被其他的指针进行修改的。
指向常量的常指针是以上两种的结合,指针指向的位置不能改变并且也不能通过这个指针改变变量的值,但是依然可以通过其他的普通指针改变变量的值。
四、修饰函数的返回值
如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。


自动化测试


自动化测试是要在手工测试之后进行的,也就是回归测试阶段,这时候其实是已经具备完善的功能测试用例啦,系统版本也已经比较稳定啦,这就具备了自动化测试的必要条件,
可行性分析:软件需求变动不频繁、项目周期足够长、自动化测试脚本可重复使用
做一个demo,简易脚本,如果没问题,即可
WEB端的自动化测试采用python+selenium+unittest框架
App端自动化测试采用Java+Appium+Junit框架
对系统的功能需求进行再次梳理,划分出可以进行自动化测试的需求,划分的标准一般是简单、重复性高、业务复杂度低的需求请添加图片描述


软件生命周期


按开发软件的规模和复杂程度,从时间上把软件从计划开发开始到软件报废的整个阶段进行分解
1、可行性研究与计划
2、需求分析
3、软件设计
4、程序编码
5、软件测试 分单元测试、组装测试以及系统测试三个阶段,测试的方法主要有白盒测试和黑盒测试两种。在测试过程中需要建立详细的测试计划并严格按照测试计划进行测试,
6、运行维护

单元、集成和系统测试?

*单元测试:是指对软件中的最小可测试单元进行的测试。一个函数方法、一个功能模块、都可以看做是一个单元。主要以白盒为主,一般有开发人员完成
*集成测试:集成测试是将单元或者模块组装在一起进行的测试。因为:一些模块虽然能够单独地工作,但并不能保证连接起来也能正常的工作。一些局部反映不出来的问题,在全局上很可能暴露出来。主要测试模块之间的接口和接口数据传递关系,以及模块组合后的整体功能,
*系统测试:将软件系统看成是一个系统,对整个软件系统进行的测试。

功能测试、性能测试、GUI测试、易用性测试、兼容性测试、可靠性测试、安全性测试、文档测试、稳定性测试、健壮性测试、特定场景测试 等等

一般系统测试会考虑哪些方面测试简要回答

(1)响应时间:系统对请求作出响应的时间。
2-5-8原则:如果系统2秒内作出响应,会感觉系统响应很快。
2-5秒内作出响应,会感觉系统响应还可以。
5-8内作出响应,会感觉响应很慢但是还可以接受。
超过8秒还没有响应,会感觉很糟糕,会认为系统已经失去响应,从而发起二次请求或离开改软件。
(2)并发用户数:指系统可以同时承载的正常使用系统功能的用户数量。
(3)吞吐量:系统在单位时间内处理请求的数量
(4)服务器的资源利用率:cpu的使用率、内存的占用率、磁盘的读写速率


抓包


工具用过Wireshark、Ethereal
看前后台的数据传输、分析分析协议内容

抓包工具在测试中的使用

1.从功能测试角度,通过抓包查看隐藏字段
Web表单中会有很多隐藏的字段,有特殊的用途,比如收集用户的数据,预防CRSF攻击,防网络爬虫,
2. 通过抓包工具了解协议内容,方便开展接口和性能测试
性能测试是大量模拟用户的请求,要知道请求中的协议内容和特点,才能更好的模拟用户请求,分析协议就需要用到抓包工具;
接口测试要求有完善的接口文档。但很多时候接口文档不可能覆盖所有的情况,或者因为文档滞后,在接口测试过程中,还时需要借助抓包工具来辅助我们进行接口测试。
3. 需要通过抓包工具,检查数据加密
安全测试方面,我们需要检查敏感数据在传输过程中是否加密,需要借助抓包工具
4.处理前后端 bug 归属之争
如果抓出来的数据就有问题的话,那么一般是后端的问题;
如果抓出来的数据是正确的,那么基本上可以断定是前端显示的问题。
5. 通过抓包分析,可以更好的理解整个系统
经常使用抓包工具辅助测试,可以很好的了解整个系统,比如数据传输过程前后端的关系,以及整个系统的结构。特别是对现在的微服务架构的产品,抓包能够更好的梳理和掌握整个系统各个服务之间的关系,大大增加测试的覆盖度。另外还可以增进对代码、HTTP协议方面知识的理解。

向服务器传送文件的客户端主机的IP地址,TCP端口号,服务器的IP地址,用来发送和接收TCP报文段的端口号
TCP头 20字节请添加图片描述

UDP头 8字节
请添加图片描述

IP头 20字节
IP协议在协议栈中位于网络层,网络数据传输封装方式如下:

请添加图片描述

IP报文格式如下:

请添加图片描述

1、版本:IP报文版本号 IPV4:4,IPV6:6
2、首部长度:IP header 长度,没有选项,则一般为5(5x32bit=20B)
3、8位服务类型:一般没有使用
3位优先权字段(已经弃用)
4位TOS字段:最小延时,最大吞吐量,最高可靠性,最小成本(这四者冲突,只能选择一个)
1位保留字段,必须为0
4、总长度:header+数据 总长度
5、16位标识:IP 报文的唯一id,分片报文的id 相同,便于进行重组。
6、3位标志:标明是否分片。
第一位:保留
第二位:是否允许分片(置0允许,置1不允许),如果置1,但是IP报文长度超过MTU则丢弃
第三位:结束标志(最后一片置1,表示已经完了,其余的置0)
7、13位片偏移:参考下图。如果是第一片取值为0,第二片取值175,以此类推。
8、TTL:生存时间,即路由器的跳数,每经过一个路由器,该TTL 减一,因此路由器需要重新计算IP报文的校验和。
9、8位协议:ICMP:1,TCP:6,UDP:17,其他的自行百度
10、首部校验和:IP header校验和,接收端收到报文进行计算如果校验和错误,直接丢弃。
11、源IP地址:无须解释
12、目的IP地址:无须解释
13、选项:这个一般也没有使用。详细参考RFC
14、数据:上层的报文,如TCP 报文、UDP报文等。

请添加图片描述


对产品测试工程师的理解


分为专业方向和客户体验方向
产品初期发展、未入市场前、以及产品上市后
产品在特征方面的创新、产品在特征方面的创新
**

为什么选择产品测试工程师

**
喜欢、产品测试需要的是耐心、细心、动手能力和执行能力,认真、细致


交换机为什么处于数据链路层


交换机是基于MAC地址从端口到端口通信的,它不能识别IP地址,所以工作在数据链路层(第二层)


基尔霍夫定理


电流KCL:电路中的任意节点,任意时刻流入该节点的电流等于流出该节点的电流
电压KVL:闭合回路中电压升之和等于电压降之和


香农公式


在这里插入图片描述

C 代表信道也就是传输通道可传送的最大信息速率,简称为信道容量;
B 代表信道也就是传输通道的带宽;
S/N 代表接收信号的信噪比;
lb代表以2为底的对数。


天线增益和天线分集的区别


在输入功率相等的条件下,实际天线与理想的辐射单元在空间同一点处所产生的信号的功率密度之比。它定量地描述一个天线把输入功率集中辐射的程度。增益显然与天线方向图有密切的关系,方向图主瓣越窄,副瓣越小,增益越高。天线增益是用来衡量天线朝一个特定方向收发信号的能力,它是选择基站天线最重要的参数之一。一般来说,增益的提高主要依靠减小垂直面向辐射的波瓣宽度,而在水平面上保持全向的辐射性能。
分集接收技术是一项主要的抗衰落技术,可以大大提高多径衰落信道传输下的可靠性,在实际的移动通信系统中,移动台常常工作在城市建筑群或其他复杂的地理环境中,而且移动的速度和方向是任意的。分集接收技术被认为是明显有效而且经济的抗衰落技术。
 分集的基本思想是将接收到的多径信号分离成不相关的(独立的)多路信号,然后把这些多路信号分离信号的能量按一定的规则合并起来,使接收到的有用信号能量最大,进而提高接收信号的信噪比。因此,分集接收包括两个方面的内容:一是如何把接收的多径信号分离出来使其互不相关,二是将分离出来的多径信号恰当合并,以获得最大信噪比。
  分集的方式:分集分为宏观分集和微观分集两大类。宏观分集也称为多基站分集,其主要作用是抗慢衰落。例如,在移动通信系统中,把多个基站设置在不同的物理位置上(如蜂窝小区的对角线上),同时发射相同的信号,小区内的移动台选择其中最好的基站与之通信,以减小地形、地物及大气等对信号造成的慢衰落。


怎么给定产品误差和分析误差原因


单个产品,能理论计算的问题可以计算给出波动,一批产品的话,抽检与标准做比照,获得产品波动上限和下限,这样给定这一批产品的误差范围


结构体内存对齐


1.为什么要实现内存对齐

因为在内存中我们一般读取数据不是一个一个内存来读取,一般都是分为一个个内存块来读取。
内存对齐(每次读取四个字节)的话,每次读取,不用进行复杂的分割拼接,大大的提高了效率。
因为内存对齐可以节省程序运行时间,提高效率。
而且有的cpu因为硬件问题 ,只能在固定位置读取数据,必须进行内存对齐,否则就会出错。
简而言之就是牺牲内存换时间。

2.结构体怎么齐

(1)第一个成员在与结构体偏移量为0的地址处。
(2)其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的对齐数为8
(3)结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
class B {
char a;//1
double b;//8
int c;//4
};
a为字符型占一个位置 但是后面b为浮点数所以需要给a再分配七个字节,b为浮点数,所以站八个字节,c为整形所以占四个字节。8+8+4=20
但是因为结构体总大小为最大对齐数的整数倍,所以必须再加四个字节,从而20+4=24为最大对齐数8的整数倍,所以这个结构体的大小等于24
4.如何让结构体按照指定的对齐参数进行对齐
只需要输入#pragma pack(想要指定的对齐参数)
5.如何知道结构体中某个成员相对于结构体起始位置的偏移量
最简单的方法就是取地址相减


break和continue介绍


一、break和continue的作用

都是用来控制循环结构的,主要作用是停止循环。

二、break和continue的区别

1、break用于跳出一个循环体或者完全结束一个循环,不仅可以结束其所在的循环,还可结束其外层循环。注意:
(1)只能在循环体内和switch语句体内使用break。
(2)不管是哪种循环,一旦在循环体中遇到break,系统将完全结束循环,开始执行循环之后的代码。
(3)当break出现在循环体中的switch语句体内时,起作用只是跳出该switch语句体,并不能终止循环体的执行。若想强行终止循环体的执行,可以在循环体中,但并不在switch语句中设置break语句,满足某种条件则跳出本层循环体。
2、continue语句的作用是跳过本次循环体中剩下尚未执行的语句,立即进行下一次的循环条件判定。注意:
(1)continue语句并没有使整个循环终止。
(2)continue 只能在循环语句中使用,即只能在 for、while 和 do…while 语句中使用。


快速排序算法基本思想复杂度 最坏情况是什么


快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。
步骤为:
1.挑选基准值:从数列中挑出一个元素,称为“基准”(pivot),
2.分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成,
3.递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。
递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。
选取基准值有数种具体方法,此选取方法对排序的时间性能有决定性影响。

最优情况

每次找到的参考轴把数据分成均匀的两半,最后应该是一个平衡二叉树状态;二叉树的层数(logn)即为递归需要进行的次数,并且每轮递归结束时,都将二叉树遍历了一遍(n),所以最优的情况下,时间复杂度为O(nlogn)

最坏情形

为正序或逆序排列,二叉树画出来应该是一棵斜树,并且需要经过n-1次递归调用才能完成,且第i次划分需要经过n‐i次关键字的比较才能找到第i个记录,也就是枢轴的位置, 最终的时间复杂度应该O(n2)请添加图片描述


给一个网页怎么测试


  1. 根据需求说明进行需求分析,确定测试计划。
    界面测试;功能性测试;性能测试;数据库测试;安全性测试;易用性测试;兼容性测试 。
    2.界面测试:页面布局、分类显示、文字描述、图片显示、多媒体播放、标点符号使用等
    页面风格统一,美观;
    页面布局是否合理,重点、热点突出;
    控件是否正常使用;
    对于必须但未安装的空间,是否提供自动下载并安装的功能;
    文字检查
  2. 功能性测试
    浏览:多媒体元素是否可以正确加载和显示;多语言支持等。
    操作、切换
    跳转:链接测试。链接是否正确跳转,是否存在空页面和无效页面,是否有不正确的出错信息返回等。
    注册登录等
  3. 性能测试——压力测试;负载测试;强度测试 (并发测试?)
    负载测试和压力测试都属于性能测试,两者可以结合进行。
    通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。
    压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。应用在客户端性能测试的目的是考察客户端应用的性能,测试的入口是客户端。
    5.数据库测试要具体决定是否需要开展。
    数据库一般需要考虑连结性,对数据的存取操作,数据内容的验证等方面。比如:数据库系统测试关注重点:
      1、数据库是否符合范式
      2、数据库设计是否和数据库相同
      3、数据库设计是否合理
      4、数据库安装测试
      5、数据库配置测试
      6、数据库的读取、保存、并发等测试
  4. 安全性测试:
    1 基本的登录功能的检查
    2 是否存在溢出错误,导致系统崩溃或者权限泄露
    3 相关开发语言的常见安全性问题检查,例如 SQL 注入等。
    4 数据库的读取及保存等安全性测试
    5 如果需要高级的安全性测试,确定获得专业安全公司的帮助,外包测试,或者获取支持
    7.易用性测试:
    浏览操作是否简单、方便、易懂
    注册登录是否简单、方便、易懂
  5. 兼容性测试
    浏览器、操作系统、软件平台、数据库的兼容性
    总结:开展测试,并记录缺陷。
    合理的安排调整测试进度,提前获取测试所需的资源,建立管理体系(例如,需求变更、风险、配置、测试文档、缺陷报告、人力资源等内容)。
    定期评审,对测试进行评估和总结,调整测试的内容。
    二、在搜索引擎中输入汉字就可以解析到对应的域名,请问如何用 LoadRunner(压力性测试、性能测试的工具) 进行测试。
    1.建立测试计划,确定测试标准和测试范围
    2.设计典型场景的测试用例,覆盖常用业务流程和不常用的业务流程等
    3.根据测试用例,开发自动测试脚本和场景:
    录制测试脚本
    新建一个脚本(Web/HTML 协议)
    点击录制按钮,在弹出的对话框的 URL 中输入”about:blank”。
    在打开的浏览器中进行正常操作流程后,结束录制。
    调试脚本并保存。可能要注意到字符集的关联。
    4.设置测试场景
    针对性能设置测试场景,主要判断在正常情况下,系统的平均事务响应时间是否达标
    针对压力负载设置测试场景,主要判断在长时间处于满负荷或者超出系统承载能力的条件下,系统是否会崩溃。
    5.执行测试,获取测试结果,分析测试结果

三、 你认为是bug,而开发不认同时怎么办?


这个主要考察的是你与团队的沟通能力,按照套路回答就好了。
1、简单分析下需求可能对客户的影响,通过影响和严重程度来说服开发来进行修改。
2、产品需求里边没有明确要求的,需要先和需求人员讨论一下,如果确认需要进行修改。在三方会议上进行提出。


如果家里断网了,该如何排查问题出在哪里。


网络故障排查
1.检查硬件,网线两端有没有插好,路由器是否有问题:
试一下ping路由器的IP地址;
使用拨号上网:将宽带网线从路由器中拔出,直接插在电脑上,然后再ping一下外部网站,看看是否会出现掉包或者连接超时现象。如果有,则是网络线路问题,连接稳定的话,则是路由器出现故障。
2.网卡驱动是否安装对了,重启一下网卡
3.看看自己的IP地址、掩码、还有网关有没有配对
用ifconfig查看
ping自己的IP地址,不通的话就是TCP/IP协议出现问题
4.用nslookup命令查看DNS域名解析过程是否正常:
DNS服务器的IP地址=主机的网络适配器使用的DNS服务器的IP地址
host文件有没有加域名解析记录
5.看一下电脑设置里有没有设置代理服务器、换一下浏览器、清一下缓存

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值