简述HTTP(一)

发布时间:2020/04/19

铺垫

世界上的计算机设备从网络协议的角度可以分为两类,一类是被普罗大众使用的PC、手机,在网络中被称为客户端,另一类呢,就是站在软件背后,为众多客户端提供数据,提供服务的设备,被称为服务端。客户端与服务端借助网络协议进行通信,可以说网络协议是他们的信使,其中http协议在应用层协议中使用最为广泛,接下来用多篇短文简述一下http的内容,这是第一篇,从宏观的角度看一眼HTTP。

从技术角度来看网络存在的目的就一句话:分享资源。图片,视频,文本,网页等都是资源,同样打印机,摄像头等也算是资源,因特网上有非常多种资源,HTTP给每种想要通过Web传输的对象都打上了MIME类型(Multipurpose Internet Mail Extension, 多用途因特网邮件扩展),MINE是一种文本标记,表示一种资源的类型和一个特定的子类型,中间由斜杠分割。例如:

1
2
3
4
text/plain  表示普通的ASCII文本文档
text/html 表示html
image/jpeg 表示JPEG格式的图片
application/vnd.ms-powerpoint 表示微软的PowerPoint演示文件

每个资源都有一个名字,这样客户端就可以说明他们需要的资源是什么了,服务器资源名称被称为统一资源标识符(Uniform Resource Identifier, URI),URI就像邮政地址一样在全世界唯一标识一个资源,URI目前有两种形式:URL(统一资源定位符)和URN(统一资源名),所以我们常说的URL是URI的子集;目前使用最为广泛的是URL,URN现在还是一个实验中的方案。一个完整的URL格式是这样的:

1
2
3
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<flag>

eg:https://www.17xueba.com/views/w/course_center/course.vpage

还有一种简短的URL形式 - 相对URL

1
2
3
比如在 https://www.17xueba.com页面中有一个图片地址可以写成这样:

<img src="images/home.png">

相对URL是基于基础URL来计算出来的,基础URL可以显式的提供,也就是html中的BASE标签

1
2
3
4
5
6
比如https://www.17xueba.com的页面中有如下标签的话
<base href="https://www.17xueba.com/assets" />

基础URL就是https://www.17xueba.com/assets

上面的例子中的图片完整地址就是 https://www.17xueba.com/assets/images/home.png

在没有显式的提供基础URL时,基础URL就是当前文档所在的URL,上面例子中的图片地址就会是

1
https://www.17xueba.com/images/home.png

报文

现在有了上面的铺垫可以说一下HTTP的数据格式了,我们把HTTP的数据包称为报文,一次完整的HTTP事务可以描述为客户端向服务器发送一条请求报文,服务器返回一个响应报文,HTTP报文都是纯文本,有三部分组成:

1
2
3
4
起始行     :请求报文的起始行是用于说明要做什么,响应报文中的起始行说明出现了什么情况
头部信息 :起始行后面有多个手部字段,用于更细致的描述报文的行为,每个字段包含一个名字和一个值,两者用:分割

可选的数据 :可选,可以包含要发给服务器的数据,或者服务器返回给客户端的数据

报文格式分别是

请求报文响应报文
method request-url versionversion status reason-phrase
headersheaders
entity-bodyentity-body

举个栗子🌰

访问一起学网校首页:

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
请求报文是这样的

GET /index.vpage HTTP/1.1
Host: www.17xueba.com
Accept: text/html

通过起始行我们可以看到这个报文我们使用了GET方法,请求的地址是 /index.vpage ,使用的协议版本是HTTP/1.1, 通过头部信息我们知道访问的host是 www.17xueba.com, 希望接收 html 格式的数据,可以看到这里的Accept的值就是我们上面提到的MIME类型。



响应报文是这样的

HTTP/1.1 200 OK
Date: Sun, 19 Apr 2020 13:03:07 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 11510
Content-Encoding: gzip

<!doctype html>
<html>
<head>
<title>一起学网校(同班同学都在学)</title>
<meta charset="utf-8">
...

通过起始行我们看到响应的报文使用的是HTTP/1.1版本, status 200代表请求成功,下面头部中分别说明了返回内容的MIME类型是html,内容长度有11510,一个空行后接着返回了响应体。

报文组成部分

下面我们详细说一下报文的个组成部分都有什么东西

method

上面例子中展示了一种请求方法GET,HTTP写一种有说明的方法有以下几种

方法描述是否包含主题
GET从服务器获取资源
HEAD只从服务器获取资源的首部信息
POST向服务器发送需要处理的数据
PUT将请求的主体部分存储在服务器上
TRACE对可能经过代理服务器传送到服务器上去的报文进行追踪
OPTIONS查找服务器支持的的方法
DELETE从服务器删除一份文档

version

HTTP/0.9, 1991制定的版本,是一个有很多严重设计缺陷的版本,只支持GET方法,不支持MIME类型,各种HTTP首部,以及版本号

HTTP/1.0,第一个广泛使用的版本,为HTTP添加了版本号,支持了MIME类型,支持了更多的请求方法

HTTP/1.1,是当前使用的最广的版本,删除了一些不好的特性,明确了语义,引入重要的性能优化措施

HTTP/2.0, 关注的是性能大幅优化

status

状态使用3位数字的状态码来区分,目前状态码共有以下5类:

整体范围已定义范围分类
100~199100 ~ 101信息提示
200~299200 ~ 206成功
300~399300 ~ 305重定向
400~499400 ~ 415客户端错误
500~599500 ~ 505服务器错误

headers

首部分为以下几类

  • 通用首部:请求和响应都可以用的首部,比如 Date: Sun, 19 Apr 2020 13:06:11 GMT
  • 请求首部:只有在请求报文中出现,比如 Accept: *
  • 响应首部:只有在响应中出现,比如 Server: Tengine
  • 实体首部:用于说明实体主体部分的数据类型,比如 Content-Type: text/html; charset=utf-8
  • 扩展首部:自己随便加

具体都有哪些首部就查文档吧,学习http的首部是学习http的重点,接下来分多篇来写吧。

最后更新:2022/06/30