当前位置:文档之家› 用CURL来发送HTTP请求的方法

用CURL来发送HTTP请求的方法

用CURL来发送HTTP请求的方法
用CURL来发送HTTP请求的方法

使用CURL来发送HTTP请求的方法

原文:Online: http://curl.haxx.se/docs/httpscripting.html

翻译:豆连军 doulianjun@https://www.doczj.com/doc/1d13116741.html,

本文假设您已经熟悉了HTML和基本网络知识。

拥有脚本语言编写能力对于设计一个漂亮的计算机系统非常重要。UNIX有shell脚本和各种Tools工具,这些可以用来执行各种自动化命令和脚本,从而大大拓展了UNIX的计算能力。这是UNIX为什么如此成功的原因之一。

越来越多的应用转向了WEB,这使得HTTP执行脚本变得更频繁和迫切。为了从web 获得更多的信息,模拟用户浏览、发帖、上传数据等,今天已经成了我们重要工作内容。

Curl是一个命令行工具,用来执行各种URL操作和信息传输。但在本文中将着重描述如何用Curl来完美地执行HTTP请求。我假定您知道如何调用’curl –help’或者’curl –manual’来获得curl的基本信息。

Curl自然不是所有事情都能干。Curl只是生成请求包,获得数据,发送数据获得信息。你可以使用脚本语言或者重复手工调用来完成你想要做的所有事情。

1. HTTP协议

HTTP用来从WEB服务器获得数据。它也是一种建筑在TCP/IP之上的简单协议。HTTP 允许从客户端向服务器端发送数据,这些数据有多种不同的操作方法。这里将给予说明。

HTTP是一些ASCII文字行,这些ASCII文字从客户端发送给服务器端来请求一个特别的操作。然后,服务器端在发送给客户端的实际请求内容之前回应一些文字行。

客户端,也就是curl,发送一个HTTP请求,该请求包含一个操作方法(比如:GET,POST,HEAD等),一组请求头,以及某些时候再携带一些请求消息体。HTTP服务器响应一个状态行(表明操作结果是否成功),响应头,以及大多数情况下还有响应消息体。消息体部分是你请求的实际数据,比如HTML或者图片等。

1.1 查看协议

使用Curl选项 –verbose(或者‐v)可以显示curl发送了什么样的命令给服务器端,以及显示其他的一些信息。

‐‐verbose 是一个非常有用的选项,可以用来调试以及历届curl和server端之间的交互操作。

有时—verbose选项仍然不满足调试需求,这时—trace和—trace‐ascii选项可以提供curl 发送和接收的所有详细信息。下面是示例:

# curl --trace-ascii debugdump.txt https://www.doczj.com/doc/1d13116741.html,/

2. URL

URL是你用来表达一个特定互联网资源如何定位寻址的一种格式。你看到的URL比如: http://curl.haxx.se or https://https://www.doczj.com/doc/1d13116741.html, a million times.

3. 获得一个网页

最简单和最常用的HTTP请求操作是Get一个URL。这个URL可能指向一个web页面,一副图片,或者一个文件。客户端表达一个GET请求发送给服务器端,并接收所请的文档。比如:你表达了一个命令行:

# curl http://curl.haxx.se

在终端窗口中你会获得一个web页面,这就是URL指向的完整的HTML文档。

所有HTTP应答都包含了一组响应头,这些响应头通常被隐藏起来。使用curl的—include(‐i)选项可以显示这些响应头。你可以使用—head(‐I)选项来单单请求响应头。这是通过curl发送一个HEAD请求来实现的。

4. Form表单

Form表单的这样一种作用:网站用来提供一个网页,该网页包含一组Fields,用户需要输入数据,然后点击“OK”或者“确认”按钮,发送这些数据到服务器端。服务器然后使用这些发过来的数据来决定如何做下一步响应。比如使用输入的文字来检索数据库,或者在一个bug跟踪系统中登记信息,在一个地图上显示输入的地址,或者校验输入的用户名口令是否合法。

当然,接收你发送数据的服务器端还是存在着某种程序,你不能凭空产生。

4.1 GET

一个GET表单使用了GET方法,HTML中是如下描述的:

在浏览器端,该表单会展现一个文字输入框和“OK”按钮。如果你输入“1905”并点击“OK”按钮,浏览器会生成一个新的URL,该URL将使用GET方法。该"junk.cgi?birthyear=1905&press=OK"衔接在先前的URL的PATH后面。

如果原表单展现在https://www.doczj.com/doc/1d13116741.html,/when/birth.html页面上,则第二个页面将是 "https://www.doczj.com/doc/1d13116741.html,/when/junk.cgi?birthyear=1905&press=OK".

绝大多数搜索引擎采用这种工作方式。

要使Curl做同样的事情,只需要键入如下命令:

# curl

"https://www.doczj.com/doc/1d13116741.html,/when/junk.cgi?birthyear=1905&press=OK"

4.2 POST

GET方法将把所有输入的Fields名称显示在浏览器的URL中。这一般是一种比较好的做法,这种做法可以帮助你来保持书签。但是这也是一种显而易见的危险行为,比如你输入了秘密信息,或者输入了大量的Fields造成URL非常长难以阅读。

HTTP协议提供了POST方法。该方法在客户端发送时,将数据从URL中分离出来,因此你不会在URL地址栏中看到任何数据内容。

表单与之前描述的表单非常类似:

使用curl发送携带了上次数据的表单,我们可以这样做:

# curl --data "birthyear=1905&press=%20OK%20"

https://www.doczj.com/doc/1d13116741.html,/when.cgi

这种POST操作使用的Content‐Type为 application/x‐www‐form‐urlencoded ,并且这是一种应用最广泛的POST方法。

你发送给服务器端的数据必须是已经被准确地编码了。curl不会自动帮你做此事。例如:如果你想使用包含了空格的数据,你需要使用%20来替换空格等。错误的请求将很可能造成你发送的数据错误,并出现混乱。

新版本的curl能够执行URL编码的POST数据,比如:

# curl --data-urlencode "name=I am Daniel" https://www.doczj.com/doc/1d13116741.html, 4.3 文件上传POST

在1995年定义了一种通过HTTP协议POST数据的方法。这就是RFC 1867。其中RFC1867‐posting部分将在此被引用。

该方法主要设计来支持文件的上传。一个表单允许用户上传一个文件,如同下面的HTML 代码:

action="upload.cgi">

上面代码清楚地描述了将要发送内容的Content‐Type是multipart/form‐data。

