HTTP 1.1与HTTP 1.0的比较

一个WEB站点每天可能要接收到上百万的用户请求,为了提高系统的效率,HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。但是,这也造成了一些性能上的缺陷,例如,一个包含有许多图像的网页文件中并没有包含真正的图像数据内容,而只是指明了这些图像的URL地址,当WEB浏览器访问这个网页文件时,浏览器首先要发出针对该网页文件的请求,当浏览器解析WEB服务器返回的该网页文档中的HTML内容时,发现其中的图像标签后,浏览器将根据标签中的src属性所指定的URL地址再次向服务器发出下载图像数据的请求,如图所示。

这里写图片描述

显 然,访问一个包含有许多图像的网页文件的整个过程包含了多次请求和响应,每次请求和响应都需要建立一个单独的连接,每次连接只是传输一个文档和图像,上一次和下一次请求完全分离。即使图像文件都很小,但是客户端和服务器端每次建立和关闭连接却是一个相对比较费时的过程,并且会严重影响客户机和服务器的性 能。当一个网页文件中包含Applet,JavaScript文件,CSS文件等内容时,也会出现类似上述的情况。

为了克服HTTP 1.0的这个缺陷,HTTP 1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。基于HTTP 1.1协议的客户机与服务器的信息交换过程,如图所示。

这里写图片描述

可见,HTTP 1.1在继承了HTTP 1.0优点的基础上,也克服了HTTP 1.0的性能问题。不仅如此,HTTP 1.1还通过增加更多的请求头和响应头来改进和扩充HTTP 1.0的功能。例如,由于HTTP 1.0不支持Host请求头字段,WEB浏览器无法使用主机头名来明确表示要访问服务器上的哪个WEB站点,这样就无法使用WEB服务器在同一个IP地址和端口号上配置多个虚拟WEB站点。在HTTP 1.1中增加Host请求头字段后,WEB浏览器可以使用主机头名来明确表示要访问服务器上的哪个WEB站点,这才实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点。HTTP 1.1的持续连接,也需要增加新的请求头来帮助实现,例如,Connection请求头的值为Keep-Alive时,客户端通知服务器返回本次请求结果后保持连接;Connection请求头的值为close时,客户端通知服务器返回本次请求结果后关闭连接。HTTP 1.1还提供了与身份认证、状态管理和Cache缓存等机制相关的请求头和响应头。

参考:
https://blog.csdn.net/elifefly/article/details/3964766

阅读更多

HTTP/1.1 , Http/1.1 , HTTP/1.0? 协议版本的问题

10-18

今天我调用 [color=#FF0000]Win32 Internet[/color] 函数发送 HTTP封包, 来获取路由器的 chklst.txt 页面. 其中涉及到对用户名和密码加密的问题, 对用户名加密后要将 [color=#FF0000]base64[/color] 码 YWRtaW46YWRtaW4= ( “admin:admin” 加密的结果, 用户名和密码都是 admin, 中间用 : 隔开) 以 [color=#FF0000]Authorization: Basic YWRtaW46YWRtaW4=[/color] 的形式加在 [color=#FF0000]Request Headers[/color] 里面.rn我通过网页获取, 抓到的封包如下所示 : rnrnGET /chklst.txt [color=#FF0000]HTTP/1.1[/color]rnAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/QVOD, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*rnAccept-Language: zh-cnrnUA-CPU: x86rnAccept-Encoding: gzip, deflaternUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; CIBA; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)rnHost: 192.168.10.1rnConnection: Keep-Alivern[color=#FF0000]Authorization: Basic YWRtaW46YWRtaW4=[/color]rnrn[color=#FF0000]HTTP/1.1[/color] 200 OKrnDate: Sat, 01 Jan 2000 00:02:02 GMTrnServer: Boa/0.94.14rc21rnAccept-Ranges: bytesrnConnection: closernContent-Length: 169rnLast-Modified: Sat, 01 Jan 2000 00:00:33 GMTrnContent-Type: text/plainrnrn…(数据部分)rnrn因为Accept, Accept-Language, UA-CPU, Accept-Encoding 及 Connection 等信息是可要可不要的, 于是我模仿它发送封包. 本来我想这应该没问题的, 我通过抓包发现 : rnrnGET /chklst.txt [color=#FF0000]Http/1.1[/color]rn[color=#FF0000]Authorization: Basic YWRtaW46YWRtaW4=[/color]rnUser-Agent: WinInet Example1rnHost: 192.168.10.1rnCache-Control: no-cachernrn[color=#FF0000]HTTP/1.0[/color] 400 Bad RequestrnDate: Sat, 01 Jan 2000 00:04:44 GMTrnServer: Boa/0.94.14rc21rnAccept-Ranges: bytesrnConnection: closernContent-Type: text/html; charset=ISO-8859-1rnrn…(数据部分)rnrn封包返回 [color=#FF0000]400 Bad Request [/color], 这表明我请求没有成功, 后来我找了很久, 包括把这些Request Headers 加得和网页获取页面的一模一样, 但是得到的结果都是[color=#FF0000]400 Bad Request [/color]. rn后来我突然发现网页发送封包和我自己发送的封包的响应信息有所不同, 网页的是 [color=#FF0000]HTTP/1.1[/color] 200 OK, 我自己的是 [color=#FF0000]HTTP/1.0[/color] 400 Bad Request, 竟然 HTTP 协议版本不同, 我马上查询我的请求头关于 HTTP 协议版本信息, 发现是 GET /chklst.txt [color=#FF0000]Http/1.1 [/color], 而网页发送的是 GET /chklst.txt [color=#FF0000]HTTP/1.1[/color] , 只是大小写不同, 却导致两种完全不同的结果. rnrn我回到程序找到 HttpOpenRequest 函数 : rnrn[code=C/C++]rn hRequest = HttpOpenRequest(rn hConnect // Handle to an HTTP session returned by InternetConnectrn , szVerb // the HTTP verb to use in the requestrn , szObjectName // the name of the target object of the specified HTTP verbrn , "HTTP/1.1" // the HTTP version "HTTP/1.1"rn , NULL // the URL of the document from which the URL in the request was obtainedrn , NULL // array of strings that indicates media types accepted by the clientrn , dwFlag // Internet optionsrn , 1 // the application-defined value that associates this operation with any application datarn );rn[/code]rnrn将参数 [color=#FF0000]"Http/1.1"[/color] 改成 [color=#FF0000]"HTTP/1.1"[/color] 或者 [color=#FF0000]NULL[/color] 就可以了.rn rnrn我想是因为我发送的封包中协议版本信息 [color=#FF0000]Http/1.1[/color] , 路由器不能识别, 而把它当成 [color=#FF0000]HTTP/1.0[/color] 处理了. 但是有些路由器或者服务器, 可以把它当成 [color=#FF0000]HTTP/1.1[/color] 处理.rn我想一定有什么[color=#FF0000]更合理的解释[/color], 所以希望大家能够毫不吝啬的告诉我, 或者告诉我 HTTP/1.0 和 HTTP/1.1 的[color=#FF0000]具体区别[/color]也可以 . rn

没有更多推荐了,返回首页