IT技术博客大学习 共学习 共进步

关于http代理

PHPor 的Blog 2015-02-26 22:18:37 浏览 4,522 次

缘起

   http代理时,域名解析发生在client端还是代理服务器端?

情形1:

  • 不需要connect方法,显然(不显然吗)这种方式只支持http的情况,不支持https的情况

  • 域名解析发生在代理服务器上

  • 事实上,如果访问的是https的地址,自然会通过使用connect方法的方式实现

    情形2:

  • 使用connect方法 (通过给curl添加 -p 参数实现, 这应该是比较常见和通用的办法)

  • 域名解析发生在代理服务器上

  •    

       下面我们看看Golang中关于代理的实现,重点关注域名解析发生在了哪里:

       golang代码:

package main

import (
    "fmt"
    "io/ioutil"
    "net"
    "net/http"
    "os"
    "time"
)

func main() {
    get()
}

func get() {
    url := "http://baidu.com/"
    if len(os.Args) > 1 {
        url = os.Args[1]
    }   
    res, err := http.Get(url)
    check_fail(err)
    defer res.Body.Close()
    body, err := ioutil.ReadAll(res.Body)
    check_fail(err)
    fmt.Println(string(body))
}

   通过环境变量设置代理:

export http_proxy=http://10.79.80.245:8888
export https_proxy=http://10.79.80.245:8888

http请求:

  • 和curl实现一致

  • 域名解析发生在代理服务器上

  •    

    https请求:

  • 和curl实现一致

  • 域名解析发生在代理服务器端

  • 意外发现: golang关于https请求的实现中,代理的connect和后续的数据交互发生在不同的线程中(看pid就能知晓)

  •    

    建议继续学习

    1. HTTPS, SPDY和 HTTP/2性能的简单对比 (阅读 17,262)
    2. 浅析http协议、cookies和session机制、浏览器缓存 (阅读 17,202)
    3. 从输入 URL 到页面加载完成的过程中都发生了什么事情? (阅读 15,702)
    4. HTTP协议Keep-Alive模式详解 (阅读 11,922)
    5. 让安卓手机通过代理翻墙的方法 (阅读 8,800)
    6. 代理的加密部分 (阅读 8,243)
    7. 关于 SOCKS 代理的远端 DNS 解析 (阅读 7,742)
    8. 各种浏览器审查、监听http头工具介绍 (阅读 7,724)
    9. nginx中对http请求处理的各个阶段分析 (阅读 7,002)
    10. nginx上,http状态200响应,PHP空白返回的问题 (阅读 6,742)