首页
独享资源池
优质资源池
全球HTTP
注册
免费送5000IP
  • 隧道IP技术是什么呢?

    隧道IP

    2021-07-02

    隧道IP技术是一种数据包封装技术,它是将原始IP包(其报头包含原始发送者和最终目的地)封装在另一个数据包(称为封装的IP包)的数据净荷中进行传输。 “隧道”其实就是路由器把一个网层协议封装成另一个协议,然后通过网络传输给另一个路由器。发送路由器将被传送的协议包进行封装,经过网络传送,接受路由器解开收到的包,取出原始协议;而在传输过程中的中间路由器并不在意封装的协议是什么。 这里的封装协议称为传输协议,是跨网络传输封装协议的协议,IP协议是IOS唯一选择的传输协议。而被封装的协议在此为IPX协议或者AppleTAlk协议,通常可以称之为乘客协议。值得注意的是:隧道技术是点到点的连接,因此连接的两端必须配置隧道协议。 我们假设在站点A和B之间交换数据。在品易HTTP的隧道IP协议下,数据包在路由器之间的传输到达目的地的过程中,其线路没有事先设计和计划。然而,在MPLS(多协议标记交换)协议中,在A、B两个站点之间传输的IP分组必须通过预先设置的第一路由信道进行传输。这条通路在IP网络中就像一条中空的隧道,直接连接A和B两个站点。

  • 用 Shadowsocks怎么设置隧道网站解锁(三)

    2021-03-25

    目标端IP的读写1、客户机如何写入目标IP?要更清楚地理解代码,我们先来回答另一个问题。如何产生IP?在main.go文件中查看代码if flags.TCPTun != "" {             for _, tun := range strings.Split(flags.TCPTun, ",") {                 p := strings.Split(tun, "=")                 go tcpTun(p[0], addr, p[1], ciph.StreamConn)             }         }从代码中我们可以看到两点:1. 我们可以同时建设多条隧道;2. 目的端的IP来自等号的左侧;接着我们看tcp.go中的tcpTun函数:func tcpTun(addr, server, target string, shadow func(net.Conn) net.Conn) {     tgt := socks.ParseAddr(target)     if tgt == nil {         logf("invalid target address %q", target)         return     }     logf("TCP tunnel %s <-> %s <-> %s", addr, server, target)     tcpLocal(addr, server, shadow, func(net.Conn) (socks.Addr, error) { return tgt, nil }) } 我想一些对golang语法不是太熟悉的小伙伴们,估计对shadow func(net.Conn) net.Conn以及func(net.Conn) (socks.Addr, error) { return tgt, nil }这两个参数传递有点困惑。 在golang中可以把函数作为一种类型,并且可以把函数作为参数进行传递。 func(net.Conn) (socks.Addr, error) {       return tgt, nil  }很容易看出,重新调整代码格式实际上是一个函数,它接收net.Conn作为参数,返回tgt作为返回值。通过tgt:=socks.ParseAddr格式化目标端IP。本文将讨论客户端如何获得目标IP。下一步,我们来看一下客户机如何将知识产权写入数据流。写数据流的动作是通过rc.Write,实际上就是conn.Write。也就是说,客户机通过conn.Write()将目标IP写入数据流。2 服务端如何解析出目的端IP呢?tgt, err := socks.ReadAddr(sc)是服务端获取目的IP的入口。 进入ReadAddr()函数,可以看到它接受的是一个io.Reader类型的参数,并将它再传递给readAddr()函数进行具体的处理。 func ReadAddr(r io.Reader) (Addr, error) {     return readAddr(r, make([]byte, MaxAddrLen)) } 接下来进入readAdder()函数,来看看具体的处理流程。 func readAddr(r io.Reader, b []byte) (Addr, error) {     if len(b) < MaxAddrLen {         return nil, io.ErrShortBuffer     }     _, err := io.ReadFull(r, b[:1]) // read 1st byte for address type     if err != nil {         return nil, err     }       switch b[0] {     case AtypDomainName:         _, err = io.ReadFull(r, b[1:2]) // read 2nd byte for domain length         if err != nil {             return nil, err         }         _, err = io.ReadFull(r, b[2:2+int(b[1])+2])         return b[:1+1+int(b[1])+2], err     case AtypIPv4:         _, err = io.ReadFull(r, b[1:1+net.IPv4len+2])         return b[:1+net.IPv4len+2], err     case AtypIPv6:         _, err = io.ReadFull(r, b[1:1+net.IPv6len+2])         return b[:1+net.IPv6len+2], err     }       return nil, ErrAddressNotSupported }此功能主要使用io.ReadFull功能()。此功能能够从对象Reader读取数据,然后将其存储在缓冲区buf中,以便其他代码能够处理buf中的数据。通过这个代码,我们可以看到,我们可以在buf中首先判断IP地址的类型,然后根据buf中不同长度的IP地址截取不同类型的IP地址。文章部分内容来源于网络,联系侵删*

微信客服

品易云HTTP微信客服

130-6353-0579

客服二维码 扫一扫添加
大客户经理:李先生

189-5212-4120

客服二维码 扫一扫添加