Http02 - 报文中的HTTP信息

了解请求和响应是怎样运作的

  • HTTP报文
  • HTTP请求报文和响应报文的结构
  • 使用编码提升传输速率
  • 发送多种数据的多部分对象数据集合
  • 获取部分内容的请求范围
  • 内容协商返回最合适的内容

Http报文

用于Http协议交互的信息叫做Http的报文<是一种由多行数据构成的字符串文本>

  • 客户端发出的请求信息叫做请求报文
  • 服务单发出的响应信息叫做响应报文

Http报文的基本结构

  • 报文首部
  • 报文主体

注意:

  • 报文首部和报文主体由(CR(Carriage Return, 回车符:16进制 0x0d) + LF(Line Feed, 换行符:16进制 0x0a))划分开,
  • 报文主体可以没有。不是必须的

HTTP请求报文和响应报文的结构

  • 请求行:包含用于请求的方法,请求URI和HTTP版本
  • 状态行:包含表面响应结果的状态码,原因短句和HTTP版本
  • 首部字段:包含请求和响应的各种条件和属性的各类首部,有以下四种首部

    • 通用首部字段
    • 请求首部字段
    • 响应首部字段
    • 实体首部字段
  • 其他:可能包含HTTP的RFC里未定义的首部(比如: Cookie)

使用编码提升传输速率

  • 使用原数据进行传输,传输速率慢,但是不需要对数据进行处理。
  • 进行编码提升传输速率,但是对原数据进行编码操作耗损cpu资源
  • 常用的有两种编码方式,应用于不同的场景当中
    • 内容的编码方式
    • 分块的编码方式

报文主体和实体主体的差异

==报文主体,实体主体的区别==

  • 报文:相当于一个载体,
  • 实体:要传输的图片或者其他的资源

压缩传输的内容编码

HTTP协议当中有一种被称之为内容编码的功能,就是对实体进行打包压缩,内容编码指明应用在实体的内容之上的编码格式,并且保持实体信息原样压缩,内容编码后的实体由客户端进行解码。

HTTP协议常用的内容编码有以下几种
  • gzip(GUN zip)
  • compress(UNIX系统的标准压缩)
  • deflate(zlib)
  • identity(不进行编码)

分割发送的分块传输的编码

HTTP协议在传输大容量数据的时候,通过把数据进行分割成多块,能够在浏览器上面逐步显示,如果不能分割成为多块的话,浏览器就无法显示请求的页面

分块传输编码会把实体主体分成多个部分,每一块使用十六进制来标记快的大小,最后一块一般使用“0(CR+LF)”来进行标记。最终都会由接受到响应的客户端负责解码,恢复到编码前的实体主体


发送多种数据的多部分对象集合

我们在发送邮件的时候,我们可以在一份邮件里面,添加视频,图片,音乐,还有文本,为什么可以呢,因为邮件采用了MIME(多用途英特网邮件扩展)机制。

我们的HTTP也同样的有着一部分的功能,,可以发送一份报文内包含多个类型的实体,

  • multipart/from-data:在Web表单上传文件时使用
  • multipart/byteranges:状态码为206,响应报文包含了多个范围内容时使用,我们可以看下面的一则报文
1
2
3
4
5
6
7
8
9
10
11
12
13
Data: Fri, 13 Jur 2016 01:45:26 GMT
Last-Modified: Fri, 31 Aug 2007 02:02:20 GMT
Content-Type :multipart/byteranges: boundary=THIS_STRING_SEPARATES

--THIS_STRING_SEPARATES
Content-Type: application/pdf
Content-Range:bytes 500-999/8000

--THIS_STRING_SEPARATES
Content-Type: application/pdf
Content-Range:bytes 7000-7999/8000

--THIS_STRING_SEPARATES--

获取部分内容的范围请求

要实现一种可以恢复上次下载中断机制,我们就需要指定下载的实体范围,这种,指定范围发送的请求就叫做范围请求(Range Request)

对一份10 000字节大小的资源,如果使用范围请求,可以只请求一部分资源

  • 注意:执行范围请求的时候会使用到首部字段 Range来指定资源的byte范围,
  • Range:bytes=50001-10000
  • Range:bytes=50001-
  • Range:bytes=-50001, 5000-7000

