Go Book / 2 Go Advances / 18 Go Web框架(一): Web技术概述

18 Go Web框架(一): Web技术概述

Web技术概述

1. Web简介

Web的本意是蜘蛛网或网,在网页设计中称为网页。现广泛译作网络、互联网等技术领域,表现为三种形式,即超文本(hypertext)、超媒体(hypermedia)、超文本传输协议(HTTP)等。WEB技术指的是开发互联网应用的技术总称,一般包括WEB服务端技术和WEB客户端技术。

Web技术本质就是实现网络各端点互联互通的技术,无论是C/S架构、B/S架构,还是P2P自组网都是为了实现这目的而设计。其大致分为服务端技术(后端)和客户端(前端)两大类技术栈。

  • 服务端技术

    • 开发语言:JAVA、C++、PHP、.NET、Go、Python、Erlang等几百上千种语言;
    • 服务器技术:Linux、Apache、Nginx、Tomcat、Jboss…
    • 数据库技术:Oracle、Mysql、Postgresql、SQLite、Hbase、Mongodb、Redis…
    • 虚拟机及容器技术:Hypervisor、Docker、K8s…
    • 软件设计及架构设计:MVC模式、分层架构、单体架构、分布式架构、微服务…
    • 各种web框架技术…
  • 客户端技术

    • HTML
    • CSS
    • ECMAScript
    • 浏览器技术
    • 移动APP技术
    • 各种前端框架技术…

以上只列举一小部分,另外还有一些流媒体、P2P网络、区块链、大数据、深度学习等新兴的技术,可见互联网技术之庞杂。如果你对Web技术发展史感兴趣,可阅读这篇文章: 《Web开发技术发展历史》

2. HTTP协议

我们在《Go基础系列》中简单提及了一下HTTP,现在我们在进一步了解HTTP协议的内容。

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

1.HTTP 协议的 8 种请求类型介绍

HTTP 协议中共定义了八种方法或者叫“method”来表明对 Request-URI 指定的资源的不同操作方式,具体介绍如下:

  • OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*‘的请求来测试服务器的功能性。
  • HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
  • GET:向特定的资源发出请求。
  • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。
  • PUT:向指定资源位置上传其最新内容。
  • DELETE:请求服务器删除 Request-URI 所标识的资源。
  • TRACE:回显服务器收到的请求,主要用于测试或诊断。
  • CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 虽然 HTTP 的请求方式有 8 种,但是我们在实际应用中常用的也就是 get 和 post,其他请求方式也都可以通过这两种方式间接的来实现。
2.HTTP 报文结构

HTTP请求报文结构.png

HTTP报文分Request(请求)和Response(响应)两种,其报文结构还是有区别的

2.1 HTTP Request

Request由请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

HTTP 请求头主要信息:
Accept:text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, image/apng, */*; q=0.8
作用:向服务器申明客户端(浏览器)可以接受的媒体类型(MIME)的资源
解释:浏览器可以接受text/html、application/xhtml+xml、application/xml类型,通配符*/* 表示任意类型的数据。并且浏览器按照该顺序进行接收。( text/html —> application/xhtml+xml —> application/xml)

Accept-encoding: gzip, deflate, br
作用:向服务器申明客户端(浏览器)接收的编码方法,通常为压缩方法
解释:浏览器支持采用经过 gzip,deflate 或 br 压缩过的资源

Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
作用:向服务器申明客户端(浏览器)接收的语言
解释:浏览器能够接受 en-US, en 和 zh-CN 三种语言,其中 en-US 的权重最高 ( q 最高为1,最低为 0),服务器优先返回 en-US 语言
延伸:语言与字符集的区别:zh-CN 为汉语,汉语中有许多的编码:gbk2312 等

Cache-control: max-age=0
作用:控制浏览器的缓存,常见值为 private、no-cache、max-age、alidate,默认为 private,根据浏览器查看页面不同的方式来进行区别
解释:浏览器在访问了该页面后,不再会访问服务器

Cookie:
作用:告诉服务器关于 Session 的信息,存储让服务器辨识用户身份的信息。

Refer:https://www.baidu.com/xxxxxxxxxx
作用:告诉服务器该页面从哪个页面链接的
解释:该页面从 https://www.baidu.com 中的搜索结果中点击过来的

Upgrade-insecure-requests:1
作用:申明浏览器支持从 http 请求自动升级为 https 请求,并且在以后发送请求的时候都使用 https
解释:当页面中包含大量的 http 资源的时候(图片、iframe),如果服务器发现一旦存在上述的响应头的时候,会在加载 http 资源的时候自动替换为 https 请求