POST一个表单,如果使用CURL,则你只需要键入下面的命令:

# curl --form upload=@localfilename --form press=OK [URL]

4.4 隐藏Fields

在HTML应用中,有一个很常用的在页面之间传输状态信息的方法,就是将隐藏Fields 放到表单中。隐藏Fields事先被填充好了数据。这些Fields不会被显示给用户看,它们会跟其他Fields一道被传送给服务器端。

同一个可见Field用法类似,一个隐藏Field和一个submit按钮见下述示例:

使用curl来发送上述表单,你不必考虑这些Fields是隐藏的或者不是隐藏的。实现上述功能的Curl用法与上例中是相同的。

# curl --data "birthyear=1905&press=OK&person=daniel" [URL]

4.5 展示POST请求

当你使用curl代替浏览器填充一个表单并发送给服务器端时,你一定会对发送和浏览器一样的POST请求感兴趣。

一个简单的办法可以看到这个过程。你可以将包含Form表单的HTML页面存储到本地硬盘上,修改表单的method为GET,然后点击submit按钮(当然,你也可以修改Action URL)。

你将清楚地看到发送的数据附加在URL之后,它们之间采用’?’符号分割,就如同GET 表单的发送过程一样。

5. PUT

上传数据到一个HTTP服务器的可能最好的方法是使用PUT操作。然后,当然服务器端必须有一个脚本或者程序来接收这些HTTP PUT流。

使用CURL上传一个文件到HTTP服务器,用法如下:

# curl --upload-file uploadfile

https://www.doczj.com/doc/1d13116741.html,/receive.cgi

6. HTTP认证鉴权

HTTP认证(Authentication)是一种通过校验你的用户名及密码来验证你是否有权执行相关操作的机制。基本的鉴权机制也是缺省的机制是*plain* *text* based, 顾名思义,它发送的用户名和密码看起来稍显杂乱,但仍然可以被读懂。

通过Curl来使用用户名口令的鉴权,示例如下:

# curl --user name:password https://www.doczj.com/doc/1d13116741.html,

网站可能要求一种不同的鉴权机制(检查服务器端回应的Header头),这时,你可以使用‐‐ntlm, ‐‐digest, ‐‐negotiate 或 ‐‐anyauth 等选项。

某些时候,你的HTTP访问需要通过HTTP代理完成。这是在很多公司存在的。HTTP代理一般需要验证它自己发放的账户口令来决定是否准许访问INTERNET。

用curl来实现上述要求,可以使用如下命令行:

# curl --proxy-user proxyuser:proxypassword curl.haxx.se

如果你的代理要求使用NTLM方法来认证,则使用—proxy‐ntlm选项。如果要求Digest,则使用—proxy‐digest选项。

如果你使用任何user+passord选项,但是没有标明password部分,curl将提示一个password交互窗口。

要注意的是,当一个程序执行时,查看这些进程时,它的参数可能会显示出来。这样,如果你执行一个直白的命令行选项,则其他用户可能会看到你的密码。这里有避免的方法。

这值得注意的是,HTTP认证时如何工作的。很多很多WEB站点不会使用这种登陆认证方式。后面的WEB 登陆章节会有进一步的细节说明。

7. Referer

HTTP请求可以包含一个’referer’字段(虽然这个拼写有误),该字段说明这个URL请求是来自于客户端的那个URL文档。某些程序/脚本检查请求中的referer字段来校验它是否来自于外部站点或者一个未知的页面。当然,检查如此容易的伪造是一个傻瓜做法。许多脚本仍然在这么做。使用CURL,你可以在referer字段中放任何数据,并且非常容易地愚弄服务器端来响应你的请求。

使用CURL来设置referer字段:

# curl --referer https://www.doczj.com/doc/1d13116741.html,e https://www.doczj.com/doc/1d13116741.html, 8. User Agent

与referer字段非常类似,所有HTTP请求可以设置User‐Agent字段。这个字段说明了用户使用的是哪种代理(客户端)。许多应用使用该信息来判断如何显示页面。傻瓜web编码人员试图为不同的浏览器用户提供不同的页面,以提供给用户最佳的体验。他们通常也使用不同的javascript,vbscript等。

有时,你会看到使用curl获得的web页面与你使用浏览器获得页面有所不同。这时,

你应该知道使用User‐Agent来糊弄这些服务器端使它们认为你就是那个它认为的浏览器。

使curl模拟Windows 2000上的Explorer 5:

# curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL]

使curl模拟老Linux 上的Netscape 4.73:

# curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)"

[URL]

9. Redirects

当向一个服务器请求一个资源时,回应可能包含了一个提示,这个提示说明了浏览器应该继续跳转到另外一个网页上。告诉浏览器做重定向的响应头是Location: Curl不会执行重定向:响应头是先前描述的,消息体也是跟其他回应相同的显示模式。但提供了一个功能选项,可用来执行后继的重定向。

使curl执行重定向:

# curl --location https://www.doczj.com/doc/1d13116741.html,

如果你使用curl来POST到一个网址,该网址将重定向到另外一个网页,你可以安全地将—localtion(‐L)和—data/‐‐form等选项一起结合使用。Curl将只在第一次请求中使用POST,然后使用GET来执行后继操作。

10. Cookies

web浏览器执行“客户端状态控制”技术是通过cookies来实现的。 Cookies是多个内容组合体。Cookies由服务器端发送给客户端。服务器端告诉客户端Cookie的有效路径和主机名称,以便浏览器返回这些数据。同时,它也发送过期时间和一些其他特性。

客户端跟服务器端通信时,如果服务器名称、路径名都跟以前Cookie设定的参数相匹配,则客户端将把Cookies和相关内容回传给服务器,除非这些cookie过期才不回传。

许多应用和服务器使用这种方式来连接一系列请求为一个逻辑会话。为了使curl能够用

于这种场合,我们必须能够记录和回传cookies。就如同浏览器处理它们一样。

当使用curl获取一个网页,最简单的方式就是发送一组cookies给服务器端。在命令行中如下所示:

# curl --cookie "name=Daniel" https://www.doczj.com/doc/1d13116741.html,

Cookies跟其他普通的HTTP响应头一样传输。这里可以通过curl来记录cookies,跟记录其他响应头一样。要使用—dump‐header(‐D)选项:

# curl --dump-header headers_and_cookies https://www.doczj.com/doc/1d13116741.html,

