网络层
网络层
提供主机之间的逻辑通信
点对点通信,把传输层产生的报文段或数据报封装成分组,选择合适路由将其从源端传到目的端,路由选择,差错控制,流量控制(控制发送方),拥塞控制(全局节点)
IP地址
在 TCP/IP 网络通信时,为了保证能正常通信,每个设备都需要配置正确的 IP 地址,否则无法实现正常的通信。
IP 地址(IPv4 地址)由 32
位正整数来表示,IP 地址在计算机是以二进制的方式处理的。
而人类为了方便记忆采用了点分十进制的标记方式,也就是将 32 位 IP 地址以每 8 位为组,共分为 4
组,每组以「.
」隔开,再将每组转换成十进制。

那么,IP 地址最大值也就是

也就说,最大允许 43 亿台计算机连接到网络。
实际上,IP 地址并不是根据主机台数来配置的,而是以网卡。像服务器、路由器等设备都是有 2 个以上的网卡,也就是它们会有 2 个以上的 IP 地址。

因此,让 43 亿台计算机全部连网其实是不可能的,更何况 IP 地址是由「网络标识」和「主机标识」这两个部分组成的,所以实际能够连接到网络的计算机个数更是少了很多。
可能有的小伙伴提出了疑问,现在不仅电脑配了 IP 地址, 手机、IPad 等电子设备都配了 IP 呀,照理来说肯定会超过 43 亿啦,那是怎么能够支持这么多 IP 的呢?
因为会根据一种可以更换 IP 地址的技术 NAT
,使得可连接计算机数超过 43 亿台。 NAT
技术后续会进一步讨论和说明。
IP 地址的分类
互联网诞生之初,IP 地址显得很充裕,于是计算机科学家们设计了分类地址。
IP 地址分类成了 5 种类型,分别是 A 类、B 类、C 类、D 类、E 类。

上图中黄色部分为分类号,用以区分 IP 地址类别
什么是 A、B、C 类地址?
其中对于 A、B、C 类主要分为两个部分,分别是网络号和主机号。这很好理解,好比小林是 A 小区 1 栋 101 号,你是 B 小区 1 栋 101 号
我们可以用下面这个表格, 就能很清楚的知道 A、B、C 分类对应的地址范围、最大主机个数。

A、B、C 分类地址最大主机个数是如何计算的呢?
最大主机个数,就是要看主机号的位数,如 C 类地址的主机号占 8 位,那么 C 类地址的最大主机个数:

为什么要减 2 呢?
因为在 IP 地址中,有两个 IP 是特殊的,分别是主机号全为 1 和 全为 0 地址。

- 主机号全为 1 指定某个网络下的所有主机,用于广播
- 主机号全为 0 指定某个网络
因此,在分配过程中,应该去掉这两种情况。

广播地址用于什么?
广播地址用于在同一个链路中相互连接的主机之间发送数据包。
学校班级中就有广播的例子,在准备上课的时候,通常班长会喊:“上课, 全体起立!”,班里的同学听到这句话是不是全部都站起来了?这个句话就有广播的含义。
当主机号全为 1 时,就表示该网络的广播地址。例如把 172.20.0.0/16
用二进制表示如下:
10101100.00010100.00000000.00000000
将这个地址的主机部分全部改为 1,则形成广播地址:
10101100.00010100.11111111.11111111
再将这个地址用十进制表示,则为 172.20.255.255
。
广播地址可以分为本地广播和直接广播两种。
- 在本网络内广播的叫做本地广播。例如网络地址为 192.168.0.0/24 的情况下,广播地址是 192.168.0.255 。因为这个广播地址的 IP 包会被路由器屏蔽,所以不会到达 192.168.0.0/24 以外的其他链路上
- 在不同网络之间的广播叫做直接广播。例如网络地址为 192.168.0.0/24 的主机向 192.168.1.255/24 的目标地址发送 IP 包。收到这个包的路由器,将数据转发给 192.168.1.0/24,从而使得所有 192.168.1.1~192.168.1.254 的主机都能收到这个包(由于直接广播有一定的安全问题,多数情况下会在路由器上设置为不转发。)

什么是 D、E 类地址?
而 D 类和 E 类地址是没有主机号的,所以不可用于主机 IP,D 类常被用于多播,E 类是预留的分类,暂时未使用。

