p2p技术,python,udp实现打洞原理笔记
peer-to-peer简称P2P,即点对点技术。又称对等互联网络技术,是一种网络新技术,简单的说,P2P直接将计算机直接联系起来,在两台都是公网ip下的计算机可以轻松实现两台电脑的连接,但是运营商现在基本给的都是非公网ip,而且进入家庭中也会由路由器再次进行NAT,这样两台电脑将无法直接连接,如果传输信息,通常都是两台电脑向具有公网ip的服务器发送信息,再由服务器转发给对方,这样传输速度势必会大打折扣,采用p2p技术可将两台在NAT后的电脑直接连接,达到点对点传输。
p2p打洞的原理(采用udp):
两台在NAT之后的电脑无法直接建立连接,因此可以让两台电脑向向一个有公网ip的服务器发送请求,服务器会记录两个发送方的源地址,并将对方的源地址分别发送给发送方,这样两个发送方都拥有了对方的的地址,然后发送方可直接向对方的源地址发送信息,这样达到了点对点连接的效果。笔记记录了最基础的实现原理,目前只在NAT1,NAT2上可以测试成功,NAT3,NAT4理论上好像不行就没在测试。。。连个互相连接的源ip地址都是发送方最外层网关的ip,对于怎么从最外部网关连接到内部电脑的传输原理,在这里就不赘述了,就是记录下实现过程,有不对的地方望批评指正。
采用网络调试助手实现(3个不同的网络中):
1、建立一个公共服务器,主要作用为服务器在接收到2个请求之后分别将对方源地址发送给发送方。
2、第一台电脑网络调试助手,向服务器发送任意信息。
如上图 两台电脑分别向ip后三位位为246的服务器发送请求,服务器将对方的源地址返回,之后将调试助手远程主机ip修改为刚才接收到的地址,这样udp打洞就实现了,两台电脑可以愉快的与对方直接连接,发送信息,达到点对点传输的目的。采用网络调试助手进行打洞的连接有时候不成功,需要多试几次,且受到对方地址后要快速发送,不然就通不了了,这个应该和运营商设定的资源释放时间有关。
用python实现的代码如下:
server
import logging
import socketlogger = logging.getLogger()
addresses = []def addr_to_msg(addr):return '{}:{}'.format(addr[0], str(addr[1])).encode('utf-8')def main(host='0.0.0.0', port=9999):sock = socket.socket(socket.AF_INET, # Internetsocket.SOCK_DGRAM) # UDPsock.bind((host, port))while True:data, addr = sock.recvfrom(1024) # buffer size is 1024 byteslogger.info("connection from: %s", addr)addresses.append(addr)if len(addresses) >= 2:logger.info("server - send client info to: %s", addresses[0])sock.sendto(addr_to_msg(addresses[1]), addresses[0])logger.info("server - send client info to: %s", addresses[1])sock.sendto(addr_to_msg(addresses[0]), addresses[1])addresses.pop(1)addresses.pop(0)if __name__ == '__main__':logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')main()
client
import logging
import socket
import threadinglogger = logging.getLogger()def msg_to_addr(data):ip, port = data.decode('utf-8').strip().split(':')return (ip, int(port))def send_to(sock,addr):while 1:a=input(f"\r向{addr}发送:").encode()sock.sendto(a, addr)def to_recv(sock):while 1:data, addr1 = sock.recvfrom(1024)print('\r 接收信息: 地址:{} 内容:{}'.format(addr1, data))def main(host='39.104.133.246', port=9999):sock = socket.socket(socket.AF_INET, # Internetsocket.SOCK_DGRAM) # UDPsock.sendto(b'0', (host, port))print(f"向服务器{host}发送")while True:print("开始等待接收1")data, addr = sock.recvfrom(1024)print('1、接收: 地址:{} 内容:{}'.format(addr, data))addr = msg_to_addr(data)print(f"2、获取新地址{addr}地址并开始发送")sock.sendto(b'0', addr)breakt2 = threading.Thread(target=to_recv, args=(sock,))t2.start()t1 = threading.Thread(target=send_to, args=(sock, addr,))t1.start()if __name__ == '__main__':logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')main()
p2p技术,python,udp实现打洞原理笔记相关推荐
- 简单解释 P2P 技术之 UDP 打洞
P2P 通信最大的障碍就是 NAT(网络地址转换),NAT 使得局域网内的设备也可以与公网进行通讯,但是不同 NAT 下的设备之间通讯将会变得很困难.UDP 打洞就是用来使得设备间绕过 NAT 进行通 ...
- P2P技术基础: UDP打洞原理
转自:http://blog.pfan.cn/fengfei/18828.html 首先先介绍一些基本概念: NAT(Network Address ...
- p2p的UDP打洞原理
P2P技术 一 P2P技术翻译,主要UDP hole punching技术 P2P技术翻译,主要UDP hole punching技术,经过测试证明有可行性,但也受其制约条件影响 2. 对于使用NAT ...
- 【原创】IP摄像头技术纵览(七)---P2P技术—UDP打洞实现内网NAT穿透
[原创]IP摄像头技术纵览(七)-P2P技术-UDP打洞实现内网NAT穿透 本文属于<IP摄像头技术纵览>系列文章之一: Author: chad Mail: linczone@163.c ...
- P2P之UDP穿透NAT的原理与实现(转)
论坛上经常有对P2P原理的讨论,但是讨论归讨论,很少有实质的东西产生(源代码).呵呵,在这里我就用自己实现的一个源代码来说明UDP穿越NAT的原理. 首先先介绍一些基本概念: NAT(Netw ...
- P2P技术详解(三):P2P中的NAT穿越(打洞)方案详解(进阶分析篇)
目录 1.NAT和NAPT 2.NAT带来的问题 3.P2P通信穿越NAT的技术.方法 4.NAT穿越技术1:应用层网关 4.1.原理 4.2.限制 5.NAT穿越技术2:中间件技术 5.1.原理 5 ...
- P2P之UDP穿透NAT的原理与实现
作者:Dipper 文章来源:http://herald.seu.edu.cn/blog/dipper/articles/7781.aspx 声明:原文来自P2P中国网,C#实现是作者做的,供参考 关 ...
- P2P技术详解(一):NAT详解——详细原理、P2P简介(转)
这是一篇介绍NAT技术要点的精华文章,来自华3通信官方资料库,文中对NAT技术原理的介绍很全面也很权威,对网络应用的应用层开发人员而言有很高的参考价值. <P2P技术详解>系列文章 ➊ 本 ...
- 015. P2P技术详解(一):NAT详解——详细原理、P2P简介
http://www.52im.net/thread-50-1-1.html 这是一篇介绍NAT技术要点的精华文章,来自华3通信官方资料库,文中对NAT技术原理的介绍很全面也很权威,对网络应用的应用层 ...
最新文章
- Linux之绝对路径和相对路径
- taro 重新加载小程序_Taro 小程序采坑
- MySQL-日志二进制日志binlog初探
- 关于win7的64位和32位有什么不同性价比怎么比
- 一元多项式计算器 :加、减、乘运算【完整代码+运行截图+实验说明】
- 异步编程:JDeferred 2.x 的使用(针对Android)
- springmvc的执行流程_springmvc执行流程
- 从 ThreadLocal 到 AsyncLocal
- 计算机专业的三行情书,各专业三行情书,看懂你就是全能学霸!
- 在HermesJMS中创建ActiveMQ Session
- java eclipse svn_[Java教程]Eclipse 安装 SVN 的在线插件
- Thinkphp学习笔记——友情链接的添加和验证
- 功能测试报告模板_接口测试用例和报告模板
- WARNING: --master-data is deprecated and will be removed in a future version
- PCB 设计技巧一百问
- 28法则在建站、优化、运维中的体现
- 虎书学习笔记2:图形学基础数学(向量、点积、叉积、)
- 三种方法获取公众号文章素材的永久链接
- Google 最大数据中心发生爆炸,三名技术人员受伤
- 边缘计算系统逻辑架构:云、边、端协同,定义及关系