网络相关知识——HTTP

网络相关知识——HTTP

1. HTTP介绍

协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,HTTP:(Hyper Text Transfer Protocol,超文本传输协议)是基于url地址的资源请求协议。HTTP最大的作用就是确定了请求和响应数据的格式。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。浏览器发送给服务器的数据:请求报文;服务器返回给浏览器的数据:响应报文。注意:http协议是无状态的,同一个客户端的这次请求和上次请求是没有对应关系,对http服务器来说,它并不知道这两个请求来自同一个客户端。 为了解决这个问题, Web程序引入了Cookie机制来维护状态。

1.1 IP

定义:互联网协议地址
作用:它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异,能唯一标识一台计算机。
IPv4的范围:255.255.255.255
局域网ip:192.168.x.x

1.2 端口

定义:port,计算机与网络交互的出口
如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门
端口可以有65536(即:2^16)个之多!0-65535
作用:对外发布服务

1.3 url地址详解

定义:每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位符),就是指网络地址。
格式:scheme://host[:port]/path/.../[?query-string][#anchor]

格式说明
scheme指定低层使用的协议(例如:http, https, ftp)
hostHTTP服务器的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

2. 报文

2.1 http报文的组成

HTTP通信过程包括客户端往服务器端发送请求以及服务器端给客户端返回响应两个过程。在此过程中,用于HTTP协议交互的信息就是http报文。Http报文分为请求报文返回(响应)报文

2.2 报文中关注的信息

  • 请求:包括地址、请求状态、方式等

  • 地址:参考url地址

  • 请求状态:参考http状态码

  • 方式:post、get、put、delete等。(主要是封包和发送方式不一样)

  • 参数:需要发送给服务器的参数信息,比如登录:需要把用户名密码发送给服务器

  • 头:主要是传递身份信息和校验信息,分请求头响应头

    • 请求头:主要是用户传递的校验信息
    • 响应头:服务器告诉用户,属于你需要保存的校验信息
  • 返回体:又叫响应。主要是服务器给用户返回处理后的信息。

2.3 请求方式

2.3.1 HTTP协议已定义的请求方式

HTTP1.1中共定义了八种请求方式:

方法描述
GET请求指定的页面信息,并返回实体主体。
HEAD类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
PUT从客户端向服务器传送的数据取代指定的文档的内容。
DELETE请求服务器删除指定的页面。
CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS允许客户端查看服务器的性能。
TRACE回显服务器收到的请求,主要用于测试或诊断。
PATCH是对 PUT 方法的补充,用来对已知资源进行局部更新 。

2.3.2 GET请求

特征1:没有请求体。
特征2:请求参数附着在URL地址后面,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456
特征3:请求参数在浏览器地址栏(URL)能够直接被看到,存在安全隐患。比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。
特征4:在URL地址后面携带请求参数,数据容量非常有限(因为浏览器对URL的长度有限制)。如果数据量大,那么超出容量的数据会丢失。
特征5:从报文角度分析,请求参数是在请求行中携带的,因为访问地址在请求行。

2.3.3 POST请求

特征1:有请求体。
特征2:请求参数放在请求体中。
特征3:请求体发送数据的空间没有限制。
特征4:可以发送各种不同类型的数据。
特征5:从报文角度分析,请求参数是在请求体中携带的。
特征6:由于请求参数是放在请求体中,所以浏览器地址栏看不到。

2.3.4 媒体类型

2.3.4.1 HTTP协议中的MIME类型

Multipurpose Internet Mail Extensions

2.3.4.2 用途

为了让用户通过浏览器和服务器端交互的过程中有更好、更丰富的体验,HTTP协议需要支持丰富的数据类型。

2.3.4.3 MIME类型定义参考

我们可以通过查看Tomcat解压目录下conf/web.xml配置文件,了解HTTP协议中定义的MIME类型。

<mime-mapping>
	<extension>mp4</extension>
	<mime-type>video/mp4</mime-type>
