铺垫
世界上的计算机设备从网络协议的角度可以分为两类,一类是被普罗大众使用的PC、手机,在网络中被称为客户端,另一类呢,就是站在软件背后,为众多客户端提供数据,提供服务的设备,被称为服务端。客户端与服务端借助网络协议进行通信,可以说网络协议是他们的信使,其中http协议在应用层协议中使用最为广泛,接下来用多篇短文简述一下http的内容,这是第一篇,从宏观的角度看一眼HTTP。
从技术角度来看网络存在的目的就一句话:分享资源。图片,视频,文本,网页等都是资源,同样打印机,摄像头等也算是资源,因特网上有非常多种资源,HTTP给每种想要通过Web传输的对象都打上了MIME类型(Multipurpose Internet Mail Extension, 多用途因特网邮件扩展),MINE是一种文本标记,表示一种资源的类型和一个特定的子类型,中间由斜杠分割。例如:
1 | text/plain 表示普通的ASCII文本文档 |
每个资源都有一个名字,这样客户端就可以说明他们需要的资源是什么了,服务器资源名称被称为统一资源标识符(Uniform Resource Identifier, URI),URI就像邮政地址一样在全世界唯一标识一个资源,URI目前有两种形式:URL(统一资源定位符)和URN(统一资源名),所以我们常说的URL是URI的子集;目前使用最为广泛的是URL,URN现在还是一个实验中的方案。一个完整的URL格式是这样的:
1 | <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<flag> |
还有一种简短的URL形式 - 相对URL
1 | 比如在 https://www.17xueba.com页面中有一个图片地址可以写成这样: |
相对URL是基于基础URL来计算出来的,基础URL可以显式的提供,也就是html中的BASE标签
1 | 比如https://www.17xueba.com的页面中有如下标签的话 |
在没有显式的提供基础URL时,基础URL就是当前文档所在的URL,上面例子中的图片地址就会是
1 | https://www.17xueba.com/images/home.png |
报文
现在有了上面的铺垫可以说一下HTTP的数据格式了,我们把HTTP的数据包称为报文,一次完整的HTTP事务可以描述为客户端向服务器发送一条请求报文,服务器返回一个响应报文,HTTP报文都是纯文本,有三部分组成:
1 | 起始行 :请求报文的起始行是用于说明要做什么,响应报文中的起始行说明出现了什么情况 |
报文格式分别是
请求报文 | 响应报文 |
---|---|
method request-url version | version status reason-phrase |
headers | headers |
entity-body | entity-body |
举个栗子🌰
访问一起学网校首页:
1 | 请求报文是这样的 |
报文组成部分
下面我们详细说一下报文的个组成部分都有什么东西
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~199 | 100 ~ 101 | 信息提示 |
200~299 | 200 ~ 206 | 成功 |
300~399 | 300 ~ 305 | 重定向 |
400~499 | 400 ~ 415 | 客户端错误 |
500~599 | 500 ~ 505 | 服务器错误 |
headers
首部分为以下几类
- 通用首部:请求和响应都可以用的首部,比如 Date: Sun, 19 Apr 2020 13:06:11 GMT
- 请求首部:只有在请求报文中出现,比如 Accept: *
- 响应首部:只有在响应中出现,比如 Server: Tengine
- 实体首部:用于说明实体主体部分的数据类型,比如 Content-Type: text/html; charset=utf-8
- 扩展首部:自己随便加
具体都有哪些首部就查文档吧,学习http的首部是学习http的重点,接下来分多篇来写吧。