原贴地址:https://blog.csdn.net/djl806943371/article/details/89577965

Yahoo!终于看完了第四单元拥塞控制,现在开始第五单元Applications and NATs。首先第一节从NATs开始。

NATs全称 Network Address Translator,即网络地址转换器。NATs拥有一个公网地址,并允许有许多私有局域网络地址在NATs后面,不同的NAT后面可能有相同的私有IP地址。而NATs有两端,一侧面向公网,一侧面向局域网,NATs就负责在公网与局域网之间传递信息。

NATs具体是如何实现的有多种方式,下面进行介绍,下面所列前三种为非对称NAT,即只要是同一个client的IP及port,数据都通过NAT的同一个端口发出,而第四种为对称型NAT,同一个client的IP及port跟不同的server连接时都分配不同的port:

1. full cone NAT:如下图所示,它在建立映射关系时仅仅建立A的ip:port与NAT的IP:port的映射,因此当NAT接收到所有目的IP:port为128.34.22.8:6641的数据包时全部转发给A。也就是说,本来服务器S端口号80发出来的数据是A想要的,但是S其他端口发送的数据如果目标ip及端口匹配NAT也会被转发给A,并且除S以外的其他服务器发送的数据包也可以被转发给A,当A接收到错误的服务器或者正确的服务器错误端口号发来的数据的时候,会发送ICMP error或者其他方式通告并丢弃这个数据包。之所以叫 full cone 就是因为NAT可以转发任意服务器或端口发来的数据包,只要目标IP和port匹配。

2.restricted cone NAT:如下图所示,当NAT建立映射关系时,同时将目标服务器的IP地址包含进来,即只有目标服务器发送来的数据包才有可能被转发。而这种情况下,不对端口号加以限制,也就是说只要是服务器S发来的数据,不管是哪个端口发出的数据,只要目的IP即port能与NAT映射中对应,则会转发给A。A收到数据,发现端口号不对时则会丢弃数据,发送ICMP error。显而易见,为什么叫 restricted cone 是因为还是一对多,但是与 full cone 相比已经不会转发其他服务器的数据包。

3.port restricted cone NAT:如下图所示,即建立映射关系时将目标IP及port都包含进来,这种情况下NAT只会转发目标服务器目标端口号发送来的数据也就是A所需要的数据,这种情况下,如果NAT接收到其他服务器或者其他端口号发送来的数据包,则会由NAT发送ICMP error。

4. symmetric NAT:如下图所示,同一个IP:port发送到不同server,将被NAT分配不同的端口。这样有个坏处就是比如同一款游戏有多个服务器,当玩家切换一个服务器时,端口号发生了变化,但是游戏系统并不知道这个新的端口对应的还是原先的玩家A。

缺点:

其实NAT带来了很多要进行特殊处理的边界情况。比如下面这个例子:当一个NAT后面有两个host A跟B。NAT在10.0.0.101:4512与NAT端口 128.34.22.8:6641之间建立了映射关系。在这种情况下,如果B发送数据包到128.34.22.8:6641会发生什么呢。我们假设NAT采用full cone,并进行常规处理,即只改写收到的数据包中的DA就发送给A,则A收到SA:10.0.0.99:X,DA:10.0.0.101:4512,在这种情况下,A回复时的DA为10.0.0.99:X,此时根据子网掩码发现是同一个局域网内的host,将直接通过交换机将数据发送到B,而不是发送给NAT,此时B收到包会发现收到的数据包的SA与自己发送包时的DA不一致,因此这个包会被丢弃。可以看到靠常规处理方式是没办法处理的。只能进行特殊处理。即B发送数据包到NAT,NAT不仅要对DA进行改变还要修改SA为128.34.22.8:X'。这样A会将数据包发回给NAT,NAT再修改SA,DA发送给B。而这一个特殊情况只是NAT带来的众多特殊情况中的一种。对于这些特殊情况的处理,RFC中进行了规定。

NATs的影响:

1. incoming connections:分为以下几种情况:

a. 一个host处于NAT后,一个有公网IP:可以通过一个中转站R,两者都与中转站建立连接,当B想与A直接建立连接时,B先通过R告知A自己的公网IP,A则可以申请与B建立连接。也就是所谓的反向连接

b. 两个host分别处于一个NAT后:也通过一个中转站R,当A与B之间想建立直接联系,只有cone NAT可以实现。即B通过R告知A自己NAT外侧的公网IP及端口号,A亦通过R告知B,A主动与B的NAT的公网IP及端口建立连接,B主动与A的NAT的公网IP及端口建立连接,如此可以实现直接连接。但是如果是对称型NAT,则无法建立直接连接。因为当A尝试与B的NAT建立连接时,A的NAT会重新分配端口号,B亦如此,无法在两个端口之间建立连接。这也是为什么现在网络上很少使用对称型NAT

2. No New Transport:

