HTTP结构

转载请注明出处:HTTP结构简介

HTTP通信过程包括从客户端发往服务器的请求和服务器返回客户端的响应,这篇文章就简单的了解一下HTTP请求和响应的结构与协议本身的状态管理。

用户HTTP协议交互的信息被称为HTTP报文,HTTP报文可分为请求报文和响应报文。请求报文包括请求行、首部字段(请求、通用、实体)和报文主体。响应报文包括状态行、首部字段(响应、通用、实体)和报文主体。

常见的请求头和响应头如下

关于图中涉及的请求与响应首部字段在之后的文章会涉及到。

1.HTTP是不保存状态的协议

HTTP是一种不保存状态,即无状态协议。HTTP协议本身不对请求和响应的通信状态进行保存。也就是说,HTTP协议对于发送过的请求和响应都不做持久化处理。

这样做的好处是为了更快的处理大量事务,确保协议的可伸缩性。但是随着web的不断发展,因为无状态协议而导致业务处理变得棘手。如用户登录到一个电商网站,即使他跳转到该网站的其他页面,也需要能保持登录状态。如果仍然保持无状态协议的话,那每次进行页面跳转都需要重新登录一次。

虽然HTTP/1.1是无状态协议,但是为了实现保持状态功能而引入了Cookie。有了Cookie进行状态管理之后,就可以实现登录、购物车等功能了。

2.Cookie

由于HTTP是无状态协议,因此引入了Cookie技术进行状态管理。

比如我们要实现的功能是:在登录之后的5天内,访问同一个网站时都不用再次登录。

要实现这个持久登录的功能,就可以使用Cookie对用户身份进行状态管理。过程大致如下:

1. 第一次登录时,服务端在响应头部设置Set-Cookie字段(包括name, value, path, expires, httpOnly, domain等)。
2. 浏览器接收到响应之后,会对Cookie信息进行存储。
3. 在下次访问该页面时,浏览器在发送请求时会将Cookie自动带上,一同发向服务器。
4. 服务器在收到浏览器发过来的请求时,对传过来的Cookie信息和服务器的Cookie信息进行匹配校验,如果匹配成功,则得到之前的状态信息。

对Cookie不熟悉的同学可以看看这篇文章。传送门: 前端存储

给一个生动的图片说明Cookie状态管理。

针对登录态还应该防范XSS攻击和CSRF攻击。不熟悉的同学可以看看这篇文章。前端安全之XSS 前端安全之XSS

3. 持久连接节省通信

HTTP协议的初始版本中,每进行一次HTTP通信就要断开一个TCP连接。这种非持久连接的缺点在于每次请求都会造成无谓的TCP连接建立和断开,增加TCP协议本身的开销。

例如,在访问某东电商网站时,如果是非持久的通信,那么会出现如下情况。

加载DOM节点(三次握手 + HTTP通信 + 四次分手)
加载各种商品图片([三次握手 + HTTP通信 + 四次分手] x N次)
...其他前端资源([三次握手 + HTTP通信 + 四次分手] x (N + 1)次)

访问一次页面时就要建立和断开TCP连接无数次,这无疑会导致前端页面渲染的性能问题。

3.1 持久连接

为了解决不断建立和断开TCP连接的问题,HTTP/1.1实现了持久连接,即在请求头和响应头都有相应的Connection: Keep-Alive字段。持久连接的特点是,只要任意一端没有明确提出断开TCP连接,则保持TCP连接状态。

持久连接(keep-alive)的好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载,加快了网页渲染的速度。

3.1 管线化

以前发送请求后需要收到响应,才能发送下一个请求。持久连接意味着可以在一次TCP连接之后发送多个请求,而管线化技术的出现使得每个请求可以异步发送,而不用等待响应了。也就是说,管线化能够做到同时并行发送多个请求,而不需要一个接一个的等待响应了。

比如说,当请求一个包含10张图片的网页,与挨个连接相比,采用持久连接可以减少TCP连接建立与断开的时间,而采用管线化技术则比持久连接更快,因为可以异步发送请求。请求数量越多,时间差就越明显。一般情况下,会同时使用持久连接和管线化。

4 HTTP状态码

响应报文中包含的状态行中,包含HTTP响应状态码。状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。

状态行的格式如下:

[协议版本号] [状态码] [状态码对应信息]

HTTP状态码没有什么学习上的难度,只需要记住状态码对应的意思即可。以下是状态码的类别。

以下会对常见的状态码进行简单的说明。

2XX 成功

200 OK: 服务器端正确处理请求。

201 Created: 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其URI已经随Location头信息返回。假如需要的资源无法及时建立的话,应当返回'202 Accepted'。

202 Accepted: 服务器已接受请求,但尚未处理。最终该请求可能会也可能不会被执行,并且可能在处理发生时被禁止。

204 No Content: 服务器接收的请求已经成功处理,但在返回的响应报文中不包含实体的主体内容。也不允许返回任何实体的主体。一般在只需要从客户端往服务器发送消息,而对客户端不需要发送新信息内容的情况下使用。

206 Partial Content: 客户端进行范围请求,而服务器成功执行了GET请求,会在响应报文中添加Content-Range指定范围的实体内容。

3XX 重定向

301 Moved Permanently: 永久重定向。该状态码表示请求的资源已经被分配到了新的URI,以后应使用资源现在所指的URI。

302 Found: 临时重定向。该状态码表示请求的资源被分配到了新的URI,希望用户能使用(本次)新的URI进行访问。

303 See Other: 表示由于请求对应的资源存在着另一个URI,应该使用GET方法定向获取请求的资源。这个状态码我在实际业务中基本没有见过...

