
浏览器输入一个网址发生了什么(四) 网络包在局域网中传输——路由器和交换机如何转发包
本系列文章归于: 计算机网络基础
上一节我们介绍了网络包经过协议栈的IP模块的封装后,经由网卡发送出本机。
浏览器输入一个网址发生了什么(三) IP模块封装、ARP协议、IP协议、ICMP协议和网卡原理
接下来我们将介绍数据从客户端主机传输出去后,在局域网内经历了什么。
网络包从客户端主机发出后,要经过集线器、交换机和路由器最终进入到互联网。在我们实际生活中,家里的路由器已经集成了集线器和交换机的功能,网络包到达家里的路由器之后就能立刻进入互联网。
这里为了理解集线器、交换机和路由器的功能,故而将每个功能独立出介绍以方便理解。
如下图所示:

1.电信号到达集线器
从之前的内容我们知道,计算机网卡会将 MAC 模块封装的数据帧转为电信号( 0 和 1
组成的高低电平),该电信号会沿着计算机连接的网线到达集线器。
集线器包含多个插口(接口),每个插口可能连接着其他集线器,交换机,路由器或者多个计算机。每个接口背后都装有网卡中 PHY(MUA)
功能相同的模块用于接收和发送电信号。
集线器上的每一个接口既可发送也可接收,但每一个接口不能在发送的同时又接收,或者接收的时候同时发送,这是因为集线器是基于半双工的工作模式。
当信号通过网线到达集线器接收接口后面的 PHY(MUA)
模块之后,会进入中继电路,中继电路的基本功能是将输入的信号广播到该集线器的所有接口之上,信号就会从这些接口发向所有连到该集线器的所有设备。
PS
:集线器不会对发送过来的数据进行解析和处理,也就是说,当集线器接收到电信号之后,不会将电信号还原为数字信息(也就是不会将电信号还原为数据帧和数据包),而是将电信号直接转发。
2.电信号从集线器到达交换机
交换机和集线器一样也有众多接口或者说端口,并且每个接口后面也装着 PHY(MUA) 模块用于收发电信号。与集线器不同的是交换机内部存储着一张 MAC
地址与网线端口的对应表( MAC 地址表)而且交换机是一个包含数据链路层的设备,具有 MAC
模块,可以校验和解析数据帧,而集线器则没有,集线器不会将电信号转为数据帧(而是直接转发电信号),更不用说解析数据帧。
当电信号被交换机的某一个端口接收到之后,由 PHY(MUA) 模块将电信号还原为数据帧,再由 MAC 模块校验数据帧内的数据是否正确( FCS
校验),如果正确则把帧里面的以太网包放到缓冲区中。
PS :我们可以理解为交换机的每一个端口都相当于一块网卡,具有 MAC 模块并且拥有自己的缓冲区。实际上并非每个端口都有独立的 PHY(MUA)
、 MAC 和内存,而是由一个控制芯片同时控制多个端口。而交换机中实际上也没有网卡,因此交换机也没有 MAC 地址。
网卡本身是具有 MAC 地址的,所以网卡能够核对接收到的包的接收方 MAC 地址是否是自己的 MAC
地址,如果不是则丢弃包。但交换机由于没有网卡也没有 MAC 地址,因此交换机会接收所有发给它的包存到缓冲区并转发,而不会丢弃(如果发送方 MAC
地址对应的接口和接收方 MAC 对应的接口相同则会丢弃该包,后面会介绍)。
包放入缓冲区后, MAC 模块会获取到以太网包 MAC 头部的发送方 MAC 地址和接收方 MAC 地址。
一方面,交换机会将发送方 MAC 地址和交换机对应接收端口的端口号的映射关系记录到 MAC 地址表中,这样交换机就知道这个发送方 MAC
地址的设备是连接在哪个端口上的,下次有其他机器要发送数据给这个 MAC 地址时,交换机就知道要将数据通过哪个接口发出。
另一方面,交换机会查询接收方 MAC 地址是否在 MAC 地址表有记录的发送端口,例如查询到接收方 MAC 地址为
00-02-B3-1C-9C-F9 则对应下面的MAC地址表中的第三行,交换机就会把包从端口 8 发送出去。

