使用 NAT 穿透访问 NAT 后面的 HTTP Server 还是用更加简单的方式?

这篇文章整整拖了 5 个月,生成的 timestamp 原来是 2 月 7 的,现在都 7 月了。。。

其实本来是一个很简单的 C/S 模型,机器人 HTTP Server 是应对机器人上本地局域网中的一个客户端(Web,桌面,安卓/iOS)。客户端连上机器的局域网,然后通过局域网的 IP 地址,访问机器人上的 HTTP Server,控制机器人。

但是后面有一个需求是,当机器人插上一个 3/4 G 网卡的时候,要复用机器人上的 HTTP Server 远程控制和访问机器人。那问题来了,该如何访问一个 NAT 后面的 HTTP Server 呢?

原来调研过几个方案。

  1. 用 SSH 反响隧道,把本地的 HTTP Server port 映射到公网上的某台服务器上。但是弊端很多,一个机器人 Server Port 对应一个公网 Server Port,机器人上会有很多不同后端工程师写的 HTTP Server Port,而且有几百台机器。映射关系数量是 HTTP Server Port * 机器人数量。机器人和服务数量起来的花,管理起来非常操蛋。
  2. NAT 打洞直接 P2P 通信。其实这个里面的内容很多,牵涉到 4 种 NAT 类型,UDP/TCP 打洞方式,还有对应的两个协议 STUN/TURN。在 Peer-to-Peer Communication Across Network Address Translators 这篇论文里面有详细的介绍。在这里不细讲,但是这种方法对应当前的模型仍然不可用。因为对于 Symmetric NAT,无法保证 Client 的每次 Request 都统一相同的 Port。
  3. 使用 Socket.io 作为一个长链接转发。当前就是用的这种方法,不过调用的方法有点丑陋。实际我们用了 JSON RPC 的方法调用。首先在 Socket.io Server 上定义转发 JSON 数据的事件转发到机器人,然后在机器人上面也定义事件接受转发,然后用这些 HTTP Meta JSON RPC 访问本地服务器的 HTTP Server,最后再通过一个定义好的 JSON RPC 返回到 Client。这个过程维护了两条 Socket.io 的长连接,定义了很多转发事件,基本上就是一个基于 Socket.io 的 JSON RPC。

不过最近看了一个做法 http://lifeofzjs.com/blog/2014/11/17/visit-server-behind-nat/。这个模型比 JSON RPC 更加简单和舒心。直接用一台服务器的 HTTP Server 进行转发 Socket.io 的 JSON RPC 到机器人,机器人返回的 Response 直接作为这台服务器的 HTTP Server Response 返回给 Client。这样只维护了一条 Socket.io 长连接,而且节约了 JSON RPC 的定义过程,而且通过公网的路由, /robots/:id 就可以对应访问不同机器人。简直舒心。

本文作者:佚名

来源:51CTO

时间: 2024-10-02 23:26:47

使用 NAT 穿透访问 NAT 后面的 HTTP Server 还是用更加简单的方式?的相关文章

用OWA访问ISA后面的EXCHANGE SERVER?

用OWA访问ISA后面的EXCHANGE SERVER,除了在ISA上配置安全http://www.aliyun.com/zixun/aggregation/12489.html">邮件服务器外,还需要ISA开放什么特殊的端口吗? 具体情况如下: 公司的局域网通过光纤接入城域网,ISA的对外IP地址设置的是城域网的IP地址,通过在ISA上配置安全邮件服务器,在城域网内可以通过OWA以IP/EXCHANGE的形式访问公司内部的EXCHANGE SERVER(此处的IP为ISA在城域网的IP)

求解决方案,把webservice发布后,可以用最兼容,简单的方式嵌入到各类网站中。

问题描述 现在有这样的需求:我们把java代码发布成webservice,然后希望各类客户可以访问,就象他们在自己的网页中插入google地图,或者google广告那样,只要给客户一段代码,如JavaScript,不管他的网站是asp的还是jsp的,都可以直接插入我们给的代码,我们的代码在他的页面上也是显示一个小方块,类似google地图,这个小方块读取我们webservice的内容.各位大虾,有什么好办法吗? 解决方案 解决方案二:你要插入到html里可以使用,就需要封装成HTTP的接口形式,

如何通过反向 SSH 隧道访问 NAT 后面的 Linux 服务器

你在家里运行着一台 Linux 服务器,它放在一个 NAT 路由器或者限制性防火墙后面.现在你想在外出时用 SSH 登录到这台服务器.你如何才能做到呢?SSH 端口转发当然是一种选择.但是,如果你需要处理多级嵌套的 NAT 环境,端口转发可能会变得非常棘手.另外,在多种 ISP 特定条件下可能会受到干扰,例如阻塞转发端口的限制性 ISP 防火墙.或者在用户间共享 IPv4 地址的运营商级 NAT. 什么是反向 SSH 隧道? SSH 端口转发的一种替代方案是 反向 SSH 隧道.反向 SSH 隧

使用TCP协议的NAT穿透技术

实很早我就已经实现了使用TCP协议穿透NAT了,但是苦于一直没有时间,所以没有写出来,现在终于放假有一点空闲,于是写出来共享之.     一直以来,说起NAT穿透,很多人都会被告知使用UDP打孔这个技术,基本上没有人会告诉你如何使用TCP协议去穿透(甚至有的人会直接告诉你TCP协议是无法实现穿透的).但是,众所周知的是,UDP是一个无连接的数据报协议,使用它就必须自己维护收发数据包的完整性,这常常会大大增加程序的复杂度,而且一些程序由于某些原因,必须使用TCP协议,这样就常常令一些开发TCP网络

Linux 有问必答:如何从VirtualBox中从主机访问NAT客户机

Linux 有问必答:如何从VirtualBox中从主机访问NAT客户机 提问: 我有一台运行在VirtualBox上的使用NAT的虚拟机,因此虚拟机会被VirtualBox分配一个私有IP地址(10.x.x.x).如果我想要从主机SSH到虚拟机中,我该怎么做? VirtualBox对虚拟机支持几种不同的网络方式,其中一种是NAT网络.当虚拟机启用NAT后,VirtualBox会自动在虚拟机和主机之间进行网络翻译,因此你不必在虚拟机和主机之间配置任何东西.这也意味着NAT中的虚拟机对于外部网络以

PJNATH介绍 -- 开源的用于NAT穿透的ICE, STUN和TURN

原文地址:http://blog.pjsip.org/2007/04/06/introducing-pjnath-open-source-ice-stun-and-turn/ ICE是什么? 对于那些不熟悉ICE的人而言,ICE可能是一种最全面的用于穿透NAT和多媒体通信的方法.它提供了一种找到两个终端之间最好路径的方法,它还解决了NAT所带来的各种各样的问题,比如两个终端处在同一个NAT后面(and no hairpin is available),两个终端都处在对称NAT后面(在这种情况下,

NAT穿透的文件传输系统的研究和开发 这个课题应该如何入手?

问题描述 NAT穿透的文件传输系统的研究和开发这个课题应该如何入手?

NAT 穿透

/********************************************************************************* * NAT 穿透 * 说明: * NAT网络数据穿透,了解一下. * * 2017-10-30 深圳 南山平山村 曾剑锋 ********************************************************************************/ 一.参考文档: 1. 怎样用python实现NA

php-nginx安装成功后访问IP提示500 Internal Server Error

问题描述 nginx安装成功后访问IP提示500 Internal Server Error 截取报错信息如下: nginx.conf配置文件是copy的别人教程里面的. #user nobody; worker_processes 1; error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_c