Go Web 入门与实战系列:访问 Web 站点的过程

620 阅读5分钟

这是我参与8月更文挑战的第1天,活动详情查看: 8月更文挑战

Web 应用程序是一种可以通过 Web 访问的应用程序,Web 程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。Web 应用对于身处互联网时代的我们来说太普遍。无论哪一种语言,只要它能够开发出与人类交互的软件,它就必然会支持 Web 应用开发。 本系列文章将会介绍 Go Web 的应用与实践。欢迎关注。

上一篇文章介绍了 Web 相关的概念。HTTP 协议是无状态的,同一个客户端的两次请求是没有对应关系的,对 HTTP 服务器来说,它并不知道这两个请求是否来自同一个客户端。为了解决这个问题, Web 程序引入了 Cookie 机制来维护连接的可持续状态。

本文将会继续介绍 Web 中涉及到的HTTP Response,以及访问 Web 站点的过程。

HTTP Response

一般情况下,服务器收到客户端的请求后,就会有一个 HTTP 的响应消息,HTTP 响应也由 4 部分组成,分别是:状态行、响应头、空行和响应体。

还是以访问 www.spring4all.com/common/tags/hot 为示例,返回抓包的数据如下:

Hypertext Transfer Protocol
    HTTP/1.1 200 \r\n
    X-Content-Type-Options: nosniff\r\n
    X-XSS-Protection: 1; mode=block\r\n
    Cache-Control: no-cache, no-store, max-age=0, must-revalidate\r\n
    Pragma: no-cache\r\n
    Expires: 0\r\n
    Content-Type: application/json;charset=UTF-8\r\n
    Transfer-Encoding: chunked\r\n
    Date: Fri, 03 May 2019 14:20:21 GMT\r\n
    \r\n
    [HTTP response 7/7]
    [Time since request: 0.074550000 seconds]
    [Prev request in frame: 1513]
    [Prev response in frame: 1519]
    [Request in frame: 1522]
    HTTP chunked response
    File Data: 447 bytes

{"code":0,"message":"success","data":[{"id":436,"name":"微信","score":5113},{"id":178,"name":"服务器","score":4526},{"id":274,"name":"Spring","score":3433},{"id":288,"name":"源码","score":2907},{"id":340,"name":"百度","score":2584},{"id":460,"name":"Java","score":2044},{"id":408,"name":"黑客","score":1793},{"id":33,"name":"Spring Boot","score":1703},{"id":527,"name":"Spring Cloud","score":1566},{"id":470,"name":"APP","score":1371}]}    
  1. 状态行:状态行由协议版本号、状态码、状态消息组成;
  2. 响应头:响应头是客户端可以使用的一些信息,如:Date(生成响应的日期)、Content-Type(MIME类型及编码格式)、Connection(默认是长连接)等等;
  3. 空行:响应头和响应体之间必须有一个空行;
  4. 响应体:响应正文,本例中是键值对信息。

状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的 Response。HTTP/1.1 协议中定义了 5 类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别。

  • 1XX 提示信息:表示请求已被成功接收,继续处理
  • 2XX 成功:表示请求已被成功接收,理解,接受
  • 3XX 重定向:要完成请求必须进行更进一步的处理
  • 4XX 客户端错误:请求有语法错误或请求无法实现
  • 5XX 服务器端错误:服务器未能实现合法的请求

访问 Web 站点的过程

我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要浏览的内容。在这个看似简单的用户行为背后,到底隐藏了些什么呢?

对于普通的上网过程,系统其实是这样做的:浏览器本身是一个客户端,当你输入URL 的时候,浏览器首先会去请求 DNS 服务器,通过 DNS 获取相应的域名及对应的 IP;然后通过 IP 地址找到 IP 对应的服务器后,要求建立 TCP 连接;浏览器发送完 HTTP Request(请求)包后,服务器接收到请求包之后才开始处理请求包,服务器调用自身服务,返回 HTTP Response(响应)包;客户端收到来自服务器的响应后开始渲染这个 Response 包里的主体(body),等收到全部的内容随后断开与该服务器之间的 TCP 连接。

一个 Web 服务器也被称为 HTTP 服务器,它通过 HTTP 协议与客户端通信。这个客户端通常指的是 Web 浏览器(移动端内部也是浏览器实现)。

Web 服务器的工作原理可以简单地归纳为:

  • 客户机通过 TCP/IP 协议建立到服务器的 TCP 连接;
  • 客户端向服务器发送 HTTP 协议请求包,请求服务器里的资源文档;
  • 服务器向客户机发送 HTTP 协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端;
  • 客户机与服务器断开。由客户端解释HTML文档,在客户端屏幕上渲染图形结果。

一个简单的 HTTP 事务就是这样实现的,看起来很复杂,原理其实是挺简单的。需要注意的是客户机与服务器之间的通信是非持久连接的,也就是当服务器发送了应答后就与客户机断开连接,等待下一次请求。

image.png

如上图所示,我们请求 baidu.com,首先 DNS 解析 baidu.com 对应的 IP地址,图示中显示的是 220.181.57.216;然后,客户端向 220.181.57.216 发送页面访问请求,客户端收到页面内容回复;客户端收到来自服务器的响应后开始渲染 Response 包里的主体,显示出 Baidu 的搜索页。

小结

本文主要介绍了 Web 中的 Http Response,以及访问 Web 站点的过程。下面的文章将会介绍如何使用 Go 构建服务器。

阅读最新文章,关注公众号:aoho求索