应用层协议之Web应用与HTTP协议

在1990年,伯纳斯.李开发了超文本传输协议(HTTP)、超文本标记语言(HTML)、统一资源标识符(URL)、第一款Web浏览器和服务器,以及第一批网页,这些是万维网(World Wide Web,或Web、WWW、W3)的起源。简单的将,互联网的出现实现了计算机之间的链接,而万维网真正开始为人类构建一个网络世界,从此全球信息的交流和传播有了革命性的变化。

说到万维网的发展,人们比较习惯将其划分为:web1.0、web2.0、web3.0等概念术语,对于真正的用户来讲,可能没有实际的意义,只是,感觉到网络变化实在太快了,也慢慢的影响人们生活中的方方面面。

Web1.0时代的本质是单向的信息分享,两大标志性的产品是门户网站和搜索引擎。通过这些信息门户和搜索引擎,人们获取信息的速度得到了很大的提升。不过,web1.0时代,人们获取的信息都是静态存储、单向输出的,用户只能读,不能写。

Web2.0时代的核心是交互,用户不仅是网站的浏览者,更是内容的制造者。博客、社交网络的开始兴起,网络的内容开始多媒体化,音频、视频、图像等开始在网络中传播,提升人们获取信息的体验。另一方面,全民开始参与的互联网,信息开始爆炸式增长。

Web3.0时代的互联网具有更高的个性化,更好的互动性,更强大的智能化,实现更快捷,更准确的信息服务。移动互联网的发展,让互联网更加深入人们的生活,在这个用户为王的时代,谁能留下用户,谁才可以获取更大的商业价值。而基于互联网技术、大数据技术、人工智能技术、云计算技术的新的商业模式、新的网络媒体,创造了一个又一个的成功案例。

Web应用

通常,Web应用有B/S结构(浏览器端/服务器端)、C/S结构(客户端/服务器端),客户端和浏览器端都是web的客户端应用程序。而web内容都在web服务器端,所有信息都是通过客户端和服务端的请求和响应完成传递的,客户端通过“统一资源标识符”,将请求报文以HTTP协议格式,通过TCP协议(信息的可靠性传递交给TCP协议,HTTP协议无需关心),发送给服务器。因为是TCP协议需要通过三次握手建立连接,建立连接后,服务器端处理客户端的请求,处理完成后将响应结果,以HTTP协议格式返回给客户端,客户端解析报文,将信息展示给最终的用户。

统一资源定位符(URL)是表示从互联网上得到资源的位置,互联网上所有的资源都有一个确定的URL。URL相当于文件名在网络范围的扩展,一般的格式为:

<协议>://<主机>:<端口>/<路径>?<参数>

使用HTTP协议的URL就是:http://<主机>:<端口>/<路径>?<参数>,如:http://www.banzclub.com/technical/lambad-and-funcional-programming.html

1、http是使用的协议;

2、www.banzclub.com是主机,端口是默认的80,可以省略;

3、/technical/lambad-and-funcional-programming.html 就是访问路径。

HTTP的报文包括两类:请求报文响应报文

请求协议 请求首行:请求方式 url 协议/版本号 请求头:key:value() /r/n/r/n:不可省略的空行 请求体:数据(只有Post请求,才有请求体)

HTTP方法

GET:从指定的资源请求数据。通过GET请求,URL可以传递参数;GET请求时,URL的长度是受限制,一般为2048个字符。

POST:向指定的资源提交要处理的数据。也可以传递参数,不过参数是在主体中发送的,没有长度限制。

HEAD:与GET请求相同,但只返回HTTP头,不返回文档主体。

还包括PUT、DELETE、OPTIONS等。(不太常用,说明略)

首部(请求头)

通用首部:请求报文和响应报文都会使用的首部

  • Connection 客户端(浏览器)想要优先使用的连接类型。普通模式时,每次请求需要重新建立连接,当使用Connection: keep-alive时,使客户端和服务端的连接持续有效,keep-alive机制避免重新建立连接,也叫HTTP长连接。
  • Cache-Control 用来指定当前的请求/回复中的,是否使用缓存机制
  • Date 报文的时间
  • Upgrade 要求服务器升级到一个高版本协议

