Skip to content

Commit

Permalink
更新了README
Browse files Browse the repository at this point in the history
  • Loading branch information
wu committed Jan 12, 2021
1 parent f754640 commit 7943e66
Showing 1 changed file with 70 additions and 0 deletions.
70 changes: 70 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,72 @@
# 基于 Golang 实现的 Shadowsocks 源码解析

你好,欢迎来到**洲洋的编程课堂**

本人邮箱:w910820618@126.com ,欢迎交流讨论学习相关的内容。

欢迎转载,转载请标注 :**洲洋的编程课堂**

---

本教程是基于 **github.com/shadowsocks/go-shadowsocks2**项目,我将通过分析该项目的源码来帮助大家学习如何通过Golang来实现一个隧道代理转发工具。

我会把重点代码罗列出来,方便大家在阅读源码的时候能够找到代码的主线。

本教程主要会从以下四个问题入手:

1. [什么是隧道代理?](#什么是隧道代理?)
2. [本教程的实验环境是什么样的?实现本教程中的示例都需要提前准备哪些条件?](#本教程的实验环境是什么样的?实现本教程中的示例都需要提前准备哪些条件?)
3. [Shadowsocks是如何实现隧道代理的?](#Shadowsocks是如何实现隧道代理的?)
4. [我们可以学习到哪些技术点?](#我们可以学习到哪些技术点?)

## 1. 什么是隧道代理?

隧道代理是两个技术的结合,本别是隧道+代理两个技术的结合,分别来解释一下这个词语。

### 1.1 代理 (Proxy)

代理(英语:Proxy)也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。

![](https://raw.githubusercontent.com/w910820618/shadowsocks/master/images/proxy.jpg)

上图中,代理服务器既是服务器又是客户端。客户端向代理发送请求报文,代理服务器必须向服务器一样,正确的处理请求和连接,然后返回响应。同时,代理自身要向服务器发送请求,这样,其行为必须像正确的客户端一样,要发送请求并接收响应。

代理服务器的特点:

- 客户端不知道真正的服务器是谁,服务器也不知道客户端是什么样的
- 客户端同代理服务器,代理服务器同服务器,这两者之间使用的通讯协议是一样的
- 代理服务器会对接收的请求进行解析,重新封装后再发送给服务器;在服务器响应后,对响应进行解析,重新封装后再发送给客户端。

### 1.2 隧道 (Tunnel)

隧道(英语:Tunneling )是一种网络通讯协议,在其中,使用一种网络协议(发送协议),将另一个不同的网络协议,封装在负载部分。使用隧道的原因是在不兼容的网络上传输数据,或在不安全网络上提供一个安全路径。

![](https://raw.githubusercontent.com/w910820618/shadowsocks/master/images/tunnel_pro.jpg)

隧道的特点:

- 该协议是为承载协议自身以外的流量而编写的协议
- 允许数据从一个网络移动到另一个网络
- 只关心流量的传输,不对承载的流量进行解析

## 2. 本教程的实验环境是什么样的?实现本教程中的示例都需要提前准备哪些条件?

![](https://raw.githubusercontent.com/w910820618/shadowsocks/master/images/tunnel.jpg)

上图就是本实验的网络架构图,下面说明一下架构图的含义:

- 其中有两个192.168.0.0和192.168.1.0网段的IP 的虚拟机,用它作为**中转机**
- 192.168.1.105、192.168.1.106以及192.168.1.107这三台机器作用**目的端**
- 192.168.0.103 这台机器作为**客户端**
- 搭建从192.168.0.103 到 192.168.0.104 之间的隧道代理,使 客户端(192.168.0.103)可以访问到 目的端 的内容。

本实验中所需要的基本开发环境:

- 三台Ubuntu 18.04 的虚拟机
- Golang 的编译环境 (1.15以上)
- IDE 可自选

## 3. Shadowsocks是如何实现隧道代理的?

## 4. 我们可以学习到哪些技术点?

0 comments on commit 7943e66

Please sign in to comment.