多播地址用于什么?
多播用于将包发送给特定组内的所有主机。
多播使用的 D 类地址,其前四位是 1110
就表示是多播地址,而剩下的 28 位是多播的组编号。
从 224.0.0.0 ~ 239.255.255.255 都是多播的可用范围,其划分为以下三类:
- 224.0.0.0 ~ 224.0.0.255 为预留的组播地址,只能在局域网中,路由器是不会进行转发的。
- 224.0.1.0 ~ 238.255.255.255 为用户可用的组播地址,可以用于 Internet 上。
- 239.0.0.0 ~ 239.255.255.255 为本地管理组播地址,可供内部网在内部使用,仅在特定的本地范围内有效。
无分类地址 CIDR
正因为 IP 分类存在许多缺点,所以后面提出了无分类地址的方案,即 CIDR
。
这种方式不再有分类地址的概念,32 比特的 IP 地址被划分为两部分,前面是网络号,后面是主机号。
怎么划分网络号和主机号的呢?
表示形式 a.b.c.d/x
,其中 /x
表示前 x 位属于网络号, x 的范围是 0 ~ 32
,这就使得 IP 地址更加具有灵活性。
比如 10.100.122.2/24,这种地址表示形式就是 CIDR,/24 表示前 24 位是网络号,剩余的 8 位是主机号。

还有另一种划分网络号与主机号形式,那就是子网掩码,掩码的意思就是掩盖掉主机号,剩余的就是网络号。
将子网掩码和 IP 地址按位计算 AND,就可得到网络号。

为什么要分离网络号和主机号?
因为两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址是否相同。如果网络地址相同,表明接受方在本网络上,那么可以把数据包直接发送到目标主机。
路由器寻址工作中,也就是通过这样的方式来找到对应的网络号的,进而把数据包转发给对应的网络内。

公有 IP 地址与私有 IP 地址
在 A、B、C 分类地址,实际上有分公有 IP 地址和私有 IP 地址。

平时我们办公室、家里、学校用的 IP 地址,一般都是私有 IP 地址。因为这些地址允许组织内部的 IT 人员自己管理、自己分配,而且可以重复。因此,你学校的某个私有 IP 地址和我学校的可以是一样的。
公有 IP 地址由谁管理呢?
私有 IP 地址通常是内部的 IT 人员管理,公有 IP 地址是由 ICANN
组织管理,中文叫「互联网名称与数字地址分配机构」。
IANA 是 ICANN 的其中一个机构,它负责分配互联网 IP 地址,是按州的方式层层分配。

- ARIN 北美地区
- LACNIC 拉丁美洲和一些加勒比群岛
- RIPE NCC 欧洲、中东和中亚
- AfriNIC 非洲地区
- APNIC 亚太地区
其中,在中国是由 CNNIC 的机构进行管理,它是中国国内唯一指定的全局 IP 地址管理的组织。
IP 地址与路由控制
IP地址的网络地址这一部分是用于进行路由控制。
路由控制表中记录着网络地址与下一步应该发送至路由器的地址。在主机和路由器上都会有各自的路由器控制表。
在发送 IP 包时,首先要确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配。
路由器转发分组的步骤:
①提取IP分组的目的IP地址
②判断是否直接交付,用路由器中直接相连的网络逐个检查,用各网络的子网掩码与目的IP地址相与,判断是否匹配,若匹配则直接交付
③判断是否有目的地址的特定主机路由(子网掩码为255.255.255.255),若有则将IP分组传给下一跳路由器。
④检索路由表每一行(目的网络地址,掩码,下一条地址),判断子网掩码是否与目的地址匹配,若匹配将IP分组传给下一跳路由器。
⑤若有默认路由,将IP分组传给指定的默认路由器
⑥上述均不匹配,丢弃IP分组,发送错误报告。

默认路由:目的网络IP地址为0.0.0.0,子网掩码为0.0.0.0,当路由表中与IP分组的目的地址没有匹配的表项时,则将分组传送给指定的默认路由器,由其发送给另一个路由器处理
作用:
如果没有默认路由,那么目的地址在路由表中没有匹配表项的包将被丢弃。
减少路由表所占用空间和搜索路由表所用时间。
当存在末梢网络时,默认路由会大大简化路由器的配置,减轻管理员的工作负担,提高网络性能
路由聚合:把网络前缀都相同的连续的IP地址组成一个CIDR地址块。
优点:隔离拓扑变化,减少路由表项
最长前缀匹配原则:从匹配结果中选择具有最长网络前缀的路由。
IPv4报文
首部与数据组成,首部有20B固定长度。首部长度最大60B(首部长度基本单位4B)
总长度:16位。基本单位1B,数据报最大长度=2^16-1(即64KB)。
MTU:一个链路层数据报能承载的最大数据量
标识:用于组装数据报
标志:中间为DF,最低位MF,MF=1表示还有分片,MF=0表示最后一个分片。DF=0才允许分片
片偏移:某片在原分组的相对位置,8个字节为偏移单位。
首部检验和:只校验首部
TTL生存时间:指示数据报在网络中可通过的路由器数的最大值

