简单了解HTTP

2019年09月29日作者:井井客原创来源:原创

9月初做了一个关于HTTP及缓存的分享,当时找了很多资料做PPT,现在只是把这些内容分享到这边~

简单了解HTTP

计算机网络及标准化

在了解http之前,我们先了解一下计算机网络。
计算机网络是由计算机技术与通信技术结合的产物,两者相互促进而使高速通信、软硬件技术飞速发展。

计算机网络分为4个发展阶段:

【1】面向终端的计算机网络
【2】多个计算机互连的计算机网络
【3】面向标准化的计算机网络
【4】面向全球互连的计算机网络

在面向标准化的阶段,我们对网络体系结构标准化,其中有两个耳熟能详的体系结构标准:

【1】OSI:由国际标准化组织制定,定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架。
【2】TCP/IP:最广泛应用的标准,常被称为是事实上的国际标准。

其中OSI结构模型,将网络通信工作分为7层结构。

OSI结构模型

数据发送由应用层逐级向下至物理层,数据接收则由物理层逐级向上至应用层。 两个通信单位由物理层连通,完成通信。

OSI划分可以说很细致,但往往也是因为细致,反而将事件弄复杂了。TCP/IP则在一定程度上参考OSI,它将通信简化划分为4层结构。

TCP/IP结构模型

网络层中IP协议制定了IP地址的规则。
传输层中UDP协议定义了端口并且规定网络中传输的数据包必须加上端口信息。TCP可以看成是UDP的升级版,是更为可靠的通信协议。

而在TCP/IP结构模型中,HTTP承载于TCP之上,属于应用层协议。
它主要规范数据(请求/响应)格式,使接收/请求双方知道该用什么格式发送及解读数据。

TCP连接

因为HTTP本身不负责通信,所以http通信在TCP连接的基础上实现。一个典型的HTTP通信过程大致有以下四步。

【1】建立TCP连接
【2】客户端向服务器发送请求头及内容
【3】服务器向客户端发送响应头及内容
【4】关闭TCP连接

建立TCP连接需要客户端和服务器总共发送3个包,即三次握手(具体发送啥,我看得也晕,只稍微通俗描述一下了)。

第一次握手,客户端向服务器说:"我,编号9527请求建立连接"。
第二次握手,服务器向客户端说:"编号9527允许建立连接"。
第三次握手,客户端向客户端说:"编号9527就是我,那我就连接了"。

而断开TCP连接则总共发送4个包,即四次挥手。

第一次挥手:客户端向服务器说:"我要发送的东西都给你了"。
第二次挥手:服务器向客户端说:"OK都已收到,你等一下,我去找你要的数据"。
第三次挥手:服务器向客户端说:"给,你要的数据都发给你了"。
第四次挥手:客户端向服务器说:"你发的数据我也都收到了,你断开连接吧"。

其实握手也好,挥手也好,在连接的过程体现更多的一个点就是确认。这也是为什么说TCP比UDP可靠的原因,TCP连接通过较验、重传控制,序号标识等等一系列操作确保数据包不会丢失、破坏。

HTTP特性

通过一个典型的HTTP通信过程,我们能发现,HTTP每次连接只处理一个请求,服务器处理完客户端请求并收到客户端应答后就断开连接,即HTTP特性之一的"无连接"。采用这种方式可以节省传输时间。

HTTP另一特性就是"无状态"。

【1】协议对于事务处理没有记忆能力
【2】服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器
【3】对同一个url请求没有上下文关系
【4】每次的请求都是独立的,它不会受前面的请求影响,也不会影响后面的请求

HTTP九种请求方法

方法 HTTP版本 描述
GET 1.0 请求指定的页面信息,并返回实体主体。
POST 1.0 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
HEAD 1.0 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
OPTIONS 1.1 允许客户端查看服务器的性能
PUT 1.1 从客户端向服务器传送的数据取代指定的文档的内容
PATCH 1.1 是对 PUT 方法的补充,用来对已知资源进行局部更新
DELETE 1.1 请求服务器删除指定的页面
TRACE 1.1 回显服务器收到的请求,主要用于测试或诊断
CONNECT 1.1 HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器

