网络层

网络层

使用中间设备(比如网桥)可以把一个网络扩大,但是从网络层的角度,仍然是在一个网络中。网络层是“互联”的核心。如何将各种不同的网络和网络连接起来,则是网络层的任务。


一、网络互连

世界范围内有各种各样的网络,使用 IP 协议可以使这些性能各异的网络在网络层看起来好像是一个统一的网络(IP网)。

当 IP 网上的主机进行通信时,就好像在单个网络进行通信一样,它们看不到互联的各网络的具体实现细节(如具体的编址方案、路由选择协议等)。在IP网上的上次使用 TCP 和 UDP 进行各种传输,构建了当前的互联网

IP网
IP网

二、IP 协议

1、IP地址

IP 地址给互联网上的每一台主机主机(或路由器)分配了了一个在全世界范围内的唯一的 32位标识符。

IP地址的编址方法经历了三个阶段。

(1)分类的 IP 地址

IP地址中的网络号和主机号
IP地址中的网络号和主机号

早期设计的时候,A、B、C类主要分为两部分,网络号和主机号。

为了方便,一般把32位 IP 地址采用点分十进制记法,每 8 位转化成一个十进制,中间用点分割。

IP范围和私有IP
IP范围和私有IP

早期,申请到一个 IP 地址,其实就是申请到了具有同样网络号的一块地址。网络号下的主机号又申请者自己分配,做到无重复即可。同一个局域网的主机网络号必须是一样的。

2、IP数据报的格式

IP数据报格式
IP数据报格式

在TCP/IP协议族中,各种数据报的协议格式通常以32位(4个字节为单位来描述)。

IP 数据报整体分为首部的数据两部分。下面分别简单介绍数据报的组成格式。

  • 版本 —— 4位, IP协议版本。
  • 首部长度 —— 4位。最大表示15,单位是 4 个字节,数据报首部固定部分为20个字节,所以首部最小值为5(0101)。
  • 区分服务 ——8位, 设计时用作服务类型,实际暂时并没有使用。
  • 总长度 ——16位, 整个数据报总长度。最大为 2^16 -1 。
    链路层数据帧规定了数据帧中数据字段最大长度(最大传送单元) MTU ,所以 IP 数据报如果超过了需要进行分片处理。后面的标示(flag)偏移(offset)都与分片相关
  • 标识(identification)—— 16位,数据报计数器,用于分片重组。,
  • 标志(flag)—— 3 位,目前前两位有意义。地位 MF (more fragment)为1,标示还有分别分片,如果是0,则表示是最后一个分片。中间为你DF(do not fragment)为1时,表示不能分片。
  • 片偏移(fragment offset)—— 分片后,某片在原分组的相对位置。
  • 生存时间 —— 8位,原表示生存时间限制,后表示路由中的跳数限制。显然最大跳数为255。
  • 协议 ——8位, 携带的数据部分是哪种协议。下面有常用协议和对应字段。

    常用协议和对应字段
    常用协议和对应字段
  • 首部校验和 —— 用于检验是否出现差错。(后来IPv6中去掉了这个功能,因为IPv6 任务在链路层和传输层已经包含了比特流的差错检测功能,于是被精简掉。这也说明程序设计时,过度设计不可避免,过度设计和简单设计的度很难把控。)
  • 源地址 —— 32位,源IP地址。
  • 目的地址 —— 32位,目标IP地址。
  • 可选字段和填充 —— 长度可变,实际很少使用,可用来支持排错、测量和安全等。很多路由不考虑数据包中可选字段。

下面是通过 Wireshare 抓取的真实 IP 数据包。

Wireshare抓包IP数据报
Wireshare抓包IP数据报

三、ARP

MAC 地址在物理层和数据链路层使用,属于身份标示,每个网卡都有固定的MAC地址,是不可变的;而IP地址在网络层使用,用来定位在哪网络中。一个主机的 IP 地址不是固定不变的,而 MAC 地址是跟随网卡一起,网卡不换就不会变。

ARP
ARP

