mvc请求过程程

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
http请求处理流程(讲的很清楚).docx 5页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:200 &&
你可能关注的文档:
··········
··········
.NET平台处理HTTP请求.NET平台处理HTTP请求的过程大致如下:1、IIS得到一个请求;,。2、查询脚本映射扩展,然后把请求映射到aspnet_isapi.dll文件3、代码进入工作者进程(IIS5里是aspnet_wp.exe;IIS6里是w3wp.exe),工作者进程也叫辅助进程;4、 .NET运行时被加载;5、非托管代码调用IsapiRuntime.ProcessRequest()方法;6、每一个请求调用一个IsapiWorkerRequest;7、使用WorkerRequest调用HttpRuntime.ProcessRequest()方法;8、通过传递进来的WorkerRequest创建一个HttpContext对象9、通过把上下文对象作为参数传递给HttpApplication.GetApplicationInstance(),然后调用该方法,从应用程序池中获取一个HttpApplication实例;10、调用HttpApplication.Init(),启动管道事件序列,钩住模块和处理器;11、调用HttpApplicaton.ProcessRequest,开始处理请求;12、触发管道事件;13、调用HTTP处理器和ProcessRequest方法;14、把返回的数据输出到管道,触发处理请求后的事件。当客户端向Web服务器请求一个页面文件时,这个HTTP请求会被inetinfo.exe进程截获(WWW服务),它判断文件后缀,如果是*.aspx、*.asmx等,就把这个请求转交给aspnet_isapi.dll,而aspnet_isapi.dll则会通过一个Http PipeLine的管道,将这个HTTP请求发送给w3wq.exe进程,当这个HTTP请求进入w3wq.exe进程之后,Asp.Net framework就会通过HttpRuntime来处理这个HTTP请求,处理完毕后将结果返回给客户端。当一个HTTP请求被送入到HttpRuntime之后,这个HTTP请求通过HTTP管道(HttpRuntime是HTTP管道的入口)被送入到一个被称之为HttpApplication Factory的一个容器当中,而这个容器会给出一个HttpApplication实例来处理传递进来的HTTP请求,同时HttpApplication实例会创建一个HttpContext对象来记录HTTP请求的上下文,而后这个HTTP请求会依次进入到如下几个容器中:HttpModule --& HttpHandler Factory --& HttpHandler当系统内部的HttpHandler的ProcessRequest方法处理完毕之后,整个Http Request就被处理完成了。如果想在中途截获一个HttpRequest并做些自己的处理,就应该在HttpRuntime运行时内部来做到这一点,确切的说时在HttpModule这个容器中做到这个的。过程详解:从本质上讲,Asp.Net主要是由一系列的类组成,这些类的主要目的就是将Http请求转变为对客户端的响应。HttpRuntime类是Asp.Net的一个主要入口,它有一个ProcessRequest方法,这个方法以一个 HttpWorkerRequest 类作为参数。HttpRuntime类几乎包含着关于单个Http请求的所有信息:所请求的文件、服务器端变量、QueryString、Http头信息等等。Asp.Net 使用这些信息来加载、运行正确的文件,并且将这个请求转换到输出流中,一般来说,就是HTML页面;二般来说,也可以是张图片^_^。对于IIS来说,它依赖于一个叫做HTTP.SYS的内置驱动程序来监听来自外部的HTTP请求。在系统启动的时候,IIS首先在HTTP.SYS中注册自己的虚拟路径(实际上相当于告诉HTTP.SYS哪些URL是可以访问的,哪些是不可以访问的。举个简单的例子:为什么你访问的文件不存在时会出现404 错误呢?就是在这一步确定的)。服务器处理一个.htm页面和一个.aspx页面肯定是不一样的,那IIS依据什么去处理呢?――根据文件的后缀名。能够处理各种后缀名的应用程序,通常被称为 ISAPI 应用程序(Internet Server Application Program Interface互联网服务器应用程序接口),它的主要工作是映射所请求的页面(文件) 和与此后缀名相对应的实际的处理程序。所有的.aspx文件实际上都是由aspnet_isapi.dll这个程序来处理的,当IIS把对于.aspx页面的请求提交给了aspnet_isapi.dll以后,它就不再关心如何处理这个请求了。除了映射文件与其对应的处理程序以外,ISAPI还需要做一些
正在加载中,请稍后...
48页40页38页39页39页40页39页26页32页92页一直......
posts - 53, comments - 2, trackbacks - 0, articles - 8
HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:
1. 建立TCP连接:
在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,
即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,
因此,首先要建立TCP连接,一般TCP连接的端口号是80。
2. Web浏览器向Web服务器发送请求命令:&
一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1。
3. Web浏览器发送请求头信息 :
浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
4. Web服务器应答 :
客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。
5. Web服务器发送应答头信息:&
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
6. Web服务器向浏览器发送数据:&
Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。
7. Web服务器关闭TCP连接 :
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive;
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。一次完整的 HTTP 请求过程 - 文章 - 伯乐在线
& 一次完整的 HTTP 请求过程
一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HTTP的响应给客户端,HTTP的响应内容同样有标准的格式。无论是什么客户端或者是什么服务端,大家只要按照HTTP的协议标准来实现的话,那么它一定是通用的。
HTTP 请求格式
HTTP请求格式主要有四部分组成,分别是:请求行、请求头、空行、消息体,每部分内容占一行
&request-line&
&general-headers&
&request-headers&
&entity-headers&
&empty-line&
[&message-body&]
&request-line&&general-headers&&request-headers&&entity-headers&&empty-line&[&message-body&]
请求行:请求行是请求消息的第一行,由三部分组成:分别是请求方法(GET/POST/DELETE/PUT/HEAD)、请求资源的URI路径、HTTP的版本号
GET /index.html HTTP/1.1
GET /index.html HTTP/1.1
请求头:请求头中的信息有和缓存相关的头(Cache-Control,If-Modified-Since)、客户端身份信息(User-Agent)等等。例如:
Cache-Control:max-age=0
Cookie:gsScrollPos=; _ga=GA1.2.; _gat=1
If-Modified-Since:Sun, 01 May :03 GMT
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36
Cache-Control:max-age=0Cookie:gsScrollPos=; _ga=GA1.2.; _gat=1If-Modified-Since:Sun, 01 May 2016 11:19:03 GMTUser-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36
消息体:请求体是客户端发给服务端的请求数据,这部分数据并不是每个请求必须的。
HTTP 响应格式
服务器接收处理完请求后返回一个HTTP相应消息给客户端。HTTP响应消息的格式包括:状态行、响应头、空行、消息体。每部分内容占一行。
&status-line&
&general-headers&
&response-headers&
&entity-headers&
&empty-line&
[&message-body&]
&status-line&&general-headers&&response-headers&&entity-headers&&empty-line&[&message-body&]
状态行:状态行位于相应消息的第一行,有HTTP协议版本号,状态码和状态说明三部分构成。如:
HTTP/1.1 200 OK
HTTP/1.1 200 OK
响应头:响应头是服务器传递给客户端用于说明服务器的一些信息,以及将来继续访问该资源时的策略。
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/ charset=utf-8
Date:Fri, 24 Jun :31 GMT
Server:nginx/1.9.12
Transfer-Encoding:chunked
Connection:keep-aliveContent-Encoding:gzipContent-Type:text/html; charset=utf-8Date:Fri, 24 Jun 2016 06:23:31 GMTServer:nginx/1.9.12Transfer-Encoding:chunked
响应体:响应体是服务端返回给客户端的HTML文本内容,或者其他格式的数据,比如:视频流、图片或者音频数据。
WEB Server都是基于Socket编程,又称之为网络编程,网络协议通过一个叫做socket的对象抽象出来,socket可以建立网络连接,读数据,写数据。socket模块定义了一些常量参数,用来指定socket的的地址族、socket的类型、以及支持的TCP/IP协议。
socket.socket([family[, type[, proto]]]):根据指定的地址族和套接字类型、协议编号(默认为0)来创建套接字对象。AF_INET对应的IPV4, AF_INET6对应的IPV6。
Socket 对象方法
socket.bind(address):绑定IP地址以及端口
socket.listen(backlog) :在指定的端口开始监听,backlog表示connection队列的最大长度
socket.setblocking(flag) : 设置为非阻塞还是阻塞的socket,如果是非阻塞的,那么调用recv的时候如果没有数据可读,那么久直接返回一个错误,相反如果设置为阻塞模式,如果没有数据可读,那么就一直处于阻塞等待数据的状态。
socket.accept():当有连接请求过来时,接收该连接,返回一个socket对象,该对象可以在基于该连接发送和接收数据。
socket.sendall(string[, flags]):发送数据
socket.recv(bufsize[, flags]):接收数据
socket.close():关闭socket连接。
搞清楚了HTTP规范和Socket之后,我们就可以使用Socket实现一个对简单的HTTP服务器了。代码:
# -*- coding:utf-8 -*-
import socket
if __name__ == '__main__':
PORT = 8000
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', PORT))
sock.listen(1)
print 'Serving HTTP on port %s ...' % PORT
conn, addr = sock.accept()
print conn, addr
request = conn.recv(1024)
# HTTP响应消息
response = "HTTP/1.1 200 OK\nContent-Type:text/html\nServer:myserver\n\nHello, World!"
conn.sendall(response)
conn.close()
12345678910111213141516171819
# -*- coding:utf-8 -*-&import socket&if __name__ == '__main__':&&&&PORT = 8000&&&&sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&&&&sock.bind(('127.0.0.1', PORT))&&&&sock.listen(1)&&&&print 'Serving HTTP on port %s ...' % PORT&&&&&while 1:&&&&&&&&conn, addr = sock.accept()&&&&&&&&print conn, addr&&&&&&&&request = conn.recv(1024)&&&&&&&&# HTTP响应消息&&&&&&&&response = "HTTP/1.1 200 OK\nContent-Type:text/html\nServer:myserver\n\nHello, World!"&&&&&&&&conn.sendall(response)&&&&&&&&conn.close()
浏览器访问地址:
打赏支持我写出更多好文章,谢谢!
打赏支持我写出更多好文章,谢谢!
关于作者:
可能感兴趣的话题
参考里面的Socket都写错了
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线用户名:gmllinux
文章数:38
评论数:10
访问量:5092
注册日期:
阅读量:1297
阅读量:3317
阅读量:585200
阅读量:470846
51CTO推荐博文
最近在学习Struts2,自己用Struts2搭建了一个简单的管理系统,大概弄清楚了Struts2处理请求的一般流程,这里主要指的是在处理请求过程中,每个角色做的事情。rv&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)http请求与响应全过程
时间: 06:56:23
&&&& 阅读:25043
&&&& 评论:
&&&& 收藏:0
标签:HTTP 无状态性
&&&&&&& HTTP 协议是无状态的(stateless)。也就是说,同一个客户端第二次访问同一个服务器上的页面时,服务器无法知道这个客户端曾经访问过,服务器也无法分辨不同的客户端。HTTP 的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的HTTP 请求。
HTTP 持久连接
HTTP1.0 使用的是非持久连接,主要缺点是客户端必须为每一个待请求的对象建立并维护一个新的连接,即每请求一个文档就要有两倍RTT 的开销。因为同一个页面可能存在多个对象,所以非持久连接可能使一个页面的下载变得十分缓慢,而且这种短连接增加了网络传输的负担。HTTP1.1 使用持久连接keepalive,所谓持久连接,就是服务器在发送响应后仍然在一段时间内保持这条连接,允许在同一个连接中存在多次数据请求和响应,即在持久连接情况下,服务器在发送完响应后并不关闭TCP
连接,而客户端可以通过这个连接继续请求其他对象。
&&&&&&& HTTP/1.1 协议的持久连接有两种方式:
&&&&&&&&&&& 非流水线方式:客户在收到前一个响应后才能发出下一个请求;
&&&&&&&&&&&&流水线方式:客户在收到 HTTP 的响应报文之前就能接着发送新的请求报文;
1、首先,在浏览器里输入网址:
2、浏览器根据域名解析IP地址:
&&&&&&& 浏览器根据访问的域名找到其IP地址。DNS查找过程如下:
& & & & 1)浏览器缓存:浏览器会缓存DNS记录一段时间。 但操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。
& & & & 2)系统缓存:如果在浏览器缓存里没有找到需要的域名,浏览器会做一个系统调用(windows里是gethostbyname),这样便可获得系统缓存中的记录。
& & & & 3)路由器缓存:如果系统缓存也没找到需要的域名,则会向路由器发送查询请求,它一般会有自己的DNS缓存。
& & & & 4)ISP DNS缓存:如果依然没找到需要的域名,则最后要查的就是ISP缓存DNS的服务器。在这里一般都能找到相应的缓存记录。
&&&&&&& 域名解析原理:
&&&&&&& 1&一个域中的每个主机名与其IP地址的映射关系由这个域的DNS服务器负责管理,例如,&www.it.org”、“ftp.it.org”、“blog.it.org”等主机名都由管理域“it.org”的DNS服务器进行管理,而不能由管理域“org”的DNS服务器进行管理。
&&&&&&& 2&每个管理域都必须在其直接父域的DNS服务器上注册该子域的名称和该子域的DNS服务器的IP地址,例如,必须在管理域“org”的DNS服务器注册子域“it.org”和其DNS服务器的IP地址后,域名“it.org”才能真正被外界所认可。
&&&&&&& 3&为了方便对顶级域名的统一管理,在顶级域名之上其实还有一个根域名,根域名用点(.)表示,例如,“www.it.org”也可以写为“www.it.org.”,“www.it.org.”中的最后的那个点(.)就表示根域名。 Internet中的根域名由InterNIC(国际互联网络信息中心)集中管理,顶级域名和其下的域名则由拥有该域名的组织、公司和个人自己管理。
&&&&&&& 域名解析的方式主要有两种,分别是:
&&&&&&& DNS有一个弊端,一个域名看上去只是对应一个单独的IP地址。还好有几种方法可以消除这个瓶颈:
&&&&&&& 1&循环 DNS 是DNS查找时返回多个IP时的解决方案。举例来说,实际上就对应了四个IP地址。
&&&&&&& 2&负载平衡器是以一个特定IP地址进行侦听并将网络请求转发到集群服务器上的硬件设备。 一些大型的站点一般都会使用这种昂贵的高性能负载平衡器。
&&&&&&& 3&地理 DNS 根据用户所处的地理位置,通过把域名映射到多个不同的IP地址提高可扩展性。这样不同的服务器不能够更新同步状态,但映射静态内容的话非常好。
&&&&&&& 4&Anycast 是一个IP地址映射多个物理主机的路由技术。 美中不足的是Anycast与TCP协议适应的不是很好,所以很少应用在那些方案中。大多数DNS服务器使用Anycast来获得高效低延迟的DNS查找。
3、浏览器与web服务器建立一个 TCP 连接
4、浏览器给Web服务器发送一个http请求:
&&&&&&& 一个http请求报文由请求行&request-line&、请求头部&headers&、空行<blank-line>
和请求数据<request-body>4个部分组成,请求报文的一般格式如下图:
&&& 1)请求行:由请求方法、URL和HTTP协议版本3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。而常见的有如下几种:
&&&&&&& 1&GET:当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。通过GET方式传递的数据直接放在在地址中,所以GET方式的请求一般不包含”请求内容”部分,请求数据以地址的形式表现在请求行。地址中”?”之后的部分就是通过GET发送的请求数据,我们可以在地址栏中清楚的看到,各个数据之间用”&”符号隔开。显然这种方式不适合传送私密数据。另外,由于不同的浏览器对地址的字符限制也有所不同,一般最多只能识别1024个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:
%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
&&&&&&& 2&POST:允许客户端给服务器提供信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。POST方式请求行中不包含数据字符串,这些数据保存在“请求内容”部分,各数据之间也是使用”&“符号隔开。POST方式大多用于页面的表单中。因为POST也能完成GET的功能,因此多数人在设计表单的时候一律都使用POST方式,其实这是一个误区。GET方式也有自己的特点和优势,我们应该根据不同的情况来选择是使用GET还是使用POST。
&&&&&&& 3&HEAD:就像GET,只不过服务端接受到HEAD请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了页面内容。
&&& 2)请求头部:由关键字/值对组成,每行一对,关键字和值用英文冒号”:“分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
&&&& User-Agent:产生请求的浏览器类型。
&&&&&Accept:客户端可识别的内容类型列表。星号 “ * ” 用于按范围将类型分组,用 “ */* ” 指示可接受全部类型,用“ type/* ”指示可接受 type 类型的所有子类型。
&&&& Host:要请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
&&&& Accept-Language:客户端可接受的自然语言。
&&&& Accept-Encoding:客户端可接受的编码压缩格式。
&&&& Accept-Charset:可接受的应答的字符集。
&&&& connection:连接方式(close 或 keepalive)。
&&&& Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie。
&&& 3)空行:最后一个请求头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头部。
&&& 4)请求数据:请求数据不在GET方法中使用,而在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头部是Content-Type和Content-Length。
请求报文示例:
POST /search HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,
application/msword, application/x-silverlight, application/x-shockwave-flash, */*
Referer: &a href=&/&&/&/a&
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 ( MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: &a href=&&&&/a&
Connection: Keep-Alive
Cookie: PREF=ID=80a06da87be9ae3c:U=fc3b714:NW=1:TM=:LM=:S=ybYcq2wpfefs4V9g;
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r
hl=zh-CN&source=hp&q=domety
5、服务器的永久重定向响应:
&&&&&&&服务器给浏览器响应一个301永久重定向响应,这样浏览器就会访问“/” 而非“/”。为什么服务器一定要重定向而不是直接发送用户想看的网页内容呢?其中一个原因跟搜索引擎排名有关。如果一个页面有两个地址,就像/和,搜索引擎会认为它们是两个网站,结果造成每个搜索链接都减少从而降低排名。而搜索引擎知道301永久重定向是什么意思,这样就会把访问带www的和不带www的地址归到同一个网站排名下。还有就是用不同的地址会造成缓存友好性变差,当一个页面有好几个名字时,它可能会在缓存里出现好几次。
&&&&&&& 一个http响应报文由状态行&status-line&、响应头部&headers&、空行<blank-line>
和响应数据<response-body>4个部分组成,响应报文的一般格式如下图:
&&& 1)状态行: 由HTTP协议版本、服务器返回的响应状态码和响应状态码的文本描述组成。
&&&&&&&&&状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
&&&&&&&&&&&& 1xx:信息性状态码,表示服务器已接收了客户端请求,客户端可继续发送请求。
&&&&&&&&&&&&&&&& 100 Continue
&&&&&&&&&&&&&&&& 101 Switching Protocols
&&&&&&&&&&&& 2xx:成功状态码,表示服务器已成功接收到请求并进行处理。
&&&&&&&&&&&&&&&& 200 OK 表示客户端请求成功
&&&&&&&&&&&&&&&& 204 No Content 成功,但不返回任何实体的主体部分
&&&&&&&&&&&&&&&& 206 Partial Content 成功执行了一个范围(Range)请求
&&&&&&&&&&&& 3xx:重定向状态码,表示服务器要求客户端重定向。
&&&&&&&&&&&&&&&& 301 Moved Permanently 永久性重定向,响应报文的Location首部应该有该资源的新URL
&&&&&&&&&&&&&&&& 302 Found 临时性重定向,响应报文的Location首部给出的URL用来临时定位资源
&&&&&&&&&&&&&&&& 303 See Other 请求的资源存在着另一个URI,客户端应使用GET方法定向获取请求的资源
&&&&&&&&&&&&&&&& 304 Not Modified 客户端发送附带条件的请求(请求首部中包含如If-Modified-Since等指定首部)时,服务端有可能返回304,此时,响应报文中不包含任何报文主体。
&&&&&&&&&&&&&&&& 307 Temporary Redirect 临时重定向。与302 Found含义一样。302禁止POST变换为GET,但实际使用时并不一定,307则更多浏览器可能会遵循这一标准,但也依赖于浏览器具体实现
&&&&&&&&&&&& 4xx:客户端错误状态码,表示客户端的请求有非法内容。
&&&&&&&&&&&&&&&& 400 Bad Request 表示客户端请求有语法错误,不能被服务器所理解
&&&&&&&&&&&&&&&&&401 Unauthonzed 表示请求未经授权,该状态代码必须与 WWW-Authenticate 报头域一起使用
&&&&&&&&&&&&&&&& 403 Forbidden 表示服务器收到请求,但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因
&&&&&&&&&&&&&&&& 404 Not Found 请求的资源不存在,例如,输入了错误的URL
&&&&&&&&&&&& 5xx:服务器错误状态码,表示服务器未能正常处理客户端的请求而出现意外错误。
&&&&&&&&&&&&&&&& 500 Internel Server Error 表示服务器发生不可预期的错误,导致无法完成客户端的请求
&&&&&&&&&&&&&&&&&503 Service Unavailable 表示服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常
&&& 2)响应头部:由关键字/值对组成,每行一对,关键字和值用英文冒号”:“分隔,典型的响应头有:
&&&&&&&&& Location:用于重定向接受者到一个新的位置。例如:客户端所请求的页面已不存在原先的位置,为了让客户端重定向到这个页面新的位置,服务器端可以发回Location响应报头后使用重定向语句,让客户端去访问新的域名所对应的服务器上的资源
&&&&&&&&& Server:包含了服务器用来处理请求的软件信息及其版本。它和 User-Agent 请求报头域是相对应的,前者发送服务器端软件的信息,后者发送客户端软件(浏览器)和操作系统的信息
&&&&&&&&& Vary:指示不可缓存的请求头列表
&&&&&&&&& Connection:连接方式
  &&&&&& 对于请求来说:close(告诉 WEB 服务器或者代理服务器,在完成本次请求的响应后,断开连接,不等待本次连接的后续请求了)。keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求);
  &&&&&& 对于响应来说:close(连接已经关闭); keepalive(连接保持着,在等待本次连接的后续请求); Keep-Alive:如果浏览器请求保持连接,则该头部表明希望WEB 服务器保持连接多长时间(秒);例如:Keep-Alive:300;
  &&&WWW-Authenticate:必须被包含在401 (未授权的)响应消息中,这个报头域和前面讲到的Authorization 请求报头域是相关的,当客户端收到 401 响应消息,就要决定是否请求服务器对其进行验证。如果要求服务器对其进行验证,就可以发送一个包含了Authorization 报头域的请求