HTTP请求/响应格式

上面说过,http协议主要是规范数据(请求/响应)格式,使接收/请求双方知道该用什么格式发送及解读数据。

下面说http客户端请求的消息格式,它主要包含:请求行、请求头、空行、请求数据四部分。

http请求

举例:

http请求实例

http服务端响应也由四部分组件:状态行、响应头、空行和响应数据。

http响应

举例:

http响应实例

HTTP消息头

根据不同上下文,可将消息头分为:

【1】一般头: 同时适用于请求和响应消息,但与最终消息主体中传输的数据无关的消息头。
【2】请求头: 包含更多有关要获取的资源或客户端本身信息的消息头。
【3】响应头: 包含有关响应的补充信息,如其位置或服务器本身(名称和版本等)的消息头。
【4】实体头: 包含有关实体主体的更多信息,比如主体长(Content-Length)度或其MIME类型。

具体的可以参考:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers

通俗点说,消息头就是为了补充和描述关于请求/响应的内容、缓存、客户端/服务器等等信息。

常见在请求头中出现的字段:

头部字段 举例值 说明
Accept text/html 客户端希望接受的数据类型
Accept-Charset UTF-8 优先的字符集
Accept-Encoding gzip 优先的压缩类型
Accept-Language zh-CN 优先的语言
Connection keep-alive (客户端)表示是否需要持久连接
Cookie BAIDUID=C79C747893FCCCDB2C8E3BA3ECFDF947:FG=1; 当前域名下的Cookie
Expect 100-continue 标识客户端需要的特殊浏览器行为
From xxx@xxx.com 用户的电子邮箱地址
Host www.xxx.com 请求的目标域名和端口号
Origin http://www.xxx.com 请求的来源域名和端口号
Referer http://www.xxx.com/ 请求资源的完整URI
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36 浏览器信息

常见在响应头中出现的字段:

Access-Control-Allow-Origin * Access-Control-Allow-Origin
Age 33 对象在代理缓存中暂存的秒数
Allow GET, HEAD 设置特定资源的有效行为
Cache-Control no-cache 控制缓存的方式
Content-Length 1023334 响应体的字节长度
Content-Type application/json; charset=utf-8 响应体的MIME类型
Content-Encoding gzip 资源解码方式
Connection keep-alive (服务端)表示是否需要持久连接
Date Mon, 30 Sep 2019 06:34:03 GMT 服务端发送资源时的服务器时间
Expires Mon, 30 Sep 2019 06:34:03 GMT 比较过时的一种验证缓存的方式
etag xxxxxxxxxxxxxxx 特定版本资源的标识符,通常是消息摘要
Last-Modified Mon, 30 Sep 2019 06:34:03 GMT 资源最后一次修改的时间
Location http://www.xxx.com/index.html 在重定向中或者创建新资源时使用
Refresh 5;url=http://www.xxx.com/ 重定向或者新资源创建时使用
Server BWS/1.0 服务器名称
Set-Cookie BAIDUID=C79C747893FCCCDB2C8E3BA3ECFDF947:FG=1; 设置Cookie
Status 200 OK 设置HTTP响应状态

列的不是很全,具体的还是需要参考上面的分享链接看。而在上面列的内容中,可以看到除了显示信息的头部字段,还有两块设置cookie及缓存有关的头部字段。
关于缓存部分的有时间再更新吧,有点写不动了...

文章TAG:http

本文标题:简单了解HTTP
本文链接:http://www.jingjingke.com/c/29360.html

上一篇:关于android开发一个简单APP的总结
下一篇:MAC安装低版本PHP(5.6)+MySQL(5.7.28)并运行