我们可以发现,NAT的出现是违背了分层原则的,因为NAT需要修改IP地址甚至是端口号,也就是传输层与网络层的首部,这导致没法完全解耦,也就是说如果想用NAT,NAT必须知道他在转发的是什么包,以根据包的种类去对应位置进行修改。因此当你自己重写一个传输协议的时候,NAT根本不知道你的协议结构也不知道如何修改。因此除非你的协议流传十分广泛,NAT做出适配,但是NAT不适配,这个协议又不可能流传广泛,这就成了先有鸡还是先有蛋的问题。因此应用基本只能使用TCP、UDP、ICMP作为传输层协议。现在往往通过对UDP进行修改实现新的协议,因为UDP几乎只提供了一个数据容器,可以自己在里面实现更多功能。

Introduction to Computer Networking学习笔记(二十五):NATs相关推荐

  1. Introduction to Computer Networking学习笔记(十五):Queue Model 包交换中的缓冲模型

    本章知识点比较零散,因此一篇文章进行总结,并且不具有连贯性,仅记录自己认为有价值的内容. 将较大的包拆分为小包进行传输,可以减小端对端延迟,原因如下图: 数据传输时,突发大量的数据包会增加延迟,简单周 ...

  2. JVM 学习笔记二十五、JVM监控及诊断工具-命令行篇

    二十五.JVM监控及诊断工具-命令行篇 1.概述 性能诊断是软件工程师在日常工作中经常面对和解决的问题,在用户体验至上的今天,解决好应用软件的性能问题能带来非常大的收益. Java作为最流行的编程语言 ...

  3. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  4. angular学习笔记(二十五)-$http(3)-转换请求和响应格式

    本篇主要讲解$http(config)的config中的tranformRequest项和transformResponse项 1. transformRequest: $http({transfor ...

  5. Mr.J-- jQuery学习笔记(二十五)--监听DOM加载

    页面元素 <body> <div></div> <div></div> <div></div> <div> ...

  6. java沙盒模式_JavaScript学习笔记(二十五) 沙箱模式

    沙箱模式(Sandbox Pattern) 沙箱模式可以避免命名空间的一些缺点(namespacing pattern),比如: 依赖一个唯一全局的变量作为程序的全局符号.在命名空间模式中,没有办法存 ...

  7. Mr.J-- jQuery学习笔记(二十八)--DOM操作方法(添加方法总结)

    Table of Contents appendTo appendTo(source, target) 源代码 append prependTo ​ ​ ​ ​ prependTo源码 prepend ...

  8. 嵌入式系统设计师学习笔记二十八:嵌入式程序设计③——高级程序设计语言

    嵌入式系统设计师学习笔记二十八:嵌入式程序设计③--高级程序设计语言 解释程序和编译程序 编译器的工作阶段示意图 语法错误:非法字符,关键字或标识符拼写错误 语法错误:语法结构出错,if--endif ...

  9. uniapp 学习笔记二十二 购物车页面结构搭建

    uniapp 学习笔记二十二 购物车页面结构搭建 cart.vue <template><view><view class="flex padding" ...

  10. Polyworks脚本开发学习笔记(二十)-补充几个常见操作指令的使用

    Polyworks脚本开发学习笔记(二十)-补充几个常见操作指令的使用 大概要写到结尾了,最后几篇就将手册的各常用命令再看一遍,组合一下,并列举出常见的一些有用的操作. DATA_COLOR_MAP数 ...

最新文章

  1. 《中国人工智能学会通讯》——7.4 语义组合
  2. 关于git经常忘记的:远程仓库关联。
  3. STL中的multimap---顺便说说如何查找同一关键字对应的所有值
  4. 【月薪三万】听说深圳老师工资全国最高!!!比德国还高
  5. 【vue开发问题-解决方法】(八)利用axios拦截器实现elementUI中加载动画,控制加载区域
  6. [论文阅读] Disentangled High Quality Salient Object Detection
  7. 我是如何一步步拿下 Google Offer 的?
  8. linux条件变量唤醒丢失,多线程编程精髓(三)
  9. 区块链学习(二)以太坊私有链搭建
  10. 微信小程序生成二维码、程序码、海报
  11. Python3 sorted自定义排序
  12. html5 tbody,tbody
  13. 矩阵求逆的一万种方法
  14. 【山大会议】注册页的编写
  15. SqlServer中的dbo是什么意思?
  16. 计算机教学设计与反思,[信客教案及反思] 信息技术教案课后反思
  17. 聚类分简单来讲:有监督 -gt; 分类(…
  18. HTML标签重点总结+案例
  19. 使用UE4开发VR项目_性能优化(一)_常用工具
  20. 日常用的管理脚本,陆续更新中...

热门文章

  1. android重写view和viewgroup的区别
  2. HDU 4540 威威猫系列故事——打地鼠(DP)
  3. 查询 加载时间过长添加提示信息
  4. 使用WindowsHooks库制作和使用全局钩子
  5. jquery ui 发布jquery.ui-1.6rc4版本,漂亮多了
  6. 在线教育开源 java_新款SpringBoot在线教育平台开源了
  7. html权重值_实战:网站权重快速提高权重绝招(10天权3)
  8. 字节码指令之方法调用与返回指令
  9. 《易学Python》——第1章 为何学习Python 1.1 学习编程
  10. was日志报检测到cpu饥饿