每种数据链路的最大传输单元 MTU
都是不相同的,如 FDDI 数据链路 MTU 4352、以太网的 MTU 是 1500 字节等。
每种数据链路的 MTU 之所以不同,是因为每个不同类型的数据链路的使用目的不同。使用目的不同,可承载的 MTU 也就不同。
其中,我们最常见数据链路是以太网,它的 MTU 是 1500
字节。
那么当 IP 数据包大小大于 MTU 时, IP 数据包就会被分片。
经过分片之后的 IP 数据报在被重组的时候,只能由目标主机进行,路由器是不会进行重组的。


在分片传输中,一旦某个分片丢失,则会造成整个 IP 数据报作废,所以 TCP 引入了 MSS
也就是在 TCP 层进行分片不由 IP 层分片,那么对于 UDP 我们尽量不要发送一个大于 MTU
的数据报文。
IPv6报文
IPv4 的地址是 32 位的,大约可以提供 42 亿个地址,但是早在 2011 年 IPv4 地址就已经被分配完了。
但是 IPv6 的地址是 128
位的,这可分配的地址数量是大的惊人,说个段子 IPv6 可以保证地球上的每粒沙子都能被分配到一个 IP 地址。
但 IPv6 除了有更多的地址之外,还有更好的安全性和扩展性,说简单点就是 IPv6 相比于 IPv4 能带来更好的网络体验。
但是因为 IPv4 和 IPv6 不能相互兼容,所以不但要我们电脑、手机之类的设备支持,还需要网络运营商对现有的设备进行升级,所以这可能是 IPv6 普及率比较慢的一个原因。
IPv6 的亮点
IPv6 不仅仅只是可分配的地址变多了,它还有非常多的亮点。
- IPv6 可自动配置,即使没有 DHCP 服务器也可以实现自动分配IP地址,真是便捷到即插即用啊。
- IPv6 包头包首部长度采用固定的值
40
字节,去掉了包头校验和,简化了首部结构,减轻了路由器负荷,大大提高了传输的性能。 - IPv6 有应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能,大大提升了安全性。
IPv6 地址的标识方法
IPv4 地址长度共 32 位,是以每 8 位作为一组,并用点分十进制的表示方式。
IPv6 地址长度是 128 位,是以每 16 位作为一组,每组用冒号 「:」 隔开。

IPv6 地址的结构
IPv6 类似 IPv4,也是通过 IP 地址的前几位标识 IP 地址的种类。
IPv6 的地址主要有以下类型地址:
- 单播地址,用于一对一的通信
- 组播地址,用于一对多的通信
- 任播地址,用于通信最近的节点,最近的节点是由路由协议决定
- 没有广播地址

IPv6 单播地址类型
对于一对一通信的 IPv6 地址,主要划分了三类单播地址,每类地址的有效范围都不同。
- 在同一链路单播通信,不经过路由器,可以使用链路本地单播地址,IPv4 没有此类型
- 在内网里单播通信,可以使用唯一本地地址,相当于 IPv4 的私有 IP
- 在互联网通信,可以使用全局单播地址,相当于 IPv4 的公有 IP

IPv4 首部与 IPv6 首部
IPv4 首部与 IPv6 首部的差异如下图:
IPv6 相比 IPv4 的首部改进:
- 取消了首部校验和字段。 因为在数据链路层和传输层都会校验,因此 IPv6 直接取消了 IP 的校验。
- 取消了分片/重新组装相关字段。 分片与重组是耗时的过程,IPv6 不允许在中间路由器进行分片与重组,这种操作只能在源与目标主机,这将大大提高了路由器转发的速度。
- 取消选项字段。 选项字段不再是标准 IP 首部的一部分了,但它并没有消失,而是可能出现在 IPv6 首部中的「下一个首部」指出的位置上。删除该选项字段使的 IPv6 的首部成为固定长度的
40
字节。
NAT 协议
NAT(Network Address Translation,网络地址转换) 主要用于在不同网络之间转换 IP 地址。它允许将私有 IP 地址(如在局域网中使用的 IP 地址)映射为公有 IP 地址(在互联网中使用的 IP 地址)或者反向映射,从而实现局域网内的多个设备通过单一公有 IP 地址访问互联网。
NAT 不光可以缓解 IPv4 地址资源短缺的问题,还可以隐藏内部网络的实际拓扑结构,使得外部网络无法直接访问内部网络中的设备,从而提高了内部网络的安全性。
由于绝大多数的网络应用都是使用传输层协议 TCP 或 UDP 来传输数据的。
因此,可以把 IP 地址 + 端口号一起进行转换。

