← 返回 计算机网络原理

计算机网络原理

第四章 第6节

回顾一下:

第四章 第6节 配图 1第四章 第6节 配图 2

这一节开始第六节NAT隧道:

一、NAT 是什么?

NAT 全称:

NetworkAddressTranslationNetworkAddressTranslation

中文叫:网络地址转换

它的核心思想是:

从外部互联网看来,一个局域网里的所有设备可以共享一个公网 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,而是统一看到:

138.76.29.7138.76.29.7

但是不同连接用不同端口区分。

二、为什么需要 NAT?

主要原因是:

IPv4 地址不够。

IPv4 只有 32 位地址:

232{2}^{32}

大约 43 亿个地址,全球设备远远不够用。

所以 NAT 让多个内网设备共享一个公网 IP。

第四章 第6节 配图 3

NAT 的好处

1. 节省公网 IP 地址

一个家庭、一个公司、一个学校内部可能有很多设备,但只需要向 ISP 申请少量公网地址,甚至一个公网地址。

2. 内网地址可以自由改

比如家里用:

192.168.1.0/24192.168.1.0/24

公司也可以用:

192.168.1.0/24192.168.1.0/24

因为私有地址只在本地网络内部有意义,不会出现在公网路由中。

3. 更换 ISP 时内部地址不用改

公网地址可能换了,但内网仍然可以继续用 192.168.x.x 或 10.x.x.x。

4. 有一定隐藏作用

外部主机不能直接看到内网主机的私有地址。

但注意:

NAT 不是严格意义上的安全机制,真正的安全还是靠防火墙、访问控制等。

三、私有地址范围

NAT 经常配合私有地址使用。

常见私有地址有三段:

10.0.0.0/8172.16.0.0/1210.0.0.0/8172.16.0.0/12

也就是:

172.16.0.0172.31.255.255192.168.0.0/16172.16.0.0∼172.31.255.255192.168.0.0/16

也就是:

192.168.0.0192.168.255.255192.168.0.0∼192.168.255.255

这些地址不能在公网直接路由,只能在局域网内部使用。

四、NAT 怎么工作?

第四章 第6节 配图 4

NAT 路由器要维护一张:

NAT 转换表

表里记录:

内网IP:内网端口公网IP:公网端口\text{内网}IP:\text{内网端口}\leftrightarrow \text{公网}IP:\text{公网端口}

比如内网主机:

10.0.0.1:334510.0.0.1:3345

访问外部服务器:

128.119.40.186:80128.119.40.186:80

NAT 路由器的公网地址是:

138.76.29.7138.76.29.7

NAT 会把源地址和源端口改成:

138.76.29.7:5001138.76.29.7:5001

然后记录映射关系:

WAN side addr | LAN side addr 138.76.29.7:5001 | 10.0.0.1:3345

五、NAT 出去时怎么改?

内网主机发出数据报:

IP=10.0.0.1源端口=3345目的IP=128.119.40.186目的端口=80\text{源}IP=10.0.0.1\text{源端口}=3345\text{目的}IP=128.119.40.186\text{目的端口}=80

经过 NAT 路由器时,NAT 改成:

IP=138.76.29.7源端口=5001目的IP=128.119.40.186目的端口=80\text{源}IP=138.76.29.7\text{源端口}=5001\text{目的}IP=128.119.40.186\text{目的端口}=80

也就是说:出去时改源 IP 和源端口。

六、NAT 回来时怎么改?

外部服务器回复:

IP=128.119.40.186源端口=80目的IP=138.76.29.7目的端口=5001\text{源}IP=128.119.40.186\text{源端口}=80\text{目的}IP=138.76.29.7\text{目的端口}=5001

NAT 路由器查表发现:

138.76.29.7:500110.0.0.1:3345138.76.29.7:5001\leftrightarrow 10.0.0.1:3345

于是把目的地址和目的端口改回:

目的IP=10.0.0.1目的端口=3345\text{目的}IP=10.0.0.1\text{目的端口}=3345

然后发回内网主机。

也就是说:回来时改目的 IP 和目的端口。

第四章 第6节 配图 5

七、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 地址长度是:

128bit128bit

远远大于 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:数据部分

第四章 第6节 配图 6

十一、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 有一个字段叫:

FlowLabelFlowLabel

它用来标识同一个“流”中的数据报。

理论上可以让路由器对同一流进行特殊处理,比如:

保证 QoS

按同一路径转发

给实时业务不同待遇

Flow Label 用于标识一个流,但实际使用并没有特别成熟。

十三、IPv4 到 IPv6 的过渡问题

问题是:不可能让全球所有路由器同一天从 IPv4 升级到 IPv6。

所以会有很长时间:

有些路由器支持 IPv4

有些路由器支持 IPv6

