Bootstrap

浏览器背景知识(dlmu2001)

dlmu2001

[email protected] 

1.1     网络接入

浏览器是用来上网的,这个很好理解,除了离线浏览,大部分的行为就是用来跟各种服务器做交互,而交互的第一个前提就是网络接入。一个简单的例子就是PC通过modem拨号上网,当你拨号成功以后,你就会获得一个ip地址,可以同网络上的其它ip进行通讯,这就是接入了,当你不上网的时候,你会挂断。

因为用户需要接入,就诞生了ISPInternet Service Provider),来为用户提供互联网接入服务,在上面的例子中,拨号我们可能拨163,或者263,这就是一个ISP。大部分用户通过以太网网卡和网线和PC连接在一起,可能用的是电信、网通、铁通,他们都是ISP

中国移动通过GPRSEDGE为用户提供互联网接入,他也是ISP

在大陆,大的ISP有:中国电信,中国网通、中国铁通、中国移动、中国联通。

在手机等无线终端里面,我们更多的听到的是“承载方式”这个词,主要是根据终端接入ISP的网络方式来区分的,常见的承载方式有GSMGPRSEDGECDMA,WIFI等等,不通的承载方式网络速度的差别比较大。

1.2     数据传输

接入互联网仅仅相当于我们的物理链路打通了,我们需要找到我们要通讯的对象,以及要确保在不可靠的物理链路上实现可靠地传输,需要流量控制来提高我们的链路传输性能,这就需要IPTCPUDP等协议来协助我们。

简单地说,IP是互联网协议,主要负责的是寻址和选路,同时适应我们的承载,做一些简单的分片工作。TCP协议则帮助我们实现的可靠传输、流量控制和多路复用等功能。UDP则主要是多路复用和不可靠的数据传输。如果采用UDP,一般应用层要自己保证数据的可靠性。

在无线网络中,wdp+wtp用来实现同tcp类似的功能。

在系统级别上,比较常见的是将TCP/IP,UDP封装成套接字的接口,供浏览器内核调用。

因此,我们从浏览器的角度看,接触到的主要是如下几个过程:

1)  解析dns,由于访问的时候,键入的大部分是域名,而套接字的通讯是以ip地址为标识之一的。有的系统会在本地有域名表供查询,如果查不到,再给dns server发送dns query数据包。有的系统,则将dns查询和套接字的连接(connect)封装在一起。

2)  连接服务器,这就是我们经常提到的tcp的三次握手

3)  查询套接字,如bsd socketselect,就是要检测套接字的可读,可写,关闭等消息。

4)  发送数据

5)  接收数据

6)  关闭连接

1.3     超文本传输协议(HTTP

HTTP协议建立了请求响应模型,用来帮助服务器和终端之间传输超文本。一个简单的HTTP过程如下:

1)  客户端向服务器发送一个请求

