动手写一个 HTTP 正向代理

概念

另外可见 博文

首先我们来了解一下 HTTP 代理的相关概念,通常来说,有两类 HTTP 代理,一类是正向代理,一类是反向代理,虽都是代理,但仍有区别。

我们平时使用的 VPN 就是正向代理,我们指定一个服务器,然后通过正向代理去连接这个服务器获取资源

在这里插入图片描述

Nginx 是典型的反向代理服务器,可以用于负载均衡和缓存,我们不清楚服务器的地址,但是我们访问反向代理服务器的时候,它会自动为我们请求服务器,并且返回相应的内容。

在这里插入图片描述

总结:正向代理下,我们知道服务器的具体地址,反向代理下,我们只需要知道代理服务的地址,无需知道具体的服务端地址。

这里,我们讲述正向代理,首先先来简单的回忆一下 HTTP 协议吧,也可以参考之前的 文章

HTTP 协议

HTTP 基于传输层协议而搭建的应用层协议,其实 HTTP 请求和响应没有什么很神奇的部分,就是一个 Client/Server 模型,客户端通过套接字发送数据,服务端解析之后进行处理,然后返回响应。

这里只稍微介绍一下协议格式,想要了解更多的同学可以参考 HTTP/1.1,下面的内容均通过 wireshark 抓包获得。

请求

格式如下:

每一行均以 \r\n 结尾,请求体可以为空

响应

格式如下:

每一行也是以 \r\n 结尾,响应体可以为空

请求和响应在格式上的主要区别在第一行,也就是请求行和响应行的内容不一致,此外,请求和响应的头部取值也有所区别,部分头部只用于请求,部分头部只由于响应,但是常见的绝大多数头部在响应和请求中均可使用。

我们如果要构造一个请求也很简单,创建一个套接字,然后发送上述格式的数据即可:

// 连接服务器
conn, err := net.Dial("tcp", "httpbin.org:80")
if err != nil {
   
  fmt.Println("Dial tcp err: ", err)
  return 
}

// 构造请求
msg := strings.Builder{
   }
msg.WriteString("GET /get HTTP/1.1\r\n")
msg.WriteString
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值