一张网页的旅行

一张网页的旅行

从一张网页的旅行窥探WEB技术。

我是一张网页,我就保存在WEB服务器上。我有很多的兄弟姐妹,如图片、HTML网页、文本文件、电影音乐、flash程序和其他资源。

WEB客户端想要得到我,就必须向服务器发出请求,服务器接收请求,然后将数据回应到客户端。

WEB客户端有很多种,最常用的就是WEB浏览器(IE、Chrome、FireFox等)。

我虽然是一个网页,但我是有身份证的,我的身份证就是我的URI(Uniform Resource Identifier),我和你一样是唯一的。

浏览器想要访问我,就必须把我的URI输入浏览器的网址对话框:

http://www.baidu.com/img/bd_logo1.png

 

这个过程看似简单,只是浏览器帮我们隐藏了所有的细节,下面来一步一步的剖析。

1、  首先,浏览器通过我们输入的网址,创建一个HTTP请求报文,然后服务器收到这个请求报文后,返回一个HTTP响应报文,客户端接收报文,并把数据解析出来显示在浏览器。

2、  一个HTTP报文由3部分组成,是纯文本,分别是:

l  起始行(Start Line)

l  首部(Header)

l  空行(space)

l  主体(Body)

请求报文格式:

<method> <request-UTL> <version>

<headers>

 

<entity-body>

 

例子(GET和POST):

GET img/bd_logo1.png HTTP/1.0(起始行)

Host: www.baidu.com

Accept:ext/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Encoding:gzip, deflate

Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3

User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0(首部)

 

POST /search HTTP/1.1  (起始行)

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint

Accept-Language: zh-cn 

Accept-Encoding: gzip, deflate 

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld) 

Host: <a href="http://www.google.cn">www.google.cn</a> (首部)

(空行,发送回车符和换行符,通知服务器以下不再有请求头。)

hl=zh-CN&source=hp&q=domety(主体)

 

GET方式的请求一般不包含”Body”部分,请求数据以地址的形式表现在请求行。

POST方式请求行中不包含数据字符串,这些数据保存在” Body”部分,各数据之间也是使用”&”符号隔开。

“Body”不在GET方法中使用,而是在POST方法中使用。

响应报文格式:

<status-line>

<headers>

<blank line>

[<response-body>]

 

例子:

         HTTP/1.1 200 OK

Accept-Ranges    bytes

Cache-Control    max-age=315360000

Content-Length   7877

Content-Type image/png

Date Fri, 03 Apr 2015 04:06:16 GMT

(下面是内容)

 

 

下面是状态码:

n   200 OK:客户端请求成功。

n   400 Bad Request:客户端请求有语法错误,不能被服务器所理解。

n   401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。

n   403 Forbidden:服务器收到请求,但是拒绝提供服务。

n   404 Not Found:请求资源不存在,举个例子:输入了错误的URL。

n   500 Internal Server Error:服务器发生不可预期的错误。

n   503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常

 

上面就是响应的HTTP报文,内容根据你的请求报文,可以是图片、文本、HTML等。

客户端接收这个报文后,在浏览器中解析显示。

怎么发送和返回报文

首先,HTTP连接是基于TCP/IP,在客户端发送HTTP报文之前,首先要用网络协议(Internet Protocol)和端口建立一条连接客户端和服务器之间的TCP/IP连接。

连接必须有头有尾,类似给某公司的某一个员工打电话一样,首先要拨打公司的电话,然后分接到要找到员工的分机,就相当于先找IP,然后找相应的端口。

怎么获取IP地址呢?首先看我们的连接:

http:// 61.135.169.121:80/img/bd_logo1.png

http://www.baidu.com/img/bd_logo1.png

第一个URL使用了服务器的IP,61.135.169.121,以及端口号为80(浏览器默认端口)

第二个URL使用的是域名,然后通过DNS将域名转换为IP地址,没有端口号则默认为80。

有了服务器的IP和端口,则进行以下步骤

1、  建立一条通道;

2、  然后客户端发送HTTP请求报文;

3、  服务器接收请求;

4、  返回HTTP相应报文;

5、  然后连接断开。

DNS解析域名流程

我们在浏览器中输入www.baidu.com,返回百度的网页。

输入IP地址:61.135.169.121,同样返回百度的网页。

结果一样,但是过程不一样。

第一个需要先通过DNS对www.baidu.com进行解析,然后得到IP地址,然后才能建立网络连接,得到百度网页。

DNS如何解析域名:

1、  浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就将结束。

2、  如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果。其实操作系统也会有一个域名解析的过程,在Windows中可以通过C:\Windows\System32\drivers\etc\hosts文件来设置,你可以将任何域名解析到任何能够访问的IP地址。到这里还没有涉及真正的域名解析服务器,如果在本机中仍然无法完成域名的解析,就会真正请求域名服务器来解析这个域名了。

3、  如何、怎么知道域名服务器呢?在我们的网络配置中都会有"DNS服务器地址"这一项,这个地址就用于解决前面所说的如果两个过程无法解析时要怎么办,操作系统会把这个域名发送给这里设置的LDNS,也就是本地区的域名服务器。这个DNS通常都提供给你本地互联网接入的一个DNS解析服务,例如你是在学校接入互联网,那么你的DNS服务器肯定在你的学校,如果你是在一个小区接入互联网的,那这个DNS就是提供给你接入互联网的应用提供商,即电信或者联通,也就是通常所说的SPA,那么这个DNS通常也会在你所在城市的某个角落,通常不会很远。

如图,设置的就是校园网的DNS服务器地址。

 

4、  如果LDNS仍然没有命中,就直接到Root Server域名服务器请求解析,本地域名服务器一个所查询域的主域名服务器(gTLD Server)地址。gTLD是国际顶级域名服务器,如.com、.cn、.org等,全球只有13台左右。

5、  本地域名服务器(Local DNS Server)再向上一步返回的gTLD服务器发送请求。

6、  接受请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常就是你注册的域名服务器,例如你在某个域名服务提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成。

7、  Name Server域名服务器会查询存储的域名和IP的映射关系表,正常情况下都根据域名得到目标IP记录,连同一个TTL值返回给DNS Server域名服务器。

8、  Name Server域名服务器会查询存储的域名和IP的映射关系表,正常情况下都根据域名得到目标IP记录,连同一个TTL值返回给DNS Server域名服务器。返回该域名对应的IP和TTL值,Local DNS Server会缓存这个域名和IP的对应关系,缓存的时间由TTL值控制。

9、  把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束。

10、              然后通过IP,建立和服务器的连接通道。

当然,还有比如代理、网关、缓存等等技术,后续再述。

posted @ 2015-05-12 15:38  zbs666  阅读(155)  评论(0编辑  收藏  举报