(注意,下面描述的‐‐cookie‐jar选项是一种更好的存储cookies的方法。)

Curl 有一个内置的功能全面的cookie解析引擎,如果你想重新连接一个服务器站点,想使用前一个步骤访问站点时存储下来的cookies(或者人工愚弄服务器端使服务器相信你有一个以前的连接),你可以使用这个功能。使用先前存储的Cookies,你可以这么使用Curl: # curl --cookie stored_cookies_in_file https://www.doczj.com/doc/1d13116741.html, Curl的Cookie引擎在你使用—cookie选项后开始执行。如果你仅仅想curl理解接收到的cookies,使用—cookie再跟一个不存在的文件。例如,如果你想让curl理解一个网页的cookie,并且重定向到一个新的网址(当然,curl会回送它接收到的cookies),你可以这么引用curl: # curl --cookie nada --location https://www.doczj.com/doc/1d13116741.html,

Curl能够读取和生成Cookie文件,这文件格式跟Netscape和Mozilla是一样的。这种特性为cookies在浏览器和自动脚本之间共享提供了一种方便性。‐‐cookie(‐b)开关自动检测一个给定文件是否为Cookie文件,如果是,就解析它。使用—cookie‐jar(‐c)选项,你可以使curl在操作结束时生成一个新的cookie文件:

# curl --cookie cookies.txt --cookie-jar newcookies.txt https://www.doczj.com/doc/1d13116741.html,

11. HTTPS

有多种方式来实现Secure HTTP传输。最知名的协议时HTTPS,HTTP over SSL。SSL将所有网络上发送和接收的数据进行加密,从而避免攻击者窃取敏感信息。

SSL(或者TLS是最近的标准)提供一整套高级功能,允许加密和HTTP请求密钥加密机制。

感谢OpenSSL库的支持,Curl实现了加密的支持。从一个HTTPS站点获得网页,只需要简单地执行如下操作:

# curl https://https://www.doczj.com/doc/1d13116741.html,

11.1 Certificates

使用HTTPS,你需要使用证书来证明你是否有权访问,这作为登陆密码的一个补充。Curl 支持客户端证书。所有证书在校验过程中都会被锁定,在证书可以被curl使用之前,你需要进入这个过程。这个过程可以在命令行中被指定,或者在curl询问时人工输入。curl在一个HTTPS站点上使用一个证书,可以采用如下方式:

# curl --cert mycert.pem https://https://www.doczj.com/doc/1d13116741.html,

CURL也将执行对证书中的服务器端的校验,该校验是通过比对本地存储的CA 证书和服务器端的证书进行的。

错误的证书将会导致CURL拒绝本次连接。此时,你必须使用—insecure(‐k)确保你想告诉curl去忽略服务器端的失败校验。

更多关于服务器端证书和CA机制,请参阅SSLCERTS文档,线上地址为:

http://curl.haxx.se/docs/sslcerts.html

12. 定制请求元素

要想做得漂亮,你需要增加或者修改curl的请求元素。例如,你可以修改POST请求指向一个PROPFIND,并且使发送的数据采用”Content‐Type: text/xml”(代替缺省的

Content‐Type),则相应curl用法如下:

# curl --data "" --header "Content-Type: text/xml"

--request PROPFIND https://www.doczj.com/doc/1d13116741.html,

你可以通过传入一个不存在的内容来删除一个缺省的Header。比如你可以去掉一个

Host头来修改一个请求。

# curl --header "Host:" https://www.doczj.com/doc/1d13116741.html,

类似的方式,你可以添加Headers头。你的服务器如果要增加一个"Destination:"头,你

可以如下方式使用Curl:

# curl --header "Destination: http://nowhere" https://www.doczj.com/doc/1d13116741.html, 13. Web Login

由于不只是HTTP方面的问题,仍然有许多困难。这里详细描述了各种登陆表单如何工

作的原理以及如何使用CURL来模拟登录。

需要注意的是,要自动登陆,大多数情况下,你需要编写脚本,反复调用curl。

首先,服务器端大多数都是使用cookies来跟踪客户端登陆状态。因此,你应该捕获服

务器端的Cookies响应,然后,许多站点会在登录页面设置一个特殊的cookie(请确认你已

登陆了)。所以,你应习惯于首先抓获一个登陆表单来捕获其上的cookies。

某些web登陆页使用了功能复杂的javascript,有时他们使用这些代码来设置和修改cookie内容。也有可能他们想通过这种方式来阻挡机器人登陆,就象本文描述的这样……。

但不管如何,如果阅读这些代码不足以让你实现自动登陆,你需要通过浏览器来捕获http

请求,并分析这些cookies的发送过程,以找到剥离javascript代码的途径。

在实际登陆页的form标签中,许多站点会隐藏很多秘密标签或填充一些随机数或session。你需要首先捕获登陆表单的HTML代码,并且抽取所有的隐藏字段,来正确地发送POST登陆请求。切记,采用普通POST命令发送数据时,内容需要使用URL编码。

14. Debug

很多时候,当你在一个站点上使用curl,你会注意到站点并不像你使用浏览器一样给你想要的响应。

然后,你需要使curl可以发出与你浏览器更类似的请求数据包。下面是几个有用的调试命令选项:

* 使用—trac‐ascii选项来存储详细的请求log日志,这可以用来辅助分析和理解。

* 检查确认是否有必要使用cookies(参考—cookie和—cookie‐jar)

* 设置User‐Agent为最近流行的浏览器类型。

* 设置referer为浏览器上的数值。

* 如果你使用POST,需要确认你发送了所有的字段,并且字段顺序跟浏览器一致。(见4.5章节)

一个可以帮助你正确操作的工具是LiveHttpHeader tool,这可以帮助你在Mozilla/Firefox 上查看你发送和接收的所有Headers。(包括你使用HTTPS场合)

一个更基本的目的是捕获HTTP网络通信数据,这可以使用ethereal或者tcpdump等工具来做到。通过这些工具可以帮助检查浏览器发送了和接收了哪些Headers。(HTTPS不适用)

15. References

RFC 2616 是你理解HTTP协议所必须阅读的。

RFC 3986 解释了URL语法。

RFC 2109 定义了cookies是如何工作的。

RFC 1867 定义了HTTP post上传格式。

http://curl.haxx.se 是curl的官方网站。

IIS架构与HTTP请求处理流程