如果是范围请求,则响应会返回状态码206的响应报文。另外,对于多重范围请求,响应会在首部字段Content-Type表明 multipart/byteranges后返回响应报文


内容协商返回最合适的内容

我们的电脑浏览器,在国外的时候看到英文的Google页面,在国内则看到中文的Google页面,这就是说明一套网站它两个版本么?答案则是不然,因为在HTTP协议内部有内容协商,通过内容协商则会返回最最适合的内容

  • 服务器驱动协商
  • 客户端驱动协商
  • 透明协商

Http01 - 基础学习

  • 1、用途
  • 2、怎样通信
  • 3、怎样的协议
  • 4、怎样找到资源
  • 5、怎样向服务器表明意图
  • 6、关于协议内怎样进行优化
  • 7、协议自身的不足,通过Cookie进行弥补

1、用途

Http协议主要用于客户端和服务器之间的通信。

客户端:请求资源的一方叫做客户端

服务端:提供资源的一方叫做服务器

  • 注意:客户端和服务端只是就一次请求而言的,有可能在第二次请求的时候角色会发生改变,

2、怎样通信

HTTP:协议主要是通过请求和响应的互换来达成通信

HTTP:协议规定,请求从客户端发出,最后由服务端响应该请求并返回响应。

从规定可以看出,是客户端最先建立通信,而服务端在没有接收到请求之前是不会返回响应的。

下面看一则请求百度的实例。

首先当我们去打开网页时,输入网址(也就是URL)点击回车时,我们的浏览器会去发送请求,也就是会发送一个请求的报文,当服务器收到请求报文的时候就会按照请求报文里面所描述的那样去返回相应的内容,而返回的相应内容就是响应报文

请求报文:

1
2
3
4
5
GET 
/hm.gif?cc=0&ck=1&cl=24-bit&ds=1366x768&ep=51640%2C20188&et=3&fl=23.0&ja=1&ln=zh-cn&lo=0&lt=1480774657&nv=0&rnd=1886959562&si=dd4738b5fb302cb062ef19107df5d2e4&st=4&v=1.1.33&lv=3
HTTP/1.1

Host: hm.baidu.com
  • 第一行,GET表示请求访问服务器的类型,也称之为方法
  • 第二行,表示当前需要定位的资源的路径,URI
  • 第三行,表示当前使用HTTP的版本号

我们的这个请求报文,所表示的意思就是请求上述Host服务器的URI资源
请求报文一般会由以下5部分组成

  • 访问服务器的类型,也叫做请求方法
  • 请求URI
  • 协议版本号
  • 可选的首部字段
  • 内容实体

响应报文

我们接着看,当我们发送请求出去的时候,我们相应的得到了服务端的响应,我们现在来看看响应报文是什么样子的

1
2
3
4
5
6
7
8
9
10
11
// 协议版本号 状态码 状态码原因短句
HTTP/1.1 200 OK

// 响应的首部字段
Cache-Control: private, max-age=0, no-cache
Content-Length: 43
Content-Type: image/gif
Date: Sat, 03 Dec 2016 14:18:44 GMT
Pragma: no-cache
Server: apache
X-Content-Type-Options: nosniff

响应报文也是由5部分组成分别为

  • 协议版本
  • 状态码
  • 状态码原因短句
  • 响应首部字段
  • 主体

3、怎样的协议

HTTP是一种不会保存状态的协议

http协议自身是不会对请求和响应之间的通信状态进行保存,也就是说http对发送来的请求还是返回的响应统一都会去做持久化处理

当最新的请求来了,服务端会进行响应,但是协议本身是不会对请求报文,还有响应报文进行保存。

为什么会这么做呢,因为HTTP协议本身就是一种设计简单,有伸缩性的网络协议,如果加入持久化,就会对服务端加大压力,并且协议本身也会变得非常复杂。

  • 注意:这也就是HTTP的一个短处,但是现在已经通过Cookie进行了改善,并且更加的方便。

4、怎样找到资源

HTTP协议使用URI来定位网络资源