User-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
作用:向服务器发送浏览器的版本、系统、应用程序的信息。
解释:Chrome 浏览器的版本信息为 63.0.3239.132,并将自己伪装成 Safari,使用的是 WebKit 引擎,WebKit伪装成 KHTML,KHTML伪装成Gecko(伪装是为了接收那些为Mozilla、safari、gecko编写的界面)
延伸:可以随便填(但不应该随便填)不过一般用于统计。

X-Chrome-UMA-Enabled、X-Client-Data :与 Chrome 浏览器相关的数据
2.2 HTTP Response

HTTP响应报文信息.jpg

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

HTTP响应头主要信息:
Accpet-ranges:bytes
作用:表明自己是否接收获取某个实体的一部分(比如文件的一部分)
解释:接受
延伸:服务器支持断点续传,以及同时下载文件的多个部分时,必须设置为 bytes

Alt-svc: hq=”:443”; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337; quic=51303335,quic=”:443”; ma=2592000; v=”41,39,38,37,35”
作用:服务器使用“alt-svc”(Alternative Servicesde)标识资源,可以通过不同的网络位置或者网络协议进行获取

Content-length:24211
作用:HTTP消息实体的传输长度
解释:该实体的传输长度(被 br 压缩后的长度为)24211

Content-encoding:br
作用:设置数据使用的编码类型(压缩类型)
解释:数据使用 br 进行压缩后返回到浏览器上

Content-type:text/html; charset=UTF-8
作用:设置响应体的媒体资源类型(MIME)
解释:服务器发送 html 文档,字符集为 UTF-8

Age:1037016
作用:表明该响应从缓存中拿到时响应的寿命,代理服务器当前的系统时间与此应答消息中的通用消息头Date的值之差
解释:该响应在缓存代理中存放了 1037016 秒

Date:Thu, 15 Feb 2018 20:31:45 GMT
作用:设置响应被服务器创建的时间
解释:在 GMT(格林威治标准时间)Thu, 15 Feb 2018 20:31:45,发送的响应

Expires:Fri, 01 Feb 2019 17:33:57 GMT
作用:设置响应体的过期时间。如果在过期之前进行访问,就会读取缓存中的版本。
解释:在 GMT(格林威治标准时间)Fri, 01 Feb 2019 17:33:57,在这个时间之前,客户端不用再向服务器发送请求
延伸:如果和 Cache-control 同时存在,那么被其中的 max-age 覆盖

Last-modified:Mon, 12 Dec 2016 14:45:00 GMT
作用:设置该文件在服务器端中最后被修改的时间
解释:在 GMT(格林威治标准时间)Fri, 01 Feb 2019 17:33:57,该文件被服务器所修改

Vary:Accept-Encoding
作用:服务器响应时根据请求头中的的值返回不同的内容的
过程:浏览器 —> 请求 —> squid —> 请求 —> apache
解释: 
apache 在 response headers 中 返回了 vary: Accept-Encoding,
在 squid 中需要存储该 encoding 的值作为缓存 key 的值,比如,resourse_1 : gzip, resourse_2: deflate
下次请求到 squid,需要先找到缓存文件的索引文件,根据不同的 accept-Encoding(gzip、deflate)的值来找相应的文件。

p3p:CP=”This is not a P3P policy! See g.co/p3phelp for more info.”
作用:隐私安全平台(the Platform for Privary Preferences),网站向浏览器申明自己的隐私政策。

Server: gws
作用:设置服务器名称

Set-cookie:
作用:设置 http 的 Cookie

Status: 200
作用:设置HTTP的响应状态
解释:200 代表成功请求

Strict-transport-security: max-age=3600
作用:HSTS 策略,告诉 HTTP 客户端缓存 HTTPS 策略多少时间。
解释:在 3600 秒内,不管用户在浏览器输入不带协议的网址如:google.com 时,还是http协议的网址如:http://google.com ,都会默认将请求内部跳转到 https://google.com

X-frame-options: SAMEORIGIN
作用:点击劫持保护
解释:页面可以在相同域名页面的 frame中展示

X-content-type-options: nosniff
作用:设置浏览器的”MIME”攻击机制
解释:服务器中的内容是 image/png,那么浏览器就会显示为 image/png

X-xss-protection:1; mode=block
作用:设置浏览器的XSS防护机制
解释:浏览器如果检测到恶意代码,则不渲染恶意代码

Content-Encoding:gzip + Content-Type:text/html
作用:声明文档的压缩类型和文档的确切MIME类型
解释:文档使用的 MIME 类型是 text/html,并且对内容进行了 gzip 压缩

Etag + Last-Modified
作用:服务器给文件资源打上的标签,客户端传回 Last-Modified / Etag 给服务器验证缓存
流程: 
客户端请求资源 example.html
服务器返回资源,并且给该 html 连同 Etag + Last-Modified 一起缓存
客户端再次请求资源 example.html,并且将 if-None-Match 一起传给服务器
服务器计算存在服务器中的 eamples.html de Etag,并且与客户端传来的 if-None-Match:Etag 或者 Last-Modified 进行匹配:
if-None-Match-false:返回 304 和空的响应头
if-None-Match-true:返回 200 和新修改的资源,如果其中的某个值没有改变,那么就返回 304 和一个空的响应头

