计算机网络原理
第四章 第6节
回顾一下:


这一节开始第六节NAT隧道:
一、NAT 是什么?
NAT 全称:
中文叫:网络地址转换
它的核心思想是:
从外部互联网看来,一个局域网里的所有设备可以共享一个公网 IPv4 地址。
比如家庭网络:
内网主机:
10.0.0.1
10.0.0.2
10.0.0.3
家庭路由器公网地址:
138.76.29.7
外部互联网看到的不是 10.0.0.1、10.0.0.2,而是统一看到:
但是不同连接用不同端口区分。
二、为什么需要 NAT?
主要原因是:
IPv4 地址不够。
IPv4 只有 32 位地址:
大约 43 亿个地址,全球设备远远不够用。
所以 NAT 让多个内网设备共享一个公网 IP。

NAT 的好处
1. 节省公网 IP 地址
一个家庭、一个公司、一个学校内部可能有很多设备,但只需要向 ISP 申请少量公网地址,甚至一个公网地址。
2. 内网地址可以自由改
比如家里用:
公司也可以用:
因为私有地址只在本地网络内部有意义,不会出现在公网路由中。
3. 更换 ISP 时内部地址不用改
公网地址可能换了,但内网仍然可以继续用 192.168.x.x 或 10.x.x.x。
4. 有一定隐藏作用
外部主机不能直接看到内网主机的私有地址。
但注意:
NAT 不是严格意义上的安全机制,真正的安全还是靠防火墙、访问控制等。
三、私有地址范围
NAT 经常配合私有地址使用。
常见私有地址有三段:
也就是:
也就是:
这些地址不能在公网直接路由,只能在局域网内部使用。
四、NAT 怎么工作?

NAT 路由器要维护一张:
NAT 转换表
表里记录:
比如内网主机:
访问外部服务器:
NAT 路由器的公网地址是:
NAT 会把源地址和源端口改成:
然后记录映射关系:
WAN side addr | LAN side addr 138.76.29.7:5001 | 10.0.0.1:3345
五、NAT 出去时怎么改?
内网主机发出数据报:
经过 NAT 路由器时,NAT 改成:
也就是说:出去时改源 IP 和源端口。
六、NAT 回来时怎么改?
外部服务器回复:
NAT 路由器查表发现:
于是把目的地址和目的端口改回:
然后发回内网主机。
也就是说:回来时改目的 IP 和目的端口。

七、NAT 的总结
NAT 本质是:
用端口号区分共享同一个公网 IP 的不同内网连接。
所以 NAT 不只是改 IP 地址,还会改运输层端口号。
这就是为什么 NAT 有争议。
八、NAT 的争议
1. 路由器本来不应该处理 4 层信息
传统分层思想里:
网络层看 IP 地址
运输层看端口号
但是 NAT 路由器不仅改 IP,还改端口号。
端口号属于运输层信息。
所以有人认为:NAT 破坏了分层原则。
2. NAT 破坏端到端原则
原本互联网希望主机之间可以端到端通信。
但是 NAT 后面的内网主机不容易被外部主动访问。
比如:
外部客户端想主动连接家里 NAT 后面的服务器,就很麻烦。
这涉及端口映射、NAT 穿透等问题。
3. NAT 让网络设备修改数据报
原本路由器只应该转发 IP 数据报。
但是 NAT 会修改:
IP 地址
TCP/UDP 端口号
校验和
所以它不再是单纯的转发设备。
4. 地址短缺本应由 IPv6 解决
理论上,IPv6 地址空间很大,可以解决地址短缺。
但是现实中 NAT 已经广泛部署,所以它成了事实上的解决方案。
九、IPv6 的动机
IPv6 出现的核心动机:
IPv4 32 位地址空间快用完了。
IPv6 地址长度是:
远远大于 IPv4 的 32 bit。
除了地址更多,IPv6 还有一些设计目标:
简化首部
加快路由器处理速度
支持流 flow 的概念
更适合现代网络扩展
十、IPv6 数据报格式
IPv6 首部比 IPv4 更简洁。
主要字段有:
Version:版本号
Priority / Traffic Class:优先级
Flow Label:流标签
Payload Length:有效载荷长度
Next Header:下一个首部
Hop Limit:跳数限制
Source Address:源地址,128 bit
Destination Address:目的地址,128 bit
Payload:数据部分