图中有两个客户端 192.168.1.10 和 192.168.1.11 同时与服务器 183.232.231.172 进行通信,并且这两个客户端的本地端口都是 1025。
此时,两个私有 IP 地址都转换 IP 地址为公有地址 120.229.175.121,但是以不同的端口号作为区分。
缺点
由于 NAT/NAPT 都依赖于自己的转换表,因此会有以下的问题:
- 外部无法主动与 NAT 内部服务器建立连接,因为 NAPT 转换表没有转换记录。
- 转换表的生成与转换操作都会产生性能开销。
- 通信过程中,如果 NAT 路由器重启了,所有的 TCP 连接都将被重置。
如何解决 NAT 潜在的问题呢?
解决的方法主要有两种方法。
第一种就是改用 IPv6
IPv6 可用范围非常大,以至于每台设备都可以配置一个公有 IP 地址,就不搞那么多花里胡哨的地址转换了,但是 IPv6 普及速度还需要一些时间。
第二种 NAT 穿透技术
NAT 穿越技术拥有这样的功能,它能够让网络应用程序主动发现自己位于 NAT 设备之后,并且会主动获得 NAT 设备的公有 IP,并为自己建立端口映射条目,注意这些都是 NAT设备后的应用程序自动完成的。
也就是说,在 NAT 穿透技术中,NAT设备后的应用程序处于主动地位,它已经明确地知道 NAT 设备要修改它外发的数据包,于是它主动配合 NAT 设备的操作,主动地建立好映射,这样就不像以前由 NAT 设备来建立映射了。
说人话,就是客户端主动从 NAT 设备获取公有 IP 地址,然后自己建立端口映射条目,然后用这个条目对外通信,就不需要 NAT 设备来进行转换了。
ARP 协议
在局域网中将主机或路由器的IP地址映射为MAC地址,工作在网络层,主机将包含目的IP地址的ARP请求广播到局域网内所有主机,并接受返回信息,以此来确认目的MAC,并将IP地址与MAC地址的映射存入本机ARP缓存,下次请求时直接查询ARP缓存以节省资源。
步骤
①每个主机都维持一个ARP高速缓存表,发送IP地址前先检索该表,如果不存在目的IP地址对应的MAC地址,则向本局域网广播ARP请求分组。
②目的主机收到广播报文之后,发现与自己的IP地址匹配,就会单播一个ARP响应分组给源主机,其中包含自己的MAC地址;
③源主机收到响应报文之后,就把目的MAC地址加入ARP缓存,下次请求时直接查询ARP缓存以节省资源。不过,MAC 地址的缓存是有一定期限的,超过这个期限,缓存的内容将被清除。
代理ARP
若目的IP地址与源主机不在同一个局域网,则本网段路由器将自己网关的MAC地址返回给源主机,实现源主机与其他网段主机的通信。
RARP 协议
ARP 协议是已知 IP 地址求 MAC 地址,那 RARP 协议正好相反,它是已知 MAC 地址求 IP 地址。例如将打印机服务器等小型嵌入式设备接入到网络时就经常会用得到。
通常这需要架设一台 RARP
服务器,在这个服务器上注册设备的 MAC 地址及其 IP 地址。然后再将这个设备接入到网络,接着:
- 该设备会发送一条「我的 MAC 地址是XXXX,请告诉我,我的IP地址应该是什么」的请求信息。
- RARP 服务器接到这个消息后返回「MAC地址为 XXXX 的设备,IP地址为 XXXX」的信息给这个设备。
最后,设备就根据从 RARP 服务器所收到的应答信息设置自己的 IP 地址。