Last-Modified:文件上次修改的时间(精确到秒)

Etag: 实体标签(Entity Tag),标识该资源的状态,ETag 如果改变,说明资源状态已经改变,能够修复 Last-Modified 的一些问题。
服务器的文件可能只改变了修改时间,而内容没有改变,客户端不希望认为文件已经修改,文件在秒以下的时间进行修改
HTTP主要响应状态码:

状态码分类:

分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

常见状态码:

状态码 状态码英文名称 中文描述
100 Continue 继续。客户端应继续其请求
101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
200 OK 请求成功。一般用于GET与POST请求
201 Created 已创建。成功请求并创建了新的资源
202 Accepted 已接受。已经接受请求,但未处理完成
203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206 Partial Content 部分内容。服务器成功处理了部分GET请求
300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303 See Other 查看其它地址。与301类似。使用GET和POST请求查看
304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305 Use Proxy 使用代理。所请求的资源必须通过代理访问
306 Unused 已经被废弃的HTTP状态码
307 Temporary Redirect 临时重定向。与302类似。使用GET请求重定向
400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 请求要求用户的身份认证
402 Payment Required 保留,将来使用
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
405 Method Not Allowed 客户端请求中的方法被禁止
406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求
407 Proxy Authentication Required 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408 Request Time-out 服务器等待客户端发送的请求时间过长,超时
409 Conflict 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突
410 Gone 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息
412 Precondition Failed 客户端请求信息的先决条件错误
413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理
415 Unsupported Media Type 服务器无法处理请求附带的媒体格式
416 Requested range not satisfiable 客户端请求的范围无效
417 Expectation Failed 服务器无法满足Expect的请求头信息
500 Internal Server Error 服务器内部错误,无法完成请求
501 Not Implemented 服务器不支持请求的功能,无法完成请求
502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理

3.HTTP2.0

Go标准库net/http包默认支持HTTP/2,只要使用TLS则会默认启动HTTP/2特性,默认进行HTTPS/2协商,协商失败则退化为HTTPS/1。那么HTTP/2对比HTTP/1有哪些新特性呢?国内已有博主总结出特性,感兴趣的可阅读博文研究一下:《HTTP2.0新特性》。以下为简要概述:

  • 二进制分帧

在不改变HTTP1.x的语义、方法、状态码,在应用层(HTTP)和传输层(TCP)之间增加一个二进制分帧层。在二进制分帧层上,HTTP2.0会将所有传输信息分割为更小的消息和帧,并对它们采用二进制格式的编码将其封装。其中,HTTP1.X中的首部信息header封装到Headers帧中,而request body将被封装到Data帧中。

  • 首部压缩

HTTP1.x每次通讯(请求或响应)都会携带首部信息用于描述资源属性。而HTTP2.0在客户端和服务端之间使用首部表来跟踪和存储之前发送的键值对。请求与响应首部的定义在HTTP2.0中基本没有变,只是所有首部键必须全部小写,而且要求行要独立为:method:、:scheme:、:host:、:path:这些键值对。

  • 流量控制

HTTP2.0为数据流和连接的流量提供了一个简单的机制:

- 流量基于HTTP链接的每一跳进行,而非端到端的控制;
- 流量控制基于窗口更新帧进行,即接收方广播自己准备接收某个数据流的多少字节,以及对整个链接要接收多少个字节;
- 流量控制有方向性,即接收方可能根据自己的情况为没个流乃至整个链接设置任意窗口大小;
- 流量控制可以由接收方禁用,包括针对个别的流和针对整个链接;
- 帧的类型决定了流量控制是否适用于帧,目前只有DATA帧服从流量控制,所有其他类型的帧并不会消耗流量控制窗口的空间。这保证了重要的控制帧不会被流量控制阻塞。
  • 多路复用

基于二进制分帧层,HTTP2.0可以在共享TCP链接的基础上同时发送请求和响应。HTTP消息被分解为独立的帧,而不破坏消息本身的语义,交错发出去,在另一端根据流标识符和首部将他们重新组装起来。

  • 请求优先级

每个流都可以带有一个31bit的优先值:0表示最高优先级;2的31次方-1表示最低优先级。

  • 服务器推送

服务端根据客户端的请求,提前返回多个响应,推送额外的资源给客户端。

4.小结

Go开发Web服务只是Web技术的一小块,但其本质是一样的,都是为了实现计算机互联互通,各种技术栈都基于Web底层技术实现开发框架,帮助用户快速构建Web应用。了解完Web和HTTP后,我们下一讲进一步理解Web框架技术。