有些路由器双栈 IPv4/IPv6

这就需要过渡技术。

十四、IPv4/IPv6 过渡:隧道 tunneling

第四章 第6节 配图 7

场景:两边是 IPv6 网络,中间隔着一段 IPv4 网络。

IPv6 数据报不能直接通过 IPv4-only 路由器。

把 IPv6 数据报封装进 IPv4 数据报里。

也就是:

IPv4数据报载荷=IPv6数据报IPv4\text{数据报载荷}=IPv6\text{数据报}

这叫:IPv6-in-IPv4 tunneling

十五、隧道的逻辑视图和物理视图

第四章 第6节 配图 8

逻辑视图

从 IPv6 端系统看来,好像中间有一条直接连接两个 IPv6 路由器的链路。

比如:

BEB\to E

看起来像直接相连。

物理视图

实际中间经过的是 IPv4 网络:

BCDEB\to C\to D\to E

其中 C、D 只懂 IPv4。

所以 B 把 IPv6 数据报封装成 IPv4 数据报,经过 IPv4 网络到 E。

E 再解封装,还原出 IPv6 数据报。

十六、隧道中地址怎么变化?

假设:

A、F 是 IPv6 主机

B、E 是双栈 IPv6/IPv4 路由器

C、D 是 IPv4 路由器

A 发给 F 的 IPv6 数据报:

IPv6源地址=AIPv6目的地址=FIPv6\text{源地址}=AIPv6\text{目的地址}=F

到 B 后,B 封装一个 IPv4 外壳:

IPv4源地址=BIPv4目的地址=EIPv4\text{源地址}=BIPv4\text{目的地址}=E

中间 C、D 只看外层 IPv4 地址,把它从 B 转发到 E。

到 E 后,E 去掉 IPv4 外壳,恢复里面的 IPv6 数据报:

IPv6源地址=AIPv6目的地址=FIPv6\text{源地址}=AIPv6\text{目的地址}=F

然后继续按 IPv6 转发给 F。

十七、IPv6 部署情况

原因是:

IPv4 已经到处部署

NAT 缓解了 IPv4 地址短缺

升级设备成本高

应用和网络运营商需要逐步迁移

双栈和隧道增加复杂性

所以 IPv6 不是技术上不好,而是:全球互联网太大,迁移成本太高。

十八、通用转发:匹配 + 行动

前面传统 IP 转发是:看目的 IP 地址,然后转发到某个接口。

这叫基于目的地址的转发。

而通用转发更抽象:匹配分组首部中的若干字段,然后执行某个动作。

也就是:

match+actionmatch+action

匹配可以看很多字段:

输入端口

源 MAC

目的 MAC

以太网类型

VLAN ID

源 IP

目的 IP

IP 协议号

TCP/UDP 源端口

TCP/UDP 目的端口

动作可以是:

转发到某端口

丢弃

修改首部字段

送给控制器

记录统计信息

十九、流表 Flow Table

第四章 第6节 配图 9

通用转发设备中维护的是:流表 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+Action+StatsMatch+Action+Stats

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 可以模拟不同设备

第四章 第6节 配图 10

这是这部分的重点。

通用转发把很多网络设备都抽象成:

匹配+行动\text{匹配}+\text{行动}

1. 路由器

传统路由器:

匹配:目的 IP 地址最长前缀

行动:从某个端口转发

2. 交换机

二层交换机:

匹配:目的 MAC 地址

行动:转发或泛洪

3. 防火墙

防火墙:

匹配:IP 地址、TCP/UDP 端口号

行动:允许或拒绝

比如:

TCP目的端口=22TCP\text{目的端口}=22

动作:

dropdrop

就是禁止 SSH。

4. NAT

NAT:

匹配:IP 地址和端口号

行动:重写 IP 地址和端口号

所以 NAT 也能用 match-action 抽象出来。

二十二、OpenFlow 例子理解

比如 PPT 里有一条:

IPDst=51.6.0.8IPDst=51.6.0.8

动作:

forward(6)forward(6)

意思是:

如果 IP 数据报的目的地址是 51.6.0.8,就从端口 6 转发。

另一个例子:

TCPdport=22TCPdport=22

动作:

dropdrop

意思是:如果 TCP 目的端口是 22,就丢弃。

这就是防火墙规则。

再比如:

IPSrc=128.119.1.1IPSrc=128.119.1.1

动作:

dropdrop

意思是:阻止来自某个源 IP 的数据报。

二十三、OpenFlow 网络范围行为

第四章 第6节 配图 11

h5、h6 到 h3、h4 的例子,重点是:

通过给多个交换机安装流表,可以控制整个网络范围内的数据流路径。

传统路由中,路径由路由协议算。

SDN/OpenFlow 中,控制器可以统一下发表项,让某些流走指定路径。