请求首部:客户端向服务端发送请求报文时使用的首部

  • Host 请求资源所在服务器
  • Accept 可接受的响应内容类型
  • Accept-Charset 可接受的字符集
  • Accept-Encoding 可接受的响应内容的编码方式
  • Accept-Language 可接受的响应的语言列表
  • User-Agent 浏览器的身份标识字符串
  • Referer 表示浏览器所访问的前一个页面,可以认为是之前访问页面的链接将浏览器带到了当前页面
  • Cookie 由之前服务器通过Set-Cookie设置的一个HTTP协议Cookie
  • Authorization 用于表示HTTP协议中需要认证资源的认证信息。如,JWT鉴权通过Authorization传递token
  • Origin 发起一个针对跨域资源共享的请求(该请求要求服务器在响应中加入一个Access-Control-Allow-Origin的消息头,表示访问控制所允许的来源)

响应首部:服务端向客户度返回响应报文时使用的首部

  • Location 用于重定向
  • Retry-After 如果某个实体临时不可用,那么此协议头用于告知客户端稍后重试
  • Server 服务器的名称
  • ETag 对于某个资源的某个特定版本的一个标识符,通常是一个消息散列,用于优化网站性能使用
  • Set-Cookie 设置和页面关联的Cookie
  • Age 响应对象在代理缓存中存在的时间,以秒为单位
  • Access-Control-Allow-Origin 指定哪些网站可以跨域源资源共享

实体首部:针对请求报文和响应报文实体部分使用的首部

  • Allow 对某网络资源的有效的请求行为,不允许则返回405
  • Content-Encoding 响应资源所使用的编码类型
  • Content-Language 响应内容所使用的语言
  • Content-Length 响应消息体的长度,用8进制字节表示
  • Content-Type 当前内容的MIME类型
  • Expires 响应的过期时间
  • Last-Modified 文档的最后改动时间

扩展首部:规范中没有定义的首部

响应协议 响应首行:协议/版本 状态码 响应头:key:value /r/n/r/n:不可省略的空行 响应体:为HTML格式的内容

状态码

1** 消息;2** 成功; 3** 重定向;4** 请求错误;5** 服务器错误;

200 请求已成功,请求所希望的响应头或数据体将随此响应返回

401 当前请求需要用户验证

403 服务器已经理解请求,但是拒绝执行它

404 请求所希望得到的资源未被在服务器上发现

405 请求行中指定的请求方法不能被用于请求相应的资源

500 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。

响应头(同请求头)

响应体

在响应头中,服务器端会标识响应的媒体类型,MediaType, 互联网媒体类型;也叫做MIME类型。

  • text/html HTML格式
  • text/plain 纯文本格式
  • text/xml XML格式
  • image/gif gif图片格式
  • image/jpeg jpg图片格式
  • image/png png图片格式
  • application/json json格式
  • application/pdf pdf格式
  • application/octet-stream 二进制流数据(如常见的文件下载)
  • application/x-www-form-urlencoded 表单格式
  • multipart/form-data 包含附件的表单格式

可以说,HTTP协议是构建Web应用的基础,通过HTTP协议完成从客户端到服务器端一系列信息的交互过程。伴随着Web应用爆发式的发展,支撑Web应用的技术栈也在快速的升级中。

HTTP协议早期并没有正式的标准,客户端向服务器发送请求时,建立TCP连接,服务器向客户端返回响应,响应只能是HTML格式,不能为别的格式,服务器发送完毕,就关闭TCP连接。在HTTP正式标准发布之前的HTTP协议被叫做HTTP/0.9版本。