PS :如果交换机接收到某个包其接收方 MAC 地址是主机 A 的 MAC 地址,那么交换机接收这个包的端口不一定是直接连着主机 A
,而可能是连接着帮 A 转发包的集线器或帮 A 转发包的其他交换机。
从上图中我们也可以看出,交换机的端口也是分为接收端口和发送端口的。 00-02-B3-1C-9C-F9 这个 MAC 地址对应的端口号为 8
,那么交换机针对该 MAC 地址的发送端口号和接收端口号都是 8
,但是发送端口和输出端口本身不是同一个端口,而是不同的2个端口,只是它们的端口号都是8。这里涉及到交换机的交换电路。如下图所示:

左边是交换机的输入端口,下方是输出端口,左边 8 号端口是交换机对 00-02-B3-1C-9C-F9 机器的接收端口,下方 8
号端口是交换机对 00-02-B3-1C-9C-F9 机器的发送端口。
· MAC 地址表的维护
像我们刚才所说,当收到包时交换机会把发送方 MAC 地址与接收端口的端口号记录到 MAC
地址表,并且交换机每次收到包都会执行这个操作。这样以后当收到发往这个地址的包,交换机就能将它发到正确的端口了。
但是地址表中的记录不能永久有效,会在一段时间不使用之后自动删除,这是为了避免类似于设备发生移动导致地址表中记录不再正确的情况,例如笔记本电脑从办公室移动到了会议室,连了不同的网线。
地址表记录的有效期为几分钟,但如果在有效期内,某条记录就过时了(发生了设备移动的情况),那么交换机依旧会将包转发给老的端口,通信就会发生错误。此时只需重启一下交换机,地址表会被清空并更新正确的信息。
下面我们看一种特殊情况:如果交换机查询 MAC 地址表发现记录中接收方 MAC 地址对应的接口和发送方 MAC
地址对应的发送接口相同,那么交换机会如何处理,如下图所示:

A 发送了一个给 B 的数据包,我们发现 A 和 B 都连接在同一台集线器上,集线器会把 A 的包广播到该集线器所有的端口,其中就包括
B 。因此 B 接收到集线器发给他的包之后,校验 MAC 地址发现是自己的 MAC 地址,于是 B
会响应回包,经过集线器,集线器再通过广播的方式把回包传回给 A 。
但是集线器也连接着左侧的交换机上,因此集线器同样会把这个包发给交换机,交换机一查 MAC 地址表会发现发送端口和接收端口是同一个端口号,为了避免计算机
B 接收重复的包,因此交换机会丢弃这个包,而不会把包又转发回集线器而又由集线器转发给 B 。
另一种特殊情况就是 MAC 地址表中无法找到指定的 MAC 地址,这是因为该 MAC 地址的设备没有向交换机发送过包,或者 MAC
记录因过了有效期而被删除。
此时交换机会将包转发给除了源端口之外的其他所有端口。可能有人会担心这样发过多的包会不会造成网络拥塞,其实不用担心,因为只要目标设备做出响应(这里主要指
ARP 响应),交换机就会根据回包将其 MAC 地址记录到地址表,下次就无需这样广播转发。
另外,如果接收方 MAC 地址是一个广播地址那么交换机也会将包发送到除了源端口外的其他端口。
交换机是全双工的工作模式,这也是交换机和集线器的区别。交换机的发送和接收端口是相互独立的,发送端口只能发送不能接收,接收端口亦然;但是发送端口在发送的时候,接收端口也能接收,这就是全双工模式的特点。而集线器的单个端口可以接收也可以发送,但接收和发送不能同时进行,否则就会发生信号碰撞,所以当集线器接收某个包时,它需要将这个包转发给其他所有端口,导致其他端口这段期间不能接收包。从转发能力而言,集线器是低于交换机的。
3.网络包经路由器并转发
网络包经过集线器和交换机转发之后达到路由器,并被转发到下一个路由器。
当然,网络包不一定非要先经过集线器再到交换机再到路由器,也可能集线器连接着路由器,包到达集线器后就能转发到路由器;也可能是计算机直接连着路由器,网络包从计算机发出后直接到达路由器;在局域网中,路由器与路由器之间也存在着众多的集线器和交换机,从当前路由器到下一跳路由器需要经过这两台路由器之间的集线器和交换机;也可能路由器内部本身就集成了集线器和交换机的功能,这样包就可以按上述所说的转发方式直接被转发到下一跳路由器。
当然本小节的重点不是集线器和交换机,而是路由器的转发机制。和交换机不同,路由器是基于 IP
设计的(具有网络层和链路层),而交换机是基于以太网设计的(只有链路层),因此路由器可以解析 MAC 包和 IP 包,交换机则只能解析 MAC
包;交换机是通过包中的接收方 MAC 地址判断转发目标,而路由器则是根据包中接收方的 IP 地址判断转发目标。
·路由器结构简化图

