协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,HTTP:(Hyper Text Transfer Protocol,超文本传输协议)是基于url地址的资源请求协议。HTTP最大的作用就是确定了请求和响应数据的格式。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。浏览器发送给服务器的数据:请求报文;服务器返回给浏览器的数据:响应报文。注意:http协议是无状态的,同一个客户端的这次请求和上次请求是没有对应关系,对http服务器来说,它并不知道这两个请求来自同一个客户端。 为了解决这个问题, Web程序引入了Cookie机制来维护状态。
定义:互联网协议地址
作用:它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异,能唯一标识一台计算机。
IPv4的范围:255.255.255.255
局域网ip:192.168.x.x
定义:port,计算机与网络交互的出口
如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门
端口可以有65536(即:2^16)个之多!0-65535
作用:对外发布服务
定义:每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位符),就是指网络地址。
格式:scheme://host[:port]/path/.../[?query-string][#anchor]
格式 | 说明 |
---|---|
scheme | 指定低层使用的协议(例如:http, https, ftp) |
host | HTTP服务器的IP地址或者域名,资源所在计算机(域名最终会解析为IP) |
port# | 资源对外发布的端口,HTTP服务器的默认端口是80,这种情况下端口号可以省略。HTTPS默认端口是443。如果使用了别的端口,必须指明,例如:http://127.0.0.1:8080/ |
path | 访问资源的路径,资源在服务器的位置(tomcat下面,其实是相对webapps的路径) |
query-string | 发送给http服务器的数据 |
anchor | 跳转到网页的指定锚点位置 |
举个例子:http://www.mywebsite.com/login?name=admin&password=admin#stuff
Schema: http
host: www.mywebsite.com
path: login
Query String: name=admin&password=admin
Anchor: stuff
HTTP通信过程包括客户端往服务器端发送请求以及服务器端给客户端返回响应两个过程。在此过程中,用于HTTP协议交互的信息就是http报文。Http报文分为请求报文和返回(响应)报文。
请求:包括地址、请求状态、方式等
地址:参考url地址
请求状态:参考http状态码
方式:post、get、put、delete等。(主要是封包和发送方式不一样)
参数:需要发送给服务器的参数信息,比如登录:需要把用户名密码发送给服务器
头:主要是传递身份信息和校验信息,分请求头和响应头
返回体:又叫响应。主要是服务器给用户返回处理后的信息。
HTTP1.1中共定义了八种请求方式:
方法 | 描述 |
---|---|
GET | 请求指定的页面信息,并返回实体主体。 |
HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
DELETE | 请求服务器删除指定的页面。 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 允许客户端查看服务器的性能。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
特征1:没有请求体。
特征2:请求参数附着在URL地址后面,以?
分割URL和传输数据,参数之间以&
相连,如EditPosts.aspx?name=test1&id=123456
。
特征3:请求参数在浏览器地址栏(URL)能够直接被看到,存在安全隐患。比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。
特征4:在URL地址后面携带请求参数,数据容量非常有限(因为浏览器对URL的长度有限制)。如果数据量大,那么超出容量的数据会丢失。
特征5:从报文角度分析,请求参数是在请求行中携带的,因为访问地址在请求行。
特征1:有请求体。
特征2:请求参数放在请求体中。
特征3:请求体发送数据的空间没有限制。
特征4:可以发送各种不同类型的数据。
特征5:从报文角度分析,请求参数是在请求体中携带的。
特征6:由于请求参数是放在请求体中,所以浏览器地址栏看不到。
Multipurpose Internet Mail Extensions
为了让用户通过浏览器和服务器端交互的过程中有更好、更丰富的体验,HTTP协议需要支持丰富的数据类型。
我们可以通过查看Tomcat解压目录下conf/web.xml配置文件,了解HTTP协议中定义的MIME类型。
mp4
video/mp4
doc
application/msword
json
application/json
html
text/html
从上面的例子中可以看出:MIME的基本格式是大类/具体类型,MIME类型在HTTP报文中对应的是内容类型:Content-type
以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
本质:
本质还是http请求,只是加入了ssl加密机制
区别:
https协议需要到ca申请证书,一般免费证书很少,需要交费。
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
HTTPS解决了信任主机的问题
测试:
只需要关注是否成功配置了证书,证书是否有效
其加密与解密不需要测试。协议本身就已经是测试通过的。
请求报文格式中分为三大部分,即请求行、请求头、请求体。
在测试中关注四要素:请求方法、URL、请求头、请求体。
使用浏览器开发者工具抓包:在网页(随便一个能交互的网页)上右键或按下F12,打开开发者工具,切换到network界面。(也可以使用Fiddler/charles抓包软件抓包)
注意:记得勾选 preserve log
作用:展示当前请求的最基本信息
POST /dynamic/target.jsp HTTP/1.1
- 请求方式
- 访问地址
- HTTP协议的版本 (一般都是HTTP/1.1)
作用:通过具体的参数对本次请求进行详细的说明,包含了很多客户端需要告诉服务器的信息,比如:浏览器型号、版本,请求内容的类型、长度。
格式:键值对,键和值之间使用冒号隔开
名称 | 功能 | 示例 |
---|---|---|
If-Modified-Since | 把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。 | If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT |
If-None-Match | If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能 | If-None-Match: "03f2b33c0bfcc1:0" |
Cache-Control | 这个用来指定Response-Request遵循的缓存机制,这个是非常重要的规则。 | Cache-Control:Public 可以被任何缓存所缓存,Cache-Control:Private 内容只缓存到私有缓存中,Cache-Control:no-cache 所有内容都不会被缓存 |
Pragma | 防止页面被缓存, 在HTTP/1.1版本中,它和Cache-Control:no-cache 作用一模一样。 | Pragma: no-cache |
名称 | 功能 | 示例 |
---|---|---|
Accept | 声明当前请求能够接受的『媒体类型』,如果服务器无法返回规定的类型的数据,服务器应该返回一个406错误(non acceptable)。 | Accept: text/plain, text/html ,代表浏览器可以接受服务器回发的类型为text/html ,也就是我们常说的html文档。通配符* 代表任意类型,Accept: "/" 代表浏览器可以处理所有类型,一般浏览器发给服务器都是发这个 |
Accept-Encoding | 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码)。 | Accept-Encoding: gzip, deflate |
Accept-Language | 浏览器申明自己接收的语言,语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。 | Accept-Language: en-us |
User-Agent | 告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本。我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。 | User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E) |
Accept-Charset | 浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312,utf-8(通常我们说Charset包括了相应的字符编码方案)。 | Accept-Charse:utf-8 |
名称 | 功能 | 示例 |
---|---|---|
Cookie | 浏览器访问服务器时携带的Cookie数据,重要! | Cookie: $Version=1; Skin=new; |
名称 | 功能 | 示例 |
---|---|---|
Content-Length | 请求体内容(发送给HTTP服务器数据)的长度 | Content-Length: 348 |
Content-Type | 请求体的内容类型,这一项的具体值是媒体类型中的某一种 | Content-Type: application/x-www-form-urlencoded |
名称 | 功能 | 示例 |
---|---|---|
Referer | 当前请求来源页面的地址,提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站,重要! | Referer:127.0.0.1 |
名称 | 功能 | 示例 |
---|---|---|
Connection | 设置客户端和服务器之间用于传输HTTP数据的TCP连接状态 | Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。 Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。 |
Host | 服务器的主机地址,请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,发送请求时,该报头域是必需的! | 我们在浏览器中输入:http://www.guet.edu.cn/index.html ,浏览器发送的请求消息中,就会包含Host请求报头域:Host:http://www.guet.edu.cn ,此处使用缺省端口号80,若指定了端口号,则变成:Host:指定端口号 |
注意:HTTP协议是无状态的和Connection: keep-alive的区别
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。
HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。
从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间
作用:作为请求的主体,发送数据给服务器。
GET方式:没有请求体,有querryString
POST方式:FromData
含义:当前请求体是一个表单提交的请求参数。
查看源码后,发现格式如下:
username=admin&password=admin
- 每一组请求参数是一个键值对
- 键和值中间是等号
- 键值对之间是&号
含义:整个请求体以某种特定格式来组织数据,例如JSON格式。
$emsp;返回报文格式同样分为三大部分,即返回行、返回头、返回体。
测试过程中通常关注重点是返回体中的信息。
HTTP/1.1 200 OK
- HTTP协议版本
- 响应状态码
- 响应状态的说明文字
名称 | 功能 | 示例 |
---|---|---|
Date | 生成消息的具体时间和日期 | Date: Sat, 11 Feb 2012 11:35:14 GMT |
Expires | 浏览器会在指定过期时间内使用本地缓存 | Expires: Tue, 08 Feb 2022 11:35:14 GMT |
Vary | 告诉代理服务器缓存两种版本的资源:压缩和非压缩,避免一些公共代理不能正确地检测Content-Encoding标头的问题 | Vary: Accept-Encoding |
名称 | 功能 | 示例 |
---|---|---|
P3P | 用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题 | P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR |
Set-Cookie | 用于把cookie 发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie非常重要的header! | Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com |
名称 | 功能 | 示例 |
---|---|---|
ETag | 和If-None-Match 配合使用。(实例请看上节中If-None-Match的实例) | ETag: "03f2b33c0bfcc1:0" |
Last-Modified | 用于指示资源的最后修改日期和时间。(实例请看上节的If-Modified-Since的实例) | Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT |
Content-Type | WEB服务器告诉浏览器自己响应的对象的类型和字符集 | Content-Type: text/html; charset=utf-8 ,Content-Type:text/html;charset=GB2312 ,Content-Type: image/jpeg |
Content-Length | 指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。 | Content-Length: 19847 |
Content-Encoding | WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。 | Content-Encoding:gzip |
Content-Language | WEB服务器告诉浏览器自己响应的对象的语言者 | Content-Language:da |
名称 | 功能 | 示例 |
---|---|---|
Server | 指明HTTP服务器的软件信息 | Server: Microsoft-IIS/7.5 |
X-AspNet-Version | 如果网站是用ASP.NET开发的,这个header用来表示ASP.NET的版本 | X-AspNet-Version: 4.0.30319 |
X-Powered-By | 表示网站是用什么技术开发的 | X-Powered-By: ASP.NET |
名称 | 功能 | 示例 |
---|---|---|
Connection | 设置客户端和服务器之间用于传输HTTP数据的TCP连接状态 | Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。 Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。 |
名称 | 功能 | 示例 |
---|---|---|
Location | 用于重定向一个新的位置, 包含新的URL地址 | Location: https://www.baidu.com ,告诉浏览器,接下来要跳转到百度页面(也可以是自己服务器上的路径) |
服务器返回的数据主体,有可能是各种数据类型。
作用:以编码的形式告诉浏览器当前请求处理的结果
状态码 | 含义 | 描述 |
---|---|---|
100 | 继续 | 初始的请求已经接受,请客户端继续发送剩余部分 |
101 | 切换协议 | 请求这要求服务器切换协议,服务器已确定切换 |
状态码 | 含义 | 描述 |
---|---|---|
200 | 成功 | 服务器已成功处理了请求 |
201 | 已创建 | 请求成功并且服务器创建了新的资源 |
202 | 已接受 | 服务器已接受请求,但尚未处理 |
203 | 非授权信息 | 服务器已成功处理请求,但返回的信息可能来自另一个来源 |
204 | 无内容 | 服务器成功处理了请求,但没有返回任何内容 |
205 | 重置内容 | 服务器处理成功,用户终端应重置文档视图 |
206 | 部分内容 | 服务器成功处理了部分GET请求 |
状态码 | 含义 | 描述 |
---|---|---|
300 | 多种选择 | 针对请求,服务器可执行多种操作 |
301 | 永久移动 | 请求的页面已永久跳转到新的url |
302 | 临时移动 | 服务器重定向,服务器目前从不同位置的网页响应请求,但请求仍继续使用原有位置来进行以后的请求 |
303 | 查看其他位置 | 请求者应当对不同的位置使用单独的GET请求来检索响应时,服务器返回此代码 |
304 | 未修改 | 自从上次请求后,请求的网页未修改过 |
305 | 使用代理 | 请求者只能使用代理访问请求的网页 |
307 | 临时重定向 | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求 |
状态码 | 含义 | 描述 |
---|---|---|
400 | 错误请求 | 服务器不理解请求的语法 |
401 | 未授权 | 请求要求用户的身份演验证 |
403 | 禁止 | 服务器拒绝请求(没有权限) |
404 | 未找到 | 服务器找不到请求的页面目录资源,(地址填错,或者文件不存在了) |
405 | 方法禁用 | 禁用请求中指定的方法,请求方式和服务器对应的处理方式不太一样 |
406 | 不接受 | 无法使用请求的内容特性响应请求的页面 |
407 | 需要代理授权 | 请求需要代理的身份认证 |
408 | 请求超时 | 服务器等候请求时发生超时 |
409 | 冲突 | 服务器在完成请求时发生冲突 |
410 | 已删除 | 客户端请求的资源已经不存在 |
411 | 需要有效长度 | 服务器不接受不含有效长度表头字段的请求 |
412 | 未满足前提条件 | 服务器未满足请求者在请求中设置的其中一个前提条件 |
413 | 请求实体过大 | 由于请求实体过大,服务器无法处理,因此拒绝请求 |
414 | 请求url过长 | 请求的url过长,服务器无法处理 |
415 | 不支持格式 | 服务器无法处理请求中附带媒体格式 |
416 | 范围无效 | 客户端请求的范围无效 |
417 | 未满足期望 | 服务器无法满足请求表头字段要求 |
状态码 | 含义 | 描述 |
---|---|---|
500 | 服务器错误 | 服务器内部错误,无法完成请求(后台报错) |
501 | 尚未实施 | 服务器不具备完成请求的功能 |
502 | 错误网关 | 服务器作为网关或代理出现错误(下游服务宕机) |
503 | 服务不可用 | 服务器目前无法使用 |
504 | 网关超时 | 网关或代理服务器,未及时获取请求 |
505 | 不支持版本 | 服务器不支持请求中使用的HTTP协议版本 |
一次HTTP操作称为一个事务,其工作过程可分为四步: