在讲数据链路层的时候,我们用一个交换机,就构建了一个局域网。但是现在我们局域网里面的一台机器,想要访问另一个局域网的机器,怎么办呢。这就是本节讨论的内容。
我们必须先连接下IP协议。
1、IP协议
IP是TCP/IP协议簇中最核心的协议,所有TCP、UDP、ICMP等数据都已IP数据报格式进行传输。
1.1、IP协议特点
- IP协议是不可靠的传输协议,上一级我们讲到到了ICMP协议,每当传输出现异常,IP层都会丢弃数据包,并且可能会响应一个ICMP差错消息给发送端,而任何要求的可靠性必须由上层如TCP协议来提供;
- IP协议是无连接的,也就是说IP不维护任何关于后续数据报的状态信息,每个数据报相互独立。具体表现在:可以不按发送顺序接收,不用维护连接状态,免去了维护复制的链接状态信息(后面讲传输层的TCP协议的时候会介绍到)。
1.2、IP数据报格式
下面是IP数据报的格式:
- 版本:协议版本号,指明IPv4还是IPv6;
- 头部长度:最长60个字节;
- 服务类型:包含3bit优先权子字段(已被忽略),4bit TOS子字段(分别代表最小时延、最大吞吐量、最高可靠性和最小费用)和1bit未用位但必须置0;
- 总长度:指的是整个IP数据报的长度,单位字节;
- 标识符:唯一地标识主机发送的每一份数据报,通常每发送一个数据报就+1;
- 标志:主要用于IP分片;
- 分片偏移:主要用于IP分片;
- 生存期:设置数据报可以经过最多的路由器数;
- 协议:主要表明IP数据是什么协议,用于对数据报进行分用;
- 头部校验和:校验数据报是否正确;
- 源IP地址:发送IP数据报的IP地址;
- 目的IP地址:IP数据报目的IP地址;
- 选项:可选数据;
- IP数据:具体的IP数据;
2、路由器
路由器一般充当一个网关,属于三层设备。会把MAC和IP头取下来根据内容进行处理。路由器有五个网口,分别可以连接5个局域网,每个网口和局域网的IP地址相同的网段,每个网口都是对应的局域网的网关。
5个网口中一般包含一个外网网口,外网网口用于连接到WAN上。
路由器除了有交换机的功能外,更拥有路由表作为发送数据包时的依据,在有多种选择的路径中选择最佳的路径。
一层设备、二层设备、三层设备分别有什么区别?
路由器是属于OSI第三层的产品,交換机是OSI第二层的产品。
第二层的产品功能在于,将网络上各个电脑的MAC地址记在
MAC地址表
中,当局域网中的电脑要经过交换机去交换传递数据时,就查询交换机上的MAC地址表中的信息,将数据包发送给指定的电脑,而不会像第一层的产品(如集线器)每台在网络中的电脑都发送。而路由器除了有交换机的功能外,更拥有
路由表
作为发送数据包时的依据,在有多种选择的路径中选择最佳的路径。此外,并可以连接两个以上不同网段的网络
,而交换机只能连接两个。路由表存储了(向前往)某一网络的最佳路径、该路径的“路由度量值”以及下一个(跳路由器)
网关地址一般是网段的第一个或者第二个,如192.168.23.0/24这个网段,网关地址可能是192.168.23.1/24或者192.168.23.2/24。
在不同的局域网中,私有IP地址是会重复的,而我们要访问公网的时候,一定要分配一个共有IP地址,所以,我们在访问公网的时候,需要路由器帮忙把私有IP变为共有IP,这种叫做NAT网关
,普通内网之间的通信用到的称为转发网关
。
我们先来看看转发网关。
2.1、转发网关
假设主机A和主机B属于同一个内网,他们通过两个路由器连接起来,如下图:
主机A要访问主机B,流程如下:
-
主机A发现要访问的主机B不是在同一个网段,准备先找到
网关
,把消息发给网关,网关地址是192.168.1.1,主机A通过ARP
获取到了网关的MAC地址,然后发送如下数据包:1
2
3
4SRC MAC: 主机A的MAC
DST MAC: 路由器A的192.168.1.1网口的MAC
SRC IP : 192.168.1.3
DST IP : 192.168.3.4 -
路由器A的
192.168.1.1
网口接收包之后,准备把包转发出去。而路由器A中的路由表中匹配到了,要想发送给192.168.3.4/24
,需要从192.168.2.1
这个网口出去,下一跳地址为192.168.2.2/24
。路由器通过ARP拿到了下一跳192.168.2.2/24
d的MAC地址,然后发送如下数据包:1
2
3
4SRC MAC: 路由器A的192.168.2.1网口的MAC
DST MAC: 路由器B的192.168.2.2网口的MAC
SRC IP : 192.168.1.3
DST IP : 192.168.3.4 -
路由器B的
192.168.2.2
网口接收包之后,准备把包转发出去。路由器B中判断到目标IP在192.168.3.1
这个网口所在的局域网,于是通过ARP拿到了192.168.3.4
的MAC地址,然后发送如下数据包:1
2
3
4SRC MAC: 路由器B的192.168.3.1网口的MAC
DST MAC: 主机192.168.3.4网口的MAC
SRC IP : 192.168.1.3
DST IP : 192.168.3.4
最终,主机B收到数据包。
可以发现在转发网关中,源IP和目的IP地址都是不会变的,因为整个内网不可能有冲突的IP。
但是,假如我们要访问外网,情况就不一样了,最终可能会请到到另一个局域网,另一个局域网的私有IP是可能跟我们所在的局域网一样的,为了避免冲突,于是就有了NAT网关。专门在把数据包发送出去之前,把IP改为公网IP。
2.2、NAT网关
现在假设主机A要访问另一个城市的主机B,这里为了演示NAT,我们把模型简化一下,假设路由器出去之后就是公网IP了,如下:
假设路由器A和路由器B都直接接入了互联网。
现在主机A想访问主机B:
-
由于是不同的局域网,主机A不会知道主机B的IP的,而主机B接入互联网的之后,领取到了一个互联网的IP,就是上图路由器WAN口的IP:
203.0.113.103
,所以主机B会把这个IP作为主机B的IP,最终发出如下IP数据包:1
2
3
4SRC MAC: 主机A的MAC
DST MAC: 路由器A的192.168.1.1网口的MAC
SRC IP : 192.168.1.3
DST IP : 203.0.113.103 -
192.168.1.1网口接收到包之后,发现要想访问
203.0.113.103
,就要从203.0.113.102
这个网口出去,发给路由器B,路由器B中判断到目标IP就是203.0.113.103
这个网口,于是通过ARP拿到了203.0.113.103
的MAC地址,然后发送如下数据包:1
2
3
4SRC MAC: 路由器A的203.0.113.102网口的MAC
DST MAC: 路由器B的203.0.113.103网口的MAC
SRC IP : 203.0.113.102
DST IP : 203.0.113.1031
* 因为消息是要发到公网的,最终SRC IP会被NAT为公网的IP 203.0.113.102;
-
最终路由器B接收到消息,通过NAPT得到最终接收数据报的IP为当前局域网的192.168.1.3/24,最终把消息转发给了这个IP所在的主机B。
NAPT是如何把一个公网IP翻译为局域网IP的?
传统的NAT(traditional NAT)包括基本NAT(basic NAT)和网络地址端口转换(Network Address Port Translation, NAPT)。基本NAT只执行IP地址的重写,本质上是将私有地址改写为一个公共地址,这往往取自于一个由ISP提供的地址池或共有地址范围,这种NAT不是最流行的,因为无助于减少需要使用的IP地址数量。
比较流行的做法是使用NAPT,NAPT使用传输层标识符如TCP或者UDP端口,或者ICMP查询标识符来确定一个特定的数据报到底和NAT内部哪台私有主机相关联。
如果局域网两个端口号一样,那么NAPT会重写端口号,保证不一致。如下图,三个局域网的IP需要转换为公网IP,由于有两个的端口重复了,于是NAPT进行了端口重写: