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实现打洞原理笔记相关推荐

  1. 简单解释 P2P 技术之 UDP 打洞

    P2P 通信最大的障碍就是 NAT(网络地址转换),NAT 使得局域网内的设备也可以与公网进行通讯,但是不同 NAT 下的设备之间通讯将会变得很困难.UDP 打洞就是用来使得设备间绕过 NAT 进行通 ...

  2. P2P技术基础: UDP打洞原理

    转自:http://blog.pfan.cn/fengfei/18828.html 首先先介绍一些基本概念:             NAT(Network Address              ...

  3. p2p的UDP打洞原理

    P2P技术 一 P2P技术翻译,主要UDP hole punching技术 P2P技术翻译,主要UDP hole punching技术,经过测试证明有可行性,但也受其制约条件影响 2. 对于使用NAT ...

  4. 【原创】IP摄像头技术纵览(七)---P2P技术—UDP打洞实现内网NAT穿透

    [原创]IP摄像头技术纵览(七)-P2P技术-UDP打洞实现内网NAT穿透 本文属于<IP摄像头技术纵览>系列文章之一: Author: chad Mail: linczone@163.c ...

  5. P2P之UDP穿透NAT的原理与实现(转)

    论坛上经常有对P2P原理的讨论,但是讨论归讨论,很少有实质的东西产生(源代码).呵呵,在这里我就用自己实现的一个源代码来说明UDP穿越NAT的原理. 首先先介绍一些基本概念:     NAT(Netw ...

  6. P2P技术详解(三):P2P中的NAT穿越(打洞)方案详解(进阶分析篇)

    目录 1.NAT和NAPT 2.NAT带来的问题 3.P2P通信穿越NAT的技术.方法 4.NAT穿越技术1:应用层网关 4.1.原理 4.2.限制 5.NAT穿越技术2:中间件技术 5.1.原理 5 ...

  7. P2P之UDP穿透NAT的原理与实现

    作者:Dipper 文章来源:http://herald.seu.edu.cn/blog/dipper/articles/7781.aspx 声明:原文来自P2P中国网,C#实现是作者做的,供参考 关 ...

  8. P2P技术详解(一):NAT详解——详细原理、P2P简介(转)

    这是一篇介绍NAT技术要点的精华文章,来自华3通信官方资料库,文中对NAT技术原理的介绍很全面也很权威,对网络应用的应用层开发人员而言有很高的参考价值. <P2P技术详解>系列文章 ➊ 本 ...

  9. 015. P2P技术详解(一):NAT详解——详细原理、P2P简介

    http://www.52im.net/thread-50-1-1.html 这是一篇介绍NAT技术要点的精华文章,来自华3通信官方资料库,文中对NAT技术原理的介绍很全面也很权威,对网络应用的应用层 ...

最新文章

  1. Linux之绝对路径和相对路径
  2. taro 重新加载小程序_Taro 小程序采坑
  3. MySQL-日志二进制日志binlog初探
  4. 关于win7的64位和32位有什么不同性价比怎么比
  5. 一元多项式计算器 :加、减、乘运算【完整代码+运行截图+实验说明】
  6. 异步编程:JDeferred 2.x 的使用(针对Android)
  7. springmvc的执行流程_springmvc执行流程
  8. 从 ThreadLocal 到 AsyncLocal
  9. 计算机专业的三行情书,各专业三行情书,看懂你就是全能学霸!
  10. 在HermesJMS中创建ActiveMQ Session
  11. java eclipse svn_[Java教程]Eclipse 安装 SVN 的在线插件
  12. Thinkphp学习笔记——友情链接的添加和验证
  13. 功能测试报告模板_接口测试用例和报告模板
  14. WARNING: --master-data is deprecated and will be removed in a future version
  15. PCB 设计技巧一百问
  16. 28法则在建站、优化、运维中的体现
  17. 虎书学习笔记2:图形学基础数学(向量、点积、叉积、)
  18. 三种方法获取公众号文章素材的永久链接
  19. Google 最大数据中心发生爆炸,三名技术人员受伤
  20. 边缘计算系统逻辑架构:云、边、端协同,定义及关系

热门文章

  1. 引起失眠的原因有哪些,为什么会失眠呢?
  2. Open3D 法向量估计(Python版本)
  3. 【C++】Windows 读取注册表方法获取串口设备信息
  4. Cisco Packet Tracer思科模拟器中路由器的广域网HDLC封装
  5. 写一篇5000字的小学数学体验式教学论文
  6. Windows 2000 ADS WEB安全配置教程
  7. [原创]中国大陆民谣盘点9 贾南《来自校园的歌手》
  8. ProcessOn入门指南
  9. 即将IPO的宝宝树,如何保住自己的城池壁垒?
  10. 打电话蓝牙耳机什么牌子好?打电话音质清晰的蓝牙耳机