例如:

来自 h5、h6 的数据报

目的为 h3 或 h4

通过 s1

再到 s2

最后送到目标主机

也就是:用流表控制网络行为。

二十四、通用转发的总结

通用转发的核心是:

将到来的分组的任意层次首部字段,与表项匹配,然后执行相应动作。

它比传统转发更灵活。

传统 IP 转发:

目的IP输出接口\text{目的}IP\to \text{输出接口}

通用转发:

很多字段匹配转发/丢弃/修改/送控制器\text{很多字段匹配}\to \text{转发}/\text{丢弃}/\text{修改}/\text{送控制器}

所以它能统一抽象:

路由器

交换机

防火墙

NAT

负载均衡器

二十五、中间盒 Middlebox

中间盒的定义:

在源主机到目的主机的数据传输路径上,任何执行了 IP 路由器标准功能之外的中间设备,都叫中间盒。

也就是说,不只是转发 IP 包,而是还做额外处理的设备。

常见中间盒:

NAT

防火墙

IDS 入侵检测系统

负载均衡器

缓存 Cache

CDN 节点

应用特定设备

第四章 第6节 配图 12

二十六、为什么说“到处都是中间盒”?

因为现实互联网已经不是纯粹的端到端 IP 网络了。

很多地方都会插入中间设备:

家庭网络:

NAT

防火墙

企业网络:

防火墙

IDS

代理服务器

数据中心:

负载均衡

缓存

安全设备

运营商网络:

NAT

流量管理

缓存

CDN

所以中间盒已经非常普遍。

二十七、中间盒的发展

一开始中间盒是:专用、封闭的硬件设备。

后来发展为:开放 API 的白盒硬件。

也就是硬件更通用,功能通过软件配置。

再后来有:

1. SDN

SDN 逻辑集中化控制网络行为。

控制器统一管理和配置网络设备。

2. NFV

NFV 全称:

NetworkFunctionsVirtualizationNetworkFunctionsVirtualization

网络功能虚拟化。

意思是:

把防火墙、NAT、负载均衡等网络功能,从专用硬件搬到通用服务器上,用软件实现。

这样更灵活、更便宜、更容易扩展。

二十八、IP 沙漏模型

互联网体系结构常用一个沙漏图表示。

上面有很多应用层协议:

HTTP

SMTP

RTP

QUIC

DASH

中间有运输层:

TCP

UDP

再往下是网络层:

IP

下面有很多链路层和物理层技术:

Ethernet

WiFi

PPP

Bluetooth

光纤

铜线

无线电

第四章 第6节 配图 13

沙漏的“腰”

沙漏最窄的地方是:

IPIP

它表示:上层很多协议,下层很多网络技术,但中间统一通过 IP 连接。

所以互联网的核心思想是:

IP 是统一的网络层协议。

这带来一个好处:

只要上层支持 IP、下层能承载 IP,各种异构网络和应用都能互联。

二十九、步入中年的沙漏模型

意思是:

互联网已经不像早期那样只有简单的 IP 腰部,中间出现了很多中间盒。

比如:

NAT

firewall

caching

NFV

这些设备在 IP 层附近对数据包进行额外操作。

所以沙漏中间变胖了。

三十、互联网体系结构设计原则

1. 连接的简单性

网络核心尽量简单,能转发 IP 包即可。

2. IP 协议是“瘦腰”

IP 层只提供最基本的互联能力。

不在网络核心加入太多复杂功能。

3. 智能性和复杂性在网络边缘

复杂功能尽量放在端系统或者网络边缘。

比如:

可靠传输由 TCP 做

拥塞控制由端系统做

应用逻辑在主机上做

这就是端到端原则的基础。

三十一、端到端原则

端到端原则的思想是:

某些功能只有在通信端系统处才能完整、正确地实现,因此不应该完全放在网络内部实现。

比如可靠数据传输。

可靠传输放在网络内部行不行?

可以在每一跳做可靠传输。

比如:

路由器1路由器2\text{路由器}1\to \text{路由器}2

每一段都确认、重传。

但是这样仍然不能保证端到端一定正确。

因为:

端主机可能出错

应用层缓冲可能出错

最后一段可能出错

网络中的某些节点仍可能丢失数据

所以最终还是要端到端确认。

为什么 TCP 在端系统实现?

TCP 的可靠传输是在端系统完成的:

发送主机接收主机\text{发送主机}\leftrightarrow \text{接收主机}

网络中间只尽力转发 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 转换表记录什么?

内网IP:内网端口公网IP:公网端口\text{内网}IP:\text{内网端口}\leftrightarrow \text{公网}IP:\text{公网端口}

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. 通用转发的核心是什么?

match+actionmatch+action

匹配首部字段,执行动作。

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、中间盒是这一节的内容。