V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
rffan
V2EX  ›  问与答

关于 TCP

  •  
  •   rffan · 2019-06-28 15:54:03 +08:00 · 2795 次点击
    这是一个创建于 2004 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想实现这样的东西 服务端监听一个端口 1,并创建监听另外一个端口 2。 客户端启动访问服务端的端口 1,建立连接 客户访问服务端的端口 2 服务端通过端口 2 转发数据到端口 1 再到客户端。 这样的 TCP 怎么实现呢?语言采用 golang,实现简单吗?

    25 条回复    2019-07-01 16:47:23 +08:00
    baiyi
        1
    baiyi  
       2019-06-28 16:07:18 +08:00
    我捋了一下,你是想实现个聊天软件吗
    sunny352787
        2
    sunny352787  
       2019-06-28 16:08:55 +08:00   ❤️ 1
    数据转发? frp ?
    rffan
        3
    rffan  
    OP
       2019-06-28 16:11:46 +08:00
    @baiyi 我只想把内网的 3389 转发出来而已。公司没有路由权限,而且也没有独立 ip。
    rffan
        4
    rffan  
    OP
       2019-06-28 16:12:22 +08:00   ❤️ 1
    @sunny352787 感谢大佬。
    glacer
        5
    glacer  
       2019-06-28 16:14:38 +08:00
    ssh 端口转发就可以了
    baiyi
        6
    baiyi  
       2019-06-28 16:17:48 +08:00
    @rffan #3 我理解错了,ngrok 这个也是类似的工具
    rffan
        7
    rffan  
    OP
       2019-06-28 16:18:54 +08:00
    @glacer
    不能实现。原因是目标要转发的客户端没有公网 IP 无法执行转发。sunny 大佬发的 frp 可能符合我的要求,我需要看他的实现方式,自己用 golang 重写。
    BingoXuan
        8
    BingoXuan  
       2019-06-28 16:39:42 +08:00
    iptable 转发应该可以实现
    exch4nge
        9
    exch4nge  
       2019-06-28 16:54:47 +08:00
    只有我一个人没看明白楼主想说什么吗?
    sunny352787
        10
    sunny352787  
       2019-06-28 17:01:59 +08:00
    @rffan 直接用就好啦...重写干啥啊...
    rffan
        11
    rffan  
    OP
       2019-06-28 17:08:03 +08:00
    @sunny352787 没仔细看他实现的语言。我是想顺便学习了一下 TCP 相关的知识。看了也是 golang 实现的,可以直接上了。
    rffan
        12
    rffan  
    OP
       2019-06-28 17:08:36 +08:00
    @BingoXuan 没有外网 IP。有外网 IP 都不需要转发。。。
    albertofwb
        13
    albertofwb  
       2019-06-28 17:16:02 +08:00 via Android
    ngrok 用于将本地端口映射到公网 IP,楼主的需求有成熟的实现,叫做“ TCP 本地端口转发”,具体请看《 lcx 端口转发》
    turi
        14
    turi  
       2019-06-28 17:25:24 +08:00
    你都说的这么清楚了,还不知道怎么实现?

    不清楚的地方画个图 ,有时能清楚些
    sujin190
        15
    sujin190  
       2019-06-28 17:43:13 +08:00
    openvpn + iptable 吧,你这个应该是每一个客户链接端口 2 就创建一个端口 1 到内网本地的链接吧,端口转发 openvpn + iptable 应该是最完整的了,tcp udp,啥都能转发,自己写的话,要么做多路复用要么有个控制连接通知本地打开新连接
    BingoXuan
        16
    BingoXuan  
       2019-06-28 18:15:42 +08:00
    @rffan
    和内外网没什么关系吧,iptable 转发是对系统所拥有的网络资源进行转发而已
    BingoXuan
        17
    BingoXuan  
       2019-06-28 18:20:22 +08:00
    @sujin190
    我想监听端口 a,把 tcp 数据转换成 udp 数据发到端口 b。同样的,端口 b 返回的 udp 数据也转换为 tcp 数据返回给端口 a。我试过用 socat 来转换,但发现效率不高,容易丢包。最后我自己写了一个多路复用的工具。能用但我想知道有没有其他实现
    zgl263885
        18
    zgl263885  
       2019-06-28 18:34:56 +08:00 via iPhone
    Frp 反向代理或者走 v,p,n
    sujin190
        19
    sujin190  
       2019-06-28 20:49:43 +08:00 via Android
    @BingoXuan 这样不行吧,tcp 连接是面向连接的,数据都是粘包有序的,你转发给不粘包无序的 udp,到时候数据格式都解不出来了吧,难道你又单独做了分帧和排序?那又是何苦呢,都用 tcp 不好么
    sujin190
        20
    sujin190  
       2019-06-28 20:50:49 +08:00 via Android
    @BingoXuan 丢包就是 udp 导致的吧,另外的排序和重传算法实现不好的话,要慢死的
    BingoXuan
        21
    BingoXuan  
       2019-06-29 00:06:14 +08:00
    @sujin190
    我也不想啊,主要是硬件架构很神奇。通过 udp 和 fpga 通讯。由于那个网卡是片内总线构建的,发 udp 过去是不会丢数据,顺序也不会乱。但瓶颈在 arm 端,由于 fpga 发包速度非常快,2w/s。arm 端只能用 c++写的多路复用可以 hold 得住不丢包。

    我也不想这样通讯,但技术选型我没话事权。明明可以走共享内存,为什么要走 udp ?
    msg7086
        22
    msg7086  
       2019-06-29 01:05:12 +08:00
    是有什么理由不能用 SSH 隧道吗?
    unixeno
        23
    unixeno  
       2019-06-29 01:06:02 +08:00 via Android
    @rffan ssh 有个参数叫反向代理
    rffan
        24
    rffan  
    OP
       2019-07-01 15:00:26 +08:00
    @unixeno 可能我描述有点复杂,就是我想要外网访问内网的 3389,现在内网是没有外网 IP,手头有一台 VPS,想实现访问 VPS 的某个端口就能访问内网的 3389。。SSH tunnel 还是 Iptables 以及各种其他反向代理的话都需要有一个确定的外网地址和端口转发才行吧?如果有的话,我干嘛 ssh tunnel 我直接转发 3389 不就 OK 了吗???
    unixeno
        25
    unixeno  
       2019-07-01 16:47:23 +08:00 via Android
    @rffan 没毛病,你就不能先查一下啥叫反向代理吗???
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1034 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:13 · PVG 07:13 · LAX 15:13 · JFK 18:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.