</mime-mapping>
<mime-mapping>
	<extension>doc</extension>
	<mime-type>application/msword</mime-type>
</mime-mapping>
<mime-mapping>
	<extension>json</extension>
	<mime-type>application/json</mime-type>
</mime-mapping>
<mime-mapping>
	<extension>html</extension>
	<mime-type>text/html</mime-type>
</mime-mapping>

从上面的例子中可以看出:MIME的基本格式是大类/具体类型,MIME类型在HTTP报文中对应的是内容类型:Content-type

2.4 https协议

以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

  • 本质:
    本质还是http请求,只是加入了ssl加密机制

  • 区别:
    https协议需要到ca申请证书,一般免费证书很少,需要交费。
    http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
    http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
    HTTPS解决了信任主机的问题

  • 测试:
    只需要关注是否成功配置了证书,证书是否有效
    其加密与解密不需要测试。协议本身就已经是测试通过的。

2.5 在开发者工具中浏览报文源码

http

3. 请求报文

请求报文格式中分为三大部分,即请求行、请求头、请求体。
在测试中关注四要素请求方法URL请求头请求体

http

使用浏览器开发者工具抓包:在网页(随便一个能交互的网页)上右键或按下F12,打开开发者工具,切换到network界面。(也可以使用Fiddler/charles抓包软件抓包)
注意:记得勾选 preserve log

http

http

http
http

3.1 请求行

作用:展示当前请求的最基本信息
POST /dynamic/target.jsp HTTP/1.1
- 请求方式
- 访问地址
- HTTP协议的版本 (一般都是HTTP/1.1)

3.2 请求消息头

作用:通过具体的参数对本次请求进行详细的说明,包含了很多客户端需要告诉服务器的信息,比如:浏览器型号、版本,请求内容的类型、长度。
格式:键值对,键和值之间使用冒号隔开

3.2.1 Cache 头域

名称功能示例
If-Modified-Since把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT
If-None-MatchIf-None-MatchETag一起工作,工作原理是在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

3.2.2 Client 头域

名称功能示例
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

3.2.3 Cookie/Login 头域

名称功能示例
Cookie浏览器访问服务器时携带的Cookie数据,重要!Cookie: $Version=1; Skin=new;

2.3.4 Entity头域

名称功能示例
Content-Length请求体内容(发送给HTTP服务器数据)的长度Content-Length: 348
Content-Type请求体的内容类型,这一项的具体值是媒体类型中的某一种Content-Type: application/x-www-form-urlencoded

2.3.5 Miscellaneous 头域

名称功能示例
Referer当前请求来源页面的地址,提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站,重要!Referer:127.0.0.1

3.2.6 Transport 头域

名称功能示例
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)中设定这个时间

3.3 请求体

作用:作为请求的主体,发送数据给服务器。

GET方式:没有请求体,有querryString

POST方式:FromData

3.3.1 QueryString

http

http

3.3.2 Form data

含义:当前请求体是一个表单提交的请求参数。

http

查看源码后,发现格式如下:

username=admin&password=admin
- 每一组请求参数是一个键值对
- 键和值中间是等号
- 键值对之间是&号

3.3.3 Request Payload

含义:整个请求体以某种特定格式来组织数据,例如JSON格式。

http

4. 响应报文

$emsp;返回报文格式同样分为三大部分,即返回行、返回头、返回体。
测试过程中通常关注重点返回体中的信息。

http
http

http

4.1 响应状态行

HTTP/1.1 200 OK

  • HTTP协议版本
  • 响应状态码
  • 响应状态的说明文字

4.2 响应消息头

  • 包含了服务器的信息;服务发送给浏览器的信息(内容的媒体类型、编码、内容长度等)。

4.2.1 Cache头域

名称功能示例
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

4.2.2 Cookie/Login 头域

名称功能示例
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

4.2.3 Entity头域

