美文网首页
我们浏览网页时发生了什么?

我们浏览网页时发生了什么?

作者: neo_ng | 来源:发表于2019-12-13 15:50 被阅读0次

    一 浏览网页时发生了什么?

    "当我们在浏览器的地址栏输入 http://www.baidu.com ,然后回车,回车这一瞬间到看到页面到底发生了什么呢?"[1]

    这个过程大体可分为如下几步:

    1. 域名解析

    2. 建立TCP连接

    3. 发起HTTP请求

    4. 服务器响应HTTP请求

    5. 浏览器渲染页面

    本文侧重讨论在客户端和服务器端会发生些什么。

    二 域名解析

    域名解析就是“根据人名找电话号码的过程”;DNS就是个通讯录;由于这个“通讯录”特别大,所以无法像通讯录一样保存在手机/PC本机,而是存储在了服务器上。

    1.IP地址

    IP地址是用来唯一标识互联网上计算机的逻辑地址,让电脑之间可以相互通信. 每台连网计算机都依靠IP地址来互相区分、相互联系

    2.域名

    由于IP地址是数字标识,使用时难以记忆和书写,因此在IP地址的基础上又发展出一种符号化的地址方案,来代替数字型的IP地址。每一个符号化的地址都与特定的IP地址对应,这样网络上的资源访问起来就容易得多了。这个与网络上的数字型IP地址相对应的字符型地址,就被称为域名。

    3. DNS

    域名系统(Domain Name System,DNS),是一个分布式数据库(部署在专门的服务器上),用于保存IP地址和域名之间是一个映射关系,(1对1或者1对多的关系)。

    域名解析:将域名“翻译”为IP的过程

    image

    图 - DNS查询,以www.baidu.com为例

    题外话:

    浏览网页其实和后台服务间的调用差别不大;浏览网页时,dns服务商提供域名解析;而服务相互调用时,如果最简单的架构,则有调用方记录服务提供方的“真实地址”;如果在架构中使用了服务注册中心,服务调用者只需要知道服务名称,服务注册中心实际完成了dns的工作。

    三 浏览器/客户端发生了什么?

    3.1 浏览器的请求通常会包含些什么?

    第一节提到,域名解析之后会建立TCP连接,然后发起HTTP请求;建立TCP连接经过三次握手断开则需要四次挥手[3];HTTP基于TCP协议的,HTTP请求和HTTP响应,都是通过TCP连接这个通道来回传输的。

    先不管这些枯燥的知识点,postman是常用的用于接口测试的工具;笔者尝试用其请求www.taobao.com。postman毕竟不是浏览器,可以看到,很多资源没法显示出来。

    image

    图 - 使用postman请求www.taobao.com示意图

    image

    图 - 使用postman请求www.taobao.com时的Header

    image

    图 - 使用postman请求www.taobao.com时的Cookies

    虽然我们只是输入了网址,但是请求到后台的参数有很多;通常有Cookie和Header。为啥我们只输入了URL,为啥postman会给“脑补”这么多参数?答案是HTTP协议

    3.2 HTTP请求

    HTTP 全称Hypertext Transfer Protocol,超文本传输协议.[4]

    一个完整的http请求消息,包含一个请求行,若干个消息头(请求头),换行,实体内容

    3.2.1 请求行

    描述客户端的请求方式、请求资源的名称、http协议的版本号。例如:GET/BOOK/JAVA.HTML HTTP/1.1

    3.2.2 请求头

    请求头包含(客户机请求的服务器主机名,客户机的环境信息等):

    Accept:用于告诉服务器,客户机支持的数据类型 (例如:Accept:text/html,image/*)

    Accept-Charset:用于告诉服务器,客户机采用的编码格式

    Accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式

    Accept-Language:客户机语言环境

    Host:客户机通过这个服务器,想访问的主机名

    If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间

    Referer:客户机通过这个头告诉服务器,它(客户端)是从哪个资源来访问服务器的(防盗链)

    User-Agent:客户机通过这个头告诉服务器,客户机的软件环境(操作系统,浏览器版本等)

    Cookie:客户机通过这个头,将Coockie信息带给服务器

    Connection:告诉服务器,请求完成后,是否保持连接

    Date:告诉服务器,当前请求的时间

    3.2.3 实体内容

    就是指浏览器端通过http协议发送给服务器的实体数据。例如:name=dylan&id=110

    (get请求时,通过url传给服务器的值。post请求时,通过表单发送给服务器的值)

    可以看到,postman为我们“脑补”的Header显然属于请求他有,而cookie其实也是通过http请求报头传到服务器端的。

    四 服务器端发生了什么?

    HTTP是一种协议;所谓协议,就是指双方遵循的规范。所以不仅需要客户端/浏览器遵守,服务器端也需要遵守这个规范。

    4.1 HTTP响应

    一个http响应代表服务器端向客户端回送的数据,它包括:一个状态行,若干个消息头,以及实体内容。[4]

    4.1.1 响应头(消息头)

    包含如下内容

    Location:这个头配合302状态吗,用于告诉客户端找谁

    Server:服务器通过这个头,告诉浏览器服务器的类型

    Content-Encoding:告诉浏览器,服务器的数据压缩格式

    Content-Length:告诉浏览器,回送数据的长度

    Content-Type:告诉浏览器,回送数据的类型

    Last-Modified:告诉浏览器当前资源缓存时间

    Refresh:告诉浏览器,隔多长时间刷新

    Content-Disposition:告诉浏览器以下载的方式打开数据。例如:context.Response.AddHeader("Content-Disposition","attachment:filename=aa.jpg"); context.Response.WriteFile("aa.jpg");

    Transfer-Encoding:告诉浏览器,传送数据的编码格式

    ETag:缓存相关的头(可以做到实时更新)

    Expries:告诉浏览器回送的资源缓存多长时间。如果是-1或者0,表示不缓存

    Cache-Control:控制浏览器不要缓存数据 no-cache

    Pragma:控制浏览器不要缓存数据 no-cache

    Connection:响应完成后,是否断开连接。 close/Keep-Alive

    Date:告诉浏览器,服务器响应时间

    4.1.2 状态行

    例如:HTTP/1.1 200 OK (协议的版本号是1.1 响应状态码为200 响应结果为 OK)

    4.1.3 实体内容(实体头)

    响应包含浏览器能够解析的静态内容,例如:html,纯文本,图片等等信息

    题外话:

    笔者在刚开始学习这些网络知识的时候,往往被这些枯燥的知识点弄得很烦躁,对编程的热情起到了很多负面的影响;但这些网络知识如此基础以至于我们在日常的开发中都在使用,只不过是借助了工具;如今,从这些工具出发重新去审视这些网络知识时,往往会有更加深刻的认识。或许,学习这件事,先有感性认识,再学习原理,再得到理性认识会比较容易。

    4.2 web服务器和应用服务器

    严格意义上Web服务器只负责处理HTTP协议,只能发送静态页面的内容;包括Nginx,Apache,IIS等。

    应用服务器通常具有事务处理(transaction processing),数据库连接(database connectivity)和消息(messaging)等功能;包括WebLogic,JBoss等当然,应用服务器的HTTP协议部分仅仅是支持,一般不会做特别优化。因此两者界限没这么清晰。

    WEB服务器一般是通用的,而应用服务器一般是专用的。一般,很少将应用服务器暴露出来,而是将两者配合使用,各司其职。

    image

    图 - NGINX作为静态资源服务器的配置

    4.3 web服务器和应用服务器的“接口”

    静态资源由web服务器处理,而JSP,ASP,PHP等动态内容需要通过CGI、FastCGI、ISAPI等接口交给应用服务器去处理。[2]

    在不同技术栈(指不同语言),这个接口的角色有不同的实现。

    对于Java,Tomcat通常不直接暴露给外面,而是和Nginx、Apache等配合,只让Tomcat[5]处理JSP和Servlet部分。

    对于Python,WSGI(Web Server Gateway Interface, Web服务器网关接口)是为 Python 语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。uWSGI,Gunicorn等都是实现了WSGI。值得一提的是,python3语言的多线程能力比较弱,单进程情况下无法充分利用机器的CPU资源,所以通常会启动多个uWSGI/Gunicorn进程来提高并发能力。

    image

    图 - python web应用的常见部署方式

    五 一些个人理解

    服务调用,从广义上讲就是Request-Response的过程;狭义上一般指后台服务之间的相互调用。

    网页浏览一般就是指输入URL访问网站的过程;个人觉得算是一种特殊的服务调用(注意:不是特殊服务!!!)。

    网页浏览中,请求类型通常是HTTP,当然对于一些轮询也会有websocket;

    服务调用中,请求类型可能是HTTP,也可能是RPC。

    Referece:

    [1]输入URL到展现页面的全过程

    [2]Web 服务器与应用服务器的区别是什么?

    [3]一个 TCP 连接可以发多少个 HTTP 请求?竟答不上来

    [4]HTTP协议详细介绍

    [5]tomcat

    相关文章

      网友评论

          本文标题:我们浏览网页时发生了什么?

          本文链接:https://www.haomeiwen.com/subject/uiwfnctx.html