http和https属于计算机网络的范畴,但是作为测试人员,我们也每天和这些请求打交道,所以掌握它们也是个必备的技能。
将会从以下几个方面进行阐述:
1、网络层结构
2、Http协议
3、Https协议/SSL协议
4、Tcp三次握手
5、http和https对比
1、网络层结构
网络结构有两种主流的分层方式:OSI七层模型和TCP/IP四层模型。
OSI是指Open System Interconnect,意为开放式系统互联。
TCP/IP是指传输控制协议/网间协议,是目前世界上应用最广的协议。
OSI层对应TCP/IP层OSI各层功能网络协议设备
应用层应用层应用程序(电子邮件,文件服务)用户接口HTTP,FTP,
TFTP,NFS
网关
表示层应用层数据的表示,压缩和加密(数据格式化,代码转化,数据加密)TELNET,SNMP网关
会话层应用层建立、管理和终止会话SMTP,DNS网关
传输层传输层提供端到端可靠报文和错误回复TCP,UDP网关
网络层网际互联层提供数据包从源到宿的传递和网际交互IP,ICMP,ARP,RARP,UUCP路由器
链路层网络接口层将比特组装成帧和点到点传递FDDI,SLIP,
PPP,PDN
交换机
物理层网络接口层传输比特流,以二进制数据形式在物理媒体上传输数据ISO2110,
IEEE802,
IEEE802.2
集线器,
中继器’
两种模型的区别:
1.OSI采用七层模型,TCP/IP协议的是四层模型
2.TCP/IP网络接口层没有真正的定义,知识概念性的描述。OSI把他分为2层,每一层功能详尽、
3.在协议开发之前,就有了OSI模型,所以OIS模型具有共通性,而TCP/IP是基于协议建立的模型,不适用于非TCP/IP的网络。
4.实际意义中,OIS模型是理论上的模型,没有成熟的产品,而TCP/IP已经成为国际标准。
2、HTTP协议
http协议是基于TCP/IP协议的应用程序协议,不包括数据包的传输,主要规定了客户端和服务器的通信格式,默认使用80端口。
http协议的发展史
1. 1991年发布http/0.9版本,只有get命令,而且服务器只返回HTML格式字符串,服务器响应完毕就关闭tcp连接。
2. 1996年发布Http/1.0版本,
优点:可以发送任何格式内容,包括文字、图像、视频、二进制。也丰富了命令Get,Post,Head。请求和响应的格式加入头信息。
缺点:每个TCP连接只能发送一个请求,而新建TCP连接的成本很高,导致Http/1.0新能很差。
3. 1997发布Http/1.1版本,完善了Http协议,直至20年后的今天仍是最流行的版本。
优点:
a. 引入持久连接,TCP默认不关闭,可被多个请求复用,对于一个域名,多数浏览器允许同时建立6个持久连接。
b. 引入管道机制,即在同一个TCP连接中,可以同时发送多个请求,不过服务器还是按顺序响应。
c. 在头部加入Content-Length字段,一个TCP可以同时传送多个响应,所以就需要该字段来区分哪些内容属于哪个响应。
d. 分块传输编码,对于耗时的动态操作,用流模式取代缓存模式,即产生一块数据,就发送一块数据。
e. 增加了许多命令,头信息增加Host来指定服务器域名,可以访问一台服务器上的不同网站。
缺点:TCP连接中的响应有顺序,服务器处理完一个回应才能处理下一个回应,如果某个回应特别慢,后面的请求就会排队等着(对头堵塞)。
4. 2015年发布Http/2版本,它有几个特性:二进制协议、多工、数据流、头信息压缩、服务器推送。
Http请求和响应格式
Request格式:
Response格式:
下面解释下请求头和响应头的部分字段:
Host: 指定服务器域名,可用来区分访问一个服务器上的不同服务
Connection: keep-alive表示要求服务器不要关闭TCP连接,close表示明确要求关闭连接,默认值是keep-alive
Accept-Encoding: 说明自己可以接收的压缩方式
USer-Agent: 用户代理,是服务器能是被客户端的操作系统(Android、iOS、web)及相关的信息。作用是帮助服务器区分
客户端,并且针对不同客户端让用户看到不同数据,做不同的操作
Content-Type:服务器告诉客户端数据的格式,常见的值有text/plain,image/jpeg,image/png,video/mp4,application/json,application/zip。这些数据类型总称为MIME TYPE。
Content-Encoding:服务器数据压缩方式
Transfer-Encoding:chunked表示采用分块传输编码,有该字段则无需使用Content-Length字段。
Content-Length:声明数据的长度,请求和回应头部都可以使用该字段。
3、Https协议/SSL协议
Https协议是以安全为目标的Http通道,简单来说就是Http的安全版。主要是在Http下加入SSL层(现在主流的是SLL/TLS),SSL是Https协议的安全基础。Https默认端口号为443。
窃听风险:Http采用明文传输数据,第三方可以获知通信内容
篡改风险:第三方可以修改通信内容
冒充风险:第三方可以冒充他人身份进行通信
SSL/TLS协议就是为了解决这些风险而设计,希望达到:
所有信息加密传输,三方窃听通信内容
具有校验机制,内容一旦被篡改,通信双发立刻会发现
配备身份证书,防止身份被冒充
4、Tcp三次握手
Http和Https协议请求都会通过Tcp三次握手建立Tcp连接。当时记得面试的时候自己看了好多次TCP相关的知识,因为面试很可能会问到这个问题。下面介绍具体的三次握手:
那么为什么一定要握手三次,一次两次难道不行么?重新回顾这个问题,认真的分析下为什么必须是三次握手。
第一次握手,A向B发送信息后,B收到信息。B可确认A的发信息能力和B的收信息能力
第二次握手,B向A发送消息,A收到消息。A可确认A的发信息能力和收信息能力,A也可以确认B的收信息能能力和B的发信息能力
第三次握手,A向B发送消息,B收到消息。B可确认A的收信息能力和B的发信息能力
通过三次握手,A和B都能确认自己和对方的收发信息能力,相当于建立了互相的信任,就可以开始通信了。
下面看一下三次握手具体发送的内容,用一张图描述如下:
首先,介绍一下几个概念:
ACK:响应标识,1表示响应,连接建立成功之后,所有报文段ACK的值都为1
SYN:连接标识,1表示建立连接,连接请求和连接接受报文段SYN=1,其他情况都是0
FIN:关闭连接标识,1标识关闭连接,关闭请求和关闭接受报文段FIN=1,其他情况都是0,跟SYN类似
seq number:序号,一个随机数X,请求报文段中会有该字段,响应报文段没有
ack number:应答号,值为请求seq+1,即X+1,除了连接请求和连接接受响应报文段没有该字段,其他的报文段都有该字段
知道了上面几个概念后,看一下三次握手的具体流程:
第一次握手:建立连接请求。客户端发送连接请求报文段,将SYN置为1,seq为随机数x。然后,客户端进入SYN_SEND状态,等待服务器确认。
第二次握手:确认连接请求。服务器收到客户端的SYN报文段,需要对该请求进行确认,设置ack=x+1(即客户端seq+1)。同时自己也要发送SYN请求信息,即SYN置为1,seq=y。服务器将SYN和ACK信息放在一个报文段中,一并发送给客户端,服务器进入SYN_RECV状态。
第三次握手:客户端收到SYN+ACK报文段,将ack设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕,客户端和服务券进入ESTABLISHED状态,完成Tcp三次握手。
从图中可以看出,建立连接经历了三次握手,当数据传输完毕,需要断开连接,而断开连接经历了四次挥手:
第一次挥手:主机1(可以是客户端或服务器),设置seq和ack向主机2发送一个FIN报文段,此时主机1进入FIN_WAIT_1状态,表示没有数据要发送给主机2了
第二次挥手:主机2收到主机1的FIN报文段,向主机1回应一个ACK报文段,表示同意关闭请求,主机1进入FIN_WAIT_2状态。
第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,主机2进入LAST_ACK状态。
第四次挥手:主机1收到主机2的FIN报文段,想主机2回应ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段后,关闭连接。此时主机1等待主机2一段时间后,没有收到回复,证明主机2已经正常关闭,主机1页关闭连接。
下面是Tcp报文段首部格式图,对于理解Tcp协议很重要:
5、Http协议和Https协议的对比
Http和Https的区别如下:
https协议需要到CA申请证书,大多数情况下需要一定费用
Http是超文本传输协议,信息采用明文传输,Https则是具有安全性SSL加密传输协议
Http和Https端口号不一样,Http是80端口,Https是443端口
Http连接是无状态的,而Https采用Http+SSL构建可进行加密传输、身份认证的网络协议,更安全。
Http协议建立连接的过程比Https协议快。因为Https除了Tcp三次握手,还要经过SSL握手。连接建立之后数据传输速度,二者无明显区别。