RARP和DHCP的区别
①RARP只能实现MAC地址到IP地址的查询工作,RARP上的MAC地址和IP地址需要事先静态分配好。
②DHCP可以实现动态分配IP地址及IP地址续租管理等复杂功能。
ICMP协议
ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议。
里面有个关键词 —— 控制,如何控制的呢?
网络包在复杂的网络传输环境里,常常会遇到各种问题。
当遇到问题的时候,总不能死个不明不白,没头没脑的作风不是计算机网络的风格。所以需要传出消息,报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局面。
ICMP 大致可以分为两大类:
- 一类是用于诊断的查询消息,也就是「查询报文类型」
- 另一类是通知出错原因的错误消息,也就是「差错报文类型」

路由协议
RIP路由信息协议
是一种基于距离向量路由算法的内部网关协议,使用“跳数”来衡量到达目标地址的路由距离,每隔固定时间与相邻节点交换整个路由表,适用于小规模网络,建立在UDP上的应用层协议。
基本特点:
- 应用层协议,使用UDP传送数据
- 使用跳数,每经过一个路由器,跳数加1
- 一条路径最多15个路由器。距离16不可达(避免无穷计算)
- 选择最小跳数路由(但路径不一定是最短的)
- 适用于规模较小的网络
- 更新路由表的时机:发现新路由,发现更短的通路
优点:
- 实现简单,开销小
缺点:
- 限制了网络的规模
- 开销大,交换的是完整的路由表

慢收敛
当出现坏消息时,比如网1出现了故障:

- 这个时候R1是知道是无法到达的,则其到网1的距离为16,并且为直接交付。
- 但是R2在收到R1报文之前,即在R2并不知道R1出故障时,发送了原来的报文,(1,2 ,R1)
- 于是,R1收到R2跟新报文后,误以为可以经过R2到网1,于是更新自己的路由表,(1,3 ,R2),并且将次更新信息发送给R2
- 然后R2以后又跟新自己的路由表为(1,4,R1), 30s后,又把这个信息发送给R1
- 然后就这样一直循环
OSPF 开放式最短路径优先协议
是一种基于链路状态路由算法的内部网关协议,使用泛洪法向自治系统内所有路由器发送链路状态信息,通过迪杰斯特拉算法计算到各目的网络的最短路径来构造路由表,适用于大规模的自治系统的网络层协议。
基本特点:
- OSPF是网络层协议,直接用IP数据报发送
- 向本自治系统中所有路由器发送信息,使用洪泛法
- 发送的信息是与路由器相邻的所有路由器的链路状态
- 只有链路状态发生变化时,路由器才向所有路由器发送此信息
- 适用于大规模的自治系统中
- 收敛速度快
- 实现多路径间的负载平衡
- 虽然能算出完整的最优路径,但路由表中不会存储完整路径。只存储“下一跳”
- 能将一个自治系统再划分为更小的范围,称为区域
工作过程:
①路由器相互发送HELLO报文,建立邻居关系
②交换数据库描述(DBD)分组,与自身的链路状态数据库(LSDB)进行对比
③通过LSR/LSU/LUAck获取邻居路由器的链路状态通告(LSA)
④经过一段时间泛洪后形成统一的链路状态数据库(LSDB)
⑤根据最短路径算法计算最短路径,形成路由信息加入到路由表中,完成收敛
⑥每隔一段时间,刷新LSDB中的信息
RIP与OSPF的区别
①RIP是基于距离向量的协议,OSPF是基于链路状态的协议。
②RIP仅与相邻的结点交换路由表的所有信息,OSPF要与网络中的所有路由器交换链路信息。
③RIP选择的是跳数最少的路径,OSPF选择的是代价最低的路径。
④RIP定时进行信息交换,OSPF只有在更新时进行信息交换。
⑤RIP存在”慢收敛“,OSPF收敛速度快。
BGP边界网关协议
是一种基于路径向量路由算法的外部网关协议,每个自治系统选择一个或多个路由器作为BGP发言人,与其他自治系统的发言人建立TCP连接交换路由信息。

路径向量路由选择协议,应用层协议,基于TCP,BGP支持CIDR
首次交换整个路由表,之后只需更新变化部分。
BGP的使用环境:
因特网规模太大,自治系统之间路由选择很困难
自治系统之间的路由选择,找最佳路由并不现实
力求寻找一条能够到达目的网络且比较好的路由
工作原理:
每个自治系统选出一个(或多个)路由器作为该自治系统的“BGP发言人”。
不同自治系统的发言人通过建立TCP连接交换路由信息