&&& 3)空行:最后一个响应头部之后是一个空行,发送回车符和换行符,通知浏览器以下不再有响应头部。
&&& 4)响应数据:服务器返回给客户端的文本信息。
响应报文示例:
HTTP/1.1 301 Moved Permanently
Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Expires: Sat, 01 Jan :00 GMT
Location: &a target=_blank href=&/&&/&/a&
P3P: CP=”DSP LAW”
Pragma: no-cache
Set-Cookie: made_write_conn= expires=Thu, 12-Feb-:50 GMT;
path=/; domain=.; httponly
Content-Type: text/ charset=utf-8
X-Cnection: close
Date: Fri, 12 Feb :51 GMT
Content-Length: 0
6、浏览器跟踪重定向地址:
现在浏览器知道了 “/”才是要访问的正确地址,所以它会发送另一个http请求。
7、服务器“处理”请求:
&&&&&&&服务器接收到获取请求,然后处理并返回一个响应。这表面上看起来是一个顺向的任务,但其实这中间发生了很多有意思的东西,就像作者博客这样简单的网站,何况像facebook那样访问量大的网站呢!web服务器软件(像IIS和阿帕奇)接收到HTTP请求,然后确定执行某一请求处理来处理它。请求处理就是一个能够读懂请求并且能生成HTML来进行响应的程序(像ASP.NET,PHP,RUBY…)。
8、服务器发回一个HTML响应
9、释放 TCP 连接
&&&&& 若connection 模式为close,则服务器主动关闭TCP 连接,客户端被动关闭连接,释放TCP 连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
10、客户端浏览器解析HTML内容
&&&&&& 客户端将服务器响应的 html 文本解析并显示
11、浏览器获取嵌入在HTML中的对象
&&&&&& 在浏览器显示HTML时,它会注意到需要获取其他地址内容的标签。这时浏览器会发送一个获取请求来重新获得这些文件。这些地址都要经历一个和HTML读取类似的过程。所以浏览器会在DNS中查找这些域名,发送请求,重定向等等…
&&&&&&&&&&

标签:
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!}

我要回帖

更多关于 http请求过程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信