GO实战 | 青训营笔记

116 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

image-20230214192241236.png

在线词典

image-20230214192217014.png

image-20230214192241236.png

curlconverter.com/go/

(用于序列化)

oktools.net/json2go

(反序列化)

强制类型语言使得go不能像js、python(map结构)用.或花括号取值,更通常是写结构体来提取。

转换展开-生成独立的多个结构体

转换嵌套-不需要对转换结果做太多操作

SOCKS5代理

go run "d:\lianxi_go\go-by-example-master\proxy\v4\main.go"

curl --socks5 127.0.0.1:1080 -v www.qq.com

(err)curl: (7) Failed to connect to 127.0.0.1 port 1080: Connection refused

设置代理:

curl --socks5 127.0.0.1:1080 -v www.qq.com --noproxy "*"

curl --socks5 127.0.0.1:1080 -v www.qq.com --proxy :1080

(err)auth failed:IPv6: no supported yet

(sol)socks5不支持IPv6,而qq网站强制使用ipv6

curl --socks5 127.0.0.1:1080 -v www.baidu.com/

原理

tcpip三次握手(见下图) 四次挥手

image-20230215131237572.png

image-20230215125834082.png

接下来我们来了解一下 socks5 协议的工作原理。正常浏览器访问一个网站,如果不经过代理服务器的话,就是先和对方的网站建立 TCP 连接,然后三次握手,握手完之后发起 HTTP 请求,然后服务返回 HTTP 响应。如果设置代理服务器之后,流程会变得复杂一些。

首先是浏览器和 socks5 代理建立 TCP 连接,代理再和真正的服务器建立 TCP 连接。这里可以分成四个阶段,握手阶段、认证阶段、请求阶段、 relay 阶段

第一个握手阶段,浏览器会向 socks5 代理发送请求,包的内容包括一个协议的版本号(一般v5),还有支持的认证的种类(用密码间传/不需要认证/...),socks5 服务器会选中一个认证方式,返回给浏览器。如果返回的是 00 的话就代表不需要认证,返回其他类型的话会开始认证流程,这里我们就不对认证流程进行概述了。

第三个阶段是请求阶段,认证通过之后浏览器会 socks5 服务器发起请求。主要信息包括 版本号,请求的类型,一般主要是 connection 请求,就代表代理服务器要和某个域名或者某个 IP 地址某个端口建立 TCP 连接。代理服务器收到响应之后,会真正和后端服务器建立连接,然后返回一个响应(报文)。

第四个阶段是 relay 阶段。此时浏览器会发送正常发送请求,然后代理服务器接收到请求之后,会直接把请求转换到真正的服务器上。然后如果真正的服务器以后返回响应的话,那么也会把请求转发到浏览器这边。然后实际上 代理服务器并不关心流量的细节,可以是 HTTP流量,也可以是其它 TCP 流量。