Proxy-Connection, 這個字段是干什么的?
從字面上的意思看,這個字段表示和代理的連接。下面我們來具體看一下
首先我們看一下設置了瀏覽器代理之后HTTP的請求有哪些變化
GET / HTTP
/1
.1
Host: www.example.com
Connection: keep-alive
GET http:
//www
.example.com/ HTTP
/1
.1
Host: www.example.com
Proxy-Connection: keep-alive
我們看到有兩個變化
1. 請求的資源URI變成了完整路徑
2. Connection 頭變為了 Proxy-Connection頭
為什么需要完整路徑
早期的HTTP設計中,瀏覽器直接和單個服務器對話,不存在虛擬主機。 所以單個服務器總知道自己的主機名和端口,這樣瀏覽器發送請求只需要發送相對地址就可以了。如下
GET / HTTP /1.0 接受主機知道這是要訪問我的/路徑的東東
有了代理就麻煩了,代理不知道GET / HTTP /1.0 這個請求發給哪個主機,所以HTTP 1.0 又要求瀏覽器給代理發送的時候必須發送完整的路徑名稱
GET http:
//www
.example.com/ HTTP
/1
.0
HTTP 1.1 規定了必須包含Host主機名這個字段。所以 HTTP 1.1 可以是
GET / HTTP
/1
.1
Host: www.example.com
但是由於不清楚代理是1.0 還是1.1的 也許代理不認識Host這個頭。 所以http 1.1 發給代理的最后格式就變為
GET http:
//www
.example.com/ HTTP
/1
.1
Host: www.example.com
說起來真是拗口啊
下面在說下Connection
GET / HTTP/1.1 Host: www.example.com Connection: my-header, close, my-connection My-Header: xxx
協議規定Connection可以定義其他只和本次Connection有關的head,比如 上面的my-header, my-connection
Http/1.1 默認是Keepalive的,所以如果Connection指明 close的話 表明消息發送完之后 會釋放對應的TCP
由於代理會識別http消息中的Header並重寫明白的Header,對於不能理解的Header會正常轉發, 這樣的目的就是為了軟件功能比較方便,增加一個Header不需要升級代理。
假如Connection發給了代理,代理不認識進行了轉發,最后到了服務器。
如果服務器認識Connection:keep-alive,但是代理不認識(1.0代理),問題就出現了
服務器發送完resonse之后會保持這個鏈接,而代理由於是1.0的默認是close的行為,所以會等待服務器釋放鏈接。
客戶端接受到服務器的response之后,由於response中的Connection也是keep-alive,所以客戶端還會繼續在連接上發送請求,但是代理卻認為客戶端不會繼續發送了。
解決這個問題就出現了一個新的Header叫 Proxy-Connection用來協商瀏覽器和代理之間的鏈接
如果代理是1.1的,那么認識Proxy-Connection,完全沒問題,代理會重寫為Connection
如果代理是1.0的,那么不認識Proxy-Connection,那么會轉發到服務器,服務器發現Proxy-Connection 並且Http的版本是1.0的,那么就會在response中添加Connection:close 也沒有問題了。
但是如果最后一個代理和服務器之間還存在不可見代理的話,則還有問題.
代理服務器的作用
1. 過濾
比如過濾兒童不適宜的網站
2.控制
集中控制內部計算機訪問外部網絡以及外部網絡發送回來的消息,並且可以經常變更策略
3.緩存
提供緩存給經常訪問的頁面
4.內容路由
可以根據內容把請求定位到特定的資源,注:迅雷的會員是否就是這樣達到限制網速的?
5.轉碼
可以根據客戶端的語言,甚至區分手機客戶端還是PC客戶端來對消息進行轉碼