dlmu2001
1.1 网络接入
浏览器是用来上网的,这个很好理解,除了离线浏览,大部分的行为就是用来跟各种服务器做交互,而交互的第一个前提就是网络接入。一个简单的例子就是PC通过modem拨号上网,当你拨号成功以后,你就会获得一个ip地址,可以同网络上的其它ip进行通讯,这就是接入了,当你不上网的时候,你会挂断。
因为用户需要接入,就诞生了ISP(Internet Service Provider),来为用户提供互联网接入服务,在上面的例子中,拨号我们可能拨163,或者263,这就是一个ISP。大部分用户通过以太网网卡和网线和PC连接在一起,可能用的是电信、网通、铁通,他们都是ISP。
中国移动通过GPRS和EDGE为用户提供互联网接入,他也是ISP。
在大陆,大的ISP有:中国电信,中国网通、中国铁通、中国移动、中国联通。
在手机等无线终端里面,我们更多的听到的是“承载方式”这个词,主要是根据终端接入ISP的网络方式来区分的,常见的承载方式有GSM,GPRS、EDGE、CDMA,WIFI等等,不通的承载方式网络速度的差别比较大。
1.2 数据传输
接入互联网仅仅相当于我们的物理链路打通了,我们需要找到我们要通讯的对象,以及要确保在不可靠的物理链路上实现可靠地传输,需要流量控制来提高我们的链路传输性能,这就需要IP,TCP,UDP等协议来协助我们。
简单地说,IP是互联网协议,主要负责的是寻址和选路,同时适应我们的承载,做一些简单的分片工作。TCP协议则帮助我们实现的可靠传输、流量控制和多路复用等功能。UDP则主要是多路复用和不可靠的数据传输。如果采用UDP,一般应用层要自己保证数据的可靠性。
在无线网络中,wdp+wtp用来实现同tcp类似的功能。
在系统级别上,比较常见的是将TCP/IP,UDP封装成套接字的接口,供浏览器内核调用。
因此,我们从浏览器的角度看,接触到的主要是如下几个过程:
1) 解析dns,由于访问的时候,键入的大部分是域名,而套接字的通讯是以ip地址为标识之一的。有的系统会在本地有域名表供查询,如果查不到,再给dns server发送dns query数据包。有的系统,则将dns查询和套接字的连接(connect)封装在一起。
2) 连接服务器,这就是我们经常提到的tcp的三次握手
3) 查询套接字,如bsd socket的select,就是要检测套接字的可读,可写,关闭等消息。
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,用来实现数据在网络上的安全传输。ietf将SSL标准化后叫TLS,两者并没有特别大的区别。
SSL在协议架构上的位置如下:
---------
| HTTP |
---------
| SSL |
---------
| TCP |
---------
| IP |
---------
在tcp连接成功后,用户代理首先同服务器进行安全协商,也就是ssl的handshake,在握手成功后,才发起HTTP请求,所发的HTTP请求会由商定的加密算法进行加密,所以看到的不再是GET www.baidu.com /HTTP1.1这样的明文,而是SSL里面的applicationdata,服务器收到请求后进行解密,将响应加密后传给用户代理,用户代理调用解密算法对ssl的applicationdata解密得到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提出了文档对象模型的概念(DOM:Document Object Model)。
一般来说,浏览器的解析工作就是解析标记语言,分析出标记语言的结构,用于后面要进行的网页排版和渲染工作中。支持DOM的浏览器还会在这个过程形成DOM树状结构。
另外,网页中还会嵌入图片资源,背景音,外部CSS和其他对象资源,解析过程还要将这些嵌入资源找出来,以便对嵌入资源进行HTTP请求。
1.6 网页排版和渲染
在标记语言解析完毕以后,浏览器需要对页面的各个组件进行排版,计算他们在页面中的位置坐标和大小,然后在显示设备上将对应的组件渲染出来。网页排版和渲染是浏览器的核心技术,好的浏览器会有很好的显示效果和渲染性能。渲染的时候,会调用到平台上的图形库。比如GTK,QT之类的。浏览器的移植工作很大部分就在于图形库的移植。
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访问,由于功能非常有限,现在已经很少得到使用。下面是javascript和wmlscript的例子:
<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) 渲染网页