前言
本文是将自己在面试前找工作的部分笔记重新整理了下,不少内容当时是查阅的知乎、博客园、书籍等。我自己在牛客上也学习了很多面经和经验帖,收获了好几家大厂offer。最近整理出来这些,希望能对找测开岗的朋友们有帮助!
一、请你说一下HTTP的报文段是怎么样的?
http请求报文(请求行/n 请求头/n请求主体)
请求行:GET /index HTTP/1.1
请求头:Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
注意,在最后一个首部之后有一个空行。即使不存在请求主体,这个空行也是必需的。
请求方法:
Get:请求获取request——URL所标识的资源
Post:在request——URL所标识的资源后附加资源
Head:请求获取request——URL所标识的资源的响应消息报头
Put:请求服务器存储资源,以request——URL为标识
Delete:请求服务器删除以request——URL为标识的资源
Trace:请求服务器回送收到的请求信息(用于测试和诊断)
Connect:保留
Options:请求查询服务器性能
URI:
URI(统一资源标识)用来唯一标识一个资源,这是一个通用概念,URI由两个子集组成(URL和URN),URL(统一资源定位)通过资源位置来标识资源,URN(统一资源命名)通过资源名字来标识资源,即使资源位置变化,URN也不会变化
请求头
Host:接受请求的服务器地址,IP或者域名
User-Agent:发送请求的应用名称
Connection:连接方式(短连接/http1.0,长连接/Keep-Alive/http1.1)
Accept-Charset:通知服务器端可以发送的编码格式
Accept-Encoding:通知服务器端可以发送的数据压缩格式
Accept-Language:通知服务器端可以发送的语言
http响应报文(状态行/n 请求头/n请求主体)
状态行:协议版本 状态码 状态描述(HTTP/1.1 200 OK)
1.状态码
200:响应成功 302:重定向
400:客户端有语法错误 403:服务器拒绝服务
404:请求资源不存在 500:服务器内部错误
2.响应头部
Server:服务器应用软件的名称和版本
Content-Type:响应正文的类型
Content-Length:响应正文的长度
Content-Charset:响应正文所使用的编码
Content-Encoding:响应正文使用的数据压缩格式
Content-Language:响应正文使用的语言
二、请回答一下HTTP的用什么连接
HTTP/1.0:默认短连接,浏览器和服务器每进行一次操作,就建立一次连接,但任务结束就终端连接
HTTP/1.1以上:默认使用长连接,使用长连接的情况下,当一个网页打开后,客户端和服务端之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问该网页,会继续使用这条连接,长连接有个保持时间,可以在不同的服务器软件中设定该时间,实现长连接要求客服端和服务端都支持长连接
三、请你说一说什么是三次握手,为什么不是两次
第一次握手:建立连接时,客户端发送syn(syn=j)包到服务器,并进入syn_sent状态,等待服务器确认,syn:同步序列编号
第二次握手:服务器收到syn包必须确认客户的syn(ack=j+1),同时自己也发送一个syn包(syn=k),即syn+ack包,此时服务器进入syn_recv状态
第三次握手:客户端收到服务器的syn+ack包,向服务器发送确认包ack(ack=k+1),此包发送完毕,服务器和客户端进入established(TCP连接成功)状态,完成三次握手
在服务端对客户端的请求进行回应后(第二次握手后),服务端认为已建立连接,但客户端未收到回应,此时客户端认为未建立连接,服务端会对已建立的连接保存必要资源,如果大量出现这种情况,就会导致服务器崩溃。
四、请你说一说什么是四次挥手
由于TCP连接时全双工的,因此每个方向都必须单独进行关闭,这个原则是当一方完成它的数据发送任务后,就发送一个fin来终止这个方向的连接,收到一个fin只意味着这一方向上没有数据流动,一个TCP连接在收到一个fin之后仍能发送数据。
首先将进行关闭的一方将主动执行关闭,另一方被动执行关闭,四次挥手过程:
1.客户端发送一个fin,用来关闭客户端到服务器的数据传输
2.服务端收到这个fin,它发回一个ack,确认序号为收到序号+1,与syn一样,一个fin将占用一个序号
3.服务端关闭与客户端的连接,再发送一个fin给客户端
4.客户端发回ack报文确认,并将序号设置为收到的序号+1
四次挥手原因:因为服务端的listen状态下的socket当收到syn报文的连接请求后,它可以把ack和syn(ack起应答作用,syn起同步作用)放在一个报文里发送,但当关闭连接时,当收到对方的fin,它仅仅表示对方没有数据发给你了,但未必你所以数据都发给对方了,所以你未必会马上关闭socket,即你可能需要还发送一些数据给对方后,再发送fin给对方同意你现在可以关闭连接了,所以ack报文和fin报文多数情况是分开发送的。
五、请说一说Get和Post的区别
六、请说一下TCP和UDP的区别
1.TCP面向连接,UDP是无连接的,即发送数据之前不需要建立连接
2.TCP提供可靠服务,通过TCP传输的数据,无差错,不丢失,不重复,且按序到达,UDP尽最大努力交付,但不保证可靠交付
3.TCP面向字节流,TCP把数据看成一连串无结构的字节流,UDP面向报文,应用层交给UDP多少报文,UDP就照样发送,即一次发送一个报文,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用有用,如IP电话,实时视频会议等)
4.每一条TCP连接只能是点到点的,UDP支撑一对一,一对多,多对一,多对多的交互通信
5.TCP首部开销20字节,UDP首部开销只有8个字节
6.TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
七、请说说TCP和UDP用一个端口发送信息是否冲突
不冲突:TCP和UDP可以绑定同一端口来进行通信,目前许多协议以及这样做了,例如DNS适用于UDP/53和TCP/53.因为数据接收时根据五元组{传输协议,源IP,目的IP,源端口,目的端口}判断接受者的
八:TCP为什么可靠,那些方式保证了可靠
1.确认和重传机制
确认:建立连接时三次握手,同步双方的序列号+确认号+窗口大小信息,是确认重传,流控的基础
重传:传输过程中,如果校验失败,丢包或延时,发送端重传
2.数据排序
TCP有专门的序列号SN字段,可提供数据reorder
3.流量控制
滑动窗口和计时器的使用,TCP窗口中会指明双方能够发送接收的最大数据量,发送方通过维持一个发送滑动窗口来确保不会发生由于发送报文发送太快接收方无法即使处理的问题
4. 拥塞控制
TCP的拥塞控制由四个核心算法组成:
慢启动、拥塞避免、快速传输、快速恢复
九:请说说进程和线程的区别,不同线程间如何通信
进程是资源调度的最小单位,线程是CPU调度的最小单位,线程是进程内一个相对独立的可执行单元,一个进程可以包含多个线程,线程组之间能共享资源,不同进程间不会相互影响,但同一进程下的不同线程会相互影响
根本区别:进程是资源调度的最先单位,线程是CPU调度的最先单位
开销方面:每个进程都有独立的代码和数据空间,切换会有较大开销,线程可以看作轻量级的进程,同一类线程共享代码和数据空间,线程间切换开销小
所处环境:操作系统中能同时运行多个进程,同一个进程中有多个线程同时执行(通过CPU调度,每个时间片只有一个线程执行)
内存分配:系统运行时会为每个进程分配不同的内存空间,但系统不会为线程分配内存(线程所使用的资源来自于进程),线程组之间只能共享资源
包含关系:没有线程的进程可以看作单线程,但是没有意义,该进程无法被调度执行
多线程间的通信方式主要有三种:
1.全局变量:因为线程间内存共享,这是常用的通信和交互方式
2. Message 消息机制:常用的message 通信接口有两个:PostMessage是线程向主窗口发送信息;PostThreadMEssage是任意两个进程间的通信接口
Linux中线程间通信:管道、消息队列、信号量、共享空间、套接字
十:OSI七层模型 TCP/IP四层网络协议
第一层:物理层:主要任务:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输
第二层:数据链路层:负责建立和管理节点间的链路
主要任务:通过各种控制协议,将有差错的物理信道变为无差错、能可靠传输数据帧的数据链路
第三层:网络层:在下两层的基础上像资源子网提供服务
主要任务:通过路由选择算法为报文或分组通过通信子网选择最恰当的路径,该层控制数据链路层和传输层之间的信息转发、建立、进/出路由控制
第四层:传输层:该层是通信子网和资源子网的接口和桥梁
主要任务:向用户提供可靠的端到端的差错与流量控制
第五层:会话层:用户应用程序和网络之间的接口
主要任务:向两个实体的表示层提供建立和使用连接的方法
第六层:表示层:它对来自应用层的命令和数据进行解释,按照一定格式传送给会话层
主要任务:处理用户信息的表示问题,如编码、数据格式转换和加密解密等
第七层:应用层:它是计算机用户,以及各种应用程序和网络之间的接口
主要任务:直接向用户提供服务,完成用户希望在网络上完成的各种工作
TCP/IP四层网络协议:应用层,网络层,传输层,数据链路层
输网址之后的技术流程:
URL解析,DNS 域名解析(浏览器缓存,系统缓存,路由器缓存,本地服务区缓存,递归查询),建立TCP连接(三次握手),浏览器发送http请求,服务器处理并响应请求,断开TCP连接(四次挥手),浏览器显示界面
十一、Cookie和Session的区别与联系:
Cookie:
概念:指的是浏览器里面能永久存储的一种数据
实现流程:由服务器生成,发送给浏览器,浏览器把cookie以key value的形式保存到某个目录下的文本文件中,下一次请求统一网站时,会将该cookie发送给服务器。Cookie存在本地客户端,所以浏览器加入某些限制确保cookie不会被恶意使用,同时不会占据太多空间,因此每个域的cookie都是有限的
Session:
概念:session存放在服务端,服务器默认30分钟保存这个session,超过时间就销毁,销毁之前,开发者可将用户数据以key value的形式暂时存放在这个session中,也可以使用数据库将session序列化保存起来,好处是没有时间的显示,坏处是数据库会急剧膨胀,一般是采用第一种
实现流程:浏览器 发送请求,服务器自动生成一个session和sessionid来唯一标识这个session,并将其通过响应发送到浏览器,当浏览器第二次发送请求时,会将前一次服务器响应中的sessionid放在请求中一并发送到服务器上,服务器中提取出sessionid与保存的所有sessionid对比,找到对应用户的session
区别:
cookie存储在客户端,session存储在服务端,cookie的所有数据保存在客户端内存或本地文本,session所有数据都保存在服务器上面,客户端每次请求服务器时都会发送当前会话的sessionid,服务器根据sessionid判断用户标志,已确定用户是否登录,或是否具有某种权限,sessionid是服务器和客户端链接时随机分配的,一般不会重复,但如果大量高并发请求,有重复的可能性,相对来说更为安全
应用场景:
Session:登录验证信息,一般采用session(logon)=true or false,用户的各种私人信息等
Cookie:判断用户是否登录过网站,方便下次登录的时候能够直接登录,若删除cookie,则必须重新提交,用户偏好,比如逛了衣服网站,cookie就是记录相应信息或关键字段,提交给服务器,服务器通过推荐算法进行偏好推送。
十二、状态码:
状态码304:第一次发送,直接获取,返回资源,状态码200,第二次发送,客户端发送请求,如果本地有缓存且没过期,直接返回200,读取本地缓存,如果有缓存但过期,像服务端请求,比较资源是否被修改(last-modified和etag),如果被修改,获取新资源,状态码200,如果没修改,返回状态码304,从本地读取缓存
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取