📅  最后修改于: 2023-12-03 15:11:43.842000             🧑  作者: Mango
网络地址转换 (NAT) 是一种网络通讯协议,它将私有网络地址转换为公共网络地址,从而实现多个计算机共享一个公共 IP 地址的功能,同时保障网络安全。
NAT 的主要作用是实现多个设备通过一个公网 IP 访问互联网。在 NAT 中,私有网络中的设备都是使用内部 IP 地址进行通信,而外部网络就直接与 NAT 设备的公共 IP 地址通信。
在上图中,单个公网 IP 地址可以对应多个内部 IP 地址,从而实现内部多个设备与外部互联网的通信。
NAT 的实现方式包括静态 NAT 和动态 NAT 两种模式。
静态 NAT 指的是将内部私有地址和公网地址进行一一映射,这种方式适合需要对内部网络进行固定的访问映射,例如公司内网的 Web 服务器等。
动态 NAT 则将内部私有地址与公网地址进行动态映射,适用于无法确定内部 IP 地址的变化情况,例如家庭网络等。
NAT 在软件开发中广泛应用于网络编程中,例如通过 NAT 对 P2P 网络进行管理,通过 NAT 实现内网的远程访问等。
在开发中,可以使用开源库,例如 miniupnp、libnatpmp 等进行 NAT 配置的操作。
对于 P2P 网络管理,可以使用 libtorrent 等开源库实现对 NAT 环境的检测和自动穿透。
使用 miniupnp 实现 NAT 配置的代码示例:
UPNPUrls urls;
IGDdatas data;
u32 leasetime = 0;
UPNPDev* devlist = upnpDiscover(2000, NULL, NULL, 0, 0, 2, &error);
if (devlist)
{
char lanaddr[64];
struct UPNPDev* dev = devlist;
while (dev)
{
int r = UPNP_GetValidIGD(dev, &urls, &data, lanaddr, sizeof(lanaddr));
if (r == 1)
break;
dev = dev->pNext;
}
if (dev && UPNP_AddPortMapping(urls.controlURL, data.first.servicetype,
port, port, lanaddr, 0, "UDP", 0, leasetime))
printf("add port mapping successful.\n");
}