1996年5月,HTTP/1.0版本正式发布,内容大大增加,首先,任何格式和内容都可以发送,这使得互联网不仅可以传输文字,还能传输图像、视频、二进制文件。其次,增加了请求方法GET、POST、HEAD等;然后,HTTP请求和响应的格式也做了调整,除了数据部分,还包括头信息;其他的新增功能包括状态码、多字符集支持、权限、缓存、内容编码等;不过,HTTP/1.0版本的主要缺点是,每个TCP连接只能发送一个请求,数据发送完毕,连接就关闭,如果还要请求其他资源,就必须再建立新的连接。TCP连接的创建成本比较高,这就使得HTTP/1.0版本的性能比较差,随着Web应用的资源越来越多,性能问题就凸显出来了。

1997年1月,HTTP/1.1版本就发布了,它进一步完善了HTTP协议,而且一直用到了今天,直到现在还是最流行的版本。HTTP/1.1版本最大的变化,就是引入了持久连接,即TCP连接不关闭,可以被多个请求复用,如果客户端和服务器长时间没有活动,再主动关闭连接。这样提升了HTTP协议的效率。这个版本的协议,允许复用TCP连接,但同一个TCP连接里面,所有的数据通信都是按次序进行的,服务器只有处理完一个回应,才会进行下一个回应,这就容易造成请求排队等待处理的情况,为了避免这种情况,服务器端可以增加持久连接数;另外,服务端也可以通过一些手段控制请求流量,减少排队的请求数;还有就是资源的优化,包括文件压缩,大文件分割,静态资源与动态资源分离开,减少请求数据的大小,如图片服务器等。

现在多数浏览器已经支持了HTTP/2.0协议,为了解决HTTP/1.1效率不高的问题,HTTP/2.0主要升级了以下几个方面:

二进制协议,HTTP/1.1版的头信息是文本(ASCII编码),数据体可以是文本,也可以是二进制。HTTP/2.0则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为“帧”,这样对于数据的解析将更加高效。

多路复用,HTTP/1.1版本,一个连接一次只能处理一个请求,HTTP/2.0版本允许多个请求和响应消息同时发出,而且之前会打开多个连接,多个连接也会对服务器的缓冲区造成溢出的危险,导致大量的网络阻塞和重发,对资源是一种浪费,HTTP/2.0的多路复用就是为了解决这一弊端。

头信息压缩,HTTP协议每次请求时,请求头都会带有全部信息,而且很多字段都是重复的,这样会浪费带宽,影响速度。HTTP/2.0对这一点进行了优化,引入了头信息压缩,使头信息大小大大减少了。

服务器推送,我们之前都是客户端主动请求,服务端才会返回响应的。现在可以根据客户端请求的资源后,不等待客户端解析工作之后,服务器就直接返回客户端将会请求的某些资源,减少一部分请求的延迟。

随着HTTP协议的发展,Web应用呈现的内容也越来越丰富多彩,这主要是由于Web前端技术的发展。早期Web站点只是简单的HTML,通过浏览器的解析、渲染呈现出来静态的Web页面。由于CSS(Cascading Style Sheets 层叠样式表)、JavaScript、DOM(Document Object Model 用于操作HTML和)的出现,不仅解决不同浏览器的兼容性问题,还让Web页面动起来了,大大提升了用户的体验。

目前Web应用向着前后端分离的模式发展着,前端已经不再是传统Web的前端开发,随着这几年移动应用、VR甚至各种小程序的发展,前端工程师已经独立成一个非常火爆的一个职业方向,而且前端语言也不仅仅是JavaScript、CSS、HTML的传统三剑客了,各种前端语言、框架、技术的发展,一点也不比后端技术简单,前端生态空前的兴盛。

Web前端技术栈

Web服务器端技术分析,见下篇:《Web服务器端技术》


1、《HTTP权威指南》

2、《计算机网络 第七版》

3、《计算机网络 自顶向下方法》

4、《图解HTTP》

5、万维网——百度百科

6、web3.0——百度百科

7、https://www.yicai.com/news/5076027.html

8、https://www.douban.com/note/682483448/

9、http://tool.oschina.net/commons

10、https://www.cnblogs.com/hhks/p/5891392.html

原文发布于微信公众号 - BanzClub(banz-club)

原文发表时间:2019-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券