IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

关于http代理

PHPor 的Blog 2015-02-26 22:18:37 累计浏览 4,658 次
本机暂存

缘起

   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. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
    2. Go 实验特性详解 (2026-06-21 10:05:27)
    3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

    查看更多 后端 文章 →

    建议继续学习

    1. 浅析http协议、cookies和session机制、浏览器缓存 (累计阅读 17,444)
    2. 如何拿下简短的域名 (累计阅读 16,933)
    3. 从输入 URL 到页面加载完成的过程中都发生了什么事情? (累计阅读 15,932)
    4. libcurl的使用总结(二) (累计阅读 15,083)
    5. 使用python爬虫抓站的一些技巧总结:进阶篇 (累计阅读 13,299)
    6. 自建DNS以防止GFW干扰 (累计阅读 13,125)
    7. HTTP协议Keep-Alive模式详解 (累计阅读 12,102)
    8. 你必须了解的Session的本质 (累计阅读 11,439)
    9. 强制刷新本地 DNS 缓存记录 (累计阅读 10,915)
    10. curl 命令使用cookie (累计阅读 10,015)