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

446 阅读4分钟
原文链接: www.ezlippi.com

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

  1. 浏览器需要查找域名[domain]的IP,从不同的缓存直至DNS服 务器。
  2. 浏览器会给web服务器发送一个HTTP请求
  3. 服务器“处理”请求
  4. 服务器发回一个HTTP响应
  5. 浏览器渲染HTML到页面。
    比如我们从www.joes-hardware.com:80/power-tools…获取资源的时候,整个过程如下图所示:

    开始时我们输入的是URI(统一资源标识符,Uniform Resource Identifier),我们用的比较多的是URI的一个子集叫统一资源定位符(URL,Uniform Resource Locator)。 URL组成

网址算是URL的一个俗称,让我们来看看一个URL的组成,以HTTP版IOT中的URL为例。
大多数URL都建立在这个通用格式

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frgs>

各个部分的介绍如下表:

以一个实际例子来说:
当我们在浏览器中输入b.phodal.com/athome/1按下回车

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

b.phodal.com:80/athome/1.js…

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

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

对就一个稍微复杂点的例子就是
designiot.phodal.com/#你所没有深入的htt…

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

www.phodal.com/search;sale…
;后面是参数部分,以便正确的与服务器进行交互
?后面的q=iot&type=blog的部分是查询字符串,通常用于查询或者、搜索。

HTTP报文

http客户端向http服务器发送请求报文,请求报文格式如下:
请求行
首部
空行
主体部分

<method><request-URL><version>
<headers>

<entity-body>

响应报文的格式如下:
响应行
首部
空行
主体

<version><status><reason-phase>
<headers>

<entity-body>
  • 方法method,常见的有get和post,是客户端希望服务器对资源执行的动作
  • 请求URL。所请求资源的完整URL或者相对路径
  • 版本version,报文使用的http版本,比如HTTP1.1
  • 首部header,向请求报文和响应报文添加了一些信息,本质上都是一些名/值对的列表。
  • 状态码(status)描述请求过程发生的情况,比如200,表示OK
  • 原因短语(reason-phase),数字状态码的可读版本
  • 实体的主体部分(entity-body)
    一个可能的请求报文图下:

    GET /java/2014/08/02/java-multithread.html HTTP1.1
    Accept:text/html
    Host: www.lippiouyangonline.info

    可能的响应报文如下:

    HTTP/1.1 200 OK
    content-type: text/plain
    content-length: 19

    Hi,I’m a message!
    下面是一个POST方法示例:

连接管理

几乎所有的HTTP通信都是由TCP/IP承载的,HTTP要传送一个报文,会以流的形式将报文数据内容通过一条打开的TCP连接按序传输。TCP收到数据流后会将数据流切成小段的数据块,并将段封装在IP分组中,通道因特网进行传输,每个IP分组包括:

1. 一个IP分组首部(通常为20字节)
2. 一个TCP段首部(通常为20字节)
3. 一个TCP数据块(0个或者多个字节)

IP首部包括源和目的的的IP地址,长度和其他一些标记,TCP首部包括TCP端口号和控制标记。 端口号和电话分机很类似,就像公司的总机号码能将你接到前台,分机号码帮你找到正确的联系人。IP地址可能将你链接的正确的计算机,端口号将你连接到正确的应用程序上去,端口号就是一个数字,HTTP的默认端口号为80。
TCP连接是通过4个值来识别的:
<源IP地址、源端口号、目地IP地址、目地端口号>这4个值唯一定义了一条TCP连接。
一个TCP分组如下:

一个典型的TCP客户端和服务器的通信过程如下:

待续…
参考书目:HTTP权威指南