我是一张网页,我就保存在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、 然后连接断开。
我们在浏览器中输入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,建立和服务器的连接通道。