http 协议学习及总结
http协议基本上是互联网应用基石。今天简单介绍一下http协议和总结学习。
http协议面向连接的、可靠的、无状态的协议。
http协议特点
一 HTTP协议特点:
- 简单协议
- HTTP是可扩展的
- HTTP是无状态的,但不是无会话的
- HTTP是面向连接的
二 HTTP 工作流程
当客户端发送请求时,http协议将执行以下流程
- 打开 TCP连接,此连接用来发送一个或者多个请求并接受服务端响应。此连接存在可复用,不存在则新建。
- 发送HTTP 消息(http2/之前时可读的,http2 之后时不可读的消息,原因:简单的消息被封装在帧中,但是原理不变。
- 读取服务端响应消息。
- 关闭连接或者供下次请求重用此连接。
三 http requests 和 Response
消息体比较相似对比如下
- 一行起始行用于描述要执行的请求,或者是对应的状态,成功或失败。这个起始行总是单行的。
- 一个可选的HTTP头集合指明请求或描述消息正文。
- 一个空行指示所有关于请求的元数据已经发送完毕。
- 一个可选的包含请求相关数据的正文 (如HTML表单内容), 或者响应相关的文档。 正文的大小有起始行的HTTP头来指定。
四 HTTP requests
起始行和 HTTP 消息中的HTTP 头统称为请求头,而其有效负载被称为消息正文。
Requests:
***起始行***起始行 (start-line) 包含三个元素:
-
一个 HTTP 方法,一个动词 (像 GET, PUT 或者 POST) 或者一个名词 (像 HEAD 或者 OPTIONS),
描述要执行的动作 -
请求目标 (request target),通常是一个 URL,或者是协议、端口和域名的绝对路径,通常以请求的环境为特征。
(1) 一个绝对路径,末尾跟上一个 ’ ? ’ 和查询字符串。这是最常见的形式。
(2)一个完整的URL,被称为 绝对形式 (absolute form),主要在使用 GET 方法连接到代理时使用。
(3)由域名和可选端口(以’:‘为前缀)组成的 URL 的 authority component,称为 authority form。 仅在使用 CONNECT 建立 HTTP 隧道时才使用。(CONNECT developer.mozilla.org:80 HTTP/1.1)
(4)星号形式 (asterisk form),一个简单的星号(’*’),配合 OPTIONS 方法使用,代表整个服务器。 -
HTTP 版本 (HTTP version),定义了剩余报文的结构,作为对期望的响应版本的指示符。
Headers
不区分大小写的字符串,紧跟着的冒号 (’:’) 和一个结构取决于 header 的值。 整个 header(包括值)由一行组成,这一行可以相当长。
General headers,例如 Via,适用于整个报文。
Request headers,例如 User-Agent,Accept-Type,通过进一步的定义(例如 Accept-Language),或者给定上下文(例如 Referer),或者进行有条件的限制 (例如 If-None) 来修改请求。
Entity headers,例如 Content-Length,适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件。
body 请求的最后一部分是它的 body。
大致格式
Single-resource bodies,由一个单文件组成。该类型 body 由两个 header 定义: Content-Type 和 Content-Length.
Multiple-resource bodies,由多部分 body 组成,每一部分包含不同的信息位。通常是和 HTML Forms 连系在一起。
五 HTTP 响应
HTTP 响应的起始行被称作 状态行 (status line),包含以下信息:
1.协议版本,通常为 HTTP/1.1。
2.状态码 (status code),表明请求是成功或失败。常见的状态码是 200,404,或 302。
3.状态文本 (status text)。一个简短的,纯粹的信息,通过状态码的文本描述,帮助人们理解该 HTTP 消息。
headers
General headers,例如 Via,适用于整个报文。
Response headers,例如 Vary 和 Accept-Ranges,提供其它不符合状态行的关于服务器的信息。
Entity headers,例如 Content-Length,适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件。
六 HTTP头信息
Host: Host用于指定请求资源的主机名和端口号
User-Agent: 用户请求的代理软件,包括用户的操作系统,浏览器等相关属性
Referer: 代表当前访问的URL的上一个URL,(也就是用户是从什么地方转到本页面)。
Cookie: Cokie 是个非常重要的请求头,常用来表示请求者的身份.
Range: 请求实体内容的一部分,多线程下载一定会用到该请求头。
Accept: 客户端接受什么类型的信息。类型用MIME表示
Accept-Charset 客户端接受什么字符集的文本内容。常用的如UTF-8,GBK等。
Accept-Language: 客户端接受什么语言的文本内容。
Accept-Encoding: 客户端接受压缩格式的内容如gzip压缩格式。
七 常见响应头
Server 服务器所使用的Web服务器名称。所以一般服务器端会对该头信息进行修改。
Set-Cookie 向客户端设置Cookie。与Cookie请求头相互对应。Set-Cookie头是服务器向客户端设置Cookie,Cookie头是客户端向服务器传客户端已经保存的Cookie信息。
Last-Modified 服务器通过该头信息告诉浏览器,资源最后的修改时间。从而让客户端及时地更新缓存内容。
Location 服务器通过该头信息告诉浏览器去访问那个页面,浏览器接收到这样的响应信息后,通常会立刻访问Location头所指向的页面。这个头通常配合302重定向状态码使用。
Refresh 服务器通过Refresh头信息让浏览器定时刷新。
Cache-Control 指定客户端对页面的缓存策略。
响应实体头信息
Content-Type 响应实体的内容类型。
Content-Type: text/html;charset=utf-8
Content-Encoding 响应实体的编码方式
Content-Encoding: gzip
Content-Length 响应实体的内容长度
参考文献:1.https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Messages
2.https://www.cnblogs.com/jpfss/p/10984966.html