Blog

Blog

PHODAL

当我们打开网页时发生了什么

原文是写在http://designiot.phodal.com/,在写设计物联网系统的时候重新整理一下这些东西,总的来说还是有用的。

打开网页时发生了什么

简单地来说,当我们在浏览器上输入URL的敲下回车的时候。

  • 浏览器需要查找域名[^domain]的IP,从不同的缓存直至DNS服务器。
  • 浏览器会给web服务器发送一个HTTP请求
  • 服务器“处理”请求
  • 服务器发回一个HTML响应
  • 浏览器渲染HTML到页面。

StackOverflow上有一个这样的回答会比较详细。

  • browser checks cache; if requested object is in cache and is fresh, skip to #9
  • browser asks OS for server's IP address
  • OS makes a DNS lookup and replies the IP address to the browser
  • browser opens a TCP connection to server (this step is much more complex with HTTPS)
  • browser sends the HTTP request through TCP connection
  • browser receives HTTP response and may close the TCP connection, or reuse it for another request
  • browser checks if the response is a redirect (3xx result status codes), authorization request (401), error (4xx and 5xx), etc.; these are handled differently from normal responses (2xx)
  • if cacheable, response is stored in cache
  • browser decodes response (e.g. if it's gzipped)
  • browser determines what to do with response (e.g. is it a HTML page, is it an image, is it a sound clip?)
  • browser renders response, or offers a download dialog for unrecognized types

忽略一些细节便剩下了

  1. 从浏览器输入URL
  2. 浏览器找到服务器,服务器返回HTML文档
  3. 从对应的服务器下载资源

说说第一步,开始时我们输入的是URI(统一资源标识符,Uniform Resource Identifier),它还有另外一个名字叫统一资源定位器(URL[^URL],Uniform Resource Locator)。

URL组成

网址算是URL的一个俗称,让我们来看看一个URL的组成,以HTTP版IOT中的URL为例。

http://b.phodal.com/athome/1

开始之前,我们需要标出URL的80端口以及json文件的全称,那么上面的网址就会变成

http://b.phodal.com:80/athome/1.json

那么对于这个URL的就有下面几部分组成

  • http:// http说的是这个URL用的是HTTP协议,至于//是一个分隔符,用法和C语言中的;一样。这样的协议还可以是coap,https,ftp等等。
  • b 是子域名,一个域名在允许的情况下可以有不限数量的子域名。
  • phodal.com 代表了一个URL是phodal.com下面的域名
  • 80 80是指80端口,默认的都是80,对于一个不是80端口的URL应该是这样的http://iot-coap.phodal.com:8896/
  • athome 指的是虚拟目录部分,或者文件路径
  • 1.json看上去就是一个文件名,然而也代表着这是一个资源。

对就一个稍微复杂点的例子就是

http://designiot.phodal.com/#你所没有深入的http

这里的#后面是锚部分,如果你打开这个URL就会发现会直接跳转到相应的锚部分,对就于下面这样的一个例子来说

http://www.phodal.com/search/?q=iot&type=blog

?后面的q=iot&type=blog的部分是参数部分,通常用于查询或者、搜索。

HTTP响应 响应报头

在这次响应中,返回了两个报头,即

Content-Type: application/json
Date: Fri, 05 Sep 2014 15:05:49 GMT

Content-Type和Date,在这里的Context-Type是application/json,而通常情况下我们打开一个网站时,他的Content-Type应该是text/html。

Content-Type: text/html;

Content-Type是最重要的报头。

HTTP响应 响应正文

正文才是我们真正想要的内容,上面的都是写给浏览器看的,一般的人不会去关注这些。

[{"id":1,"temperature":19,"sensors1":31,"sensors2":7.5,"led1":0}]

通常这是以某种格式写的,在这里是以JSON写的,而对于一个网站的时候则是HTML。

关于我

Github: @phodal     微博:@phodal     知乎:@phodal    

微信公众号(Phodal)

围观我的Github Idea墙, 也许,你会遇到心仪的项目

QQ技术交流群: 321689806
comment

Feeds

RSS / Atom

最近文章

关于作者

Phodal Huang

Engineer, Consultant, Writer, Designer

ThoughtWorks 技术专家

工程师 / 咨询师 / 作家 / 设计学徒

开源深度爱好者

出版有《前端架构:从入门到微前端》、《自己动手设计物联网》、《全栈应用开发:精益实践》

联系我: h@phodal.com

微信公众号: 最新技术分享

标签