Skip to content
This repository has been archived by the owner on Mar 17, 2024. It is now read-only.

Commit

Permalink
全面修订代码,文档;修复一系列bug;修改quic配置格式,见下:
Browse files Browse the repository at this point in the history
修复一处quic的代码缺陷导致速度不高问题。
修复 quic 的 too many open streams 问题。
修复 quic的 early实际未生效的问题。
修复 grpcSimple 的一些导致闪退的bug

quic 的配置中,maxStreamCountInOneSession 改名为 maxStreamsInOneConn
  • Loading branch information
e1732a364fed committed Apr 29, 2022
1 parent cc758de commit 996dbe1
Show file tree
Hide file tree
Showing 32 changed files with 637 additions and 519 deletions.
17 changes: 7 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ vs的一些亮点是 全协议readv加速,lazy技术,vless v1,hysteria 阻

socks5(包括 udp associate)/http/dokodemo/tproxy(透明代理)/trojan/simplesocks/vless(v0/v1),

ws(以及earlydata)/grpc(以及multiMode 以及uTls)/quic(以及hy阻控 和 0-rtt)/smux,
ws(以及earlydata)/grpc(以及multiMode,uTls,以及 可支持回落的 grpcSimple)/quic(以及hy阻控 和 0-rtt)/smux,

dns(udp/tls)/route(geoip/geosite)/fallback(path/sni/alpn),

Expand Down Expand Up @@ -198,12 +198,6 @@ verysimple -c server.toml

如果你不是放在path里的,则要 `./verysimple`, 前面要加一个点和一个斜杠。windows没这个要求。

注意,如果你是自己直接 go build 编译的,则可执行文件与项目名称一致,为 v2ray_simple;

如果用的下载的官方编译版本,则可执行文件叫做 verysimple. 可以通过文件名称判断是自己编译的还是下载的。

官方发布版统一叫做verysimple是为了与 v2ray区别开。

## 关于证书

自己生成证书!而且最好是用 自己真实拥有的域名,使用acme.sh等脚本申请免费证书,特别是建站等情况。
Expand Down Expand Up @@ -286,12 +280,13 @@ v0协议是直接兼容现有v2ray/xray的,比如可以客户端用任何现

支持websocket, 使用性能最高的 gobwas/ws 包,支持 early data 这种 0-rtt方式,应该是与现有xray/v2ray兼容的

支持grpc,与 xray/v2ray兼容
支持grpc,与 xray/v2ray兼容; 还在clash的代码基础上实现了 grpcSimple, 遵循了极简的理念,不引用谷歌的grpc包,而且可以支持 分流 和 回落。

支持 quic以及hysteria 阻控,与xray/v2ray兼容(详情见wiki),还新开发了“手动挡”模式

api服务器;tproxy 透明代理; http伪装头

总之,可以看到,几乎在每一个技术上 本作都有一定的优化,非常 Nice。
## 技术详情
### 关于vless v1

Expand All @@ -301,7 +296,7 @@ api服务器;tproxy 透明代理; http伪装头

verysimple 实现了 一种独创的 非mux型“分离信道”方法的 udp over tcp 的fullcone

v1还有很多其他新设计,比如用于 连接池和 dns等,详见 [vless_v1](docs/vless_v1.md)
v1还有很多其他新设计,比如用于 连接池和 dns等,详见 [vless_v1_discussion](docs/vless_v1_discussion.md)

vless v1协议还处在开发阶段,我随时可能新增、修改定义。

Expand Down Expand Up @@ -543,7 +538,9 @@ verysimple 版本 v1.0.3

详细测速还可以参考另外几个文件,docs/speed_macos.md 和 docs/speed_ubuntu.md。

总之目前可以看到,verysimple是绝对的王者。虽然有时还不够稳定,但是我会进一步优化这个问题的。
总之目前可以看到,verysimple是绝对的王者。虽然有时lazy还不够稳定,但是我会进一步优化这个问题的。

测速时,打开的窗口尽量少,且只留浏览器的窗口在最前方。已经证明多余的窗口会影响速率。尤其是这种消耗cpu性能的情况,在核显的电脑上确实要保证cpu其它压力减到最小。

## 交流

