亚洲熟女综合色一区二区三区,亚洲精品中文字幕无码蜜桃,亚洲va欧美va日韩va成人网,亚洲av无码国产一区二区三区,亚洲精品无码久久久久久久

http 代理 在Go語言這里,實現(xiàn)起來很簡單

代理是網(wǎng)絡(luò)中的一項重要的功能,其功能就是代理網(wǎng)絡(luò)用戶去取得網(wǎng)絡(luò)信息。形象的說:它是網(wǎng)絡(luò)信息的中轉(zhuǎn)站,對于客戶端來說,代理扮演的是服務(wù)器的角色,接收請求報文,返回響應(yīng)報文;對于 web 服務(wù)器來說,代理扮演的是客戶端的角色,發(fā)送請求報文,接收響應(yīng)報文。

代理具有多種類型,如果是根據(jù)網(wǎng)絡(luò)用戶劃分的話,可以劃分為正向代理反向代理

  • 正向代理:將客戶端作為網(wǎng)絡(luò)用戶??蛻舳嗽L問服務(wù)端時,先訪問代理服務(wù)器,隨后代理服務(wù)器再訪問服務(wù)端。此過程需客戶端進行代理配置,對服務(wù)端透明。
  • 反向代理:將服務(wù)端作為網(wǎng)絡(luò)用戶。訪問過程與正向代理相同,不過此過程對客戶端透明,需服務(wù)端進行代理配置(也可不配置)。

針對正向代理和反向代理,分別有不同的代理協(xié)議,即代理服務(wù)器和網(wǎng)絡(luò)用戶之間通信所使用的協(xié)議:

  • 正向代理:
    • http
    • https
    • socks4
    • socks5
    • vpn:就功能而言,vpn 也可以被認(rèn)為是代理
  • 反向代理:
    • tcp
    • udp
    • http
    • https

接下來我們就說說 http 代理。

http 代理概述

http 代理是正向代理中較為簡單的代理方式,它使用 http 協(xié)議作為客戶端和代理服務(wù)器的傳輸協(xié)議。

http 代理可以承載 http 協(xié)議,https 協(xié)議,ftp 協(xié)議等等。對于不同的協(xié)議,客戶端和代理服務(wù)器間的數(shù)據(jù)格式略有不同。

http 協(xié)議

我們先來看看 http 協(xié)議下客戶端發(fā)送給代理服務(wù)器的 HTTP Header:

http 代理 在Go語言這里,實現(xiàn)起來很簡單

可以看到,http 代理比起直接連接:

  • url 變成完整路徑,/->http://staight.github.io/
  • Connection字段變成Proxy-Connection字段
  • 其余保持原樣

為什么使用完整路徑?

為了識別目標(biāo)服務(wù)器。如果沒有完整路徑,且沒有 Host 字段的話,代理服務(wù)器將無法得知目標(biāo)服務(wù)器的地址。

為什么使用 Proxy-Connection 字段代替 Connection 字段?

為了兼容使用 HTTP/1.0 協(xié)議的過時的代理服務(wù)器。HTTP/1.1 才開始有長連接功能,直接連接的情況下,客戶端發(fā)送的 HTTP Header 中如果有Connection: keep-alive字段,表示使用長連接和服務(wù)端進行 http 通信,但如果中間有過時的代理服務(wù)器,該代理服務(wù)器將無法與客戶端和服務(wù)端進行長連接,造成客戶端和服務(wù)端一直等待,白白浪費時間。

因此使用Proxy-Connection字段代替Connection字段,如果代理服務(wù)器使用 HTTP/1.1 協(xié)議,能夠識別Proxy-Connection字段,則將該字段轉(zhuǎn)換成Connection再發(fā)送給服務(wù)端;如果不能識別,直接發(fā)送給服務(wù)端,因為服務(wù)端也無法識別,則使用短連接進行通信。

http 代理 http 協(xié)議交互過程如圖:

http 代理 在Go語言這里,實現(xiàn)起來很簡單

https 協(xié)議

接下來我們來看看 https 協(xié)議下,客戶端發(fā)送給代理服務(wù)器的 HTTP Header:

http 代理 在Go語言這里,實現(xiàn)起來很簡單

如上,https 協(xié)議和 http 協(xié)議相比:

  • 請求方法從GET變成CONNECT
  • url 沒有 protocol 字段

實際上,由于 https 下客戶端和服務(wù)端的通信除了開頭的協(xié)商以外都是密文,中間的代理服務(wù)器不再承擔(dān)修改 http 報文再轉(zhuǎn)發(fā)的功能,而是一開始就和客戶端協(xié)商好服務(wù)端的地址,隨后的 tcp 密文直接轉(zhuǎn)發(fā)即可。

http 代理 https 協(xié)議交互過程如圖:

http 代理 在Go語言這里,實現(xiàn)起來很簡單
http 代理 https 協(xié)議

代碼實現(xiàn)

首先,創(chuàng)建 tcp 服務(wù),并且對于每個 tcp 請求,均調(diào)用 handle 函數(shù):

http 代理 在Go語言這里,實現(xiàn)起來很簡單

然后將獲取的數(shù)據(jù)放入緩沖區(qū):

http 代理 在Go語言這里,實現(xiàn)起來很簡單

從緩沖區(qū)讀取 HTTP 請求方法,URL 等信息:

http 代理 在Go語言這里,實現(xiàn)起來很簡單

http 協(xié)議和 https 協(xié)議獲取地址的方式不同,分別處理:

http 代理 在Go語言這里,實現(xiàn)起來很簡單

用獲取到的地址向服務(wù)端發(fā)起請求。如果是 http 協(xié)議,將客戶端的請求直接轉(zhuǎn)發(fā)給服務(wù)端;如果是 https 協(xié)議,發(fā)送 http 響應(yīng):

http 代理 在Go語言這里,實現(xiàn)起來很簡單

最后,將所有客戶端的請求轉(zhuǎn)發(fā)至服務(wù)端,將所有服務(wù)端的響應(yīng)轉(zhuǎn)發(fā)給客戶端:

http 代理 在Go語言這里,實現(xiàn)起來很簡單

完整的源代碼:

http 代理 在Go語言這里,實現(xiàn)起來很簡單

http 代理 在Go語言這里,實現(xiàn)起來很簡單

添加代理,然后運行:

http 代理 在Go語言這里,實現(xiàn)起來很簡單

http 代理 在Go語言這里,實現(xiàn)起來很簡單

原文鏈接:https://mp.weixin.qq.com/s/7xT9CQe-_DjVmNChJeSoFw

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國內(nèi)好評如潮的Linux云計算運維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開發(fā)專業(yè)人才培訓(xùn)機構(gòu)!