局域网中需要 MAC 地址才能在链路层通信,两个主机之间是如何知道对方的MAC地址呢?通过ARP 协议

1、ARP

ARP解决的是同一个局域网内,IP 地址和 MAC 地址的映射问题。下面加德纳介绍 ARP 的工作流程

ARP请求应答
ARP请求应答

假设 A的 IP 地址是 209.0.0.5,B 的 IP 地址是209.0.0.6。当 A 向 B 发送IP数据报时,先在本地局域网广播发送一个ARP请求分组,主要内容为 我的IP是209.0.0.5,我的 MAC 地址是 A-MAC,209.0.0.6的MAC 地址是多少?

局域网的 B 主机收到了ARP 请求后,对比IP地址,发现自己与查询的IP地址一致,于是发送一个ARP 应答(单播),主要内容是 我是 209.0.0.6 ,我的 MAC 地址是 H2MAC。

A 收到的 B 的单播应答分组后,解析出来并将 B 的 IP 和 MAC地址写进 ARP 缓存表中。这样下次就可以直接用了。由于一个局域网中是不断有主机加入和退出,导致IP经常变化,所以这个映射关系会有过期时间,需要动态更新。

Wireshark ARP 请求
Wireshark ARP 请求

Wireshark ARP 请求

Wireshark ARP 应答
Wireshark ARP 应答

2、使用ARP 的典型情况

ARP四种情况

  • (1) 发送方是主机(如H1),要把IP数据报发送到同一个网络上的另一台主机(如H2)。这时H1发送ARP请求分组(在网1上广播),找到目的主机H2的硬件地址。
  • (2) 发送方是主机(如H1),要把IP数据报发送到另一个网络上的一-台主机(如H3或H4)。这时H发送ARP请求分组(在网1上广播),找到网1上的一个路由器R1的硬件地址。剩下的工作由路由器R1来完成。R1 要做的事情是下面的(3)或(4)。
  • (3) 发送方是路由器(如R1), 要把IP数据报转发到与R1连接在同一个网络(网2) 上的主机(如H3)。这时R1发送ARP请求分组(在网2上广播),找到目的主机H3的硬件地址。
  • (4) 发送方是路由器(如R1), 要把IP数据报转发到网3上的一台主机(如H4)。H4与R1不是连接在同一个网络上。这时R1发送ARP请求分组(在网2上广播),找到连接在网2上的一个路由器R2的硬件地址。剩下的工作由这个路由器R2来完成。
  • 在许多情况下需要多次使用ARP。但这只是以上几种情况的反复使用而已。

四、CIDR

1、划分子网和CIDR

早起的 IP 地址是分类的两级结构,两级 IP 的(网络号和主机号)设计其实是不太合理的。A、B类主机数太多,C类太少,直接的导致了IP地址的浪费和过早用完。

为了解决这个为问题,于是将原来的主机号再进行划分,从 2 级结构变成了 3 级结构,叫做划分子网。 为了标示再划分的子网,于是出现了子网掩码。子网掩码也是32位的,一般也用十进制点分法表示。

3级结构和子网掩码
3级结构和子网掩码

划分子网增加了网络划分的灵活性,一定程度上缓解了互联网发展的困难。但是近几十年互联网飞速发展,主机和设备急剧增长,路由表项目数也急剧增加。于是出现了 CIDR (无类型域间路由选择)。

CIDR 消除了传统 ABC分类的和划分子网的概念,将IP地址分为两个部分:网络号和主机号。用斜线的形式记录网络号,例如 10.202.120.2/18,18表示网络号,后面14位表示主机号。

CIDR地址中没有子网的表示。但是,CIDR地址块仍然可以更具需要再划分子网。比如分到地址块/20,需要再划分8个子网,则可以通过向主机位借 3 位来划分,这样网络前缀就变成了 23 位。

2、地址聚合

一个CIDR地址快可以有很多地址,路由利用CIDR地址块来查找目的地址,被称作路由聚合,可以减少路由表的信息,提高网络性能

假定某ISP已拥有地址块206.0.64.0/18 (相当于有64个C类网络)。现在某大学需要800个IP地址。ISP 可以给该大学分配一个地址块206.0.68.0/22,它包括1024 (即2”0)个IP地址,相当于4个连续的C类/24地址块,占该ISP拥有的地址空间的1/16。这个大学然后可自由地对本校的各系分配地址块而各系还可再划分本系的地址块。CIDR的地址块分配有时不易看清,这是因为网络前缀和主机号的界限不是恰好出现在整数字节处。只要写出地址的二进制表示(从图中的地址块的二进制表示中可看出,实际上只需要将其中的一个关键字节转换为二进制的表示即可),弄清网络前缀的位数,就不会把地址块的范围弄错。

CIDR地址块划分
CIDR地址块划分

从图中可以清楚地看出地址聚合的概念。这个ISP共拥有64个C类网络。如果不采用CIDR技术,则在与该ISP的路由器交换路由信息的每一一个路由器的路由表中,就需要有64个项目。但采用地址聚合后,就只需用路由聚合后的一个项目206.0.64.0/18 就能找到该ISP。同理,这个大学共有4个系。在ISP内的路由器的路由表中,也需使用206.0.68.0/22这个项目。这个项目好比是大学的收发室。凡寄给这个大学任何一个系的邮件,邮递员都不考虑大学各个系的地址,而是把这些邮件集中投递到大学的收发室,然后由大学的收发室再进行下一步的投递。这样就减轻了邮递员的工作量(相当于简化了路由表的查找)。

五、IP 数据报分组的转发

1、路由器

完成IP数据报转发工作的主要设备就是路由器。在接触转发之前,需要先接触路由器这种设备。

(1)接口概念

常规的路由属于三层的设备(需要网络层IP信息)。抽象的说,一个路由器往往有多个接口,每个接口都有不同网络号的 IP 地址。每个接口都会有网卡(单独的MAC地址),一个网卡属于一个网络段,分别连接着不同的局域网,每个网口可以在这个网络中进行局域网通信。

如下图,R1和R2分别有2个接口,分别连接着不同的局域网

路由接口
路由接口

我们家个路由器一般分为 WAN口和 LAN 口, WAN 口连接到广域网,而 LAN 口连接到局域网。这种物理接口既是输入端口又是输出端口,一般叫做线路接口卡。家里的网关往往也都是路由器。

(2)分组转发

路由器是一种具有多个输入输出端和专用计算机,任务就是转发分组(先查找转发表)。下图是典型的路由器构造,其中1、2、3分别表示物理层、数据链路层和网络层的处理模块。

路由器构造
路由器构造

转发分组有三部分组成:输入端口、输出端口和交换结构路由器收到的分组可能是路由交换信息的分组,这样理由器需要把分组交给路由处理机;如果是数据分组,则查找路由表,经过交换结构到合适输出口。

每个输入端口都有一份转发表,成为’影子副本’,可以避免单点故障影响整体。

输入端口
输入端口
输出端口
输出端口

输入输出口都有缓存队列,如果输入输出速率不匹配,导致输入或者输出队列溢出,就会发生分组丢弃

2、转发实例

H1向H2发送分组
H1向H2发送分组

当主机 H1 向 主机 H2 发送分组时,源主机H首先要进行的操作是要判断:发送的这个分组,是在本子网上进行直接交付还是要通过本子网上的路由器进行间接交付?

源主机H把本子网的“子网掩码255.255.255.128” 与目的主机H2的“IP地址128.30.33.138”逐位相“与”(即逐位进行AND操作),得出128.30.33.128, 它不等于H的网络地址( 128.30.33.0)。这说明H2与H1不在同一个子网上。因此H不能把分组直接交付H2,而必须交给子网上的默认路由器R1,由R1来转发。

路由器R1在收到一个分组后,就在其路由表中逐行寻找有无匹配的网络地址。先看R1路由表中的第-一行。用这一行的 “子网掩码255.255.255.128” 和收到的分组的 “目的地址128.30.33.138” 逐位相“与”(即逐位进行AND操作),得出128.30.33.128。 然后和这一行给出的目的网络地址128.30.33.0进行比较。但比较的结果不一致(即不匹配)。

用同样方法继续往下找第二行。用第二行的“子网掩码255.255.255.128” 和该分组的“目的地址128.30.33.138”逐位相“与”(即逐位进行AND操作),结果也是128.30.33. 128。

这个结果和第二行的目的网络地址128.30.33.128相匹配,说明这个网络(子网2)就是收到的分组所要寻找的目的网络。于是不需要再继续查找下去。R1把分组从接口1直接交付主机H2 (它们都在一个子网上)。

这就完成了 两个主机之间的分组转发。

假设H1要向 H3 通信的话,R1中则需要找到的第三行才能知道 H3 在网络 128.30.36.0上。R1则把分组转发到 R3,由R3直接交付到H3。

六、补充

1、ICMP

互联网世界的情况很复杂,经常变化,为了更有效的转发IP数据报和提高交付成功的机会,网络层有一个网际控制报文协议 ICMP (Internet Control Message Protocol)。它如何工作呢?

(1)工作方式

  • 当路由或主机发现一个数据报不能交付,比如主机或网络不可用,这个时候就向源点发送一个差错报告类型终点不可达的ICMP 报文。
  • IP数据包是有生存时间(在IP 数据报格式中占8位)的,如果路由发现一个数据报超时了,就向源点就向源点发送一个差错报告类型超时的ICMP 报文。
  • 路由或主机发现数据报首部字段不对时,就丢弃数据报,并向源点发送参数错误的ICMP 报文。
  • 如果一个路由发现一个数据报有更好的路由选择时,就会发送改变路由(重定向)的 ICMP报文给源点。

以上 4 种都是ICMP 差错报告报文。ICMP 还有一种询问报文,如下图是常用ICMP 报文类型。

常用ICMP报文类型
常用ICMP报文类型

询问报文有两种,请求回答报文(类型字段8表示请求,0表示回答)和时间戳请求和回答报文。请求回答报文用来测试目的站是否可达已经了解相关状态,我们常用的 ping (检查主机连通性)就是用的这种类型。时间戳请求和回答用于时钟同步和时间测量

(2)抓包实例

下图是通过 Wireshark 抓的一个 实际 ICMP 报文实例。可以看到 type 是3,表示差错报文中的终点不可达。

Wireshare抓包ICMP差错报文-不可达
Wireshare抓包ICMP差错报文-不可达

2、NAT

目前我们家庭局域网的主机的用的 IP 是局域网的IP地址,属于私有 IP,只能再局域网内通信,如果想要和互联网通信怎么办?使用网络地址转换 NAT (Network Address Translation) 方式。这种方式需要在路由器的安装专用的NAT软件,这样的路由叫做 NAT 路由器

工作原理

NAT工作原理
NAT工作原理

上图中专用网的主机 A想要访问互联网,必须经过NAT 路由进行地址转化,将本地专用网IP转化成 全球IP。下面是 IP 转换表,“出”表示离开专用网到全球互联网,“入”表示进入专用网。

NAT地址转化
NAT地址转化

可以看到,只通过 IP 进行转化的话,当专用网内有 N 个主机时,NAT 路由必须有 N 个 全球地址来做转换。这种方式使用全球外网 IP,也是相当奢侈。所以为了更有效的利用 IP 地址,NAT 路由可以把 运输层的端口用上。这种方式叫做 NAPT (网络地址与端口转化)一般为了简便也成为 NAT 技术。

NAPT转换表
NAPT转换表

NAPT 这样可以利用端口把专用网的地址都转化为一个全球 IP,例如上表中内网地址都转化为了172.38.1.5,这种方式大大提交了 IP 的利用率。

NAT 路由(NAPT)技术已经不仅仅作用在网络层,因为需要查看端口,所有也属于传输层的范畴。

七、其他

1、参考

计算机网络(第6版)

极客时间-趣谈网络协议

发表评论

电子邮件地址不会被公开。 必填项已用*标注