十一、IPv6 和 IPv4 首部的区别
IPv6 相比 IPv4 删除或改变了很多字段。
1. 没有首部校验和
IPv4 有首部校验和。
IPv6 没有。
原因是:为了加快路由器处理速度。
因为链路层和运输层本来就可能做差错检测,IPv6 不再让每个路由器重复计算 IP 首部校验和。
2. 没有分片相关字段
IPv4 里面有:
Identification
Flags
Fragment Offset
IPv6 基本首部里没有这些字段。
因为:IPv6 不允许中间路由器分片。
如果包太大,需要源主机通过路径 MTU 发现来调整。
3. 没有选项字段
IPv4 首部可以带 Options。
IPv6 把选项改成扩展首部机制,不放在固定基本首部里。
这样可以让路由器更快处理普通数据报。
4. TTL 改名为 Hop Limit
IPv4 里叫 TTL。
IPv6 里叫 Hop Limit。
功能类似:
每经过一个路由器减 1,减到 0 丢弃。
十二、IPv6 的流标签 Flow Label
IPv6 有一个字段叫:
它用来标识同一个“流”中的数据报。
理论上可以让路由器对同一流进行特殊处理,比如:
保证 QoS
按同一路径转发
给实时业务不同待遇
Flow Label 用于标识一个流,但实际使用并没有特别成熟。
十三、IPv4 到 IPv6 的过渡问题
问题是:不可能让全球所有路由器同一天从 IPv4 升级到 IPv6。
所以会有很长时间:
有些路由器支持 IPv4
有些路由器支持 IPv6
有些路由器双栈 IPv4/IPv6
这就需要过渡技术。
十四、IPv4/IPv6 过渡:隧道 tunneling

场景:两边是 IPv6 网络,中间隔着一段 IPv4 网络。
IPv6 数据报不能直接通过 IPv4-only 路由器。
把 IPv6 数据报封装进 IPv4 数据报里。
也就是:
这叫:IPv6-in-IPv4 tunneling
十五、隧道的逻辑视图和物理视图

逻辑视图
从 IPv6 端系统看来,好像中间有一条直接连接两个 IPv6 路由器的链路。
比如:
看起来像直接相连。
物理视图
实际中间经过的是 IPv4 网络:
其中 C、D 只懂 IPv4。
所以 B 把 IPv6 数据报封装成 IPv4 数据报,经过 IPv4 网络到 E。
E 再解封装,还原出 IPv6 数据报。
十六、隧道中地址怎么变化?
假设:
A、F 是 IPv6 主机
B、E 是双栈 IPv6/IPv4 路由器
C、D 是 IPv4 路由器
A 发给 F 的 IPv6 数据报:
到 B 后,B 封装一个 IPv4 外壳:
中间 C、D 只看外层 IPv4 地址,把它从 B 转发到 E。
到 E 后,E 去掉 IPv4 外壳,恢复里面的 IPv6 数据报:
然后继续按 IPv6 转发给 F。
十七、IPv6 部署情况
原因是:
IPv4 已经到处部署
NAT 缓解了 IPv4 地址短缺
升级设备成本高
应用和网络运营商需要逐步迁移
双栈和隧道增加复杂性
所以 IPv6 不是技术上不好,而是:全球互联网太大,迁移成本太高。
十八、通用转发:匹配 + 行动
前面传统 IP 转发是:看目的 IP 地址,然后转发到某个接口。
这叫基于目的地址的转发。
而通用转发更抽象:匹配分组首部中的若干字段,然后执行某个动作。
也就是:
匹配可以看很多字段:
输入端口
源 MAC
目的 MAC
以太网类型
VLAN ID
源 IP
目的 IP
IP 协议号
TCP/UDP 源端口
TCP/UDP 目的端口
动作可以是:
转发到某端口
丢弃
修改首部字段
送给控制器
记录统计信息
十九、流表 Flow Table

通用转发设备中维护的是:流表 flow table
每个流表项包括三部分:
Match:匹配字段
Action:执行动作
Stats:统计信息
比如:
Match | Action dst IP = 51.6.0.8 | forward(6) TCP dst port = 22 | drop src IP = 128.119.1.1 | drop dst MAC = 某地址 | forward(3)
二十、OpenFlow 表项
OpenFlow 是 SDN 里常见的一种南向协议。
它的表项就是典型的:
Match 字段
可以匹配链路层、网络层、运输层字段:
ingress port
src MAC
dst MAC
Ethernet type
VLAN ID
IP src
IP dst
IP protocol
TCP/UDP src port
TCP/UDP dst port
Action 动作
常见动作:
Forward packet to port(s)
Drop packet
Modify fields in header(s)
Encapsulate and forward to controller
也就是:
转发
丢弃
修改首部
发给控制器
Stats 统计
统计:
packet count
byte count
也就是这个流表项匹配了多少包、多少字节。
二十一、OpenFlow 可以模拟不同设备

