这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
在线词典
(用于序列化)
(反序列化)
强制类型语言使得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三次握手(见下图) 四次挥手
接下来我们来了解一下 socks5 协议的工作原理。正常浏览器访问一个网站,如果不经过代理服务器的话,就是先和对方的网站建立 TCP 连接,然后三次握手,握手完之后发起 HTTP 请求,然后服务返回 HTTP 响应。如果设置代理服务器之后,流程会变得复杂一些。
首先是浏览器和 socks5 代理建立 TCP 连接,代理再和真正的服务器建立 TCP 连接。这里可以分成四个阶段,握手阶段、认证阶段、请求阶段、 relay 阶段。
第一个握手阶段,浏览器会向 socks5 代理发送请求,包的内容包括一个协议的版本号(一般v5),还有支持的认证的种类(用密码间传/不需要认证/...),socks5 服务器会选中一个认证方式,返回给浏览器。如果返回的是 00 的话就代表不需要认证,返回其他类型的话会开始认证流程,这里我们就不对认证流程进行概述了。
第三个阶段是请求阶段,认证通过之后浏览器会 socks5 服务器发起请求。主要信息包括 版本号,请求的类型,一般主要是 connection 请求,就代表代理服务器要和某个域名或者某个 IP 地址某个端口建立 TCP 连接。代理服务器收到响应之后,会真正和后端服务器建立连接,然后返回一个响应(报文)。
第四个阶段是 relay 阶段。此时浏览器会发送正常发送请求,然后代理服务器接收到请求之后,会直接把请求转换到真正的服务器上。然后如果真正的服务器以后返回响应的话,那么也会把请求转发到浏览器这边。然后实际上 代理服务器并不关心流量的细节,可以是 HTTP流量,也可以是其它 TCP 流量。