【软件测试】Web测试基础(各类协议)面试必背
目录
14.为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态
前言:
在学习web测试前,我们需要对计算机网络的一些概念有一定的了解,以面试问题的形式来详细了解
TCP/IP协议
1.概念
TCP/IP协议,严格来说是一个协议族,里面包括很多协议(Telnet、HTTP、SMTP、TCP、UDP、IP、ARP等),由于TCP协议和IP是结构中最核心的协议,所以统称为TCP/IP协议。
2.TCP/IP层次结构与OSI层次结构的对照关系图
OSI七层网络模型 | TCP/IP概念层模型 | 功能 | TCP/IP协议族 |
应用层 | 应用层 | 文件传输、电子邮件、文件服务、虚拟终端 | HTTP、TFTP、SNMP、FTP(文件传输协议)、SMTP、DNS(域名系统)、Telnet |
表示层 | 数据格式化、代码转换、数据加密 | ||
会话层 | 解除或建立与别的接点的联系 | ||
传输层 | 传输层 | 提供端对端的接口 | TCP(传输控制协议)、UDP(用户数据包协议) |
网络层 | 网络层 | 为数据包选择路由 | IP、ICMP、RIP、OSPF |
数据链路层 | 链路层 | 传输有地址的帧以及错误检测功能 | SLIP、PPP、ARP、CSLIP |
物理层 | 以二进制数据形式在物理媒体上传输数据 | ISO2110、IEEE802、IEEE802.2 | |
3.TCP简介
1、面向连接的、可靠的、基于字节流的传输层的通信协议;
2、将应用层的数据流分割成报文段并发送给目标节点的TCP层;
3、数据包都有序号,对方收到则发送ACK确认,未收到则重传;
4、使用校验和来检验数据在传输过程中是否有误;
4.TCP标志位(Flags)
1、URG:紧急指针标志;
2、ACK:确认序号标志;
3、PSH:push标志;
4、RST:重置连接标志;
5、SYN:同步序号,用于建立连接过程;
6、FIN:finish标志,用于释放连接
5.TCP三次握手建立连接
刚开始客户端处于 closed 的状态,服务端处于 listen 状态:
1、第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化*** ISN(c)。此时客户端处于 SYN_Send 状态。
2、第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化*** ISN(s),同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态。
3、第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 establised 状态。
4、服务器收到 ACK 报文之后,也处于 establised 状态,此时,双方以建立起了链接。
6.TCP四次挥手关闭连接
刚开始双方都处于 establised 状态,假如是客户端先发起关闭请求:
1、第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个***。此时客户端处于FIN_WAIT1状态
2、第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的***值 + 1 作为 ACK 报文的***值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT状态【服务端可能还有一些数据没有传送完,不能立马关闭】
3、第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个***。此时服务端处于 LAST_ACK 的状态
4、第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的***值 + 1 作为自己 ACK 报文的***值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态
5、服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态
7.三次握手过程中可以携带数据吗
第一次、第二次握手不可以携带数据,而第三次握手是可以携带数据的。
为什么这样呢?假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据,因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。也就是说,第一次握手可以放数据的话,其中一个简单的原因就是会让服务器更加容易受到攻击了。
而对于第三次的话,此时客户端已经处于 established 状态,也就是说,对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据。
8.三次握手的作用
1、确认双方的接受能力、发送能力是否正常。
2、指定自己的初始化***,为后面的可靠传送做准备。
3、如果是 https 协议的话,三次握手这个过程,还会进行数字证书的验证以及加***的生成到。
9.为什么建立连接是三次握手,关闭连接却是四次挥手
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
10.为什么需要三次握手
目的:为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。主要防止资源的浪费。
11.为什么需要四次挥手
为了保证在最后断开的时候,客户端能够发送最后一个ACK报文段能够被服务器接收到。如果客户端在收到服务器给它的断开连接的请求之后,回应完服务器就直接断开连接的话,若服务器没有收到回应就无法进入CLOSE状态,所以客户端要等待两个最长报文段寿命的时间,以便于服务器没有收到请求之后重新发送请求。
防止“已失效的连接请求报文”出现在连接中,在释放连接的过程中会有一些无效的滞留报文,这些报文在经过2MSL的时间内就可以发送到目的地,不会滞留在网络中。这样就可以避免在下一个连接中出现上一个连接的滞留报文了。
12.(ISN)是固定的吗
三次握手的一个重要功能是客户端和服务端交换ISN(Initial Sequence Number), 以便让对方知道接下来接收数据的时候如何按***组装数据。
如果ISN是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。
13.什么是半连接队列
服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列。当然还有一个全连接队列,就是已经完成三次握手,建立起连接的就会放在全连接队列中。如果队列满了就有可能会出现丢包现象。
14.为什么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连接。
15.为什么不能用两次握手进行连接
3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始***进行协商,这个***在握手过程中被发送和确认。
现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的***,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
16.如果已经建立了连接,但是客户端突然出现故障了怎么办
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
17.首次握手的隐患------SYN超时问题
题起因和分析:
1、服务器收到客户端的SYN,回复SYN和ACK的时候未收到ACK确认
2、服务器不断重试直至超时,Linux默认等待63秒才断开连接;(重复5次【不包括第一次】,从1秒开始,每次重试都翻倍:1+2+4+8+16+32=63秒)
针对SYN Flood的防护措施:
1、SYN队列满后,通过tcp_syncookies参数会发SYN cookie【源端口+目标端口+时间戳组成】;
2、若为正常连接则Client会回发SYN Cookie,直接建立连接;
建立连接后,Client出现故障怎么办:
保活机制:
1、向对方发送保活探测报文,如果未收到相应则继续发送;
2、尝试次数达到保活探测数仍未收到相应则中断连接;
18.拓展进阶
https://blog.csdn.net/csdnnews/article/details/86570658
https://blog.csdn.net/heyi5351230/article/details/106115484
HTTP协议
1.概述
对器客户端和 服务器端之间数据传输的格式规范,格式简称为“超文本传输协议”
2.协议简介
1、应用层协议, 一般以TCP为基础,数据收发通过TCP实现;
2、一次性连接。服务器与客户端的每次连接只处理一个请求,下次请求重新建立连接;
3、 无状态协议。服务器不保留与客户交易时的状态,减轻记忆负担,较快响应速度;
4、默认端口号80,常用请求方法GET/POST
3.浏览器输入url按回车后执行了哪些操作
1、首先,在浏览器地址栏中输入url,先解析url,检测url地址是否合法
2、浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则跳到第三步操作
浏览器缓存:浏览器会记录DNS一段时间,因此,只是第一个地方解析DNS请求
操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调用操作系统,获取操作系统的记录(保存最近的DNS查询缓存)
路由器缓存:如果上述两个步骤均不能成功获取DNS记录,继续搜索路由器缓存
ISP缓存:若上述均失败,继续向ISP搜索
3、在发送http请求前,需要域名解析(DNS解析),解析获取相应的IP地址
4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手
5、握手成功后,浏览器向服务器发送http请求,请求数据包
6、服务器处理收到的请求,将数据返回至浏览器
7、浏览器收到HTTP响应
8、浏览器解码响应,如果响应可以缓存,则存入缓存。
9、 浏览器发送请求获取嵌入在HTML中的资源(html,css,javascript,图片,音乐······),对于未知类型,会弹出对话框
10、 浏览器发送异步请求
11、页面全部渲染结束。
4.常用的HTTP请求方法有哪些
GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器
POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式
PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置
HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效
DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件
OPTIONS:查询相应URI支持的HTTP方法
5.GET和POST的区别
标准答案参考自w3schools:
-
GET在浏览器回退时是无害的,而POST会再次提交请求
-
GET产生的URL地址可以被Bookmark,而POST不可以
-
GET请求会被浏览器主动cache,而POST不会,除非手动设置
-
GET请求只能进行url编码,而POST支持多种编码方式
-
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留
-
GET请求在URL中传送的参数是有长度限制的,而POST没有
-
对参数的数据类型,GET只接受ASCII字符,而POST没有限制
-
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
-
GET参数通过URL传递,POST放在Request body中
(实际上,这两种方法是没什么区别的,但面试官问起来,最好还是按照标准答案来回答了,详情可以去知乎搜索“get和post有什么区别”)
6.常见的HTTP相应状态码
返回的状态
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
200:请求被正常处理
204:请求被受理但没有资源可以返回
206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源。
301:永久性重定向
302:临时重定向
303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上
304:发送附带条件的请求时,条件不满足时返回,与重定向无关
307:临时重定向,与302类似,只是强制要求使用POST方法
400:请求报文语法有误,服务器无法识别
401:请求需要认证
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
500:服务器内部错误
503:服务器正忙
7.HTTP无状态协议
所谓的无状态就是每次请求完成后,不会在客户端和服务器上保存任何的信息,对于客户端和服务器来说,根本不知道上一次请求的信息是什么,甚至不知道本次连接的对端是不是上次连接的那一端,它的生命周期随着TCP/IP连接的关闭结束了。
无状态是指协议对于事务处理没有记忆功能。缺少状态意味着,假如后面的处理需要前面的信息,则前面的信息必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要前面信息时,应答就较快。直观地说,就是每个请求都是独立的,与前面的请求和后面的请求都是没有直接联系的。
(1)无状态协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息
(2)无状态协议解决办法: 通过1、Cookie 2、通过Session会话保存。
8.实际中的使用情况
在web应用中,我们使用http协议,但是我们需要的web是有状态的,因此加入了cookie、session等机制实现有状态的的web。
web=http协议+状态机制+其他机制
9.哪些方法可以实现有状态连接
cookies, session, application
有人将web应用中有无状态的情况,比着顾客逛商店的情景。
顾客:浏览器访问方;
商店:web服务器;
一次购买:一次http访问
我们知道,上一次顾客购买,并不代表顾客下一个小时一定会买(当然也不能代表不会)。也就是说同一个顾客的不同购买之间的关系是不定的。所以说实在的,这种情况下,让商店保存所有的顾客购买的信息,等到下一次购买可以知道这个顾客以前购买的内容代价非常大的。所以商店为了避免这个代价,索性就认为每次的购买都是一次独立的新的购买。浅台词:商店不区分对待老顾客和新过客。这就是无状态的。
但是,商店为了提高收益。她是想鼓励顾客购买的。所以告诉你,只要你在一个月内购买了5瓶以上的啤酒,就送你一个酒杯。
我们看看这种情况我们怎么去实现呢?
A,给顾客发放一个磁卡,里面放有顾客过去的购买信息。
这样商店就可以知道了。这就是cookie.
B,给顾客发放一个唯一号码,号码制定的顾客的消费信息,存储在商店的服务器中。这就是session。
最后,商店可以全局的决定,是5瓶为送酒杯还是6瓶。这就是application。
其实,这些机制都是在无状态的传统购买过程中加入了一点东西,使整个过程变得有状态。Web应用就是这样的。
10.cookies机制和session机制的区别
cookies数据保存在客户端,session数据保存在服务器端
cookies可以减轻服务器压力,但是不安全,容易进行cookies欺骗
session较安全,但占用服务器资源
11.http和https区别
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTPS和HTTP的区别主要如下:
总的来说: HTTPS=SSL+HTTP
- https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- (这个只是默认端口不一样,实际上端口是可以改的)
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
12.HTTP请求报文与响应报文格式
请求报文包含三部分:
a、请求行:包含请求方法、URI、HTTP版本信息
b、请求头部(headers)字段
c、请求内容实体(body)
响应报文包含三部分:
a、状态行:包含HTTP版本、状态码、状态码的原因短语
b、响应头部(headers)字段
c、响应内容(body)实体
13.常见的 POST 提交数据方式
application/x-www-form-urlencoded
multipart/form-data
application/json
text/xml
14.什么是DNS
域名解析服务。将主机名转换为IP地址。如将http://www.cnblogs.com/主机名转换为IP地址:211.137.51.78
15.请描述网络传输的过程
16.Http与Https优缺点
- 通信使用明文不加密,内容可能被窃听,也就是被抓包分析。
- 不验证通信方身份,可能遭到伪装
- 无法验证报文完整性,可能被篡改
- HTTPS就是HTTP加上加密处理(一般是SSL安全通信线路)+认证+完整性保护
17.Http优化
- 利用负载均衡优化和加速HTTP应用
- 利用HTTP Cache来优化网站
18.Http协议有那些特征
支持客户/服务器模式
简单快速
灵活
无连接无状态
19.Http协议中Http1.0与1.1区别
- 在http1.0中,当建立连接后,客户端发送一个请求,服务器端返回一个信息后就关闭连接,当浏览器下次请求的时候又要建立连接,显然这种不断建立连接的方式,会造成很多问题。
- 在http1.1中,引入了持续连接的概念,通过这种连接,浏览器可以建立一个连接之后,发送请求并得到返回信息,然后继续发送请求再次等到返回信息,也就是说客户端可以连续发送多个请求,而不用等待每一个响应的到来。
B/S和C/S
- CS = Client - Server = 客户端 - 服务器
例子: QQ,迅雷,快播,各种网络游戏等等。有和服务器通讯的
信息有着一对一,点对点的转发,单线传输,实时转发的特性的,服务器只做转发功能,大量的工作在客户端,这样的需求一般就是CS架构
- BS = Browser - Server = 浏览器 - 服务器
例子:所有的网站
支持很多人访问(甚至包括陌生人,游客等),不需要信息的实时性,但需要长期有效性,这样的需求一定是BS架构