Expand Down
35 changes: 23 additions & 12 deletions advLayer/advLayer.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
//Package advLayer contains subpackages for Advanced Layer in VSI model.
/*Package advLayer contains subpackages for Advanced Layer in VSI model.
实现包 用 ProtocolsMap 注册 Creator。
*/
package advLayer

import (
Expand Down Expand Up @@ -28,12 +31,12 @@ func PrintAllProtocolNames() {
}

type Creator interface {
//NewClientFromURL(url *url.URL) (Client, error)
//NewClientFromURL(url *url.URL) (Client, error) //todo: support url
NewClientFromConf(conf *Conf) (Client, error)
NewServerFromConf(conf *Conf) (Server, error)

GetDefaultAlpn() (alpn string, mustUse bool)
PackageID() string
PackageID() string //unique for each package
}

type Conf struct {
Expand All @@ -42,9 +45,9 @@ type Conf struct {
Host string
Addr netLayer.Addr
Path string
Headers map[string][]string
IsEarly bool //is 0-rtt; for quic and ws.
Extra map[string]any //quic: useHysteria, hysteria_manual, maxbyte; grpc: multiMode
Headers map[string][]string //http headers
IsEarly bool //is 0-rtt or not; for quic and ws.
Extra map[string]any //quic: useHysteria, hysteria_manual, maxbyte; grpc: multiMode
}

type Client interface {
Expand All @@ -68,15 +71,14 @@ type SingleClient interface {
type MuxClient interface {
Client

// If IsSuper, underlay should be nil;
// If IsSuper, underlay should be nil; conn must be non nil when err==nil.
//
// If not IsSuper and underlay == nil, it will return error if it can't find any extablished connection.
// Usually underlay is tls.Conn.
GetCommonConn(underlay net.Conn) (conn any, err error)

//underlay is conn returned from GetCommonConn
DialSubConn(underlay any) (net.Conn, error)

ProcessWhenFull(underlay any) //for quic
}

type Server interface {
Expand All @@ -85,23 +87,32 @@ type Server interface {

GetPath() string //for ws and grpc

Stop()
}

//ws
type SingleServer interface {
Handshake(optionalFirstBuffer *bytes.Buffer, underlay net.Conn) (net.Conn, error)
}

// http level fallback metadata
type FallbackMeta struct {
FirstBuffer *bytes.Buffer
Path string
Conn net.Conn
}

//grpc
type MuxServer interface {
//non-blocking
StartHandle(underlay net.Conn, newSubConnChan chan net.Conn)

//non-blocking. if fallbackChan is not nil, then it can serve for fallback feature.
StartHandle(underlay net.Conn, newSubConnChan chan net.Conn, fallbackChan chan FallbackMeta)
}

//quic
type SuperMuxServer interface {
MuxServer

//non-blocking. Super会直接掌控 原始链接的 监听过程, 并直接向 newSubConnChan 传递 子连接。
//non-blocking. Super will listen raw conn directly, and pass subStreamConn to newSubConnChan。Can stop the listening progress by closer.Close().
StartListen() (newSubConnChan chan net.Conn, closer io.Closer)
}
10 changes: 4 additions & 6 deletions advLayer/grpc/conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ type Conn struct {
stream StreamConn
cacheReader io.Reader
closeFunc context.CancelFunc
local net.Addr
remote net.Addr
}

Expand Down Expand Up @@ -59,7 +58,10 @@ func (c *Conn) Close() error {
return nil
}
func (c *Conn) LocalAddr() net.Addr {
return c.local
return &net.TCPAddr{
IP: []byte{0, 0, 0, 0},
Port: 0,
}
}
func (c *Conn) RemoteAddr() net.Addr {
return c.remote
Expand All @@ -83,10 +85,6 @@ func newConn(service StreamConn, cancelFunc context.CancelFunc) *Conn {
closeFunc: cancelFunc,
}

conn.local = &net.TCPAddr{
IP: []byte{0, 0, 0, 0},
Port: 0,
}
ad, ok := peer.FromContext(service.Context())
if ok {
conn.remote = ad.Addr
Expand Down
12 changes: 6 additions & 6 deletions advLayer/grpc/grpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,18 @@
stream.pb.go 可以无视, 是数据编码; 主要观察 stream_grpc.pb.go .
这里参考v2ray/xray, 它们的 Tun的意思应该是 network tunnel, 没啥的.
GunService 看不懂,可能是瞎编的; 或者可能是 "gprc tunnel"的简写吧。但是就算简写也要是 gTun。毕竟gun谐音不好。
GunService 看不懂, 可能是 "gprc tunnel"的简写吧。但是就算简写也要是 gTun。毕竟gun谐音不好。
不过查看一下v2ray的合并grpc功能的pr
查看一下v2ray的合并grpc功能的pr
https://github.com/v2fly/v2ray-core/pull/757
似乎是来自 Qv2ray/gun 这个库;总之也一样,那么那个库的起名还是很怪
是来自 Qv2ray/gun 这个库;总之也一样,那个库的起名还是很怪
但是因为我们使用自定义ServiceName的方法,所以似乎 GunService的名字无所谓,可以随便改
因为我们使用自定义ServiceName的方法,所以 GunService的名字无所谓,可以随便改.
我直接把 GunService名称改成了 “Stream”,不影响的。反正我们自定义内部真实名称.
直接把 GunService名称改成了 “Stream”,不影响的。反正我们自定义内部真实名称.
实测名称是不影响的, 一样兼容xray/v2ray的 grpc因为 我们自定义实际的 ServiceDesc
实测 是不影响的, 一样兼容xray/v2ray的 grpc, 因为 我们自定义实际的 ServiceDesc.
*/
package grpc

Expand Down
24 changes: 9 additions & 15 deletions advLayer/grpc/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"net"
_ "unsafe"

"github.com/e1732a364fed/v2ray_simple/advLayer"
"github.com/e1732a364fed/v2ray_simple/utils"
"google.golang.org/grpc"
)
Expand All @@ -17,7 +18,7 @@ func handle_grpcRawConn(c *grpc.Server, lisAddr string, rawConn net.Conn)
type Server struct {
UnimplementedStreamServer

newConnChan chan net.Conn //会在 main.go 被调用
newConnChan chan net.Conn

ctx context.Context

Expand All @@ -37,10 +38,14 @@ func (*Server) IsSuper() bool {
return false
}

func (s *Server) Stop() {

}

// StartHandle方法 被用于 手动给 grpc提供新连接.
// 在本作中 我们不使用 grpc的listen的方法。这样更加灵活.
//非阻塞.
func (s *Server) StartHandle(conn net.Conn, theChan chan net.Conn) {
//非阻塞. 暂不支持回落。
func (s *Server) StartHandle(conn net.Conn, theChan chan net.Conn, fallbackConnChan chan advLayer.FallbackMeta) {

s.newConnChan = theChan

Expand All @@ -60,10 +65,6 @@ func (s *Server) Tun(stream_TunServer Stream_TunServer) error {

utils.Info("Grpc Got New Tun")

if s.ctx == nil {
s.ctx = context.Background()
}

tunCtx, cancel := context.WithCancel(s.ctx)
s.newConnChan <- newConn(stream_TunServer, cancel)
<-tunCtx.Done()
Expand All @@ -81,10 +82,6 @@ func (s *Server) TunMulti(stream_TunMultiServer Stream_TunMultiServer) error {

utils.Info("Grpc Got New MultiTun")

if s.ctx == nil {
s.ctx = context.Background()
}

tunCtx, cancel := context.WithCancel(s.ctx)
s.newConnChan <- newMultiConn(stream_TunMultiServer, cancel)
<-tunCtx.Done()
Expand All @@ -93,16 +90,13 @@ func (s *Server) TunMulti(stream_TunMultiServer Stream_TunMultiServer) error {
}

// NewServer 以 自定义 serviceName 来创建一个新 Server
// 返回一个 NewConnChan 用于接收新连接
func NewServer(serviceName string) *Server {
gs := grpc.NewServer()

//newConnChan := make(chan net.Conn, 10)

s := &Server{
//NewConnChan: newConnChan, //该NewConnChan目前是永远不会被关闭的, 因为我们始终在监听新连接
gs: gs,
serviceName: serviceName,
ctx: context.Background(),
}

registerStreamServer_withName(gs, s, serviceName)
Expand Down
Loading

0 comments on commit 996dbe1

Please sign in to comment.