web服务器访问流程


一.DNS解析

域名系统(英文:Domain Name System,缩写:DNS)是因特网的一项服务。

DNS是域名和IP地址相互映射的一个数据库。采用分布式,层次数据库,没有一台DNS服务器具有因特网上所有主机的映射关系,映射分布在所有的DNS服务器上。

DNS服务器分为四种类型:

   *根域名服务器(13个根域名服务器)

   *顶级域名服务器(负责顶级域名和所有国家的顶级域名)

   *权限域名服务器(负责一个区的域名服务器)

   *本地域名服务器(起到代理作用,一般像一个大学都有自己的本地域名服务器)

DNS是用户可以方便的访问网络,不需要记繁琐的IP地址。

DNS的解析查询方式有两种:迭代查询和递归查询。

第一种查询方式:迭代查询

以www.baidu.com为例:

   ·  用户主机向本地服务器A发送查询请求;

   ·  如果本地服务器A上有baidu的记录,则直接将baidu对应的IP返回给用户主机;

   ·  如果本地服务器A上没有记录,则向根域名服务器B发送查询请求;

   ·  根域名服务器B把负责com域的域名服务器C的IP地址返回给本地服务器A;

   ·  A再向C发送查询请求,获得负责baidu.com域的域名服务器D的IP地址;

   ·  A再向D发送查询请求,获得www.baidu.com对应的IP地址;

   ·  A将获得的IP地址返回给用户主机完成域名的解析。

第二种查询方式:递归查询

以www.baidu.com为例:

   ·  用户主机向本地服务器A发送查询请求;

   ·  如果本地服务器A上有baidu的记录,则直接将baidu对应的IP返回给用户主机;

   ·  如果本地服务器A上没有记录,则向根域名服务器B发送查询请求;

   ·  根域名服务器B向负责com域的域名服务器C发送请求;

   ·  C再向负责baidu.com域的域名服务器D发送查询请求;

   ·  D再返回给服务器C,www.baidu.com对应的IP地址,C返回给B,B返回给A;

   ·  A将获得的IP地址返回给用户主机完成域名的解析。

迭代查询和递归查询:

用户主机向本地服务器的查询一般都是用递归查询;而本地服务器的查询通常都是采用迭代查询,递归查询很少使用,对于流量比较大的13台根域名服务器如果对每个解析请求都代为查询的话,将会消耗极大的服务器的资源,很容易导致服务器崩溃。

 二.与服务器建立TCP连接

建立TCP连接需要用“三次握手”。

假设有客户A和服务器B,此时两者的TCP进程处于“CLOSED”状态。

   ·  A主动打开,A的TCP向B发送连接请求报文段,其首部的同步位SYN=1,并选择序号seq=x,表明传送数据的第一个数据字节的序号为x;

   ·  B的TCP收到连接请求报文段后,如同意,则返回确认,确认报文段中SYN=1,ACK=1,确认号ack=x+1,自己选择的序号seq=y,被动打开;

   ·  A收到此报文段后向B给出确认,其ACK=1,确认号ack=y+1,A的TCP通知上层应用进程,连接已经建立,B的TCP收到主机A的确认后,也通知其上层应用进程,连接已经建立;

三.客户端与服务器传送数据

在“最后一次握手”后,客户端向服务端开始传输数据,通信双方都有发送和接受两个窗口,双方分别有发送缓冲区和接受缓冲区,应用程序将数据提交给发送缓冲区,由TCP协议来控制,接收方将数据放到接受缓冲区,高层应用在合适的时间到缓冲区提取数据。

四.HTTP与TCP之间的关系

TCP:传输控制协议。握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”

HTTP:超文本传输协议。HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
 

五.Http get请求过程

在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)。

Http的get方法请求从指定的资源获取数据。

GET提交,请求的数据会附在URL之后(就是把数据放置在请求行(request line)中),以?分割URL和传输数据,多个参数用&连接。Url的编码格式采用的是ASCII码,而不是Unicode,这也就是说你不能在Url中包含任何非ASCII字符,所有非ASCII字符均需要编码再传输。

例子:

请求

GET /DEMOWebServices2.8/Service.asmx/CancelOrder?UserID=string&PWD=string&OrderConfirmation=string HTTP/1.1
Host: api.efxnow.com

回复

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length


<--文档内容省略-->(注:文档内容与上面有一个空行)

六.Http post请求过程

Http的post方法向指定的资源提交要被处理的数据。

POST提交:把提交的数据放置在是HTTP包的包体中。因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变。

例子:

请求

POST /DEMOWebServices2.8/Service.asmx/CancelOrder HTTP/1.1
Host: api.efxnow.com
Content-Type: application/x-www-form-urlencoded
Content-Length: length
<--此处空一行-->
UserID=string&PWD=string&OrderConfirmation=string

回复

Host: api.efxnow.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<--此处空一行-->

<--文档内容省略-->

七.Nginx

Nginx是一款轻量级夸平台的Web服务器。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler使用。

其特点是占有内存少,并发能力强,安装简单,中国大陆使用nginx网站用户有:新浪、网易、腾讯等。

Nginx由内核和模块组成,内核设计简洁微小,完成工作简单便捷,仅通过查找配置文件将客户端请求映射到location block(location是Nginx配置中的一个指令,用于URL匹配),在location中配置的每个指令将会启动不同的模块完成相应的工作。

八.Nginx工作流程

Nginx接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。

猜你喜欢

转载自moneyinto.iteye.com/blog/2108626