设置HTTP代理后,HTTP协议头的不同之处

 转自:http://blog.csdn.net/wxfengyun/article/details/6612585

由于项目需要,最近热衷于研究HTTP代理相关技术。

      众所周知,用户在设置了浏览器的代理之后,再打开浏览器,输入网址,点击回车之后,浏览器会自动地将http请求数据包发往代理服务器。很明显地,这期间,ip地址会发生改变,这种改变属于网络层需要处理的事情,也就说浏览器负责了这部分的工作。

      那么应用层的HTTP协议头会不会有什么变化呢,到底哪个协议头表明了用户是设置了代理呢?

怀着这样的疑问,我翻开了HTTP协议的经典巨著《HTTP:The Definitive Guide》一书。(PS:这本书是boss在我第一天入组时就推荐给我的书籍)我试图从这本书中找到有关http代理设置与否是否有相关的头域做了标注。但是遗憾的是,我并没有找到很详细的关于HTTP代理设置之后,关于协议的变化部分,只看了一个头域User-Agent。直译过来,似乎是用户代理的意思,那么到底是不是只要设置了代理,这个头域就会被设置呢?我查了网上的资料,如下:

 

        在使用HTTP协议进行请求时,HTTP协议头部会添加User-Agent,该信息可以标识请求者的一些信息,如什么浏览器类型和版本、操作系统,使用语言等信息。
       通过抓包分析,得知IE,Firefox,傲游几个浏览器中 User-Agent的信息都为 “Mozilla/....”开头,而Opera 则不同的版本会有所不同,具体信息可以参照 下面网站,该网站信息很全,列出了常见的爬虫程序,浏览器,feed reader等几类软件所使用的User-Agent信息。
 http://www.useragentstring.com/pages/useragentstring.php

       根据所提供的信息,可以发现绝大部分的浏览器使用的User-Agent 信息都是以 “Mozilla/....”开头,而网络爬虫则只有一小部分使用 “Mozilla/....”信息。所以一般来统计的话,可以根据此信息确定使用浏览器所发出的HTTP请求。

 

     看到了吧,User-Agent头域根本与代理服务器无关,而是包含了用户的浏览器类型等信息。

     那么到底有没有哪个字段表明了用户设置了代理了呢?经过一番询问和搜索,终于找到了问题的最终答案:

     实际上,确实存在这么一个字段Proxy-Connection,表示了客户端设置了代理,不过此字段并不是HTTP标准协议指定的,而是用的人多了,所以形成了一种默认的通用字段。在客户端,从Http的协议标准来讲,http头在使用proxy或者不使用的情况下并没有任何区别。(感觉就像TCP/IP协议因为实际用的人多了反而代替OSI模型形成了事实上的标准一样^_^)

     下面我们来看看设不设置代理,HTTP请求的具体不同之处:

 

     直接连接远程服务器后,当连接成功时向服务器提交HTTP头,注意看看大概的格式(不设置代理时
GET / HTTP/1.1
Accept: */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: www.baidu.com

Connection:Keep-Alive

 

设置代理后:

先连接代理服务器(IP地址、端口),然后向代理服务器提交这样的HTTP头
GET http://www.baidu.com/ HTTP/1.0
Accept: */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: www.baidu.com
Proxy-Connection:Keep-Alive


区别
就这么一点,
1、连接的不是目标服务器的IP地址和端口而是代理服务器IP地址和端口
2、提交的不是相对的地址而是绝对的HTTP地址
3、Connection: Keep-Alive 和 Proxy-ConnectionKeep-Alive 的区别

 

下面再来点国外专业网站的解释:

 

The Proxy-Connection: header is a mistake in how some web browsers use HTTP. Its name is the result of a false analogy. It is not a standard part of the protocol. There is a different standard protocol mechanism for doing what it does. And its existence imposes a requirement upon HTTP servers such that no proxy HTTP server can be standards-conforming in practice.

翻译:

The Proxy-Connection:此协议头是使用HTTP协议的浏览器的一个错误。这个协议头名称来自于一个错误的类比。它不是标准协议的一部分。之所以说成是错误的类比,原因是标准协议中已经存在一种机制可以完成此协议头的功能。此协议头强加在HTTP服务器上,实际上不使用代理的服务器可以使用标准的确认机制(译者注:也就是说没有此协议头,HTTP服务器也可以正常工作)

 

HTTP already has a mechanism for this purpose. It is the Connection: header, documented in RFC 2616 § 14.10. Part of the reason that the Proxy-Connection:header is a mistake is that there is no need for another header to do the same thing. The Connection: header provides exactly the same functionality, less the faulty part, as the Proxy-Connection: header is intended to; and, moreover, provides it for any connection between any HTTP server, content or proxy, and its clients, not just for connections specifically between proxy servers and their clients.

翻译:

HTTP已经实现了相同目的的机制,这就是Connection头域,详见RFC 2616的14.10节。之所以说Proxy-Connection头域是一个错误,部分的原因是没有必要使用另外一个新协议头完成已存在协议头相同功能。与Proxy-Connection头相比,Connection协议头几乎提供了相同的功能,除了错误部分。而且,Connection协议头可用于任意连接之间,包括HTTP服务器,代理,客户端,而不是像Proxy-Connection一样,只能用于代理服务器和客户端之间。

 

参考文献:

[1].《Http代理前后的不同之处》http://blog.csdn.net/zztfj/article/details/5899709

[2]. 《来讨论一个HTTP协议的问题》 http://s.yanghao.org/program/viewdetail.php?i=48034

[3]. 《HTTP 协议的User-Agent相关信息》 http://blog.csdn.net/perddy/article/details/2282287

[4]. 《The Proxy-Connection: header is a mistake in how some web browsers use HTTP》

       http://homepage.ntlworld.com./jonathan.deboynepollard/FGA/web-proxy-connection-header.html

posted @ 2012-12-12 17:25  杂烩饭2012  阅读(667)  评论(0)    收藏  举报