名称功能示例
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-TypeWEB服务器告诉浏览器自己响应的对象的类型和字符集Content-Type: text/html; charset=utf-8Content-Type:text/html;charset=GB2312Content-Type: image/jpeg
Content-Length指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。Content-Length: 19847
Content-EncodingWEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。Content-Encoding:gzip
Content-LanguageWEB服务器告诉浏览器自己响应的对象的语言者Content-Language:da

4.2.4 Miscellaneous 头域

名称功能示例
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

4.2.5 Transport头域

名称功能示例
Connection设置客户端和服务器之间用于传输HTTP数据的TCP连接状态Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。 Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。

4.2.6 Location头域

名称功能示例
Location用于重定向一个新的位置, 包含新的URL地址Location: https://www.baidu.com,告诉浏览器,接下来要跳转到百度页面(也可以是自己服务器上的路径)

4.3 响应体

服务器返回的数据主体,有可能是各种数据类型。

  • HTML页面
  • 图片
  • 视频
  • 以下载形式返回的文件
  • CSS文件
  • JavaScript文件

4.4 响应状态码

作用:以编码的形式告诉浏览器当前请求处理的结果

1XX:信息状态码

状态码含义描述
100继续初始的请求已经接受,请客户端继续发送剩余部分
101切换协议请求这要求服务器切换协议,服务器已确定切换

2XX:成功状态码

状态码含义描述
200成功服务器已成功处理了请求
201已创建请求成功并且服务器创建了新的资源
202已接受服务器已接受请求,但尚未处理
203非授权信息服务器已成功处理请求,但返回的信息可能来自另一个来源
204无内容服务器成功处理了请求,但没有返回任何内容
205重置内容服务器处理成功,用户终端应重置文档视图
206部分内容服务器成功处理了部分GET请求

3XX:重定向状态码

状态码含义描述
300多种选择针对请求,服务器可执行多种操作
301永久移动请求的页面已永久跳转到新的url
302临时移动服务器重定向,服务器目前从不同位置的网页响应请求,但请求仍继续使用原有位置来进行以后的请求
303查看其他位置请求者应当对不同的位置使用单独的GET请求来检索响应时,服务器返回此代码
304未修改自从上次请求后,请求的网页未修改过
305使用代理请求者只能使用代理访问请求的网页
307临时重定向服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求

4XX:客户端错误状态码

状态码含义描述
400错误请求服务器不理解请求的语法
401未授权请求要求用户的身份演验证
403禁止服务器拒绝请求(没有权限)
404未找到服务器找不到请求的页面目录资源,(地址填错,或者文件不存在了)
405方法禁用禁用请求中指定的方法,请求方式和服务器对应的处理方式不太一样
406不接受无法使用请求的内容特性响应请求的页面
407需要代理授权请求需要代理的身份认证
408请求超时服务器等候请求时发生超时
409冲突服务器在完成请求时发生冲突
410已删除客户端请求的资源已经不存在
411需要有效长度服务器不接受不含有效长度表头字段的请求
412未满足前提条件服务器未满足请求者在请求中设置的其中一个前提条件
413请求实体过大由于请求实体过大,服务器无法处理,因此拒绝请求
414请求url过长请求的url过长,服务器无法处理
415不支持格式服务器无法处理请求中附带媒体格式
416范围无效客户端请求的范围无效
417未满足期望服务器无法满足请求表头字段要求

5XX:服务端内部错误状态码

状态码含义描述
500服务器错误服务器内部错误,无法完成请求(后台报错)
501尚未实施服务器不具备完成请求的功能
502错误网关服务器作为网关或代理出现错误(下游服务宕机)
503服务不可用服务器目前无法使用
504网关超时网关或代理服务器,未及时获取请求
505不支持版本服务器不支持请求中使用的HTTP协议版本

5. HTTP协议的工作流程

一次HTTP操作称为一个事务,其工作过程可分为四步:

  1. 首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。
  2. 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
  3. 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
  4. 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
  5. 如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

版权声明:本文为weixin_45048331原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。