日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HTTP代理原理探索

發布時間:2023/12/10 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HTTP代理原理探索 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Web 上的代理服務器是代表客戶端完成事務處理的中間人。如果沒有 Web 代理, HTTP 客戶端就要直接與 HTTP 服務器進行對話。有了 Web 代理,客戶端就可以與代理進行對話,然后由代理代表客戶端與服務器進行交流。客戶端仍然會完成對事務的處理,但它是通過代理服務器提供的優質服務來實現的。

HTTP 代理存在兩種形式,分別簡單介紹如下:
- 第一種是 RFC 7230 - HTTP/1.1: Message Syntax and Routing(即修訂后的 RFC 2616,HTTP/1.1 協議的第一部分)描述的普通代理。這種代理扮演的是「中間人」角色,對于連接到它的客戶端來說,它是服務端;對于要連接的服務端來說,它是客戶端。它就負責在兩端之間來回傳送 HTTP 報文。
- 第二種是 Tunneling TCP based protocols through Web proxy servers(通過 Web 代理服務器用隧道方式傳輸基于 TCP 的協議)描述的隧道代理。它通過 HTTP 協議正文部分(Body)完成通訊,以 HTTP 的方式實現任意基于 TCP 的應用層協議代理。這種代理使用 HTTP 的 CONNECT 方法建立連接,但 CONNECT 最開始并不是 RFC 2616 - HTTP/1.1 的一部分,直到 2014 年發布的 HTTP/1.1 修訂版中,才增加了對 CONNECT 及隧道代理的描述,詳見 RFC 7231 - HTTP/1.1: Semantics and Content。實際上這種代理早就被廣泛實現。

普通代理

HTTP 客戶端向代理發送請求報文,代理服務器需要正確地處理請求和連接(例如正確處理 Connection: keep-alive),同時向服務器發送請求,并將收到的響應轉發給客戶端。

實驗驗證

網絡連接: Tencent-DevWiFi

代理設置: dev-proxy.oa.com:8080

訪問站點: http://www.cnbeta.com/

Wireshark抓包分析:

隧道代理

HTTP 客戶端通過 CONNECT 方法請求隧道代理創建一條到達任意目的服務器和端口的 TCP 連接,并對客戶端和服務器之間的后繼數據進行盲轉發。

實驗驗證 I

網絡連接: Tencent-DevWiFi

代理設置: dev-proxy.oa.com:8080

訪問站點: https://www.baidu.com/

Wireshark抓包分析:

可以看到,瀏覽器與代理進行 TCP 握手之后,發起了 CONNECT 請求,報文起始行如下:

CONNECT www.baidu.com:443 HTTP/1.1

代理收到這樣的請求后,需要與服務端建立 TCP 連接,并響應給瀏覽器這樣一個 HTTP 報文:

HTTP/1.1 200 Connection established

瀏覽器收到了這個響應報文,就可以認為到服務端的 TCP 連接已經打通,后續直接往這個 TCP 連接寫協議數據即可。

實驗驗證 II

[tcp_echo_server]

網絡連接:騰訊云主機(外網: 139.199.76.147 內網: 10.186.8.226)

[tcp_echo_client]

網絡連接: Tencent-DevWiFi

代理設置: dev-proxy.oa.com:8080

Wireshark抓包分析:

附源碼如下:

# tcp_echo_server.pyimport sys, sockethost = sys.argv[1] port = int(sys.argv[2])sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind((host, port)) sock.listen(1)while True:connection, client_address = sock.accept()try:print >>sys.stderr, 'connection from', client_addresswhile True:data = connection.recv(16)print >>sys.stderr, 'received "%s"' % dataif data:print >>sys.stderr, 'sending data back to the client'connection.sendall(data)else:print >>sys.stderr, 'no more data from', client_addressbreakfinally:connection.close() # tcp_echo_client.pyimport sys, socket, sockshost = sys.argv[1] port = int(sys.argv[2])sock = socks.socksocket(socket.AF_INET, socket.SOCK_STREAM) sock.set_proxy(socks.HTTP, "dev-proxy.oa.com", 8080)sock.connect((host, port))try:message = 'This is the message. It will be repeated.'print >>sys.stderr, 'sending "%s"' % messagesock.sendall(message)amount_received = 0amount_expected = len(message)while amount_received < amount_expected:data = sock.recv(16)amount_received += len(data)print >>sys.stderr, 'received "%s"' % datafinally:print >>sys.stderr, 'closing socket'sock.close()

總結

以上是生活随笔為你收集整理的HTTP代理原理探索的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。