这是这部分的重点。
通用转发把很多网络设备都抽象成:
1. 路由器
传统路由器:
匹配:目的 IP 地址最长前缀
行动:从某个端口转发
2. 交换机
二层交换机:
匹配:目的 MAC 地址
行动:转发或泛洪
3. 防火墙
防火墙:
匹配:IP 地址、TCP/UDP 端口号
行动:允许或拒绝
比如:
动作:
就是禁止 SSH。
4. NAT
NAT:
匹配:IP 地址和端口号
行动:重写 IP 地址和端口号
所以 NAT 也能用 match-action 抽象出来。
二十二、OpenFlow 例子理解
比如 PPT 里有一条:
动作:
意思是:
如果 IP 数据报的目的地址是 51.6.0.8,就从端口 6 转发。
另一个例子:
动作:
意思是:如果 TCP 目的端口是 22,就丢弃。
这就是防火墙规则。
再比如:
动作:
意思是:阻止来自某个源 IP 的数据报。
二十三、OpenFlow 网络范围行为

h5、h6 到 h3、h4 的例子,重点是:
通过给多个交换机安装流表,可以控制整个网络范围内的数据流路径。
传统路由中,路径由路由协议算。
SDN/OpenFlow 中,控制器可以统一下发表项,让某些流走指定路径。
例如:
来自 h5、h6 的数据报
目的为 h3 或 h4
通过 s1
再到 s2
最后送到目标主机
也就是:用流表控制网络行为。
二十四、通用转发的总结
通用转发的核心是:
将到来的分组的任意层次首部字段,与表项匹配,然后执行相应动作。
它比传统转发更灵活。
传统 IP 转发:
通用转发:
所以它能统一抽象:
路由器
交换机
防火墙
NAT
负载均衡器
二十五、中间盒 Middlebox
中间盒的定义:
在源主机到目的主机的数据传输路径上,任何执行了 IP 路由器标准功能之外的中间设备,都叫中间盒。
也就是说,不只是转发 IP 包,而是还做额外处理的设备。
常见中间盒:
NAT
防火墙
IDS 入侵检测系统
负载均衡器
缓存 Cache
CDN 节点
应用特定设备

二十六、为什么说“到处都是中间盒”?
因为现实互联网已经不是纯粹的端到端 IP 网络了。
很多地方都会插入中间设备:
家庭网络:
NAT
防火墙
企业网络:
防火墙
IDS
代理服务器
数据中心:
负载均衡
缓存
安全设备
运营商网络:
NAT
流量管理
缓存
CDN
所以中间盒已经非常普遍。
二十七、中间盒的发展
一开始中间盒是:专用、封闭的硬件设备。
后来发展为:开放 API 的白盒硬件。
也就是硬件更通用,功能通过软件配置。
再后来有:
1. SDN
SDN 逻辑集中化控制网络行为。
控制器统一管理和配置网络设备。
2. NFV
NFV 全称:
网络功能虚拟化。
意思是:
把防火墙、NAT、负载均衡等网络功能,从专用硬件搬到通用服务器上,用软件实现。
这样更灵活、更便宜、更容易扩展。
二十八、IP 沙漏模型
互联网体系结构常用一个沙漏图表示。
上面有很多应用层协议:
HTTP
SMTP
RTP
QUIC
DASH
中间有运输层:
TCP
UDP
再往下是网络层:
IP
下面有很多链路层和物理层技术:
Ethernet
WiFi
PPP
Bluetooth
光纤
铜线
无线电