****************************************************************** ******************************************************************* Windows操作系统中的IIS负责提供互联网服务,一台运行了IIS的计算机可以看成是一台Web服务器。 Windows XP SP2 中IIS主版本号为5,Windows 2003 Server为6,Vista和Windows Server 2008为7。对于Windows 2003 Server,其默认支持的https://www.doczj.com/doc/1d13116741.html,版本为1.1,因此必须单独安装.NET Framework 2.0以上版本[1]。 目前,IIS 6是使用最为广泛的版本,IIS 5已基本不在Web服务器上部署, IIS 6与IIS 5相比在系统架构上有着较大的差异,IIS 7与IIS 6相比,基本架构并没有根本性的变化,但在许多方面有新的增强和改进。本书选择IIS 6/7进行介绍,大部分内容也适合于IIS 5,但IIS 5一些已过时的特性就不介绍了。 首先,我们来仔细分辨一下三个很容易混淆的基本概念。 8.1.1网站、Web应用程序和虚拟目录 在IIS中可以创建网站、Web 应用程序和虚拟目录,以便与计算机网络上的用户共享信息。“网站”、“Web 应用程序”和“虚拟目录”这三个概念的关系如图 8?1所示。 图 8?1 网站,应用程序与虚拟目录 简而言之,一个“网站(Web Site)”包含一个或多个“ Web 应用程序(Web Application)”,一个Web 应用程序包含一个或多个“虚拟目录(Virtual Directory)”,而虚拟目录则映射到 Web 服务器或远程计算机上的物理目录。 图 8?2所示为运行IIS 7的一个Web服务器。 图 8?2 IIS 7中的网站,应用程序与虚拟目录 图 8?2中可以清楚地看到此Web服务器上有两个“网站”:Default Web Site和NewWebSite,其中Default Web Site网站中有三个“Web 应用程序”:HappyBookShopService、HappyBookShopWebSite和OnlineAlbum。而HappyBookShopWebSite应用程序下的每一个子文件夹都是一个“虚拟目录”。最顶层的虚拟目录称为“根虚拟目录”,图8?2中Web应用程序HappyBookShopWebSite的根虚拟目录为“/HappyBookShopWebSite”。

http协议请求响应报文格式及状态码详解

HTTP协议报文格式 HTTP协议(Hypertext Transfer Protocol――超文本传输协议)浏览器端(客户端)向WEB 服务器端访问页面的过程和HTTP协议报文的格式。 基于HTTP协议的客户机访问包括4个过程,分别是建立TCP套接字连接、发送HTTP请求报文、接收HTTP应答报文和关闭TCP套接字连接: 1. 创建TCP套接字连接 客户端与WEB服务器创建TCP套接字连接,其中WEB端服务器的地址可以通过域名解析确定,WEB端的套接字侦听端口一般是80。 2. 发送HTTP请求报文 客户端向WEB服务端发送请求报文,HTTP协议的请求报文格式为: 请求消息= 请求行(实体头信息)CRLF[实体内容] 请求行= 方法URL HTTP版本号CRLF 方法= GET|HEAD|POST|扩展方法 URL = 协议名称+宿主名+目录与文件名 其中"CRLF"表示回车换行。 "请求行"中的"方法"描述了对指定资源执行的动作,常用的方法"GET"、"HEAD"和"POST"等3种,它们的含义如表15-8所示: 请求报文 一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。 (1)请求行 请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。 HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。 GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾 与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据。 表15-8 HTTP请求方法

HTTP请求报头详解

HTTP头字段包括4类: general-header ; request-header ; response-header ; entity-header . ********************************************************************* ********** General Header Fields ============================= general header是request、response都可用的, 但是不能用于entity. --Cache-Control --Connection --Date --Pragma --Trailer --Transfer-Encoding --Upgrade --Via --Warning ********************************************************************* ********** Request Header Fields ====================== request-header fields 允许客户端传递关于request和客户端的附加信息到服务端, --Accept --Accept-Charset --Accept-Encoding --Accept-Language --Authorization --Expect --From --Host --If-Match --If-Modified-Since --If-None-Match --If-Range --If-Unmodified-Since

HTTP协议分析

HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。 HTTP协议的主要特点可概括如下: 1.支持客户/服务器模式。 2.简单快速: 客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、H EAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 3.灵活: HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 4.无连接: 无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。 5.无状态: HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。 一、HTTP协议(URL)

http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。 HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下: http: //host[": "port][abs_path] 二、HTTP协议的请求 http请求由三部分组成,分别是: 请求行、消息报头、请求正文 1、请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下: Method Request-URI HTTP-Version CRLF 其中Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。 请求方法(所有方法全为大写)有多种,各个方法的解释如下: GET 请求获取Request-URI所标识的资源 POST 在Request-URI所标识的资源后附加新的数据 HEAD 请求获取由Request-URI所标识的资源的响应消息报头 PUT 请求服务器存储一个资源,并用Request-URI作为其标识

HTTP请求方法及响应码详解(http get post head)

