bytom源码分析-P2P网络-upnp端口映射
简介
https://github.com/Bytom/bytom
本章介绍bytom代码P2P网络中upnp端口映射
作者使用MacOS操作系统,其他平台也大同小异
Golang Version: 1.8
UPNP介绍
UPNP(Universal Plug and Play)通用即插即用。UPNP端口映射将一个外部端口映射到一个内网ip:port。从而实现p2p网络从外网能够穿透网关访问到内网的bytomd节点。
UPNP协议
SSDP(Simple Service Discovery Protocol 简单服务发现协议)
GENA(Generic Event Notification Architecture 通用事件通知结构)
SOAP(Simple Object Access Protocol 简单对象访问协议)
XML(Extensible Markup Language 可扩张标记语言)
UPNP代码
p2p/upnp/upnp.go
发现网络中支持UPNP功能的设备
从网络中发现支持UPNP功能的设备,并得到该设备的location和url等相关信息
1 | type upnpNAT struct { |
添加端口映射
向upnp设备发送一条http post请求,将内部网络ip:port和外部网络ip:port做映射
1 | func (n *upnpNAT) AddPortMapping(protocol string, externalPort, internalPort int, description string, timeout int) (mappedExternalPort int, err error) { |
删除端口映射
向upnp设备发送一条http post请求,将内部网络ip:port和外部网络ip:port删除映射关系
1 | func (n *upnpNAT) DeletePortMapping(protocol string, externalPort, internalPort int) (err error) { |
获取映射后的公网地址
1 | func (n *upnpNAT) GetExternalAddress() (addr net.IP, err error) { |