Go 语言的实战案例|青训营笔记

144 阅读3分钟

Socket5

image.png 接下来我们来了解一下 socks5协议的工作原理。正常浏览器访问一个网站,如果不经过代理服务器的话,就是先和对方的网站建立 TCP 连接,然后三次握手,握手完后发起 HTTP 请求,然后服务返回 HTTP 响应。如果设置代理服务器之后,流程会变得复杂一些。省先是浏览器和 SOCKS5 代理建立 TCP 连接,代理再和真正的务器建立 TCP 连接。这里可以分成四人阶段,握手阶段、认证阶段、请求阶段,relay 阶段第一个握手阶段,浏览器会向 socks5 代理发送请求,包的内容包括一个协议的版本号,还有支持的认证的种类,soks5 服务器会选中一个认证方式,返回给测览器。果返回的是 00 的话就代表不需要认证,返回其他类型的话会开始认证流程,这里我们就不对认证流程进行概述了。生=人段是请求阶段,认证通过之后浏览器会 SOCs5 服务器发起清求,主要信息包 版本号,请求的类型,一船要是 (mnetion 请,就代表代理服务器要和个域名或者某个1P 地址某个端口建立 TCP 连接。代理服务器收到响应之后,会真正和后说服务器建立连接,然后返回一个响应。第四个阶段是 relay 阶段。此时浏览器会发送 正常发送请求,然后代理服务器接收到请求之后,会直接把请求转换到真正的服务器上。然后如果真正的服务器以后返有应的话,那么也会把清求转发到浏览器这边,然后实际上 代理服务器并不关心流量的细节,可以是 HTTP流量,也可以是其它 TCP 流量,这个就是 socks5 协议的作原理,接下来我们就会试图去简单地实现它

76d3eafe-1048-4ee9-ae3a-50726c8e4adf.png 第一步,我们先在 go 里面写一个简单的 TCP echo server。为了方便测试, server 的工作逻辑很简单,你给他发送啥,他就回复啥,大概代码会长这样子:先我们在 main 函数里面先用 net.listen 去监听一个端口,会返回一个 server,然后在一个死循坏里面,每次去 accept 一个请求,成功就会返回一个连接。接下来的 活我们在一个 process 函数里面去处理这个连接。主意这前面会有个 go 关键字,这个代表启动一个 goroutinue,可以暂时类比为其他语言里面的启动一个子线程。只是这里的 goroutinue 的开销会比子线程要小很多可以很轻松地处理上万的并发。要小来是这价DIes 以都以买现。首先蛋一步的活会生加 deter OedtndOsede是 G0 里面的-人法 这一的就是表在这人风数R时候要把这个连接关掉,否则会有资源的泄露。专下来的话我们会用 bunoNeMReader 来创建一 带缓中的只速流,这个在前面的清谈游戏里面也有用到,带罗中的流的作用是,可以减少底层系统调用的次数,比这里为了方便是一个字节一个字节的读取,但是底层可能合并成几次大的读取操作。并且带缓冲的流会有更多的一些工具函数用来读取数据。我们可以简单地调用那个 readbyte 函数来读取单个字节。再把这一个字节写进去连接。

image.png

image.png

image.png

image.png