路由器内部包含两部分:转发模块和端口模块。
转发模块负责根据包内目的地 IP 判断包应该转发到哪个下一跳路由器;端口模块负责执行包的收发操作。
·端口模块
端口模块包含 PHY ( MUA )模块(可以接收电信号将帧转为数字信息)、 MAC
模块(将帧解析为以太网包)和内存缓冲区(暂存网络数据),端口模块对于路由器而言就相当于网卡对于计算机一样。路由器的每个端口都具有独立的 MAC 地址和
IP 地址。
不同类型的路由器安装的端口模块也不同,例如具有 ADSL 组件的路由器(一般用作为互联网中的路由器),具有 FTTH
组件的路由器(互联网中的路由器),支持专线的路由器(公司局域网中的路由器),支持无线局域网或以太网的路由器(局域网中的路由器)。
不同端口模块的路由器支持不同的通信功能,例如具有 ADSL 通信功能的路由器在把包转发之前会为包添加 MAC 头部、 PPPOE 头部和
PPP 头部(用于在互联网中传输和鉴权)并发送到互联网中;而具有以太网或无线局域网功能的路由器在转发时只添加 MAC
头部,并且只支持包在局域网内传输和解析。
一般而言,计算机的网卡支持以太网和无限局域网的通信技术,而路由器的端口模块除了支持以太网和无线局域网还支持如 ADSL , FTTH
以及各种宽带专线的通信,只需要端口模块安装了支持这些技术的硬件即可。
一个路由器可以有多个端口和多种类型的端口(意味着这个路由器既支持包在局域网中转发也支持在互联网中转发),每个端口都可能连接着一根网线(如果端口类型是无线的则不用连网线),端口类型不同,连的网线种类也不同。
·转发模块
路由器的转发模块中有一个重要的表叫做路由表,如下所示:

路由器中的路由表内容,以及匹配规则和之前介绍的计算机内的路由表一样。
其中,第一列“目标地址”记录的是接收方的信息,但它不是具体某台设备的 IP ,而是只有 IP 的网络号部分的 IP
段,表示主机号部分的比特值都为 0 。
第二列表示目标地址的子网掩码,用于路由器判断所需比对的网络号的比特数。
路由器在比对路由表和接收方 IP 时,只会比对 接收方 IP 的网络号而忽略主机号。
·路由聚合
路由表第一列和第二列中记录的可能不是目标地址 IP
的真正子网,这是路由聚合的结果。所谓的路由聚合就是将多个子网合并为一个子网,并在路由表中生成一条记录,这样就能减少路由表中的记录数。
例如有 3 个子网: 10.10.1.0/24 、 10.10.2.0/24 和 10.10.3.0/24 。路由器 B 需要转发接收方
IP 为 10.10.2.100 的包,但实际上路由器 B 的路由表 中并没有上面的 3 个子网的记录,而是将上面 3 个子网合并成一个
10.10.0.0/16 的子网记录起来(这里记录的是聚合后的地址),并将下一跳指向路由器 A 。如下所示:
目标地址
|
子网掩码
|
网关
|
接口
|
跃点数
—|—|—|—|—
10.10.0.0
|
255.255.0.0
|
路由器 A 的 IP
|
路由器 B 某接口的 IP
|
1
此时在路由器 B 中就只需匹配目标地址 10.10.2.100 的前 16 个位,即 10.10 。匹配正确后 B
会将这个包转发给路由器 A 。
路由器 A 的路由表则记了上面 3 个子网的记录,根据 10.10.2.100 匹配到 10.10.2.0/24 这个子网和下一跳的 IP
地址,如下所示:
目标地址
|
子网掩码
|
网关
|
接口
|
跃点数
—|—|—|—|—
10.10.1.0
|
255.255.255.0
|
…
|
路由器 A 的 5 号端口的 IP
|
1
10.10.2.0
|
255.255.255.0
|
…
|
路由器 A 的 2 号端口的 IP
|
1
10.10.3.0
|
255.255.255.0
|
…
|
路由器 A 的 8 号端口的 IP
|
1

路由聚合是将多个子网聚合为一个子网,路由表记录聚合后的子网地址。相反的,路由器也可能将一个子网细分并注册到路由表形成多条记录。甚至也可以将某台具体计算机的地址写入路由,此时第二列的子网掩码为
255.255.255.255 ,表示匹配路由表时需要匹配所有 32 个比特的值。
至于网关、接口和跃点数在上面介绍计算机的路由表已经介绍过,这里不再赘述。第 4
列接口在计算机中代表某一块网卡,在路由器中代表路由器众多端口中的某一个端口。
PS :路由表的维护方式与交换机不同,交换机对 MAC 地址表的维护是通过记录发送方的以太网包 MAC
地址以及交换机接收端口的端口号、记录接收方的响应以太网包的 MAC 头部和交换机接收该包的接收端口实现的。路由表的维护则通过 人手动维护 以及
根据路由协议通过路由器之间的信息交换由路由器自行维护。
那么回到正题,当包到达路由器时路由器是怎么处理的,这会根据路由器的端口不同而异(如以太网端口,无线局域网端口, ADSL 等),
这里只介绍路由器以太网端口是如何接收和转发包的 。
首先信号到达网线接口部分,由 PHY ( MUA )模块和 MAC 模块将电信号转为数字信息,检验帧尾部 FCS ,查看接收方的 MAC
地址是不是发送给自己的,放入接收缓冲区;如果不是发给自己的包则丢弃(交换机不具有 MAC 地址,只负责转发,因此交换机不会因为校验 MAC
地址不是自己的 MAC 地址而丢弃以太网包,而是根据 MAC 地址表转发)。
校验完 MAC 地址之后, MAC 头部的任务就完成了然后被丢弃( MAC 头部的任务就是将包送到指定 MAC
地址的路由器上,因此其实上一章中我们介绍通过 ARP 协议向局域网中广播以获取接收方的 MAC 地址实际上是获取路由器的 MAC
地址而不是远端目标主机的 MAC 地址)。然后路由器会根据 IP 包头部的接收方 IP 地址匹配路由表的记录,从而找到下一跳路由器的 IP
(即路由表中的网关列)和输出端口(路由表的接口列,即通过本路由器的哪个端口发出这个包)。需要注意,如果匹配到的记录的网关列为具体 IP
地址,则该地址就是下一个转发目标,如果网关列为空,则 IP 头部的接收方 IP 地址就是下一个转发目标。
如果无法在路由表中匹配到对应记录,路由器会丢弃这个包,并通过 ICMP 消息告知发送方。
在发出这个包前,路由器需要重新封装 MAC 头部,因为之前的 MAC 头部已经被丢弃。此时 MAC 头部填入的发送方 MAC
地址不是源发送端的 MAC 地址,而是本路由器的某发送端口的 MAC 地址(路由器有多个端口,每一个端口都有一个 MAC 地址)。接收方的
MAC 地址则根据下一个转发目标的 IP (可能是下一跳路由器的 IP ,也可能是目标主机的 IP )通过 ARP
查询的方式获取,当然路由器中也有 ARP 缓存,因此会先在 ARP 缓存中查询。
网络包封装完毕后,会在端口模块将数字信息转为电信号发送出去,这个过程和在计算机的发送包过程一样。如果输出端口是以太网类型,则网络包会通过交换机到达下一个路由器并经过路由器的层层转发,网络包到达最终目的地(当然这里省略了包如何从局域网进入互联网的过程介绍,我们会在下一章再介绍)。
需要注意的是,如果路由器通过以太网类型的端口发出包则此时以太网包的头部只有 MAC 头部,如果是通过 ADSL
类型的端口(将包发送到网络服务运营商和互联网)发出则以太网包会包含 MAC 、 PPPoE 和 PPP 头部。
·默认路由
对于局域网中的路由器而言,可能小的局域网中的路由器和计算机数量不多,因此所有转发目标都能够写到路由表。但如果是互联网中的路由器,由于互联网中的设备数量太多,无法将所有目标
IP 的网络号都记录到路由表中。因此路由表会在最后一行配置默认路由的记录,这一行的目标地址列和子网掩码列为 0.0.0.0 ,子网掩码为
0.0.0.0 表示需要匹配网络包接收方 IP 的比特数为 0 ,即无需匹配。而这一条记录的网关列即为默认网关,一般会填写为
接入互联网的路由器地址。
换句话说,如果包内的接收方 IP 无法匹配到路由表中的其他所有记录,且路由表中有 0.0.0.0 这条默认网关记录,那么接收方 IP
就会匹配到这条记录并转发到默认网关。
当然,如果路由器中没有设置默认网关,那么当匹配路由表中所有记录失败时,路由器会发送 ICMP 消息给发送方。
·包的有效期
在路由器转发包之前,其转发模块会更新 IP 头部的 TTL 字段。该字段表示有效期,每经过一个路由器的转发这个值就会减 1 ,当这个值变为 0
时就表示超过了有效期,这个包就会被丢弃。
这个机制是为了防止包在转发的过程中陷入死循环,如果路由表中的配置正确是不会出现这种情况的,但如果信息有问题或者设备故障等原因切换备用路由器导致暂时性的路由混乱就会出现这种情况。
TTL 一般会设置为 64 或 128
· 通过分片功能拆分大网络包
路由器的端口类型不只以太网一种,也可以支持其他局域网或专线通信技术。不同端口类型的线路能传输的最大包长度( MTU )也不同,像在以太网中,以太网包的
MTU (包括以太网头部)为 1500 。
当路由器的输入端口和输出端口是不同的端口类型(像局域网内的路由器输入端口和输出端口可能都是以太网类型的端口和线路,但接入互联网的路由器的输入端口为以太网类型端口,输出端口是
ADSL 类型的端口),且输出端口能传输的 MTU 小于输入端口时,一旦传入的包的大小超过了输出端口的 MTU ,就会导致包无法发送。如下所示

有时候即使输入和输出端口的 MTU 一样,但可能由于包经过重新封装添加了额外的头部数据导致包的长度超过输出端口的 MTU 。例如 ADSL 和
FTTH 等端口类型在发出包之前需要在 IP 头部前添加 PPP 头部和 PPPoE 头部再添加 MAC 头部。
为了避免包超过输出端口 MTU 而无法发送包的情况出现,路由器中的 IP
模块提供了分片功能,首先它会看看这个要发送出去的包能否直接发送出去,将输出端口的 MTU 与包的长度(数据帧的包长度,不包括帧的报头和 FCS
)比较,如果输出端口的 MTU 小于包的长度则会对这个包分片,拆分之前会看一下 IP
头部的标志字段是否允许分片;如果标志字段表示不能分片,则路由器会丢弃该包并发送 ICMP 消息给发送方。
分片如下图所示

图中( a )的蓝色部分就是被拆分的内容。
每个分片都会添加相同的 MAC 头部和 IP 头部(如果是在以太网中传输则为这两个头部,如果是通过 ADSL 则还需要 PPP 和
PPPoE 头部)。
需要注意的是,这里对 IP 包的分片和之前在协议栈中介绍的 TCP 模块对 HTTP 消息的分片不同。 TCP 模块对 HTTP
消息的分片是在数据被装进包里之前进行的,而且每个分片都包含一个 TCP 头部。而路由器则是直接对 IP 包进行分片,每个分片都有一个 IP
头部,但是所有分片只有一个 TCP 头部。TCP分片也是因为要发送的数据可能大于MTU因而分片。
假如有客户端有 1M 的 http 消息要发送,则这 1M 的内容会在 TCP
模块中被分为几百多个分片包(IP包),但经过路由器的时候,每个 IP 包还可能再被路由器的 IP 模块分片为两个小包。
·路由器与交换机以及路由器之间的关系
简单的来说,路由器负责通过将包不断传递给下一跳路由器最终把包送达通信对象这一整个过程(由网络层如 IP
模块负责)。而包从一个路由器到达下一个路由器则是由交换机负责广播获取MAC地址实现(由链路层如以太网线路等负责)。
网络中除了以太网之外,还有无线局域网、 ADSL 和 FTTH 等等众多类型的网络,如果当前路由器和下一跳路由器是通过以太网连接的,则当前路由器的
IP 模块会委托以太网将包传递给下一个路由器;如果当前路由器和下一跳路由器是通过 ADSL 连接,则会委托 ADSL 线路传递。 IP
本身不负责包的传输,而是委托链路层的各种通信技术(以太网、 ADSL 、 FTTH 、无线局域网等)把包传给下一个路由器。
当然,现在基本上很多的路由器都内置了交换机功能,因此路由器本身就具有广播,以及进行 ARP 查询 MAC 地址的功能。
路由器的附加功能
上面我们介绍了路由器的基本功能,即根据网络包头部接收方 IP 来查询路由表,获取下一跳地址,并以接力的方式将包传送到目标地址的计算机上。
除了这个基本功能之外,路由器还有一些附加功能,这里介绍比较重要的两个功能:地址转换和过滤。
·地址转换
我们知道一台设备只有一个唯一的 IP 地址,如果网络中出现有重复 IP 地址的设备就会无法正常传输网络包。可是随着互联网设备数量增长, IP
地址会被很快分配完。为了解决这个问题,我们容许相互独立的不同内网之间的机器出现 IP 重复而同一内网的机器的 IP
不重复的情况,只要不同内网之间的设备不直接进行通信就行。为此我们提出了私有地址和公有地址的概念。
公有地址中没分配的一部分 拿出来规定 只能在内网使用 的地址叫做私有地址,而互联网中分配的固定地址叫做公有地址。
私有地址的范围如下:
10.0.0.0 ~ 10.255.255.255
172.16.0.0 ~ 172.31.255.255
192.168.0.0 ~ 192.168.255.255
不同内网的两台机器即使出现上面范围内的 IP 地址重复也没有关系。
下面我们以公司内网为例。一般而言,公司内网中的设备会分为两部分,一部分是对互联网开放的服务器,一部分是公司内部设备。对互联网开放的设备分配公有地址,对公司内部设备分配私有地址,被分配私有地址的设备只能够与内网的设备直接通信而不能和互联网直接收发网络包。
如果内网中的设备想和互联网中的设备通信就需要一种特别的机制,这个机制就是 地址转换
地址转换的原理就是依靠路由器在转发网络包时对 IP 包头部的 IP 地址和端口进行改写 。
当内网的设备要把网络包发送到远程的目标机器,在网络包经过路由器的时候,路由器会将 IP 包头部的发送方 IP
地址(私有地址)换为路由器接收端口的地址(该路由器的端口地址是一个公有地址),并且将包 TCP 头部的端口号也改写为路由器分配的一个空闲端口号。
改写前的私有地址和端口号,改写后的公有地址和端口号会对应的记录到路由器的一张表中。
这个被替换后的公有地址其实是地址转换设备的 IP ,即路由器的 IP 。所以实际上真正的发送者不是内网的计算机,而是该路由器。