304 Not Modified: 表示请求的资源在浏览器存在缓存,则服务器端会返回304,直接从浏览器读取缓存,而不是从服务器获取资源。虽然304状态码被划分在3XX中,但是其和重定向没有关系。

4XX 客户端错误

400 Bad Request: 表示请求报文中存在错误。

401 Unauthorized: 表示发送的请求需要有通过HTTP认证的认证信息。当浏览器初次接收到401响应时,会弹出认证用的对话窗口。

403 Forbidden: 没有权限访问请求的资源。未获得文件系统的访问权限,访问权限出现某些问题(从未授权的IP地址试图访问)等情况都可能会返回403。

404 Not Found: 服务器上无法找到对应的请求资源。

5XX 服务器错误

500 Internal Server Error: 表示服务器端在执行请求时发生了错误。也有可能是应用存在的bug获某些临时的故障。

503 Service Unavailable: 表示服务器暂时处于超负荷获正在停机维护,现在无法处理请求。

HTTP结构的更多相关文章

  1. 【.net 深呼吸】细说CodeDom(1):结构大观

    CodeDom 是啥东东?Html Dom听过吧,XML Dom听过吧.DOM一般可翻译为 文档对象模型,那 Code + DOM呢,自然是指代码文档模型了.如果你从来没接触过 CodeDom,你大概 ...

  2. 读书笔记:《HTML5开发手册》--HTML5新的结构元素

    读书笔记:<HTML5开发手册> (HTML5 Developer's CookBook) 虽然从事前端开发已有很长一段时间,对HTML5标签也有使用,但在语义化上面理解还不够清晰.之前在 ...

  3. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  4. HTML5 语义元素(一)页面结构

    本篇主要介绍HTML5增加的语义元素中关于页面结构方面的,包含: <article>.<aside>.<figure>.<figcaption>.< ...

  5. React在开发中的常用结构以及功能详解

    一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...

  6. ElasticSearch 5学习(10)——结构化查询(包括新特性)

    之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...

  7. ASP.NET Core应用针对静态文件请求的处理[4]: DirectoryBrowserMiddleware中间件如何呈现目录结构

    和StaticFileMiddleware中间件一样,DirectoryBrowserMiddleware中间本质上还是定义了一个请求地址与某个物理目录之间的映射关系,而目标目录体现为一个FilePr ...

  8. Go结构体实现类似成员函数机制

    Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...

  9. CRL快速开发框架系列教程十(导出对象结构)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  10. Javacript实现字典结构

    字典是一种用[键,值]形式存储元素的数据结构.也称作映射,ECMAScript6中,原生用Map实现了字典结构. 下面代码是尝试用JS的Object对象来模拟实现一个字典结构. <script& ...

随机推荐

  1. Asp.net导出Excel/Csv文本格式数据

    刚刚开始做Excel相关的项目,所以遇到的问题不管大小都给记录一下 偶然的机会在添加数据的时候全改成了数字,结果输出的时候全自动变成了科学计数法,这是excel的强大功能,能自动识别数字和字符串,太聪 ...

  2. SpringBoard 无法启动应用程序(错误:-3)

    临时不知道错误的细节原因,重新启动模拟器就好了. 先记录下.

  3. gRPC异步处理应答

    gRPC异步处理应答 (金庆的专栏) gRPC的演示样例 greeter_async_client.cc 不算是异步客户端,它使用了异步请求.可是堵塞式等待应答,结果成为一个同步调用. std::st ...

  4. Codeforces 29D Ant on the Tree 树的遍历 dfs序

    题目链接:点击打开链接 题意: 给定n个节点的树 1为根 则此时叶子节点已经确定 最后一行给出叶子节点的顺序 目标: 遍历树并输出路径.要求遍历叶子节点时依照给定叶子节点的先后顺序訪问. 思路: 给每 ...

  5. mock.js的真实数据模拟

    哈哈,怎么说,这应该是我的第一个随笔了,毕竟前端之路上一直在学习并且各位大神们的经验,虽然也有不少的坑,但是总是收获比较多,所以我也想把一些收获记录下来,有需要的可以参考参考. 网上看了不少大神很多例 ...

  6. 基于Metronic的Bootstrap开发框架经验总结(18)-- 在代码生成工具Database2Sharp中集成对Bootstrap-table插件的分页及排序支持

    在我们开发系统界面,包括Web和Winform的都一样,主要的界面就是列表展示主界面,编辑查看界面,以及一些辅助性的如导入界面,选择界面等,其中列表展示主界面是综合性的数据展示界面,一般往往需要对记录 ...

  7. 三.RabbitMQ之异步消息队列(Work Queue)

    上一篇文章简要介绍了RabbitMQ的基本知识点,并且写了一个简单的发送和接收消息的demo.这一篇文章继续介绍关于Work Queue(工作队列)方面的知识点,用于实现多个工作进程的分发式任务. 一 ...

  8. 自学Zabbix2.6-zabbix升级

    如果你从zabbix 1.6升级到1.8或者zabbix 1.8升级到zbbix 2.0,那么你需要额外执行sql文件(path.sql): 但是在2.0之后这些步骤都不需要手动做,如果你的版本很低, ...

  9. ViewPager+Fragment 懒加载

    转载于: 作者:尹star链接:http://www.jianshu.com/p/c5d29a0c3f4c來源:简书   ViewPager+Fragment的模式再常见不过了,以国民应用微信为例,假 ...

  10. C#winform向Txt文件传值,不重复录入且不清空

    private void textLog_TextChanged(object sender, EventArgs e) { FileStream fs = new FileStream(@" ...