码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【计算机网络笔记】网络地址转换(NAT)


    系列文章目录

    什么是计算机网络?
    什么是网络协议?
    计算机网络的结构
    数据交换之电路交换
    数据交换之报文交换和分组交换
    分组交换 vs 电路交换
    计算机网络性能(1)——速率、带宽、延迟
    计算机网络性能(2)——时延带宽积、丢包率、吞吐量/率
    计算机网络体系结构概念
    OSI参考模型基本概念
    OSI参考模型中非端-端层(物理层、数据链路层、网络层)功能介绍
    OSI参考模型中端-端层(传输层、会话层、表示层、应用层)功能介绍
    TCP/IP参考模型基本概念,包括五层参考模型
    网络应用的体系结构
    网络应用进程通信
    网络应用对传输服务的需求
    Web应用之HTTP协议(涉及HTTP连接类型和HTTP消息格式)
    Cookie技术
    Web缓存/代理服务器技术
    传输层服务概述、传输层 vs. 网络层
    传输层——多路复用和多路分用
    传输层——UDP简介
    传输层——可靠数据传输原理之Rdt协议
    传输层——可靠数据传输之流水线机制与滑动窗口协议
    传输层——TCP特点与段结构
    传输层——TCP的可靠数据传输
    TCP连接管理(图解三次握手和四次挥手)
    传输层——拥塞控制原理与解决方法
    TCP的拥塞控制机制
    网络层服务与核心功能
    网络层服务模型——虚电路网络
    网络层服务模型——数据报网络
    Internet网络的网络层——IP协议之IP数据报的结构
    IP分片
    IP编址与有类IP地址
    IP子网划分与子网掩码
    CIDR与路由聚合
    DHCP协议


    • 系列文章目录
    • NAT是什么?
    • 为什么要使用NAT?
    • 如何实现NAT?
    • NAT存在的问题
    • NAT穿透技术


    NAT是什么?

    要想让使用私有地址的主机在公共互联网上进行通信,就需要网络地址转换(NAT)。

    如下图所示,路由器左边是互联网,右边是内部网络比如家庭网络。在路由器把内部网络的数据报转发到互联网上之前,必须要进行地址替换。为此,这个路由器必须实现NAT功能,并且至少有一个公共IP地址,就是俗称的合法IP。

    在这种情况下,内部网络中的主机之间相互通信使用自己的地址作为源IP和目的IP是没有问题的,但是如果这些主机要发送或接收来自互联网的数据报的时候,就必须进行地址转换。比如发送给互联网的数据报的源地址要替换为公共IP地址。

    在这里插入图片描述


    为什么要使用NAT?

    • 一个网络只需/能从ISP申请一个IP地址。这样能够缓解地址短缺问题
    • 内部网络设备全部使用私有地址,内部网络设备IP地址的变更,无需通告外界网络
    • 同理,变更ISP时(比如原先通过联通接入,现在改为电信接入),也无需修改内部网络设备IP地址
    • 内部网络设备对外界网络不可见,即不可直接寻址(安全)

    NAT带来的最主要的好处之一就是能够在IPv4地址匮乏的情况下仍然保证网络健康地发展和运行,尤其让众多使用私有地址的网络设备可以成功的在网络上通信。


    如何实现NAT?

    概括地来说,NAT最典型的实现方法是通过一次替换、一次记录、再来一次替换来完成。

    • 替换:利用(NAT IP地址,新端口号)替换每个外出IP数据报 的(源IP地址,源端口号)
    • 记录 :将每对(NAT IP地址, 新端口号) 与(源IP地址, 源端 口号)的替换关系信息存储到NAT转换表中
    • 替换 :根据NAT转换表,利用(源IP地址, 源端口号)替换每 个进入内网IP数据报的(目的IP地址,目的端口号), 即(NAT IP地址, 新端口号)

    NAT存在的问题

    在NAT实现的基本方法中,要利用端口号。端口号是16比特的字段。一个公共IP同时支持60,000多并行连接。

    但NAT带来了诸多方便的同时也有很多争议,比如:

    • NAT通常嵌入到路由器中来实现。但路由器是一个标准的第三层(网络层)设备,应该只处理第3层功能。所以违背了层次关系
    • 违背了端到端通信原则。因为端口号是传输层使用的,而传输层是端到端的通信,那么原则上来说,那么中间的路由器设备不应该对端口号进行修改。同时,NAT的存在也使一些端到端通行的网络应用开发者必须考虑到NAT的存在,比如P2P应用
    • 地址短缺问题应该由IPv6来解决

    NAT穿透技术

    NAT的一些问题通常利用一些技术穿透NAT来完成。

    比如这样一个例子:

    在这里插入图片描述

    客户期望连接内网地址为 10.0.0.1的服务器。但不能直接利用地址 10.0.0.1直接访问服务器。对外部用户来说,能看到的就是路由器拥有的公共IP地址,即NAT地址,比如这里的138.76.29.7。解决NAT的穿透/穿越主要有三种方法:

    • 解决方案1:静态配置NAT。配置NAT转换表,让对外的、公共的IP地址以及一个端口映射为内部的私有IP地址以及对应的端口。比如配置(138.76.29.7, 2500) 总是转发给(10.0.0.1, 25000)

    • 解决方案2:利用UPnP (Universal Plug and Play) 互联网网关设备协议 (IGD-Internet Gateway Device ) 自动配置。与解决方案1达到的目的是一样的。在这种情况下,内部的主机和路由需要实现UPnP协议,这样之后,内部的主机服务器能够自己学习到NAT公共IP地址 (138.76.29.7),并且完成在NAT转换表中,增删端口映射

    • 解决方案3:中继(如Skype)。

      • 在公共网络上设置若干个中继服务器,然后让NAT内部网络中的客户与中继服务器建立连接
      • 外部客户也与中继服务器建立连接
      • 中继服务器桥接两个连接的分组
      • 这样能够支持外部客户主动发起通信

      在这里插入图片描述

  • 相关阅读:
    C语言详解(文件操作)2
    Linux常用工具
    Google protobuf使用技巧和经验总结
    CorelDRAW Graphics Suite2022免费图形设计软件
    利用随机数生成猜数字游戏【C语言】
    伦敦金的走势高低的规律
    比较两个文本文件是否相等(C语言)
    详解sed命令与awk命令
    iptables防火墙
    One class learning(SVDD)
  • 原文地址:https://blog.csdn.net/m0_60511809/article/details/134409925
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号