服务端的回包的接收方 IP 会写之前发送方的公有地址,即 198.18.8.31 ,这个公网 IP 是路由器的 IP
。当包到达公司网关路由器时,路由器会根据回包的接收方 IP 和端口查上面的映射表找到对应的内网设备并转发给该设备(上图的表格中只有一个公有 IP
,但真实情况其实还可能有多个公有地址,因为路由器有多个端口)。
在公有地址只有一个的情况下,可以用不同的端口号来区别内网的不同终端。这样就不至于服务端的回包无法找到准确的内网设备。
这个公有地址和私有地址的映射表的某条记录会在某内网计算机 A 与外网服务器 B 建立连接时( A 发送连接请求的 TCP
包到达路由器时)生成,之后该内网计算机 A 与外网设备 B 的通信都会使用这条转换记录,直到 A 与 B 通信完毕,断开连接, A
关闭用于与 B 通信的套接字后,(此时这个私有地址的端口号就失效)这条记录才会被删除。
我们发现路由器做地址转换的时候还改写了端口号,这样做是为了在地址转换时让公有地址的一个端口号对应一个私有 IP
地址,提高公有地址的利用率。如果不改写端口号,就意味着每转换一个私有地址都需要一个新的公有地址。假如这个公司的局域网只被分配了 10
个公有地址,但是公司有 1000 台设备( 1000 个私有地址),就意味着只有 10 台内部设备能够同时和互联网通信。
上面我们介绍了内网设备作为客户端,互联网中的远程设备作为服务端情况下的路由器地址转换。下面我们再说说公司内网设备作为服务端,从互联网访问公司内网设备时路由器的地址转换。
其实基本原理还是通过复用一个(或多个)公有地址的多个端口号来对应多个私有地址建立映射进行转换,唯一的不同在于内网设备作为客户端请求的情况下,这个地址转换表的记录是在设备发出请求并经过路由器时才生成的(即动态生成);而内网设备作为服务端供互联网请求的情况下,路由器中的地址转换表记录需要提前手动添加,而且只要内网设备不停止提供服务,里面的记录就不会删除。如图:

这样一来,互联网中的某个用户访问 198.18.8.31:8080 其实访问的就是公司内网中的 10.10.1.1 这台机器的 80
端口所提供的服务。
· 路由器的包过滤功能
包过滤就是对包转发时根据 MAC 头部、 IP 头部和 TCP
头部按时限设定好的规则决定转发这个包还是丢弃这个包。我们常说的防火墙设备和软件就是利用这一机制。
这一原理虽然简单,但是想要灵活控制不容易,例如如何防止来自互联网的包经过路由器进入内网,但是又允许内网发出的包能通过路由器转发给互联网。
很多朋友会想,如果希望内网能访问互联网而不让互联网访问内网,只需允许路由器转发由内网发向互联网的包,而禁止转发由互联网发到内网的包就行。
可是网络包是双向传输的,例如 TCP 应答机制中,内网设备发送了带有序号的网络包,服务端就会回一个 ACK 包。此时这个 ACK
包就被拦截导致内网向客户端发起的请求无法正常响应(应该说客户端的请求包都无法正常传输完,客户端主机会一直等服务端的应答包)。
这部分内容将会在探索服务器时介绍。
-- 往期精彩 –
浏览器输入一个网址发生了什么(二) TCP模块封装和传输机制
计算机网络基础(三) 网络层之IP地址、ARP协议、ICMP协议和IP协议详解
计算机网络基础(四) 网络层之路由选择协议、RIP协议、OSPF协议、BGP协议以及路由器的构成
面试题:BIO,NIO,AIO 的区别是什么?说说select 和 epoll 工作机制与差异?为何epoll 如此高效
面试题:说说看你对数据库事务和ACID的理解?并发事务可能会产生哪些问题,该如何解决?什么是快照读和MVCC,解决了什么问题?