该URI回作为请求报文中请求URI字段

  • 注意:访问资源的时候使用URI,而如果不是访问特定的资源而是对服务器本身进行请求,可以使用*来代替请求URI。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    GET * HTTP/1.1


    ---

    ### 5、怎样向服务器表明意图

    #### 通过HTTP协议里面规定的方法(method)来向服务器表明意图。

    - ##### GET方法
    GET方法用来请求访问已经被URI识别的资源。指定资源经过服务端解析后返回响应内容。

    - ##### POST方法
    POST方法主要是用来传输实体的主体,

    > - 注意:GET方式也可以通过URI的方式去传输实体的主体,但是一般都不会使用GET的方式,因为不是很安全。

    > - POST的主要的目标是传输,和GET不一样,GET的主要目标就是获取响应的主体内容。

    - ##### PUT方法
    PUT方法主要是用来传输文件的,类似于FTP协议上传一样,要求在请求报文的主体中包括文件的内容,然后保存在URI指定的位置。

    > - 注意:由于HTTP/1.1 的PUT方式自身不带验证机制,任何人都可以上传文件,存在着很大的安全隐患,因此在一般的Web网站不会选择这种方法,但是配合Web程序的验证机制,或是架构设计采用REST,表征状态转移标准的Web网站,就可能会开发使用PUT协议

    - ##### HEAD方法
    HEAD方法和GET方法一样,只是不返回报文主体部分,用于确认URI的有效性以及资源更新的时间日期等。

    - ##### DELETE方法
    DELETE方法主要用来删除文件,是与PUT相反的方法。DELETE方法按照请求的URI找到资源,并删除。

    > - 注意:在HTTP/1.1中 DELETE方法与PUT方法一样,没有验证机制,所以一般的Web网站不会使用DELETE方法,当配合Web程序的验证机制,或者遵守REST标准时还是有可能会开放使用的

    - ##### OPTIONS(options)方法
    OPTIONS方法主要用来查询针对请求URI指定资源支持的方法。

    > - sequenceDiagram
    客户端->>服务器: (OPTIONS):支持什么方法
    服务器->>客户端: 支持GET POST 方法!


    - ##### TRACE(trace)方法
    TRACE方法主要是让Web服务器端将之前的请求通信还回给客户端。
    > - 客户端主要通过TRACE方法发出请求可以查询发送出去的请求是怎么样被加工修改的,这是因为请求想要链接到目标服务器有可能经过代理中转,TRACE方法就是用来确认连接过程中发生的一系列操作

    - - 注意:TRACE方法不常用,再加上使用这个方法会容易引发XST(跨站追踪)攻击,通常不会用到
    - ##### CONNECT方法
    CONNECT方法要求在于代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer, 安全套接层)和TLS(Transport Layer Security 传输层安全)协议把通信内容加密后经网络隧道传输。Connect方法格式如下

CONNECT 代理服务器名:端口号 HTTP版本
`


6、关于协议内怎样进行优化

问题1: 如果我们请求一个包含多张图片的HTML页面的时候,在发送请求访问HTML的URI的同时,也会请求HTML页面里面包含的其他资源,而我们HTTP协议,会每一次请求开始建立TCP连接,而在请求结束以后断开TCP连接,这样会增加通信的开销
问题2: 就上述的例子,我们在第一次请求图片的时候,只能等到第一次请求结束以后才能进行第二次请求,这样我们页面呈现在时间上面就会很差,大家可以理解为线程里面的同步处理多个任务,只能一个一个的任务按照顺序处理。

问题一:

为了解决这个问题,HTTP/1.1 提出了持久化连接来解决这个问题
持久化连接:HTTP keep-alive,HTTP Connection rese,只要任意一端没有明确提出断开连接,则保持TCP连接状态

问题二:

为了解决这个问题,HTTP/1.1 提出了管线化来解决这个问题
管线化:不用等待响应亦可直接发送下一个请求

7、使用Cookie的状态来管理Http无状态的缺点

Cookie技术就是通过请求和响应报文中写入Cookie信息来控制客户端的状态

Cookie会根据从服务器端发送的响应报文内一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie,当下一次客户端再往该服务器发送请求时,客户端会自动的在请求报文中加入Cookie值后再进行发送。