HTTP是Web协议集中的重要协议,它是从客户机/服务器模型发展起来的。客户机/服务器是运行一对 相互通信的程序,客户与服务器连接时,首先,向服务器提出请求,服务器根据客户的请求,完成处理 并给出响应。浏览器就是与Web服务器产生连接的客户端程序,它的端口为TCP的80端口,。浏览器 与Web 服务器之间所遵循的协议就是HTTP。 HTTP的早期版本为HTTP/0.9,它适用于各种数据信息的简洁快速协议,但是其远不能满足日益发展各 种应用的需要。但HTTP/0.9作为HTTP协议具有典型的无状态性:每个事务都是独立进行处理的,当 一个事务开始就在客户与服务器之间建立一个连接,当事务结束时就释放这个连接。HTTP/0.9包含Simple-Request&Simple-Responsed的报文结构。但是客户无法使用内容协商,所以服务器也无法 返回实体的媒体类型。 1982年,Tim Berners-Lee提出了HTTP/1.0,在此后的不断丰富和发展中,HTTP/1.0成为最重要 的面向事务的应用层协议。该协议对每一次请求/响应,建立并拆除一次连接。其特点是简单、易于管理,所以它符合了大家的需要,得到了广泛的应用。其缺点是仍会发生下列问题:对用户请求响应慢、网络拥 塞严重、安全性等。 1997年形成的HTTP/1.1,也就是现在普遍使用的协议,在持续连接操作机制中实现流水方式,即客户 端需要对同一服务器发出多个请求时,其实现在多数的网页都是有多部分组成(比如多张图片),可用 流水线方式加快速度,流水机制就是指连续发出多个请求并等到这些请求发送完毕,再等待响应。这样 就大大节省了单独请求对响应的等待时间,使我们得到更快速的浏览。 另外,HTTP/1.1服务器端处理请求时按照收到的顺序进行,这就保证了传输的正确性。当然,服务器端 在发生连接中断时,会自动的重传请求,保证数据的完整性。 HTTP/1.1还提供了身份认证、状态管理和Cache缓存等机制。这里,我想特别提一下关于HTTP/1.1 中的Cache缓存机制对 HTTP/1.0的不足之处的改进,它严格全面,既可以减少时间延迟、又节省了带宽。HTTP/1.1采用了内容协商机制,选择最合适的用户的内容表现形式。 现在,很多地方都有用到的虚拟主机技术在HTTP/1.1中也可以实现。所谓的虚拟主机技术,就是同一 主机地址实际对应多台主机。通俗的讲,当你同时在一个网站申请两个主页时,用协议分析仪可以发现 其实这两个主页对应的是同一个IP地址。这样用多台完全相同的机器形成WWW服务器就可以提高处 理的吞吐量。 传统的解决方案是改造域名服务器使其可以根据一定的算法将同一域名解释成不同的IP地址。分别对应 虚拟主机的每台机器,其缺点是要求每台机器占用完全独立的IP地址,这与IP地址的缺乏是相矛盾的。HTTP/1.1提供的解决方案在HTTP协议自身中加入了指定不同主机的功能,从而多台主机可以共享一个IP地址,既提高了性能又便于管理。 因为HTTP/1.1是Internet现行的标准协议,这里详细介绍其相关语法。 首先,HTTP/1.1格式可写为: 其中请求方法是请求一定的Web页面的程序或用于特定的URL。可选用下列几种: GET:请求指定的页面信息,并返回实体主体。 HEAD:只请求页面的首部。 POST:请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。 PUT:从客户端向服务器传送的数据取代指定的文档的内容。

http协议交互过程

竭诚为您提供优质文档/双击可除 http协议交互过程 篇一:wireshake抓包分析tcp与http过程详解 http协议报文格式详解 在我们日常生活中最常见的应用环境就是上网浏览网页,很多上班族到办公室的第一件事就是打开电脑,而开机后的第一件事就是打开ie、Firefox、myie、greenbrowser、opera等浏览器时,做的第一件事就是浏览一下例如.cn,的新闻,而这种简单的应用操作,完成的交互过程就是一个典型的http协议的应用过程。 http是基于tcp的连接,因此,建立http连接必须经过tcp的过程,tcp的建立过程是3次握手的过程。然后就是http过程,http只有两种报文,请求和应答报文。完成http过程后,3次断开tcp连接。 http tcp的第一阶段 http开始之前先3次握手,第一阶段就是客户向服务器发送同步请求,flag字段的syn位置1。 第二阶段

第二阶段就是服务器向客户回复一个ack包,其中Flag 字段的syn位和ack字段置1。 tcp的第三阶段: tcp的第三阶段是客户向服务器发送ack,至此,tcp的3次握手结束 tcp三次握手结束之后就是http请求 客户发出http请求之后,服务器收到请求发送ack: 服务器发送应答报文 篇二:http协议分析报告实例 http协议分析 1实验目的 分析http协议报文首部格式,理解http协议工作过程2实验内容 截获http报文,分析http协议报文首部格式,学习http 协议工作过程。3实验原理 超文本传送协议http(hypertexttransferprotocol),是万维网客户程序与万维网服务器程序之间的交互所要严 格遵守的协议。http是一个应用层协议,它使用tcp连接进行可靠的传送。对于万维网站点的访问要使用的http协议。 http的uRl的一般形式是:http://:/ www采用b/s结构,客户使用浏览器在uRl栏中输入http 请求,即输入对方服务器的地址,向web服务器提出请求。

运行时创建HTTP请求及请求的处理

