路由器|为什么我在公司里访问不了家里的电脑?( 四 )


step11: 注意 , 之前我们都是用的UDP数据包 , 目的只是为了在两个局域网的NAT上打个洞出来 , 实际上大部分应用用的都是TCP连接 , 所以 , 这时候我们还需要在A主动向B发起TCP连接 。 到此 , 我们就完成了两端之间的通信 。

这里估计大家会有疑惑 。
端口已经被udp用过了 , TCP再用 , 那岂不是端口重复占用(address already in use)?
其实并不会 , 端口重复占用的报错常见于两个TCP连接在不使用SO_REUSEADDR的情况下 , 重复使用了某个IP端口 。 而UDP和TCP之间却不会报这个错 。 之所以会有这个错 , 主要是因为在一个linux内核中 , 内核收到网络数据时 , 会通过五元组(传输协议 , 源IP , 目的IP , 源端口 , 目的端口)去唯一确定数据接受者 。 当五元组都一模一样的时候 , 内核就不知道该把数据发给谁 。 而UDP和TCP之间\"传输协议\"不同 , 因此五元组也不同 , 所以也就不会有上面的问题 。

NAPT还分为好多种类型 , 上面的nat打洞方案 , 都能成功吗?
关于NAPT , 确实还细分为好几种类型 , 比如完全锥形NAT和限制型NAT啥的 , 但这并不是本文的重点 。 所以我就略过了 。 我们现在常见的都是锥形NAT 。 上面的打洞方案适用于大部分场景 , 这其中包括限制最多的端口受限锥形NAT 。

总结

  • IPV4地址有限 , 但通过NAT路由器 , 可以使得整个内网N多台机器 , 对外只使用一个公网IP , 大大节省了IP资源 。
  • 内网机子主动连接公网IP , 中间的NAT会将内网机子的内网IP转换为公网IP , 从而实现内网和外网的数据交互 。
  • 普通的NAT技术 , 只会修改网络包中的发送端和接收端IP地址 , 当内网设备较多时 , 将有可能导致冲突 。 因此一般都会使用NAPT技术 , 同时修改发送端和接收端的IP地址和端口 。
  • 由于NAT的存在 , 公网IP是无法访问内网服务的 , 但通过内网穿透技术 , 就可以让公网IP访问内网服务 。 一波操作下来 , 就可以在公司的网络里访问家里的电脑 。
最后留个问题 , 有了NAT之后 , 原本并不富裕的IPv4地址突然就变得非常够用了 。
那我们为什么还需要IPv6?
另外IPv6号称地址多到每粒沙子都能拥有自己的IP地址 , 那我们还需要NAT吗?