沙漏的“腰”
沙漏最窄的地方是:
它表示:上层很多协议,下层很多网络技术,但中间统一通过 IP 连接。
所以互联网的核心思想是:
IP 是统一的网络层协议。
这带来一个好处:
只要上层支持 IP、下层能承载 IP,各种异构网络和应用都能互联。
二十九、步入中年的沙漏模型
意思是:
互联网已经不像早期那样只有简单的 IP 腰部,中间出现了很多中间盒。
比如:
NAT
firewall
caching
NFV
这些设备在 IP 层附近对数据包进行额外操作。
所以沙漏中间变胖了。
三十、互联网体系结构设计原则
1. 连接的简单性
网络核心尽量简单,能转发 IP 包即可。
2. IP 协议是“瘦腰”
IP 层只提供最基本的互联能力。
不在网络核心加入太多复杂功能。
3. 智能性和复杂性在网络边缘
复杂功能尽量放在端系统或者网络边缘。
比如:
可靠传输由 TCP 做
拥塞控制由端系统做
应用逻辑在主机上做
这就是端到端原则的基础。
三十一、端到端原则
端到端原则的思想是:
某些功能只有在通信端系统处才能完整、正确地实现,因此不应该完全放在网络内部实现。
比如可靠数据传输。
可靠传输放在网络内部行不行?
可以在每一跳做可靠传输。
比如:
每一段都确认、重传。
但是这样仍然不能保证端到端一定正确。
因为:
端主机可能出错
应用层缓冲可能出错
最后一段可能出错
网络中的某些节点仍可能丢失数据
所以最终还是要端到端确认。
为什么 TCP 在端系统实现?
TCP 的可靠传输是在端系统完成的:
网络中间只尽力转发 IP 数据报。
如果丢包、乱序、损坏,TCP 端系统通过:
序号
ACK
重传
校验和
来保证可靠性。
三十二、智能 体现在哪里?
智能体现在哪里?
早期电话网:智能在网络交换机里,终端电话很简单。
早期互联网:网络核心简单,智能在边缘主机。
现代互联网:
复杂性又部分回到网络中,例如 NAT、防火墙、CDN、负载均衡、NFV、可编程网络设备。
所以互联网从“简单核心 + 智能边缘”,逐渐发展成:
边缘仍然智能,但网络中也有越来越多的智能中间盒。
三十三、整体逻辑
IPv4 地址不够,所以出现 NAT。 NAT 让多个内网设备共享一个公网 IP,通过修改 IP 地址和端口号来维护内外映射。
但是 NAT 有争议,因为它破坏分层和端到端原则。
IPv6 用 128 位地址从根本上扩大地址空间,并简化首部,不再让路由器分片,也取消首部校验和。
由于全球网络不能同时升级,所以 IPv4 到 IPv6 需要过渡技术,其中一种是隧道:把 IPv6 数据报封装在 IPv4 数据报中穿过 IPv4 网络。
然后进入通用转发。传统转发只看目的 IP,通用转发则是匹配多个首部字段,然后执行动作。OpenFlow 用流表实现 match-action,可以统一抽象路由器、交换机、防火墙、NAT 等设备。
现实网络中大量存在中间盒,如 NAT、防火墙、负载均衡和缓存。它们让原本简单的 IP 沙漏模型变得更复杂,也引出了端到端原则和网络体系结构演化问题。
三十四、回顾一下
1. NAT 是什么?
网络地址转换,让多个内网设备共享一个公网 IP。
2. NAT 出去和回来分别改什么?
出去:改源 IP 和源端口。
回来:改目的 IP 和目的端口。
3. NAT 转换表记录什么?
4. NAT 有什么争议?
路由器处理了端口号,破坏分层
破坏端到端原则
让外部主动连接内网主机困难
地址短缺本应由 IPv6 解决
5. IPv6 为什么出现?
IPv4 地址空间不够,IPv6 使用 128 位地址,并简化首部。
6. IPv6 相比 IPv4 删除了什么?
没有首部校验和
没有路由器分片
没有基本首部中的选项字段
7. IPv6 的 Hop Limit 是什么?
类似 IPv4 的 TTL。
每经过一个路由器减 1,减到 0 丢弃。
8. IPv4 到 IPv6 如何过渡?
隧道技术:把 IPv6 数据报封装进 IPv4 数据报中,穿过 IPv4 网络。
9. 通用转发的核心是什么?
匹配首部字段,执行动作。
10. OpenFlow 流表包含什么?
Match
Action
Stats
11. OpenFlow 可以抽象哪些设备?
路由器
交换机
防火墙
NAT
12. 中间盒是什么?
在路径上执行普通 IP 路由器功能之外的设备。
如 NAT、防火墙、IDS、负载均衡、缓存、CDN。
13. IP 沙漏模型是什么?
上层很多协议,下层很多技术,中间统一靠 IP 连接。
14. 端到端原则是什么?
某些功能只有在通信端系统处才能完整正确实现,所以复杂性应尽量放在网络边缘,而不是网络核心。
NAT 用地址和端口转换缓解 IPv4 地址不足;IPv6 用 128 位地址和简化首部试图替代 IPv4;通用转发/OpenFlow 用“匹配 + 行动”统一抽象路由器、交换机、防火墙和 NAT;现实互联网中大量中间盒让原本简单的 IP 沙漏模型变得更复杂。
NAT、IPv6、OpenFlow、中间盒是这一节的内容。
