HTTP协议简述


一、HTTP 协议概述

1.概述

HTTP(Hyper Text Transfer Protocol,超文本传输协议)是一种请求/响应式的协议,它专门用于定义客户端与服务器之间交换数据的过程以及数据本身的格式。
通俗的讲,HTTP 协议是客户端与服务器双方沟通的语言以及在交互过程中共同遵循的规则
基于 HTTP 协议的交互过程可以简要描述如下:
客户端先与服务端建立连接,
然后向服务端发送请求,称为HTTP 请求
服务端接收到 HTTP 请求后会做出响应,称为 HTTP 响应
交互过程简析
当我们在本地浏览器输入相应的 URL 地址后,便向服务端发送了一个 HTTP 请求,服务端接收到该请求后,便会将该网页的内容以 HTTP 响应的形式返回给客户端(浏览器),客户端会对该 HTTP 响应进行解析然后以一定的形式展现给用户

2.特点

快速灵活
HTTP 的简单性保证了客户端与服务端之间的通讯速度很快。另外,HTTP 协议允许传输任意类型的数据,使得交互方式十分灵活。
无状态
HTTP 是无状态协议,它规定了服务端程序对于事务处理没有记忆能力。一次交互结束后,如果要处理相同请求则必须重新发送该请求

二、HTTP 消息

客户端向服务器发送请求数据,即 HTTP 请求消息
服务器接收到请求消息后将处理后的数据返回给客户端,即 HTTP 响应消息
HTTP 请求消息和 HTTP 响应消息统称为 HTTP消息
一个完整的 HTTP 消息主要包括消息头(Headers)、响应实体内容(Response)和 Cookies 文件
响应实体内容主要包括 HTML 内容、CSS 内容、JavaScript 内容以及图片等资源

本文主要讲述 HTTP 消息的消息头部分,主要包括一般消息头、请求消息头和响应消息头(根据 chrome 浏览器给出的划分)

1.一般消息头

一般消息头中包含了常见请求和响应信息

(1).Request URL

Request URL 表示客户端请求的 URL 地址,该 URL 内容主要由三种方式来决定:用户直接在浏览器地址栏中输入超链接跳转以及表单提交

(2).Request Method

Request Method 表示客户端向服务发送请求的方式。实际开发中,常用的请求方式主要有 GET、POST、PUT、DELETE 等 4 种,每种方式都指明了操作服务器中指定资源的方式
本文主要对其中最常用的 GET 和 POST 方式进行详细讲解。
下面我们以这个表单为例子

<form action="" method="get/post">
	登录名(文本框):<input type="text" name="username" value="wzu"> <br>
	密码(密码框):<input type="password" name="pwd" value=""> <br>
	<input type="submit" value="注册">
</form>

GET 方式
当用户在浏览器地址栏中输入某个 URL 地址或者单击网页上一个超链接时,浏览器将会以GET 方式发送请求。
另外,如果将网页上的 FORM 表单的 Method 属性设置为 GET 或者不设置 method 属性(默认值是 GET),当用户提交表单时,浏览器也将以 GET 方式发送请求。
GET 请求的主要特点是请求数据会以参数的形式附加在 Request URL 后发送给服务端。
在这里插入图片描述
从图中可以看出,表单中的数据会附加在URL地址后发给服务端,如果表单的action属性为空,则表示请求当前页面
图中的 URL 中,“?”后面的内容为参数信息。参数是由参数名和参数值构成的,中间使用等号(=)进行连接,参数之间用“&”分隔
需要注意的是,使用 GET 方式传送的数据量有限,最多不能超过 1KB。
POST 方式
如果 FORM 表单的 method 属性设置为“POST”,则浏览器将使用 POST 方式提交表单,并把各个表单元素及数据作为 HTTP 消息的请求头发送给服务器,而不是作为 URL 地址的参数传递
在这里插入图片描述
从图中可以看出,表单数据可以在 HTTP 请求头的 Form Data 选项中查看,表示数据以实体内容的形式发送给服务端,因此 POST 传输数据的大小无限制。另外,由于 GET 请求的参数信息都会在 URL 地址栏中明文显示,而 POST 请求方式传递的参数隐藏在请求内容中,用户不可见,因此 POST 比 GET 请求方式更加安全。
实际开发中,get 请求主要用来查询或删除数据,post 请求是用来增加或者修改数据

(3).Status Code

Status Code 表示 HTTP 响应的状态码,状态码由三位数字组成,表示请求是否被理解或被满足。其中第一个数字定义了响应的类别,有 5 种可能的取值,后两位没有具体的分类。

状态码响应类别
1XX表示请求已接收,需要继续处理
2XX表示请求已成功被服务器接收、理解并接受
3XX为完成请求,服务端需要进一步细化
4XX客户端的请求有错误
5XX服务端出现错误

实际开发中几种最常见的状态码
在这里插入图片描述

2.请求消息头

