- 1、用途
- 2、怎样通信
- 3、怎样的协议
- 4、怎样找到资源
- 5、怎样向服务器表明意图
- 6、关于协议内怎样进行优化
- 7、协议自身的不足,通过Cookie进行弥补
1、用途
Http协议主要用于客户端和服务器之间的通信。
客户端:请求资源的一方叫做客户端
服务端:提供资源的一方叫做服务器
- 注意:客户端和服务端只是就一次请求而言的,有可能在第二次请求的时候角色会发生改变,
2、怎样通信
HTTP:协议主要是通过请求和响应的互换来达成通信
HTTP:协议规定,请求从客户端发出,最后由服务端响应该请求并返回响应。
从规定可以看出,是客户端最先建立通信,而服务端在没有接收到请求之前是不会返回响应的。
下面看一则请求百度的实例。
首先当我们去打开网页时,输入网址(也就是URL)点击回车时,我们的浏览器会去发送请求,也就是会发送一个请求的报文,当服务器收到请求报文的时候就会按照请求报文里面所描述的那样去返回相应的内容,而返回的相应内容就是响应报文
请求报文:
1 | GET |
- 第一行,GET表示请求访问服务器的类型,也称之为方法
- 第二行,表示当前需要定位的资源的路径,URI
- 第三行,表示当前使用HTTP的版本号
我们的这个请求报文,所表示的意思就是请求上述Host服务器的URI资源
请求报文一般会由以下5部分组成
- 访问服务器的类型,也叫做请求方法
- 请求URI
- 协议版本号
- 可选的首部字段
- 内容实体
响应报文
我们接着看,当我们发送请求出去的时候,我们相应的得到了服务端的响应,我们现在来看看响应报文是什么样子的
1 | // 协议版本号 状态码 状态码原因短句 |
响应报文也是由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
47GET * 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值后再进行发送。