源码:https://github.com/zhongchengyi/node-udp-trunnel-demo

1、原理

  1. A登录Server, NAT A 分配端口11000,Server得到A的地址为100.10.10.10:11000
  2. B登录Server, NAT B 分配端口22000,Server得到B的地址为200.20.20.20:22000
  3. 如果A直接发送到200.20.20.20:22000,B会直接把来自A的包丢弃,所以要在NAT B上打一个方向为A的洞,那么A就可以向200.20.20.20:22000发送数据了。
  4. 打洞指令来自Server。B向A的地址 100.10.10.10:11000发一个UDP,被NAT A丢弃,但在NAT B上建立映射记录,NAT B不再丢弃来自A的报文。
  5. Server 通知A 可以通信,A 发起 UDP 给 B,NAT B 放行,NAT B 放行, B 收到 A 的包,双方开始通信

  来自《P2P技术揭秒-P2P网络技术原理与典型系统开发》第5.4篇

2、流程

  1. 结点A 以TCP方式 登录服务器,服务器分配ID,服务器TCP返回 ID
  2. 结点A 收到TCP返回ID后,发送UDP登录消息到服务器,同时携带刚刚收到的ID
  3. 服务器收到UDP登录消息后,获取UDP的IP和端口,并在服务器记录信息(ID, TCP-socket连接, udp ip, udp 端口)
  4. 结点B重复1、2、3步。
  5. 结点B通过TCP向服务器发送反向连接到A的请求。
  6. 服务器通过TCP通知A向B的UDP IP和端口发送消息,同时返回A的UDP IP和端口给B.
  7. 结点B收到服务器返回的A的UDP IP和端口后,发送UDP信息到A的UDP IP和端口。

3、前提

  • 需要一个有公网地址的电脑,运行服务器程序
  • 需要在服务器和客户端都安装node.js和 npm

4、运行截图

node.js UDP NAT 穿透实现的更多相关文章

  1. Node.js UDP/Datagram

    稳定性: 3 - 稳定 调用 require('dgram') ,可以使用数据报文 sockets(Datagram sockets). 重要提醒: dgram.Socket#bind() 的行为在 ...

  2. Node.js 参考学习地址

    前段时间研究过Node.js 自从由于笔记本硬盘崩了之后就很少在家里搞程序了,但是很想学习之,只因最近在努力学习英文.技术之外的事也需要做好,我们毕竟不是为了技术而生,技术是我们生存的一门得力技能,唯 ...

  3. Beaglebone Black– 智能家居控制系统 LAS - 网页服务器 Node.js 、Web Service、页面 和 TCP 请求转 UDP 发送

    上一篇,纯粹玩 ESP8266,写入了 init.lua 能收发 UDP.这次拿 BBB 开刀,用 BBB host 一个 web server ,用于与用户交互,数据来自 ESP8266 的 UDP ...

  4. udp之nat穿透的困惑

    nat穿透实现:[A]内网地址[内A]192.168.1.176:25789通过stun服务器查询映射到的外网地址为外网地址[外A]212.10.55.124:26559UDPsocketA绑定到[内 ...

  5. node.js中通过dgram数据报模块创建UDP服务器和客户端

    node.js中 dgram 模块提供了udp数据包的socket实现,可以方便的创建udp服务器和客户端. 一.创建UDP服务器和客户端 服务端: const dgram = require('dg ...

  6. Node.js使用UDP通讯

    Node.js 的 dgram 模块可以方便的创建udp服务,,以下是使用 dgram模块创建的udp服务和客户端的一个简单例子. 一.创建 UDP Server var dgram = requir ...

  7. 前端(Node.js)(2)-- Node.js开发环境配置

    1.开发环境介绍 1.MEAN Stack 什么是全栈? 负责界面和UI的设计师.负责移动端应用开发的安卓IOS开发工程师.负责服务器端开发的后端程序员.负责数据库开发和管理的数据库工程师.负责服务器 ...

  8. node.js之开发环境搭建

    一.安装linux系统 (已安装linux可跳此步骤) 虚拟机推荐选择:VirtualBox 或者 Vmware (专业版永久激活码:5A02H-AU243-TZJ49-GTC7K-3C61N) 我这 ...

  9. 《深入浅出Node.js》第7章 网络编程

    @by Ruth92(转载请注明出处) 第7章 网络编程 Node 只需要几行代码即可构建服务器,无需额外的容器. Node 提供了以下4个模块(适用于服务器端和客户端): net -> TCP ...

随机推荐

  1. python 数据集变量的数据类型总结

  2. Nacos Committer 张龙:Nacos Sync 的设计原理和规划

    图:Nacos Meetup @杭州 与你同行,抬头便是星空. 本文整理自Nacos Committer 张龙的现场分享,阿里巴巴中间件受权发布. 随着 Nacos 1.0.0 稳定版的发布,越来越多 ...

  3. OpenStack组件系列☞horizon搭建

    第一步:部署horizon环境: 安装部署memcache 安装软件包 yum install memcached python-memcached 启动memcache并且设置开机自启动 syste ...

  4. oracle函数 CHR(n1)

    [功能]:将ASCII 码转换为字符. [参数]:n1,为0 ~ 255,整数 [返回]:字符型 [示例] SQL> select chr(54740) zhao,chr(65) chr65 f ...

  5. ORACLE 创建pfile和spfile

        使用服务器参数文件spfile创建文本参数文件pfile:1,SQL> create pfile from spfile="/u01/app/oracle/product/9. ...

  6. 根据User Agent参数的各个字段Mozilla/5.0/4.0-AppleWebKit/Chrome/Safari/Firefox/Opera/MSIE来确定/判断客户端使用什么浏览器

    下面给你一一解答以及给你介绍: //Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/533.21.1 (KHTML, like ...

  7. Android 动态设置控件获取焦点

    之前写过一篇博客,简单的介绍了Android 隐藏EditText的焦点,之所以要隐藏EditText的焦点,是因为当应用在第一次进入某个Activity时,由于该页面中的EditText获取了焦点, ...

  8. Project Euler Problem 18-Maximum path sum I & 67-Maximum path sum II

    基础的动态规划...数塔取数问题. 状态转移方程: dp[i][j] = num[i][j] + max(dp[i+1][j],dp[i+1][j+1]);

  9. CodeForces 620E"New Year Tree"(DFS序+线段树+状态压缩)

    传送门 •题意 给你一颗 n 个节点的树,每个节点被染上了颜色: 有 m 次操作,每次操作的类型有两种 1 v c : 将以 v 为根的子树的结点全部涂成 c 2 v : 询问以 v 为根的子树的结点 ...

  10. dotnet core 添加 SublimeText 编译插件

    因为 SublimeText 有很多插件都是使用 Py 写的,而我想使用 dotnet core 给 SublimeText 写一个编译插件,也就是在我使用 Markdown 的时候可以点击编译,将 ...