请求消息头主要用于向服务端传递附加消息。发送请求时,浏览器会根据功能需求的不同而发送不同请求消息头,下面是一些常用的请求头字段

(1).Accept

Accept 头字段用于表明客户端程序能够处理的 MIME 类型。MIME 是一种互联网标准,它使得浏览器能自动处理从服务端返回的不同类型的数据
Accept 头字段中常见的 MIME类型

MIME类型说明
text/html表示客户端希望接收 HTML 文本
*/*表示客户端可以接受所有格式的内容
Image/*表示客户端可以接收所有 image 格式的子类型
application/x-gzip表示客户端可以接收 GZIP 文件
application/pdf表示客户端可以接收 pdf 文件
video/x-msvideo表示客户端可以接收.avi 格式的文件
audio/x-midi表示客户端可以接收 MIDI 格式的音乐文件

(2).Accept-Encoding

在数据传输过程中对其进行压缩编码可以有效节省网络带宽和传输时间
Accept-Encoding 头字段是浏览器发送给服务器,声明客户端能够支持的压缩编码类型,一般有 gzip,deflate,br,
例如:Accept-Encoding: gzip, deflate, br
服务器接收到这个请求头后,会使用其中指定的一种编码算法对原始文档内容进行压缩编码,然后再将其作为响应消息的实体内容发送给客户端,浏览器接收到压缩后的内容后会自动进行解压缩,进而在浏览器中显示相关内容

(3). Accept-Language

Accept-Language 头字段用于指定客户端期望服务端返回哪个国家语言的文档,它的值可以指定多个国家的语言
例如:accept-language: zh-CN,zh;q=0.9
zh-CN 表示简体中文,zh 表示中文,zh-CN 在 zh 前表示优先支持简体中文。q 是权重系数,且 0<=q<=1,q 值越大表示请求越倾向于获得其“;”之前的类型表示内容,若没有指定 q 值,则默认为 1,因此上述示例等价于accept-language:zh-CN;q=1,zh;q=0.9
服务器只要检查 Accept- Language 请求头中的信息,按照其中设置的国家语言的权重,首先选择返回位于前面的国家语言的网页文档,如果不能返回,则依次返回后面的国家语言的网页文档

(4).Cache-Control

Cache-Control 在请求消息中用于通知位于客户端和服务端之间的代理服务器如何使用已缓存的页面,它的值可以是 no-cache 和 max-age=0。no-cache 表示表示不管服务端有没有设置 Cache-Control,都必须从重新去获取请求。max-age=0 表示不管 response 怎么设置,在重新获取资源之前,先检验 Last-Modified/ETAG 属性。
该机制可以帮助提高请求响应的性能,其主要思想是

  • 客户端请求页面 P
  • 服务端返回页面 P 并在 P 上加上一个 Last-Modified/ETAG 标记
  • 客户端连同页面及 Last-Modified/ETAG 标记一起缓存
  • 客户端再次请求页面 P 时,会将上次请求时服务端返回的 Last-Modified/ETAG 一起发送给服务端
  • 服务端检查 Last-Modified/ETAG 标记,如果服务器端的资源未修改,直接返回 304状态码和空响应体,客户端从缓存中获取资源,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

(5).Connection

Connection 头字段用于指定处理完本次请求/响应后,客户端和服务端是否还要继续保持连接,它可以指定两个值,分别为 keep-aliveclose
当 Connection 头字段的值为 keep-alive 时,客户端和服务器在完成本次交互后继续保持连接,当 Connection 头字段的值为 close 时,客户端和服务器在完成本次交互后关闭连接。

(6).Content-Length

Content-Length 头字段在请求消息中用于表示 POST 请求中请求主体的字节数。

(7).Content- Type

Content- Type 头字段在请求消息中用于表示 POST 请求中数据所处的位置,例如:Content-Type: application/x-www-form-urlencoded 表示请求数据在发送到服务器之前,所有字符都会以“application/x-www-form-urlencoded”进行编码并封装在请求消息中,也就是 FormData 中。

(8).Host 和 Origin

Host 头字段用于指定请求资源所在的位置,通常包括且仅仅包括域名和端口号,比如localhost:8080。
Origin 用于指定请求从哪里发起的,通常包括协议名、域名和端口号,比如http://localhost:8080。

(9).Refer

浏览器向服务器发送请求,可能是直接在浏览器中输入 URL 地址来发出,也可能是单击一个网页上的超链接或提交表单而发出。

对于直接在浏览器中输入 URL 地址来发出请求,浏览器不会发送 Refer 请求头,

而对于单击一个网页上的超链接或提交表单而发出请求,浏览器会使用 Refer 头字段标识发出请求的超链接所在的URL。

例如:Referer: http://localhost:8080/chap06/6-3.html
在实际应用中,Refer 头字段常用于网站的防盗链。
什么是防盗链呢?假设一个网站的页面中想显示一些图片信息,而该网站所在的服务器中没有这些图片资源,而是通过在 HTML文件中使用标记链接到其他网站的图片资源,这便是盗链。盗链加重了被链接网站的负担并损害了其合法权益,因此应用程序通常通过 Refer 头检测出非本站链接的访问,从而进行阻止或者挑战到指定的页面。

(10).User-Agent

User-Agent 通常用于指定浏览器使用的操作系统版本、浏览器及版本、浏览器渲染引擎和语言等,以便服务器针对不同类型的浏览器而返回不同的内容。

例如:User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/62.0.3202.94 Safari/537.36
上述请求头中,User-Agent 头字段首先列出了 Mozilla 的版本为 5.0(这里需要注意的是,不管是什么类型的浏览器通常都会带有 Mozilla 字样),其次给出浏览器所使用操作系统的版本(Windows NT 10.0 对应 Win10,WOW64 是指操作系统的位数),然后列出浏览器引擎的版本(由于 Chrome 用了 WebKit 内核,因此这里为 AppleWebKit/537.36),最后给出的是浏览器的版本(这里为 Chrome 浏览器)。

3.响应消息头

(1).Accept-Range

Accept-Range 用于说明服务器是否接受客户端使用带 Range 的请求,值为 none 表示服务端告知客户端不要使用带 Range 的请求,值为 bytes 表示服务端告知客户端可以使用以bytes 为单位的 Range 请求。
带 Range 请求主要用于断点续传,以此节省网络带宽。

(2).Content-Length

Content-Length 头字段在响应消息中用于表示响应实体内容的字节数
在 HTTP1.1 中,浏览器与服务器之间保持持久连接,服务器允许客户端在一个 TCP 连接上发送多个请求,服务器必须在每个响应中发送一个 Content-Length 响应头来表示各个实体内容的长度,以便客户端能分清每个响应内容的结束位置,而不会将不同响应混淆。

(3).Content-Type

Content-Type 头字段在响应消息中用于指定响应实体内容的 MIME 类型,客户端通过检查该字段中的 MIME 类型,就能知道接收到的实体内容代表哪种格式的数据类型,从而进行正确的处理。大多数服务器会在配置文件中配置文件扩展名与 MIME 类型的映射关系,从而可以根据 资 源 的 扩 展 名 自 动 确 定 MIME 类 型 。

(4). Data 和 Expires

Data 头字段用于表示 HTTP 消息产生的当前时间,它的值为 GMT 格式。Expires 用于指定当前文档的国企时间,浏览器在这个时间以后不能再继续使用本地缓存,而需要向服务器发送新的访问请求,它的值也是 GMT 格式。
需要注意的是,由于浏览器的兼容问题,在设置网页不缓存时,一般将 Progma、Cache-Control 和 Expires 三个头字段一起使用。

(5).Etag 和 Last-Modified

Etag 头字段用于向客户端传送代表实体内容特征的标记信息,这些标记信息称为实体标签,通过实体标签可以判断在不同时间获得的统一资源路径下的实体内容是否相同。
Last-Modified 头字段用于指定文档最后的更改时间,当客户端接收到该头字段后,将在以后的请求消息中发送一个If-Modified-Since请求消息头来指出缓存文档的最后更新时间来决定是否需要重新发送请求。


总结

根据书本知识整理,本文仅供了解 HTTP 通讯的原理,简单理解 HTTP 消息的内容和结构

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
accept-ranges是HTTP协议中的一个响应头部,用于指示服务器是否支持分块传输(chunked transfer encoding)和范围请求(range requests)。 在HTTP/1.1协议中,范围请求允许客户端请求部分资源的内容,而不是整个资源。例如,如果一个大的视频文件被分成多个部分,一个客户端可以只请求其中的一个部分而不是整个文件。支持范围请求可以提高性能和降低网络带宽的消耗。 accept-ranges头部的值可以是"none"、"bytes"或其他自定义值。当值为"none"时,表示服务器不支持范围请求。当值为"bytes"时,表示服务器支持范围请求,并且只接受字节范围请求。其他自定义值可以用于指示服务器支持其他类型的范围请求,但这种情况比较少见。 例如,一个支持范围请求的响应头部可以如下所示: HTTP/1.1 200 OK Accept-Ranges: bytes Content-Length: 1024 在这个响应中,Accept-Ranges头部的值为"bytes",表示服务器支持字节范围请求。Content-Length头部指示响应正文的总长度为1024个字节。如果客户端想要请求其中的一部分,可以使用Range头部来指定范围,例如: Range: bytes=0-511 这个请求表示客户端只需要请求响应正文的前512个字节。服务器将返回一个206 Partial Content响应,并在Content-Range头部中指定返回的内容范围,例如: HTTP/1.1 206 Partial Content Accept-Ranges: bytes Content-Length: 512 Content-Range: bytes 0-511/1024 在这个响应中,Content-Range头部指示返回的内容范围是0到511字节,总共有1024个字节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值