1、发起请求 下面这个方法的作用就是接收要发送的数据及数据要发送到的URL,然后返回响应数据 protected string SendRequest(string data,string url) { WebRequest req = WebRequest.Create(url); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; byte[] sendBytes = Encoding.UTF8.GetBytes(data); req.ContentLength = sendBytes.Length; Stream reqStream = req.GetRequestStream(); reqStream.Write(sendBytes, 0, sendBytes.Length); reqStream.Close(); WebResponse res = req.GetResponse(); Stream resStream = res.GetResponseStream(); StreamReader sr = new StreamReader(resStream, Encoding.UTF8); string resData = sr.ReadToEnd(); sr.Close(); resStream.Close(); return resData; } 使用示例: protected void btnSubscribe_Click(object sender, EventArgs e) { string FileName = Server.MapPath("订购.xml");

http协议数据包格式

竭诚为您提供优质文档/双击可除http协议数据包格式 篇一:数据包格式 tcp/ip协议族包括诸如internet协议(ip)、地址解析协议(aRp)、互联网控制信息协议(icmp)、用户数据报协议(udp)、传输控制协议(tcp)、路由信息协议(Rip)、telnet、简单邮件传输协议(smtp)、域名系统(dns)等协议。tcp/ip 协议的层次结构如图3所示。 图3tcp/ip协议层次结构 (1)应用层应用层包含一切与应用相关的功能,相当于osi的上面三层。我们经常使用的http、Ftp、telnet、smtp 等协议都在这一层实现。 (2)传输层传输层负责提供可靠的传输服务。该层相当于osi模型中的第4层。在该层中,典型的协议是 tcp(transmissioncontrolprotocol)和 udp(userdatagramprotocol)。其中,tcp提供可靠、有序的,面向连接的通信服务;而udp则提供无连接的、不可靠用户数据报服务。 (3)网际层网际层负责网络间的寻址和数据传输,其功

能大致相当于osi模型中的第3层。在该层中,典型的协议是ip(internetprotocol)。 (4)网络接口层最下面一层是网络接口层,负责数据的实际传输,相当于osi模型中的第1、第2层。在tcp/ip协议族中,对该层很少具体定义。大多数情况下,它依赖现有的协议传输数据。 tcp/ip与osi最大的不同在于osi是一个理论上的网络通信模型,而tcp/ip则是实际运行的网络协议。tcp/ip实际上是由许多协议组成的协议簇。图4示出tcp/ip的主要协议分类情况。 整个过程: 1.dhcp请求ip地址的过程 l发现阶段,即dhcp客户端寻找dhcp服务器的阶段。客户端以广播方式发送dhcpdiscoVeR包,只有dhcp服务器才会响应。 l提供阶段,即dhcp服务器提供ip地址的阶段。dhcp 服务器 接收到客户端的dhcpdiscoVeR报文后,从ip地址池中选择一个尚未分配的ip地址分配给客户端,向该客户端发送包含租借的ip地址和其他配置信息的dhcpoFFeR包。 l选择阶段,即dhcp客户端选择ip地址的阶段。如果有多台dhcp服务器向该客户端发送

http请求处理流程(讲的很清楚)

.NET平台处理HTTP请求 .NET平台处理HTTP请求的过程大致如下: 1、IIS得到一个请求;,。 2、查询脚本映射扩展,然后把请求映射到文件 3、代码进入工作者进程(IIS5里是;IIS6里是,工作者进程也叫辅助进程; 4、 .NET运行时被加载; 5、非托管代码调用()方法; 6、每一个请求调用一个IsapiWorkerRequest; 7、使用WorkerRequest调用()方法; 8、通过传递进来的WorkerRequest创建一个HttpContext对象 9、通过把上下文对象作为参数传递给(),然后调用该方法,从应用程序池中获取一个HttpApplication实例; 10、调用(),启动管道事件序列,钩住模块和处理器; 11、调用,开始处理请求; 12、触发管道事件; 13、调用HTTP处理器和ProcessRequest方法; 14、把返回的数据输出到管道,触发处理请求后的事件。 当客户端向Web服务器请求一个页面文件时,这个HTTP请求会被进程截获(WWW服务),它判断文件后缀,如果是*.aspx、*.asmx等,就把这个请求转交给,而则会通过一个Http PipeLine的管道,将这个HTTP请求发送给进程,当这个HTTP请求进入进程之后, 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这个容器中做到这个的。 过程详解: 从本质上讲,主要是由一系列的类组成,这些类的主要目的就是将Http请求转变为对客户端的响应。HttpRuntime类是的一个主要入口,它有一个ProcessRequest方法,这个方法以一个 HttpWorkerRequest 类作为参数。HttpRuntime类几乎包含着关于单个Http请求的所有信息:所请求的文件、服务器端变量、QueryString、Http头信息等等。使用这些信息来加载、运行正确的文件,并且将这个请求转换到输出流中,一般来说,就是HTML页面;二般来说,也可以是张图片^_^。

http协议分析报告实例

HTTP协议分析 1 实验目的 分析HTTP协议报文首部格式,理解HTTP协议工作过程 2 实验内容 截获HTTP报文,分析HTTP协议报文首部格式,学习HTTP协议工作过程。 3 实验原理 超文本传送协议HTTP(HyperText Transfer Protocol),是万维网客户程序与万维网服务器程序之间的交互所要严格遵守的协议。HTTP是一个应用层协议,它使用TCP连接进行可靠的传送。对于万维网站点的访问要使用的HTTP协议。 HTTP的URL的一般形式是: http://<主机>:<端口>/<路径> WWW采用 B/S 结构,客户使用浏览器在 URL栏中输入 HTTP 请求,即输入对方服务器的地址,向 web 服务器提出请求。如访问师院的机构设置页面 https://www.doczj.com/doc/1d13116741.html,/jigou/gljg.htm,具体的工作过程如下: (1) 浏览器分析指向页面的URL. (2) 浏览器向DNS请求解析https://www.doczj.com/doc/1d13116741.html,的IP地址。 (3) 域名系统DNS解析出师院服务器的IP地址 (4) 浏览器与服务器建立TCP连接 (5) 浏览器发出取文件命令:GET /jigou/gljg.htm. (6) 服务器https://www.doczj.com/doc/1d13116741.html,给出响应,将文件 gljg.htm发送给浏览器。 (7) TCP连接释放。 (8) 浏览器显示“北航机构设置”的页面。 服务器提供的默认端口号为80. 4 实验步骤 步骤 1 在计算机上打开wireshark软件,进行报文截获。 步骤 2 从浏览器上访问https://www.doczj.com/doc/1d13116741.html,页面,具体操作为打开网页,浏览,关掉网页。 步骤 3 停止wireshark的报文截获,结果命名为http_学号,保存在本机或上 传至服务器目录下。

http请求响应过程

http请求与响应过程 (1)请求方法URI协议/版本 请求的第一行是“方法URL议/版本”:GET/sample.jsp HTTP/1.1 以上代码中“GET”代表请求方法,“/sample.jsp”表示URI,“HTTP/1.1代表协议和协议的版本。 根据HTTP标准,HTTP请求可以使用多种请求方法。例如:HTTP1.1目前支持7种请求方法:GET、POST、HEAD、OPTIONS、 PUT、DELETE和TARCE。 GET 请求获取由Request-URI所标识的资源。 POST 在Request-URI所标识的资源后附加新的数据。 HEAD 请求获取由Request-URI所标识的资源的响应消息报头。 OPTIONS 请求查询服务器的性能,或查询与资源相关的选项和需求。 PUT 请求服务器存储一个资源,并用Request-URI作为其标识。 DELETE 请求服务器删除由Request-URI所标识的资源。 TRACE 请求服务器回送收到的请求信息,主要用语测试或诊断。 在Internet应用中,最常用的方法是GET和POST。 URI完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头,最 后,协议版本声明了通信过程中使用HTTP的版本。 (2)服务器响应状态码 状态代码: 状态代码由3位数字组成,表示请求是否被理解或被满足。 状态描述: 状态描述给出了关于状态代码的简短的文字描述。 状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类。 第一个数字有五种可能的取值: - 1xx: 指示信息—表示请求已接收,继续处理。 - 2xx: 成功—表示请求已经被成功接收、理解、接受。 - 3xx: 重定向—要完成请求必须进行更进一步的操作。 - 4xx: 客户端错误—请求有语法错误或请求无法实现。 - 5xx: 服务器端错误—服务器未能实现合法的请求。 状态代码状态描述说明 200 OK --客户端请求成功 400 Bad Request --由于客户端请求有语法错误,不能被服务器所理解。 401 Unauthonzed --请求未经授权,请求身份认证。这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden --服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因

1、HTTP协议分析

开放式课题 实验报告 实验名称:基于Wireshark软件的HTTP协议分析 学号: 姓名: 指导教师:宫婧 指导单位:理学院

目录 实验目的..........................................................错误!未定义书签。 1) 掌握Wireshark软件使用方法............. 错误!未定义书签。 2)理解HTTP协议工作原理..................................... 错误!未定义书签。 实验任务.................................... 错误!未定义书签。 1) 抓取数据包........................... 错误!未定义书签。 2)分析数据包........................... 错误!未定义书签。实验环境.............................. 错误!未定义书签。软件介绍 (2) 1) wireshark软件简介 (2) 2) wireshark软件的应用 (2) 3) wireshark软件的价值 (2) 4) wireshark软件的操作简介 (3) HTTP协议详解............................... 错误!未定义书签。 1) HTTP协议基础概念....................... 错误!未定义书签。 2) HTTP协议工作流程....................... 错误!未定义书签。 3) HTTP协议请求响应信息 (6) HTTP请求报文信息....................................6 HTTP响应报文信息....................................7HTTP数据包分析 (8) 1)网络接口层信息 (10) 2)网络层信息 (11) 3)传输层信息 (12) 4)应用层信息 (13) 总结........................................ 错误!未定义书签。参考文献.. (14)