GET http://www.google.cn:80/somedata.exe

  Host: www.google.cn

  Accept: */*

  Cache-Control: no-cache

User-Agent: dillo

2)  服务器响应以资源内容

HTTP/1.0200OK

  Date:Mon,31Dec200104:25:57GMT

  Server:Apache/1.3.14(Unix)

  Content-type:text/html

  Last-modified:Tue,17Apr200106:46:28GMT

  Etag:"a030f020ac7c01:1e9f"

Content-length:397

 

<html>……………………..</html>

 

由于是一个简单的request—response响应,所以http会话本身是没有状态的,后来为了实现有状态,提出了cookie的概念,现在cookie在网络上很经常用来携带账号相关的信息,因此cookie的使用时有一定风险的,大部分浏览器都提供禁用cookie的开关。

另外,为了避免同服务器之间反复的交互,减小网络负载,http还引入了cache的机制。对于像baidu首页这样的页面,是很少做改变的,因此客户端访问过一次以后,可以将它缓存下来,下次再访问,只要缓存没有过期,就可以直接从本地取,不需要再从baidu的服务器取到页面数据。

在无线网络中,收到带宽的限制,还经常对http的体部做内容编码,常见的编码方式就是gzip,这样客户端在受到数据以后,必须对数据进行解码。

http协议对浏览器的理解非常重要,有兴趣的同志建议看rfc2616

1.4     数据的安全传输(SSL/TLS

由于http协议是以明文传送的,因此用来传递账号相关的信息是不合适的。

Netscape公司设计了SSL,用来实现数据在网络上的安全传输。ietfSSL标准化后叫TLS,两者并没有特别大的区别。

SSL在协议架构上的位置如下:

---------
|    HTTP      |
---------
|    SSL       |
---------
|    TCP       |
---------
|    IP        |
---------

tcp连接成功后,用户代理首先同服务器进行安全协商,也就是sslhandshake,在握手成功后,才发起HTTP请求,所发的HTTP请求会由商定的加密算法进行加密,所以看到的不再是GET www.baidu.com /HTTP1.1这样的明文,而是SSL里面的applicationdata,服务器收到请求后进行解密,将响应加密后传给用户代理,用户代理调用解密算法对sslapplicationdata解密得到HTTP的响应,协议比较简单,关键在于加密算法上。

有兴趣的同志可以参阅http://www.ietf.org/rfc/rfc2246.txt,另外,绿盟的文章SSL/TLS/WTLS原理(http://www.nsfocus.net/index.php?act=magazine&do=view&mid=841)讲解非常通俗易懂,可以学习下。

1.5     标记语言解析

html/xhtml/wml是网页常用的标记语言。也是用户代理通过HTTP获得的网页的内容,通过标记语言,网页编写者将网站的内容有效地组织在一起,并为用户提供导航。为了方便地操作网页中的个体元素以及数据,实现与浏览器、平台、语言的无关性,W3C提出了文档对象模型的概念(DOMDocument Object Model)。

一般来说,浏览器的解析工作就是解析标记语言,分析出标记语言的结构,用于后面要进行的网页排版和渲染工作中。支持DOM的浏览器还会在这个过程形成DOM树状结构。

另外,网页中还会嵌入图片资源,背景音,外部CSS和其他对象资源,解析过程还要将这些嵌入资源找出来,以便对嵌入资源进行HTTP请求。

1.6     网页排版和渲染

在标记语言解析完毕以后,浏览器需要对页面的各个组件进行排版,计算他们在页面中的位置坐标和大小,然后在显示设备上将对应的组件渲染出来。网页排版和渲染是浏览器的核心技术,好的浏览器会有很好的显示效果和渲染性能。渲染的时候,会调用到平台上的图形库。比如GTKQT之类的。浏览器的移植工作很大部分就在于图形库的移植。

1.7     CSS(层叠样式表)

CSS用来对页面的布局、字体、颜色、背景等进行控制,它会引起网页的重新排版,让网页看起来像一个个容器的概念。CSS让页面的内容和表现分离开来,而且能够让网站保持风格的一致性,是当前页面设计的主流。

一个简单的例子,可能你也遇到过,访问一个网页的时候,有时候网速比较慢,会发现网页下来以后,页面排版乱七八糟的,跟平时表现不一样,这时候,很有可能就是CSS还没有下载下来。

1.8     JAVASCRIPT

JAVASCIPT是一个面向对象的客户端脚本。由于能够调用客户端的CPU来做事情,所以JAVASCIPT的潜力是巨大的。他的设计初衷是让客户端自己来进行一些数据的验证,做一些交互,减少客户端同服务器的交互,现在得到了大量的运用,主流网站都会在自己的网页上嵌入javascript。当然,javascript对浏览器的性能的挑战也是巨大的,恶意的递归可能让浏览器crash

Google为什么要开发chrome?就是想在服务器上提供更多的类似在线office这样的软件,即时髦的云计算,这些又是怎么做到了呢?在客户端来说,就是强大的javascript处理能力。Chrome用的是webkit的内核,最大的改进就在于Javascript V8引擎。Google专门请了天才拉斯巴克来写V8引擎,还允许拉斯巴克在自己的农舍上班,而不是到google的办公室。

在嵌入式终端中,还有wmlscript脚本,他是一个轻量级的javascript,主要用来验证用户输入,生成消息框,简单计算。同javascript不同的是,他不嵌入网页,要通过url访问,由于功能非常有限,现在已经很少得到使用。下面是javascriptwmlscript的例子:

<html>
<head>
  <script language="LiveScript">
     function pushbutton() {
       alert("嗨! 你好");
  }
 </script>
</head>
<body>
<form>
  <input type="button" name="Button1" value="Push me" οnclick="pushbutton()">
  </form>
</body>
</html>

 

wml script例子

wml文件中

<card id="no1" title="Go to URL">

<do type="options" label="Go">

<go href="check.wmls#go_url('W3School')"/>

</do>

</card>

check.wmls文件中,定义了go_url

extern function go_url(the_url)

{

if (the_url=="W3School")

{                                                                                                                                    

WMLBrowser.go("http://www.w3school.com.cn/wmlscript/wap.wml")

}

}

1.9     浏览器简单流程

下面以tcp连接为例简单介绍浏览器的流程。

1)  接入互联网,很多情况下,终端都是一直在线了,所以这部可以省略。但是像GPRS这样的承载,都是在进入浏览器的时候才打开gprs通道。

2)  用户输入url

3)  浏览器对url进行dns解析,由于dns解析可能涉及到网络或者文件操作,所以dns解析式异步的。

4)  dns解析到ip地址后,浏览器调用socket去连接远端服务器(如果是使用了HTTP Proxy,则这个时候连接的是Proxy地址),因为是tcp连接,需要做三次握手,所以也是异步的。

5)  浏览器在调用连接的接口后,会轮询套接字,如果套接字收到了连接成功的消息(或者,在某些套接字设计中,是可写消息),就调用套接字的发送接口来发送HTTP请求数据。

6)  发送请求的过程也是一个异步的过程,而且非常有可能不能一次性发完,这个时候会不停地轮询套接字,检测可写消息。

7)  发送完请求数据后,就等待响应。知道套接字有了可读消息,HTTP就去收数据,数据一般多次才能收齐。HTTP1.1通过content-length头部或者chunked机制来判断什么时候收起数据,而1.0则通过对端关闭来判断。

8)  收齐数据后,HTTP解析响应,有选择性地对体部数据进行解码(如果存在编码),将解码后的数据传给解析模块进行解析。当然,好的浏览器,能够做到边收数据边解析。

9)  解析标记语言,形成解析数据结构和DOM树。如果页面中含有嵌入子媒体对象(如图片,外部CSS,背景音,其它对象),则发起HTTP请求,请求对应数据。

10)              对网页进行排版(如果有CSS,要根据CSS规则进行排版)

11)              渲染网页

 

;