完善文档和注释,精简部分代码

netLayer/dial.go: Dial 方法中,区分ipv6和v4的部分被精简掉。
因为优化太小,而代码太复杂,划不来。
This commit is contained in:
e1732a364fed
2000-01-01 00:00:00 +00:00
parent f7bccf2d0a
commit a55bb01a76
4 changed files with 23 additions and 39 deletions

View File

@@ -1054,7 +1054,7 @@ func dialClient(iics incomingInserverConnState, targetAddr netLayer.Addr,
不是direct的udp的话也要分情况:
如果是单路的, 则我们在此dial, 如果是多路复用, 则不行, 因为要复用同一个连接
Instead, 我们要试图 取出已经拨号好了的 连接 ,获取不到现有连接后 再拨号
Instead, 我们要试图 取出已经拨号好了的 连接
*/
adv := client.AdvancedLayer()

View File

@@ -14,6 +14,9 @@ var (
CustomDialerMap = make(map[string]func(address string, timeout time.Duration) (net.Conn, error))
)
//Dial 可以拨号tcp、udp、unix domain socket、tls 这几种协议。
//如果不是这几种之一,则会尝试查询 CustomDialerMap 找出匹配的函数进行拨号。
//如果找不到则会使用net包的方法进行拨号其会返回错误
func (a *Addr) Dial() (net.Conn, error) {
var istls bool
var resultConn net.Conn
@@ -49,44 +52,23 @@ func (a *Addr) Dial() (net.Conn, error) {
tcp:
//本以为直接用 DialTCP 可以加速拨号结果发现go官方包内部依然还是把地址转换回字符串再拨号
if a.IP != nil {
if a.IP.To4() == nil {
if weKnowThatWeDontHaveIPV6 {
return nil, ErrMachineCantConnectToIpv6
} else {
tcpConn, err2 := net.DialTCP("tcp6", nil, &net.TCPAddr{
IP: a.IP,
Port: a.Port,
})
var tcpConn *net.TCPConn
if err2 == nil {
tcpConn.SetWriteBuffer(utils.MaxPacketLen) //有时不设置writebuffer时会遇到 write: no buffer space available 错误, 在实现vmess的 ChunkMasking 时 遇到了该问题。
tcpConn, err = net.DialTCP("tcp", nil, &net.TCPAddr{
IP: a.IP,
Port: a.Port,
})
}
if err == nil {
tcpConn.SetWriteBuffer(utils.MaxPacketLen) //有时不设置writebuffer时会遇到 write: no buffer space available 错误, 在实现vmess的 ChunkMasking 时 遇到了该问题。
resultConn, err = tcpConn, err2
goto dialedPart
}
} else {
tcpConn, err2 := net.DialTCP("tcp4", nil, &net.TCPAddr{
IP: a.IP,
Port: a.Port,
})
if err2 == nil {
tcpConn.SetWriteBuffer(utils.MaxPacketLen)
}
resultConn, err = tcpConn, err2
goto dialedPart
}
resultConn = tcpConn
goto dialedPart
}
defaultPart:
@@ -120,7 +102,7 @@ dialedPart:
func (a Addr) DialWithOpt(sockopt *Sockopt) (net.Conn, error) {
dialer := &net.Dialer{
Timeout: time.Second * 8, //v2ray默认16秒,是不是太长了??
Timeout: time.Second * 8, //作为对照,v2ray默认16秒
}
dialer.Control = func(network, address string, c syscall.RawConn) error {
return c.Control(func(fd uintptr) {

View File

@@ -25,10 +25,6 @@ func (DirectCreator) NewClientFromURL(url *url.URL) (Client, error) {
func (DirectCreator) NewClient(dc *DialConf) (Client, error) {
d := &DirectClient{}
if dc.Sockopt != nil {
opt := *dc.Sockopt
d.Sockopt = &opt
}
return d, nil
}

View File

@@ -133,11 +133,15 @@ advLayer文件夹 代表第七层, proxy文件夹代表第8层或第10层, 同
Contents of proxy package - proxy包内容
接口 ProxyCommon 和 结构 ProxyCommonStruct 给 这个架构定义了标准.
接口 BaseInterface 和 结构 Base 给 这个架构定义了标准.
而 Client 和 Server 接口 是 具体利用该架构的 客户端 和 服务端都位于VSI中的第八层.
使用 RegisterClient 和 RegisterServer 来注册新的实现.
使用 RegisterClient 和 RegisterServer 来注册新的实现Creator.
一般Client和Server都要内嵌Base结构这样可以快速实现BaseInterface接口然后自行实现Name方法以及
Client接口中的方法 和 Server接口中的方法
Server and Client
@@ -151,6 +155,8 @@ proxy中默认实现了 direct 和 reject 这两种 Client。默认实现了 rej
reject作为Client和Server 的作用基本是一致的,就是读取一下用户的请求,查看是否为 http请求然后根据情况 返回 对应的 http1.1 的 4xx 响应,然后关闭连接。
Comparison
层级清晰、详细的好处就是 转发路径十分清晰,转发路径在读取完配置后就是确定的,性能可以得到提高。