有关http请求返回值的说明

2xx 成功 200 正常;请求已完成。 201 正常;紧接 POST 命令。 202 正常;已接受用于处理,但处理尚未完成。 203 正常;部分信息—返回的信息只是一部分。 204 正常;无响应—已接收请求,但不存在要回送的信息。 3xx 重定向 301 已移动—请求的数据具有新的位置且更改是永久的。 302 已找到—请求的数据临时具有不同 URI。 303 请参阅其它—可在另一 URI 下找到对请求的响应,且应使用 GET 方法检索此响应。 304 未修改—未按预期修改文档。 305 使用代理—必须通过位置字段中提供的代理来访问请求的资源。 306 未使用—不再使用;保留此代码以便将来使用。 4xx 客户机中出现的错误 400 错误请求—请求中有语法问题,或不能满足请求。 401 未授权—未授权客户机访问数据。 402 需要付款—表示计费系统已有效。 403 禁止—即使有授权也不需要访问。 404 找不到—服务器找不到给定的资源;文档不存在。 407 代理认证请求—客户机首先必须使用代理认证自身。 410 请求的网页不存在(永久); 415 介质类型不受支持—服务器拒绝服务请求,因为不支持请求实体的格式。 5xx 服务器中出现的错误 500 内部错误—因为意外情况,服务器不能完成请求。 501 未执行—服务器不支持请求的工具。 502 错误网关—服务器接收到来自上游服务器的无效响应。 503 无法获得服务—由于临时过载或维护,服务器无法处理请求。 100系列码 从100到199范围的HTTP状态码是信息报告码。基于各种原因考虑,大多数情况下我们是很少看见这些代码的。首先,如果一个浏览器尝试访问一个网站,而网站返回这些代码时,它们往往都不会显示在屏幕上。它们只是浏览器使引用的内部码。另外,这些代码不常见的另外一个原因是起初HTTP标准不允许使用这一范围的状态码。就其本身而言,它们也一直没有被广泛地使用。 200系列码 从 200到299范围的状态码是操作成功代码。同样的,在正常的Web上网中,你也很可能不曾在屏幕上看到这些代码。相反的,这些代码是在浏览器内部使用的,用以确认操作成功确认和当前请求状态。虽然这些代码通常不显示,但是有一些故障排除工具能够读到它们,就像和其它大多数的HTTP状态码一样,它们在错误诊断过程中是非常有用的。

HTTP协议报头信息详解

对HTTP协议的头信息详解 HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW 方式的数据,关于HTTP 协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。 通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。 通用头域 通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。下面简单介绍几个在UPnP消息中使用的通用头域。 Cache-Control头域 Cache -Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下: Public指示响应可被任何缓存区缓存。 Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。 no-cache指示请求或响应消息不能缓存 no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。 min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。 Date头域

HTTP客户端的设计与实现

一、实验目的和要求 1、实验目的 HTTP客户端程序的功能是给出一个URL,要求程序能够获得指定URL所指向的内容,对于获得内容不必做进一步的处理,只打印HTML代码即可 ●通过HTTP客户端程序使学生掌握网络编程的基本知识和基 本技能; ●使学生掌握HTTP协议的常用命令; ●通过跟踪运行java网络包,使学生了解网络编程实现的细节。 2、实验要求 本实验要求实现一个简单的HTTP客户端,具体内容及要求如下: ●分析HTTP客户端程序的功能,要求能根据给定的URL,获 得URL指向的资源,对于资源的内容可以不做任何的处理, 直接打印即可; ●实现HTTP客户端程序; ●跟踪运行java网络包。 二、系统技术路线和运行环境 1、技术路线: 本系统采用Java语言开发,可以适应几乎所有支持JVM的操作系统。同时Java语言在网络领域的特殊优势,使得它所提供的类库中包含了较为丰富的网络编程API,可以使开发人员方便地开发网络通信类应用程序。

其次还采用了Tomcat6.0与jsp相结合的web建设、使得该系统能够更好的符合实验的要求和标准。 2、系统运行环境: ●硬件环境: PC机一台 ●软件环境: 操作系统:Windows XP、Tomcat6.0、jdk6.0、eclipse等 三、程序的逻辑框图 程序流逻辑框图能够帮助我们更好的熟悉和了解该系统的运行过程,本系统的一些逻辑框图如下所示:

四、程序源代码 1、基于URL的HttpClient.java程序代码如下:import java.awt.*; import java.awt.event.*; import java.io.*; import https://www.doczj.com/doc/1d13116741.html,.*; import javax.swing.*; public class HttpClient extends JApplet implements ActionListener { //创建一个按钮来点击事件 private JButton jbtView = new JButton("View"); //文本字段来接收文件的名字 private JTextField jtfURL = new JTextField(12);

HttpRuntime请求处理周期

IIS 5 的https://www.doczj.com/doc/1d13116741.html, 请求处理过程 对图的解释: IIS 5.x 一个显著的特征就是Web Server 和真正的https://www.doczj.com/doc/1d13116741.html, Application 的分离。作为Web Server 的进程上,InetInfo.exe 是一个Native Executive,并不是一个托管的程序,而我们真正的https://www.doczj.com/doc/1d13116741.html, Application aspnet_wp 的Worker Process 上面,在该进程初始化的时候会加载CLR,所以这是一个托管的环境。 IIS6 的https://www.doczj.com/doc/1d13116741.html, 请求处理过程 对图的解释: IIS 5.x 是通过InetInfo.exe 监听Request 并把Request分发到Work Process。换句话说,在IIS 5.x中对 Mode中进行,在IIS 6中,这种工作被移植到kernel Mode中进行,所有的这一切都是通过一个新的组件:

注:为了避免用户应用程序访问或者修改关键的操作系统数据,windows提供了两种处理器访问模式:用户模式(User Mode)和内核模式(Kernel Mode)。一般地,用户程序运行在User mode下,而操作系统代码运行在Kernel Mode下。Kernel Mode的代码允许访问所有系统内存和所有CPU指令。 在User Mode下,http.sys接收到一个基于aspx 的http request,然后它会根据IIS中的Metabase 查看该基于该Request 的Application 属于哪个Application Pool,如果该Application Pool不存在,则创建之。否则直接将request 发到对应Application Pool 的Queue中。每个Application Pool 对应着一个Worker Process:w3wp.exe,毫无疑问他是运行在User Mode下的。在IIS Metabase 中维护着Application Pool 和worker process的Mapping。WAS(Web Administrative service)根据这样一个mapping,将存在于某个Application Pool Queue的request 传递到对应的worker process(如果没有,就创建这样一个进程)。在worker process 初始化的时候,加载 https://www.doczj.com/doc/1d13116741.html, ISAPI,https://www.doczj.com/doc/1d13116741.html, ISAPI 进而加载CLR。最后的流程就和IIS 5.x一样了:通过AppManagerAppDomainFactory 的Create方法为Application 创建一个Application Domain;通过ISAPIRuntime 的ProcessRequest处理Request,进而将流程进入到https://www.doczj.com/doc/1d13116741.html, Http Runtime Pipeline。 IIS 7的https://www.doczj.com/doc/1d13116741.html, 请求处理过程 IIS7 站点启动并处理请求的步骤如下图: 步骤1 到6 ,是处理应用启动,启动好后,以后就不需要再走这个步骤了。 上图的8个步骤分别如下: 1、当客户端浏览器开始HTTP 请求一个WEB 服务器的资源时,HTTP.sys 拦截到这个请求。 2、HTTP.sys contacts WAS to obtain information from the configuration store. 3、WAS 向配置存储中心请求配置信息。applicationHost.config。 4、WWW 服务接受到配置信息,配置信息指类似应用程序池配置信息,站点配置信息等等。 5、WWW 服务使用配置信息去配置HTTP.sys 处理策略。 6、WAS starts a worker process for the application pool to which the request was made. 7、The worker process processes the request and returns a response to HTTP.sys. 8、客户端接受到处理结果信息。 W3WP.exe 进程中又是如果处理得呢??IIS 7 的应用程序池的托管管道模式分两种:经典和集成。这两种模式下处理策略各不相通。 本文作者:郭红俊https://www.doczj.com/doc/1d13116741.html,/ghj IIS 6 以及IIS7 经典模式的托管管道的架构 在IIS7之前,https://www.doczj.com/doc/1d13116741.html, 是以IIS ISAPI extension 的方式外加到IIS,其实包括ASP 以及PHP,也都以相同的方式配置(PHP 在IIS 采用了两种配置方式,除了IIS ISAPI extension 的方式,也包括了CGI 的方式,系统管理者能选择PHP 程序的执行方式),因此客户端对IIS 的HTTP 请求会先经由IIS 处理,然后IIS 根据要求的内容类型,如果是HTML 静态网页就由IIS 自行处理,如果不是,就根据要求的内容类型,分派给各自的IIS ISAPI extension;如果要求的内容类型是https://www.doczj.com/doc/1d13116741.html,,就分派给负责处理https://www.doczj.com/doc/1d13116741.html, 的IIS ISAPI extension,也就是aspnet_isapi.dll。下图是这个架构的示意图。 IIS7 应用程序池的托管管道模式经典模式也是这样的工作原理。这种模式是兼容IIS 6 的方式,以减少升级的成本。

HTTP工作过程

由于HTTP协议是基于请求/响应范式的(相当于客户机/服务器)。一个客户机与服务器建 立连接后,发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版 本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的 代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。 许多HTTP通讯是由一个用户代理初始化的并且包括一个申请在源服务器上资源的请求。最简单的情况可能是在用户代理和服务器之间通过一个单独的连接来完成。在Internet上,HTTP通讯通常发生在TCP/IP连接之上。缺省端口是TCP80,但其它的端口也是可用的。但这并不预示着HTTP协议在Internet或其它网络的其它协议之上才能 完成。HTTP只预示着一个可靠的传输。 这个过程就好像我们打电话订货一样,我们可以打电话给商家,告诉他我们需要什么 规格的商品,然后商家再告诉我们什么商品有货,什么商品缺货。这些,我们是通过电话 线用电话联系(HTTP是通过TCP/IP),当然我们也可以通过传真,只要商家那边也有传真。 以上简要介绍了HTTP协议的宏观运作方式,下面介绍一下HTTP协议的内部操作过程。 在WWW中,“客户”与“服务器”是一个相对的概念,只存在于一个特定的连接期间,即在某个连接中的客户在另一个连接中可能作为服务器。基于HTTP协议的客户/服务器模式的信息交换过程,它分四个过程:建立连接、发送请求信息、发送响应信息、关闭连接。这就好像上面的例子,我们电话订货的全过程。 其实简单说就是任何服务器除了包括HTML文件以外,还有一个HTTP驻留程序,用于响应用户请求。你的浏览器是HTTP客户,向服务器发送请求,当浏览器中输入了一个开始文件或点击了一个超级链接时,浏览器就向服务器发送了HTTP请求,此请求被送往由IP地址指定的URL。驻留程序接收到请求,在进行必要的操作后回送所要求的文件。 在这一过程中,在网络上发送和接收的数据已经被分成一个或多个数据包(packet),每个数据包包括:要传送的数据;控制信息,即告诉网络怎样处理数据包。TCP/IP决定了每 个数据包的格式。如果事先不告诉你,你可能不会知道信息被分成用于传输和再重新组合 起来的许多小块。 也就是说商家除了拥有商品之外,它也有一个职员在接听你的电话,当你打电话的时候,你的声音转换成各种复杂的数据,通过电话线传输到对方的电话机,对方的电话机又 把各种复杂的数据转换成声音,使得对方商家的职员能够明白你的请求。这个过程你不需 要明白声音是怎么转换成复杂的数据的。

相关主题
文本预览
相关文档 最新文档